linssid-2.7/qwt-lib/src/qwt_plot_directpainter.cpp000644 001750 001750 00000020331 12151666703 023333 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_directpainter.h" #include "qwt_scale_map.h" #include "qwt_plot.h" #include "qwt_plot_canvas.h" #include "qwt_plot_seriesitem.h" #include #include #include #include static inline void qwtRenderItem( QPainter *painter, const QRect &canvasRect, QwtPlotSeriesItem *seriesItem, int from, int to ) { // A minor performance improvement is possible // with caching the maps. TODO ... QwtPlot *plot = seriesItem->plot(); const QwtScaleMap xMap = plot->canvasMap( seriesItem->xAxis() ); const QwtScaleMap yMap = plot->canvasMap( seriesItem->yAxis() ); painter->setRenderHint( QPainter::Antialiasing, seriesItem->testRenderHint( QwtPlotItem::RenderAntialiased ) ); seriesItem->drawSeries( painter, xMap, yMap, canvasRect, from, to ); } static inline bool qwtHasBackingStore( const QwtPlotCanvas *canvas ) { return canvas->testPaintAttribute( QwtPlotCanvas::BackingStore ) && canvas->backingStore() && !canvas->backingStore()->isNull(); } class QwtPlotDirectPainter::PrivateData { public: PrivateData(): attributes( 0 ), hasClipping(false), seriesItem( NULL ) { } QwtPlotDirectPainter::Attributes attributes; bool hasClipping; QRegion clipRegion; QPainter painter; QwtPlotSeriesItem *seriesItem; int from; int to; }; //! Constructor QwtPlotDirectPainter::QwtPlotDirectPainter( QObject *parent ): QObject( parent ) { d_data = new PrivateData; } //! Destructor QwtPlotDirectPainter::~QwtPlotDirectPainter() { delete d_data; } /*! Change an attribute \param attribute Attribute to change \param on On/Off \sa Attribute, testAttribute() */ void QwtPlotDirectPainter::setAttribute( Attribute attribute, bool on ) { if ( bool( d_data->attributes & attribute ) != on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; if ( ( attribute == AtomicPainter ) && on ) reset(); } } /*! \return True, when attribute is enabled \param attribute Attribute to be tested \sa Attribute, setAttribute() */ bool QwtPlotDirectPainter::testAttribute( Attribute attribute ) const { return d_data->attributes & attribute; } /*! En/Disables clipping \param enable Enables clipping is true, disable it otherwise \sa hasClipping(), clipRegion(), setClipRegion() */ void QwtPlotDirectPainter::setClipping( bool enable ) { d_data->hasClipping = enable; } /*! \return true, when clipping is enabled \sa setClipping(), clipRegion(), setClipRegion() */ bool QwtPlotDirectPainter::hasClipping() const { return d_data->hasClipping; } /*! \brief Assign a clip region and enable clipping Depending on the environment setting a proper clip region might improve the performance heavily. F.e. on Qt embedded only the clipped part of the backing store will be copied to a ( maybe unaccelerated ) frame buffer device. \param region Clip region \sa clipRegion(), hasClipping(), setClipping() */ void QwtPlotDirectPainter::setClipRegion( const QRegion ®ion ) { d_data->clipRegion = region; d_data->hasClipping = true; } /*! \return Currently set clip region. \sa setClipRegion(), setClipping(), hasClipping() */ QRegion QwtPlotDirectPainter::clipRegion() const { return d_data->clipRegion; } /*! \brief Draw a set of points of a seriesItem. When observing an measurement while it is running, new points have to be added to an existing seriesItem. drawSeries() can be used to display them avoiding a complete redraw of the canvas. Setting plot()->canvas()->setAttribute(Qt::WA_PaintOutsidePaintEvent, true); will result in faster painting, if the paint engine of the canvas widget supports this feature. \param seriesItem Item to be painted \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the series will be painted to its last point. */ void QwtPlotDirectPainter::drawSeries( QwtPlotSeriesItem *seriesItem, int from, int to ) { if ( seriesItem == NULL || seriesItem->plot() == NULL ) return; QWidget *canvas = seriesItem->plot()->canvas(); const QRect canvasRect = canvas->contentsRect(); QwtPlotCanvas *plotCanvas = qobject_cast( canvas ); if ( plotCanvas && qwtHasBackingStore( plotCanvas ) ) { QPainter painter( const_cast( plotCanvas->backingStore() ) ); if ( d_data->hasClipping ) painter.setClipRegion( d_data->clipRegion ); qwtRenderItem( &painter, canvasRect, seriesItem, from, to ); if ( testAttribute( QwtPlotDirectPainter::FullRepaint ) ) { plotCanvas->repaint(); return; } } bool immediatePaint = true; if ( !canvas->testAttribute( Qt::WA_WState_InPaintEvent ) ) { #if QT_VERSION < 0x050000 if ( !canvas->testAttribute( Qt::WA_PaintOutsidePaintEvent ) ) #endif immediatePaint = false; } if ( immediatePaint ) { if ( !d_data->painter.isActive() ) { reset(); d_data->painter.begin( canvas ); canvas->installEventFilter( this ); } if ( d_data->hasClipping ) { d_data->painter.setClipRegion( QRegion( canvasRect ) & d_data->clipRegion ); } else { if ( !d_data->painter.hasClipping() ) d_data->painter.setClipRect( canvasRect ); } qwtRenderItem( &d_data->painter, canvasRect, seriesItem, from, to ); if ( d_data->attributes & QwtPlotDirectPainter::AtomicPainter ) { reset(); } else { if ( d_data->hasClipping ) d_data->painter.setClipping( false ); } } else { reset(); d_data->seriesItem = seriesItem; d_data->from = from; d_data->to = to; QRegion clipRegion = canvasRect; if ( d_data->hasClipping ) clipRegion &= d_data->clipRegion; canvas->installEventFilter( this ); canvas->repaint(clipRegion); canvas->removeEventFilter( this ); d_data->seriesItem = NULL; } } //! Close the internal QPainter void QwtPlotDirectPainter::reset() { if ( d_data->painter.isActive() ) { QWidget *w = static_cast( d_data->painter.device() ); if ( w ) w->removeEventFilter( this ); d_data->painter.end(); } } //! Event filter bool QwtPlotDirectPainter::eventFilter( QObject *, QEvent *event ) { if ( event->type() == QEvent::Paint ) { reset(); if ( d_data->seriesItem ) { const QPaintEvent *pe = static_cast< QPaintEvent *>( event ); QWidget *canvas = d_data->seriesItem->plot()->canvas(); QPainter painter( canvas ); painter.setClipRegion( pe->region() ); bool doCopyCache = testAttribute( CopyBackingStore ); if ( doCopyCache ) { QwtPlotCanvas *plotCanvas = qobject_cast( canvas ); if ( plotCanvas ) { doCopyCache = qwtHasBackingStore( plotCanvas ); if ( doCopyCache ) { painter.drawPixmap( plotCanvas->contentsRect().topLeft(), *plotCanvas->backingStore() ); } } } if ( !doCopyCache ) { qwtRenderItem( &painter, canvas->contentsRect(), d_data->seriesItem, d_data->from, d_data->to ); } return true; // don't call QwtPlotCanvas::paintEvent() } } return false; } linssid-2.7/qwt-lib/src/qwt_color_map.h000644 001750 001750 00000011663 12151666702 021067 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COLOR_MAP_H #define QWT_COLOR_MAP_H #include "qwt_global.h" #include "qwt_interval.h" #include #include /*! \brief QwtColorMap is used to map values into colors. For displaying 3D data on a 2D plane the 3rd dimension is often displayed using colors, like f.e in a spectrogram. Each color map is optimized to return colors for only one of the following image formats: - QImage::Format_Indexed8\n - QImage::Format_ARGB32\n \sa QwtPlotSpectrogram, QwtScaleWidget */ class QWT_EXPORT QwtColorMap { public: /*! Format for color mapping \sa rgb(), colorIndex(), colorTable() */ enum Format { //! The map is intended to map into RGB values. RGB, /*! The map is intended to map into 8 bit values, that are indices into the color table. */ Indexed }; QwtColorMap( Format = QwtColorMap::RGB ); virtual ~QwtColorMap(); Format format() const; /*! Map a value of a given interval into a RGB value. \param interval Range for the values \param value Value \return RGB value, corresponding to value */ virtual QRgb rgb( const QwtInterval &interval, double value ) const = 0; /*! Map a value of a given interval into a color index \param interval Range for the values \param value Value \return color index, corresponding to value */ virtual unsigned char colorIndex( const QwtInterval &interval, double value ) const = 0; QColor color( const QwtInterval &, double value ) const; virtual QVector colorTable( const QwtInterval & ) const; private: Format d_format; }; /*! \brief QwtLinearColorMap builds a color map from color stops. A color stop is a color at a specific position. The valid range for the positions is [0.0, 1.0]. When mapping a value into a color it is translated into this interval according to mode(). */ class QWT_EXPORT QwtLinearColorMap: public QwtColorMap { public: /*! Mode of color map \sa setMode(), mode() */ enum Mode { //! Return the color from the next lower color stop FixedColors, //! Interpolating the colors of the adjacent stops. ScaledColors }; QwtLinearColorMap( QwtColorMap::Format = QwtColorMap::RGB ); QwtLinearColorMap( const QColor &from, const QColor &to, QwtColorMap::Format = QwtColorMap::RGB ); virtual ~QwtLinearColorMap(); void setMode( Mode ); Mode mode() const; void setColorInterval( const QColor &color1, const QColor &color2 ); void addColorStop( double value, const QColor& ); QVector colorStops() const; QColor color1() const; QColor color2() const; virtual QRgb rgb( const QwtInterval &, double value ) const; virtual unsigned char colorIndex( const QwtInterval &, double value ) const; class ColorStops; private: // Disabled copy constructor and operator= QwtLinearColorMap( const QwtLinearColorMap & ); QwtLinearColorMap &operator=( const QwtLinearColorMap & ); class PrivateData; PrivateData *d_data; }; /*! \brief QwtAlphaColorMap varies the alpha value of a color */ class QWT_EXPORT QwtAlphaColorMap: public QwtColorMap { public: QwtAlphaColorMap( const QColor & = QColor( Qt::gray ) ); virtual ~QwtAlphaColorMap(); void setColor( const QColor & ); QColor color() const; virtual QRgb rgb( const QwtInterval &, double value ) const; private: QwtAlphaColorMap( const QwtAlphaColorMap & ); QwtAlphaColorMap &operator=( const QwtAlphaColorMap & ); virtual unsigned char colorIndex( const QwtInterval &, double value ) const; class PrivateData; PrivateData *d_data; }; /*! Map a value into a color \param interval Valid interval for values \param value Value \return Color corresponding to value \warning This method is slow for Indexed color maps. If it is necessary to map many values, its better to get the color table once and find the color using colorIndex(). */ inline QColor QwtColorMap::color( const QwtInterval &interval, double value ) const { if ( d_format == RGB ) { return QColor( rgb( interval, value ) ); } else { const unsigned int index = colorIndex( interval, value ); return colorTable( interval )[index]; // slow } } /*! \return Intended format of the color map \sa Format */ inline QwtColorMap::Format QwtColorMap::format() const { return d_format; } #endif linssid-2.7/qwt-lib/src/qwt_global.h000644 001750 001750 00000002070 12151666701 020343 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_GLOBAL_H #define QWT_GLOBAL_H #include // QWT_VERSION is (major << 16) + (minor << 8) + patch. #define QWT_VERSION 0x060100 #define QWT_VERSION_STR "6.1.0" #if defined(_MSC_VER) /* MSVC Compiler */ /* template-class specialization 'identifier' is already instantiated */ #pragma warning(disable: 4660) /* inherits via dominance */ #pragma warning(disable: 4250) #endif // _MSC_VER #ifdef QWT_DLL #if defined(QWT_MAKEDLL) // create a Qwt DLL library #define QWT_EXPORT Q_DECL_EXPORT #else // use a Qwt DLL library #define QWT_EXPORT Q_DECL_IMPORT #endif #endif // QWT_DLL #ifndef QWT_EXPORT #define QWT_EXPORT #endif #endif linssid-2.7/qwt-lib/src/qwt_point_mapper.cpp000644 001750 001750 00000045424 12151666703 022147 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_mapper.h" #include "qwt_scale_map.h" #include "qwt_pixel_matrix.h" #include #include #include #include #if QT_VERSION >= 0x040400 #include #include #include #if !defined(QT_NO_QFUTURE) #define QWT_USE_THREADS 0 #endif #endif static QRectF qwtInvalidRect( 0.0, 0.0, -1.0, -1.0 ); // Helper class to work around the 5 parameters // limitation of QtConcurrent::run() class QwtDotsCommand { public: const QwtSeriesData *series; int from; int to; QRgb rgb; }; static void qwtRenderDots( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtDotsCommand command, const QPoint &pos, QImage *image ) { const QRgb rgb = command.rgb; QRgb *bits = reinterpret_cast( image->bits() ); const int w = image->width(); const int h = image->height(); const int x0 = pos.x(); const int y0 = pos.y(); for ( int i = command.from; i <= command.to; i++ ) { const QPointF sample = command.series->sample( i ); const int x = static_cast( xMap.transform( sample.x() ) + 0.5 ) - x0; const int y = static_cast( yMap.transform( sample.y() ) + 0.5 ) - y0; if ( x >= 0 && x < w && y >= 0 && y < h ) bits[ y * w + x ] = rgb; } } static inline int qwtRoundValue( double value ) { #if 1 return qRound( value ); #else // A little bit faster, but differs from qRound() // for negative values. Should be no problem as we are // rounding widgets coordinates, where negative values // are clipped off anyway ( at least when there is no // painter transformation ) return static_cast( value + 0.5 ); #endif } // some functors, so that the compile can inline struct QwtRoundI { inline int operator()( double value ) { return qwtRoundValue( value ); } }; struct QwtRoundF { inline double operator()( double value ) { return static_cast( qwtRoundValue( value ) ); } }; struct QwtNoRoundF { inline double operator()( double value ) { return value; } }; // mapping points without any filtering - beside checking // the bounding rectangle template static inline Polygon qwtToPoints( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, Round round ) { Polygon polyline( to - from + 1 ); Point *points = polyline.data(); int numPoints = 0; if ( boundingRect.isValid() ) { // iterating over all values // filtering out all points outside of // the bounding rectangle for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); const double x = xMap.transform( sample.x() ); const double y = yMap.transform( sample.y() ); if ( boundingRect.contains( x, y ) ) { points[ numPoints ].rx() = round( x ); points[ numPoints ].ry() = round( y ); numPoints++; } } polyline.resize( numPoints ); } else { // simply iterating over all values // without any filtering for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); const double x = xMap.transform( sample.x() ); const double y = yMap.transform( sample.y() ); points[ numPoints ].rx() = round( x ); points[ numPoints ].ry() = round( y ); numPoints++; } } return polyline; } static inline QPolygon qwtToPointsI( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { return qwtToPoints( boundingRect, xMap, yMap, series, from, to, QwtRoundI() ); } template static inline QPolygonF qwtToPointsF( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, Round round ) { return qwtToPoints( boundingRect, xMap, yMap, series, from, to, round ); } // Mapping points with filtering out consecutive // points mapped to the same position template static inline Polygon qwtToPolylineFiltered( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, Round round ) { // in curves with many points consecutive points // are often mapped to the same position. As this might // result in empty lines ( or symbols hidden by others ) // we try to filter them out Polygon polyline( to - from + 1 ); Point *points = polyline.data(); const QPointF sample0 = series->sample( from ); points[0].rx() = round( xMap.transform( sample0.x() ) ); points[0].ry() = round( yMap.transform( sample0.y() ) ); int pos = 0; for ( int i = from + 1; i <= to; i++ ) { const QPointF sample = series->sample( i ); const Point p( round( xMap.transform( sample.x() ) ), round( yMap.transform( sample.y() ) ) ); if ( points[pos] != p ) points[++pos] = p; } polyline.resize( pos + 1 ); return polyline; } static inline QPolygon qwtToPolylineFilteredI( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { return qwtToPolylineFiltered( xMap, yMap, series, from, to, QwtRoundI() ); } template static inline QPolygonF qwtToPolylineFilteredF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, Round round ) { return qwtToPolylineFiltered( xMap, yMap, series, from, to, round ); } template static inline Polygon qwtToPointsFiltered( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { // F.e. in scatter plots ( no connecting lines ) we // can sort out all duplicates ( not only consecutive points ) Polygon polygon( to - from + 1 ); Point *points = polygon.data(); QwtPixelMatrix pixelMatrix( boundingRect.toAlignedRect() ); int numPoints = 0; for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); const int x = qwtRoundValue( xMap.transform( sample.x() ) ); const int y = qwtRoundValue( yMap.transform( sample.y() ) ); if ( pixelMatrix.testAndSetPixel( x, y, true ) == false ) { points[ numPoints ].rx() = x; points[ numPoints ].ry() = y; numPoints++; } } polygon.resize( numPoints ); return polygon; } static inline QPolygon qwtToPointsFilteredI( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { return qwtToPointsFiltered( boundingRect, xMap, yMap, series, from, to ); } static inline QPolygonF qwtToPointsFilteredF( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) { return qwtToPointsFiltered( boundingRect, xMap, yMap, series, from, to ); } class QwtPointMapper::PrivateData { public: PrivateData(): boundingRect( qwtInvalidRect ) { } QRectF boundingRect; QwtPointMapper::TransformationFlags flags; }; //! Constructor QwtPointMapper::QwtPointMapper() { d_data = new PrivateData(); } //! Destructor QwtPointMapper::~QwtPointMapper() { delete d_data; } /*! Set the flags affecting the transformation process \param flags Flags \sa flags(), setFlag() */ void QwtPointMapper::setFlags( TransformationFlags flags ) { d_data->flags = flags; } /*! \return Flags affecting the transformation process \sa setFlags(), setFlag() */ QwtPointMapper::TransformationFlags QwtPointMapper::flags() const { return d_data->flags; } /*! Modify a flag affecting the transformation process \param flag Flag type \param on Value \sa flag(), setFlags() */ void QwtPointMapper::setFlag( TransformationFlag flag, bool on ) { if ( on ) d_data->flags |= flag; else d_data->flags &= ~flag; } /*! \return True, when the flag is set \param flag Flag type \sa setFlag(), setFlags() */ bool QwtPointMapper::testFlag( TransformationFlag flag ) const { return d_data->flags & flag; } /*! Set a bounding rectangle for the point mapping algorithm A valid bounding rectangle can be used for optimizations \param rect Bounding rectangle \sa boundingRect() */ void QwtPointMapper::setBoundingRect( const QRectF &rect ) { d_data->boundingRect = rect; } /*! \return Bounding rectangle \sa setBoundingRect() */ QRectF QwtPointMapper::boundingRect() const { return d_data->boundingRect; } /*! \brief Translate a series of points into a QPolygonF When the WeedOutPoints flag is enabled consecutive points, that are mapped to the same position will be one point. When RoundPoints is set all points are rounded to integers but returned as PolygonF - what only makes sense when the further processing of the values need a QPolygonF. \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \return Translated polygon */ QPolygonF QwtPointMapper::toPolygonF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const { QPolygonF polyline; if ( d_data->flags & WeedOutPoints ) { if ( d_data->flags & RoundPoints ) { polyline = qwtToPolylineFilteredF( xMap, yMap, series, from, to, QwtRoundF() ); } else { polyline = qwtToPolylineFilteredF( xMap, yMap, series, from, to, QwtNoRoundF() ); } } else { if ( d_data->flags & RoundPoints ) { polyline = qwtToPointsF( qwtInvalidRect, xMap, yMap, series, from, to, QwtRoundF() ); } else { polyline = qwtToPointsF( qwtInvalidRect, xMap, yMap, series, from, to, QwtNoRoundF() ); } } return polyline; } /*! \brief Translate a series of points into a QPolygon When the WeedOutPoints flag is enabled consecutive points, that are mapped to the same position will be one point. \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \return Translated polygon */ QPolygon QwtPointMapper::toPolygon( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const { QPolygon polyline; if ( d_data->flags & WeedOutPoints ) { polyline = qwtToPolylineFilteredI( xMap, yMap, series, from, to ); } else { polyline = qwtToPointsI( qwtInvalidRect, xMap, yMap, series, from, to ); } return polyline; } /*! \brief Translate a series into a QPolygonF - WeedOutPoints & RoundPoints & boundingRect().isValid() All points that are mapped to the same position will be one point. Points outside of the bounding rectangle are ignored. - WeedOutPoints & RoundPoints & !boundingRect().isValid() All consecutive points that are mapped to the same position will one point - WeedOutPoints & !RoundPoints All consecutive points that are mapped to the same position will one point - !WeedOutPoints & boundingRect().isValid() Points outside of the bounding rectangle are ignored. When RoundPoints is set all points are rounded to integers but returned as PolygonF - what only makes sense when the further processing of the values need a QPolygonF. \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \return Translated polygon */ QPolygonF QwtPointMapper::toPointsF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const { QPolygonF points; if ( d_data->flags & WeedOutPoints ) { if ( d_data->flags & RoundPoints ) { if ( d_data->boundingRect.isValid() ) { points = qwtToPointsFilteredF( d_data->boundingRect, xMap, yMap, series, from, to ); } else { // without a bounding rectangle all we can // do is to filter out duplicates of // consecutive points points = qwtToPolylineFilteredF( xMap, yMap, series, from, to, QwtRoundF() ); } } else { // when rounding is not allowed we can't use // qwtToPointsFilteredF points = qwtToPolylineFilteredF( xMap, yMap, series, from, to, QwtNoRoundF() ); } } else { if ( d_data->flags & RoundPoints ) { points = qwtToPointsF( d_data->boundingRect, xMap, yMap, series, from, to, QwtRoundF() ); } else { points = qwtToPointsF( d_data->boundingRect, xMap, yMap, series, from, to, QwtNoRoundF() ); } } return points; } /*! \brief Translate a series of points into a QPolygon - WeedOutPoints & boundingRect().isValid() All points that are mapped to the same position will be one point. Points outside of the bounding rectangle are ignored. - WeedOutPoints & !boundingRect().isValid() All consecutive points that are mapped to the same position will one point - !WeedOutPoints & boundingRect().isValid() Points outside of the bounding rectangle are ignored. \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \return Translated polygon */ QPolygon QwtPointMapper::toPoints( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const { QPolygon points; if ( d_data->flags & WeedOutPoints ) { if ( d_data->boundingRect.isValid() ) { points = qwtToPointsFilteredI( d_data->boundingRect, xMap, yMap, series, from, to ); } else { // when we don't have the bounding rectangle all // we can do is to filter out consecutive duplicates points = qwtToPolylineFilteredI( xMap, yMap, series, from, to ); } } else { points = qwtToPointsI( d_data->boundingRect, xMap, yMap, series, from, to ); } return points; } /*! \brief Translate a series into a QImage \param xMap x map \param yMap y map \param series Series of points to be mapped \param from Index of the first point to be painted \param to Index of the last point to be painted \param pen Pen used for drawing a point of the image, where a point is mapped to \param antialiased True, when the dots should be displayed antialiased \param numThreads Number of threads to be used for rendering. If numThreads is set to 0, the system specific ideal thread count is used. \return Image displaying the series */ QImage QwtPointMapper::toImage( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, const QPen &pen, bool antialiased, uint numThreads ) const { Q_UNUSED( antialiased ) #if QWT_USE_THREADS if ( numThreads == 0 ) numThreads = QThread::idealThreadCount(); if ( numThreads <= 0 ) numThreads = 1; #else Q_UNUSED( numThreads ) #endif // a very special optimization for scatter plots // where every sample is mapped to one pixel only. const QRect rect = d_data->boundingRect.toAlignedRect(); QImage image( rect.size(), QImage::Format_ARGB32 ); image.fill( Qt::transparent ); if ( pen.width() <= 1 && pen.color().alpha() == 255 ) { QwtDotsCommand command; command.series = series; command.rgb = pen.color().rgba(); #if QWT_USE_THREADS const int numPoints = ( to - from + 1 ) / numThreads; QList< QFuture > futures; for ( uint i = 0; i < numThreads; i++ ) { const QPoint pos = rect.topLeft(); const int index0 = from + i * numPoints; if ( i == numThreads - 1 ) { command.from = index0; command.to = to; qwtRenderDots( xMap, yMap, command, pos, &image ); } else { command.from = index0; command.to = index0 + numPoints - 1; futures += QtConcurrent::run( &qwtRenderDots, xMap, yMap, command, pos, &image ); } } for ( int i = 0; i < futures.size(); i++ ) futures[i].waitForFinished(); #else command.from = from; command.to = to; qwtRenderDots( xMap, yMap, command, rect.topLeft(), &image ); #endif } else { // fallback implementation: to be replaced later by // setting the pixels of the image like above, TODO ... QPainter painter( &image ); painter.setPen( pen ); painter.setRenderHint( QPainter::Antialiasing, antialiased ); const int chunkSize = 1000; for ( int i = from; i <= to; i += chunkSize ) { const int indexTo = qMin( i + chunkSize - 1, to ); const QPolygon points = toPoints( xMap, yMap, series, i, indexTo ); painter.drawPoints( points ); } } return image; } linssid-2.7/qwt-lib/textengines/textengines.pro000644 001750 001750 00000000722 12151666703 022670 0ustar00warrenwarren000000 000000 ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ include( $${PWD}/../qwtconfig.pri ) TEMPLATE = subdirs contains(QWT_CONFIG, QwtMathML) { SUBDIRS += mathml } linssid-2.7/qwt-lib/src/qwt_plot_histogram.h000644 001750 001750 00000010307 12151666701 022140 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_HISTOGRAM_H #define QWT_PLOT_HISTOGRAM_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_column_symbol.h" #include #include class QwtIntervalData; class QString; class QPolygonF; /*! \brief QwtPlotHistogram represents a series of samples, where an interval is associated with a value ( \f$y = f([x1,x2])\f$ ). The representation depends on the style() and an optional symbol() that is displayed for each interval. \note The term "histogram" is used in a different way in the areas of digital image processing and statistics. Wikipedia introduces the terms "image histogram" and "color histogram" to avoid confusions. While "image histograms" can be displayed by a QwtPlotCurve there is no applicable plot item for a "color histogram" yet. \sa QwtPlotBarChart, QwtPlotMultiBarChart */ class QWT_EXPORT QwtPlotHistogram: public QwtPlotSeriesItem, public QwtSeriesStore { public: /*! Histogram styles. The default style is QwtPlotHistogram::Columns. \sa setStyle(), style(), setSymbol(), symbol(), setBaseline() */ enum HistogramStyle { /*! Draw an outline around the area, that is build by all intervals using the pen() and fill it with the brush(). The outline style requires, that the intervals are in increasing order and not overlapping. */ Outline, /*! Draw a column for each interval. When a symbol() has been set the symbol is used otherwise the column is displayed as plain rectangle using pen() and brush(). */ Columns, /*! Draw a simple line using the pen() for each interval. */ Lines, /*! Styles >= UserStyle are reserved for derived classes that overload drawSeries() with additional application specific ways to display a histogram. */ UserStyle = 100 }; explicit QwtPlotHistogram( const QString &title = QString::null ); explicit QwtPlotHistogram( const QwtText &title ); virtual ~QwtPlotHistogram(); virtual int rtti() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); void setBaseline( double reference ); double baseline() const; void setStyle( HistogramStyle style ); HistogramStyle style() const; void setSymbol( const QwtColumnSymbol * ); const QwtColumnSymbol *symbol() const; virtual void drawSeries( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: virtual QwtColumnRect columnRect( const QwtIntervalSample &, const QwtScaleMap &, const QwtScaleMap & ) const; virtual void drawColumn( QPainter *, const QwtColumnRect &, const QwtIntervalSample & ) const; void drawColumns( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const; void drawOutline( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const; void drawLines( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const; private: void init(); void flushPolygon( QPainter *, double baseLine, QPolygonF & ) const; class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_painter.cpp000644 001750 001750 00000105125 12151666703 021107 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_painter.h" #include "qwt_math.h" #include "qwt_clipper.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #endif #if QT_VERSION < 0x050000 #ifdef Q_WS_X11 #include #endif #endif bool QwtPainter::d_polylineSplitting = true; bool QwtPainter::d_roundingAlignment = true; static inline bool qwtIsClippingNeeded( const QPainter *painter, QRectF &clipRect ) { bool doClipping = false; const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::SVG ) { // The SVG paint engine ignores any clipping, if ( painter->hasClipping() ) { doClipping = true; clipRect = painter->clipRegion().boundingRect(); } } return doClipping; } template static inline void qwtDrawPolyline( QPainter *painter, const T *points, int pointCount, bool polylineSplitting ) { bool doSplit = false; if ( polylineSplitting ) { const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::Raster ) { /* The raster paint engine seems to use some algo with O(n*n). ( Qt 4.3 is better than Qt 4.2, but remains unacceptable) To work around this problem, we have to split the polygon into smaller pieces. */ doSplit = true; } } if ( doSplit ) { const int splitSize = 20; for ( int i = 0; i < pointCount; i += splitSize ) { const int n = qMin( splitSize + 1, pointCount - i ); painter->drawPolyline( points + i, n ); } } else painter->drawPolyline( points, pointCount ); } static inline void qwtUnscaleFont( QPainter *painter ) { if ( painter->font().pixelSize() >= 0 ) return; static QSize screenResolution; if ( !screenResolution.isValid() ) { QDesktopWidget *desktop = QApplication::desktop(); if ( desktop ) { screenResolution.setWidth( desktop->logicalDpiX() ); screenResolution.setHeight( desktop->logicalDpiY() ); } } const QPaintDevice *pd = painter->device(); if ( pd->logicalDpiX() != screenResolution.width() || pd->logicalDpiY() != screenResolution.height() ) { QFont pixelFont( painter->font(), QApplication::desktop() ); pixelFont.setPixelSize( QFontInfo( pixelFont ).pixelSize() ); painter->setFont( pixelFont ); } } /*! Check is the application is running with the X11 graphics system that has some special capabilities that can be used for incremental painting to a widget. \return True, when the graphics system is X11 */ bool QwtPainter::isX11GraphicsSystem() { static int onX11 = -1; if ( onX11 < 0 ) { QPixmap pm( 1, 1 ); QPainter painter( &pm ); onX11 = ( painter.paintEngine()->type() == QPaintEngine::X11 ) ? 1 : 0; } return onX11 == 1; } /*! Check if the painter is using a paint engine, that aligns coordinates to integers. Today these are all paint engines beside QPaintEngine::Pdf and QPaintEngine::SVG. If we have an integer based paint engine it is also checked if the painter has a transformation matrix, that rotates or scales. \param painter Painter \return true, when the painter is aligning \sa setRoundingAlignment() */ bool QwtPainter::isAligning( QPainter *painter ) { if ( painter && painter->isActive() ) { switch ( painter->paintEngine()->type() ) { case QPaintEngine::Pdf: case QPaintEngine::SVG: return false; default:; } const QTransform tr = painter->transform(); if ( tr.isRotating() || tr.isScaling() ) { // we might have to check translations too return false; } } return true; } /*! Enable whether coordinates should be rounded, before they are painted to a paint engine that floors to integer values. For other paint engines this ( PDF, SVG ), this flag has no effect. QwtPainter stores this flag only, the rounding itself is done in the painting code ( f.e the plot items ). The default setting is true. \sa roundingAlignment(), isAligning() */ void QwtPainter::setRoundingAlignment( bool enable ) { d_roundingAlignment = enable; } /*! \brief En/Disable line splitting for the raster paint engine In some Qt versions the raster paint engine paints polylines of many points much faster when they are split in smaller chunks: f.e all supported Qt versions >= Qt 5.0 when drawing an antialiased polyline with a pen width >=2. The default setting is true. \sa polylineSplitting() */ void QwtPainter::setPolylineSplitting( bool enable ) { d_polylineSplitting = enable; } //! Wrapper for QPainter::drawPath() void QwtPainter::drawPath( QPainter *painter, const QPainterPath &path ) { painter->drawPath( path ); } //! Wrapper for QPainter::drawRect() void QwtPainter::drawRect( QPainter *painter, double x, double y, double w, double h ) { drawRect( painter, QRectF( x, y, w, h ) ); } //! Wrapper for QPainter::drawRect() void QwtPainter::drawRect( QPainter *painter, const QRectF &rect ) { const QRectF r = rect; QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { if ( !clipRect.intersects( r ) ) return; if ( !clipRect.contains( r ) ) { fillRect( painter, r & clipRect, painter->brush() ); painter->save(); painter->setBrush( Qt::NoBrush ); drawPolyline( painter, QPolygonF( r ) ); painter->restore(); return; } } painter->drawRect( r ); } //! Wrapper for QPainter::fillRect() void QwtPainter::fillRect( QPainter *painter, const QRectF &rect, const QBrush &brush ) { if ( !rect.isValid() ) return; QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); /* Performance of Qt4 is horrible for a non trivial brush. Without clipping expect minutes or hours for repainting large rectangles (might result from zooming) */ if ( deviceClipping ) clipRect &= painter->window(); else clipRect = painter->window(); if ( painter->hasClipping() ) clipRect &= painter->clipRegion().boundingRect(); QRectF r = rect; if ( deviceClipping ) r = r.intersected( clipRect ); if ( r.isValid() ) painter->fillRect( r, brush ); } //! Wrapper for QPainter::drawPie() void QwtPainter::drawPie( QPainter *painter, const QRectF &rect, int a, int alen ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( rect ) ) return; painter->drawPie( rect, a, alen ); } //! Wrapper for QPainter::drawEllipse() void QwtPainter::drawEllipse( QPainter *painter, const QRectF &rect ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( rect ) ) return; painter->drawEllipse( rect ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, double x, double y, const QString &text ) { drawText( painter, QPointF( x, y ), text ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, const QPointF &pos, const QString &text ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( pos ) ) return; painter->save(); qwtUnscaleFont( painter ); painter->drawText( pos, text ); painter->restore(); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, double x, double y, double w, double h, int flags, const QString &text ) { drawText( painter, QRectF( x, y, w, h ), flags, text ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, const QRectF &rect, int flags, const QString &text ) { painter->save(); qwtUnscaleFont( painter ); painter->drawText( rect, flags, text ); painter->restore(); } #ifndef QT_NO_RICHTEXT /*! Draw a text document into a rectangle \param painter Painter \param rect Traget rectangle \param flags Alignments/Text flags, see QPainter::drawText() \param text Text document */ void QwtPainter::drawSimpleRichText( QPainter *painter, const QRectF &rect, int flags, const QTextDocument &text ) { QTextDocument *txt = text.clone(); painter->save(); painter->setFont( txt->defaultFont() ); qwtUnscaleFont( painter ); txt->setDefaultFont( painter->font() ); txt->setPageSize( QSizeF( rect.width(), QWIDGETSIZE_MAX ) ); QAbstractTextDocumentLayout* layout = txt->documentLayout(); const double height = layout->documentSize().height(); double y = rect.y(); if ( flags & Qt::AlignBottom ) y += ( rect.height() - height ); else if ( flags & Qt::AlignVCenter ) y += ( rect.height() - height ) / 2; QAbstractTextDocumentLayout::PaintContext context; context.palette.setColor( QPalette::Text, painter->pen().color() ); painter->translate( rect.x(), y ); layout->draw( painter, context ); painter->restore(); delete txt; } #endif // !QT_NO_RICHTEXT //! Wrapper for QPainter::drawLine() void QwtPainter::drawLine( QPainter *painter, const QPointF &p1, const QPointF &p2 ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !( clipRect.contains( p1 ) && clipRect.contains( p2 ) ) ) { QPolygonF polygon; polygon += p1; polygon += p2; drawPolyline( painter, polygon ); return; } painter->drawLine( p1, p2 ); } //! Wrapper for QPainter::drawPolygon() void QwtPainter::drawPolygon( QPainter *painter, const QPolygonF &polygon ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); QPolygonF cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygonF( clipRect, polygon ); painter->drawPolygon( cpa ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPolygonF &polygon ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); QPolygonF cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygonF( clipRect, cpa ); qwtDrawPolyline( painter, cpa.constData(), cpa.size(), d_polylineSplitting ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPointF *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { QPolygonF polygon( pointCount ); ::memcpy( polygon.data(), points, pointCount * sizeof( QPointF ) ); polygon = QwtClipper::clipPolygonF( clipRect, polygon ); qwtDrawPolyline( painter, polygon.constData(), polygon.size(), d_polylineSplitting ); } else { qwtDrawPolyline( painter, points, pointCount, d_polylineSplitting ); } } //! Wrapper for QPainter::drawPolygon() void QwtPainter::drawPolygon( QPainter *painter, const QPolygon &polygon ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); QPolygon cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygon( clipRect, polygon ); painter->drawPolygon( cpa ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPolygon &polygon ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); QPolygon cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygon( clipRect, cpa ); qwtDrawPolyline( painter, cpa.constData(), cpa.size(), d_polylineSplitting ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPoint *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { QPolygon polygon( pointCount ); ::memcpy( polygon.data(), points, pointCount * sizeof( QPoint ) ); polygon = QwtClipper::clipPolygon( clipRect, polygon ); qwtDrawPolyline( painter, polygon.constData(), polygon.size(), d_polylineSplitting ); } else qwtDrawPolyline( painter, points, pointCount, d_polylineSplitting ); } //! Wrapper for QPainter::drawPoint() void QwtPainter::drawPoint( QPainter *painter, const QPointF &pos ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( pos ) ) return; painter->drawPoint( pos ); } //! Wrapper for QPainter::drawPoint() void QwtPainter::drawPoint( QPainter *painter, const QPoint &pos ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { const int minX = qCeil( clipRect.left() ); const int maxX = qFloor( clipRect.right() ); const int minY = qCeil( clipRect.top() ); const int maxY = qFloor( clipRect.bottom() ); if ( pos.x() < minX || pos.x() > maxX || pos.y() < minY || pos.y() > maxY ) { return; } } painter->drawPoint( pos ); } //! Wrapper for QPainter::drawPoints() void QwtPainter::drawPoints( QPainter *painter, const QPoint *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { const int minX = qCeil( clipRect.left() ); const int maxX = qFloor( clipRect.right() ); const int minY = qCeil( clipRect.top() ); const int maxY = qFloor( clipRect.bottom() ); const QRect r( minX, minY, maxX - minX, maxY - minY ); QPolygon clippedPolygon( pointCount ); QPoint *clippedData = clippedPolygon.data(); int numClippedPoints = 0; for ( int i = 0; i < pointCount; i++ ) { if ( r.contains( points[i] ) ) clippedData[ numClippedPoints++ ] = points[i]; } painter->drawPoints( clippedData, numClippedPoints ); } else { painter->drawPoints( points, pointCount ); } } //! Wrapper for QPainter::drawPoints() void QwtPainter::drawPoints( QPainter *painter, const QPointF *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = qwtIsClippingNeeded( painter, clipRect ); if ( deviceClipping ) { QPolygonF clippedPolygon( pointCount ); QPointF *clippedData = clippedPolygon.data(); int numClippedPoints = 0; for ( int i = 0; i < pointCount; i++ ) { if ( clipRect.contains( points[i] ) ) clippedData[ numClippedPoints++ ] = points[i]; } painter->drawPoints( clippedData, numClippedPoints ); } else { painter->drawPoints( points, pointCount ); } } //! Wrapper for QPainter::drawImage() void QwtPainter::drawImage( QPainter *painter, const QRectF &rect, const QImage &image ) { const QRect alignedRect = rect.toAlignedRect(); if ( alignedRect != rect ) { const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); painter->save(); painter->setClipRect( clipRect, Qt::IntersectClip ); painter->drawImage( alignedRect, image ); painter->restore(); } else { painter->drawImage( alignedRect, image ); } } //! Wrapper for QPainter::drawPixmap() void QwtPainter::drawPixmap( QPainter *painter, const QRectF &rect, const QPixmap &pixmap ) { const QRect alignedRect = rect.toAlignedRect(); if ( alignedRect != rect ) { const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); painter->save(); painter->setClipRect( clipRect, Qt::IntersectClip ); painter->drawPixmap( alignedRect, pixmap ); painter->restore(); } else { painter->drawPixmap( alignedRect, pixmap ); } } //! Draw a focus rectangle on a widget using its style. void QwtPainter::drawFocusRect( QPainter *painter, const QWidget *widget ) { drawFocusRect( painter, widget, widget->rect() ); } //! Draw a focus rectangle on a widget using its style. void QwtPainter::drawFocusRect( QPainter *painter, const QWidget *widget, const QRect &rect ) { QStyleOptionFocusRect opt; opt.init( widget ); opt.rect = rect; opt.state |= QStyle::State_HasFocus; widget->style()->drawPrimitive( QStyle::PE_FrameFocusRect, &opt, painter, widget ); } /*! Draw a round frame \param painter Painter \param rect Frame rectangle \param palette QPalette::WindowText is used for plain borders QPalette::Dark and QPalette::Light for raised or sunken borders \param lineWidth Line width \param frameStyle bitwise OR´ed value of QFrame::Shape and QFrame::Shadow */ void QwtPainter::drawRoundFrame( QPainter *painter, const QRectF &rect, const QPalette &palette, int lineWidth, int frameStyle ) { enum Style { Plain, Sunken, Raised }; Style style = Plain; if ( (frameStyle & QFrame::Sunken) == QFrame::Sunken ) style = Sunken; else if ( (frameStyle & QFrame::Raised) == QFrame::Raised ) style = Raised; const double lw2 = 0.5 * lineWidth; QRectF r = rect.adjusted( lw2, lw2, -lw2, -lw2 ); QBrush brush; if ( style != Plain ) { QColor c1 = palette.color( QPalette::Light ); QColor c2 = palette.color( QPalette::Dark ); if ( style == Sunken ) qSwap( c1, c2 ); QLinearGradient gradient( r.topLeft(), r.bottomRight() ); gradient.setColorAt( 0.0, c1 ); #if 0 gradient.setColorAt( 0.3, c1 ); gradient.setColorAt( 0.7, c2 ); #endif gradient.setColorAt( 1.0, c2 ); brush = QBrush( gradient ); } else // Plain { brush = palette.brush( QPalette::WindowText ); } painter->save(); painter->setPen( QPen( brush, lineWidth ) ); painter->setBrush( Qt::NoBrush ); painter->drawEllipse( r ); painter->restore(); } /*! Draw a rectangular frame \param painter Painter \param rect Frame rectangle \param palette Palette \param foregroundRole Foreground role used for QFrame::Plain \param frameWidth Frame width \param midLineWidth Used for QFrame::Box \param frameStyle bitwise OR´ed value of QFrame::Shape and QFrame::Shadow */ void QwtPainter::drawFrame( QPainter *painter, const QRectF &rect, const QPalette &palette, QPalette::ColorRole foregroundRole, int frameWidth, int midLineWidth, int frameStyle ) { if ( frameWidth <= 0 || rect.isEmpty() ) return; const int shadow = frameStyle & QFrame::Shadow_Mask; painter->save(); if ( shadow == QFrame::Plain ) { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF innerRect = outerRect.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); QPainterPath path; path.addRect( outerRect ); path.addRect( innerRect ); painter->setPen( Qt::NoPen ); painter->setBrush( palette.color( foregroundRole ) ); painter->drawPath( path ); } else { const int shape = frameStyle & QFrame::Shape_Mask; if ( shape == QFrame::Box ) { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF midRect1 = outerRect.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); const QRectF midRect2 = midRect1.adjusted( midLineWidth, midLineWidth, -midLineWidth, -midLineWidth ); const QRectF innerRect = midRect2.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); QPainterPath path1; path1.moveTo( outerRect.bottomLeft() ); path1.lineTo( outerRect.topLeft() ); path1.lineTo( outerRect.topRight() ); path1.lineTo( midRect1.topRight() ); path1.lineTo( midRect1.topLeft() ); path1.lineTo( midRect1.bottomLeft() ); QPainterPath path2; path2.moveTo( outerRect.bottomLeft() ); path2.lineTo( outerRect.bottomRight() ); path2.lineTo( outerRect.topRight() ); path2.lineTo( midRect1.topRight() ); path2.lineTo( midRect1.bottomRight() ); path2.lineTo( midRect1.bottomLeft() ); QPainterPath path3; path3.moveTo( midRect2.bottomLeft() ); path3.lineTo( midRect2.topLeft() ); path3.lineTo( midRect2.topRight() ); path3.lineTo( innerRect.topRight() ); path3.lineTo( innerRect.topLeft() ); path3.lineTo( innerRect.bottomLeft() ); QPainterPath path4; path4.moveTo( midRect2.bottomLeft() ); path4.lineTo( midRect2.bottomRight() ); path4.lineTo( midRect2.topRight() ); path4.lineTo( innerRect.topRight() ); path4.lineTo( innerRect.bottomRight() ); path4.lineTo( innerRect.bottomLeft() ); QPainterPath path5; path5.addRect( midRect1 ); path5.addRect( midRect2 ); painter->setPen( Qt::NoPen ); QBrush brush1 = palette.dark().color(); QBrush brush2 = palette.light().color(); if ( shadow == QFrame::Raised ) qSwap( brush1, brush2 ); painter->setBrush( brush1 ); painter->drawPath( path1 ); painter->drawPath( path4 ); painter->setBrush( brush2 ); painter->drawPath( path2 ); painter->drawPath( path3 ); painter->setBrush( palette.mid() ); painter->drawPath( path5 ); } #if 0 // qDrawWinPanel doesn't result in something nice // on a scalable document like PDF. Better draw a // Panel. else if ( shape == QFrame::WinPanel ) { painter->setRenderHint( QPainter::NonCosmeticDefaultPen, true ); qDrawWinPanel ( painter, rect.toRect(), palette, frameStyle & QFrame::Sunken ); } else if ( shape == QFrame::StyledPanel ) { } #endif else { const QRectF outerRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); const QRectF innerRect = outerRect.adjusted( frameWidth - 1.0, frameWidth - 1.0, -( frameWidth - 1.0 ), -( frameWidth - 1.0 ) ); QPainterPath path1; path1.moveTo( outerRect.bottomLeft() ); path1.lineTo( outerRect.topLeft() ); path1.lineTo( outerRect.topRight() ); path1.lineTo( innerRect.topRight() ); path1.lineTo( innerRect.topLeft() ); path1.lineTo( innerRect.bottomLeft() ); QPainterPath path2; path2.moveTo( outerRect.bottomLeft() ); path2.lineTo( outerRect.bottomRight() ); path2.lineTo( outerRect.topRight() ); path2.lineTo( innerRect.topRight() ); path2.lineTo( innerRect.bottomRight() ); path2.lineTo( innerRect.bottomLeft() ); painter->setPen( Qt::NoPen ); QBrush brush1 = palette.dark().color(); QBrush brush2 = palette.light().color(); if ( shadow == QFrame::Raised ) qSwap( brush1, brush2 ); painter->setBrush( brush1 ); painter->drawPath( path1 ); painter->setBrush( brush2 ); painter->drawPath( path2 ); } } painter->restore(); } /*! Draw a rectangular frame with rounded borders \param painter Painter \param rect Frame rectangle \param xRadius x-radius of the ellipses defining the corners \param yRadius y-radius of the ellipses defining the corners \param palette QPalette::WindowText is used for plain borders QPalette::Dark and QPalette::Light for raised or sunken borders \param lineWidth Line width \param frameStyle bitwise OR´ed value of QFrame::Shape and QFrame::Shadow */ void QwtPainter::drawRoundedFrame( QPainter *painter, const QRectF &rect, double xRadius, double yRadius, const QPalette &palette, int lineWidth, int frameStyle ) { painter->save(); painter->setRenderHint( QPainter::Antialiasing, true ); painter->setBrush( Qt::NoBrush ); double lw2 = lineWidth * 0.5; QRectF r = rect.adjusted( lw2, lw2, -lw2, -lw2 ); QPainterPath path; path.addRoundedRect( r, xRadius, yRadius ); enum Style { Plain, Sunken, Raised }; Style style = Plain; if ( (frameStyle & QFrame::Sunken) == QFrame::Sunken ) style = Sunken; else if ( (frameStyle & QFrame::Raised) == QFrame::Raised ) style = Raised; if ( style != Plain && path.elementCount() == 17 ) { // move + 4 * ( cubicTo + lineTo ) QPainterPath pathList[8]; for ( int i = 0; i < 4; i++ ) { const int j = i * 4 + 1; pathList[ 2 * i ].moveTo( path.elementAt(j - 1).x, path.elementAt( j - 1 ).y ); pathList[ 2 * i ].cubicTo( path.elementAt(j + 0).x, path.elementAt(j + 0).y, path.elementAt(j + 1).x, path.elementAt(j + 1).y, path.elementAt(j + 2).x, path.elementAt(j + 2).y ); pathList[ 2 * i + 1 ].moveTo( path.elementAt(j + 2).x, path.elementAt(j + 2).y ); pathList[ 2 * i + 1 ].lineTo( path.elementAt(j + 3).x, path.elementAt(j + 3).y ); } QColor c1( palette.color( QPalette::Dark ) ); QColor c2( palette.color( QPalette::Light ) ); if ( style == Raised ) qSwap( c1, c2 ); for ( int i = 0; i < 4; i++ ) { QRectF r = pathList[2 * i].controlPointRect(); QPen arcPen; arcPen.setCapStyle( Qt::FlatCap ); arcPen.setWidth( lineWidth ); QPen linePen; linePen.setCapStyle( Qt::FlatCap ); linePen.setWidth( lineWidth ); switch( i ) { case 0: { arcPen.setColor( c1 ); linePen.setColor( c1 ); break; } case 1: { QLinearGradient gradient; gradient.setStart( r.topLeft() ); gradient.setFinalStop( r.bottomRight() ); gradient.setColorAt( 0.0, c1 ); gradient.setColorAt( 1.0, c2 ); arcPen.setBrush( gradient ); linePen.setColor( c2 ); break; } case 2: { arcPen.setColor( c2 ); linePen.setColor( c2 ); break; } case 3: { QLinearGradient gradient; gradient.setStart( r.bottomRight() ); gradient.setFinalStop( r.topLeft() ); gradient.setColorAt( 0.0, c2 ); gradient.setColorAt( 1.0, c1 ); arcPen.setBrush( gradient ); linePen.setColor( c1 ); break; } } painter->setPen( arcPen ); painter->drawPath( pathList[ 2 * i] ); painter->setPen( linePen ); painter->drawPath( pathList[ 2 * i + 1] ); } } else { QPen pen( palette.color( QPalette::WindowText ), lineWidth ); painter->setPen( pen ); painter->drawPath( path ); } painter->restore(); } /*! Draw a color bar into a rectangle \param painter Painter \param colorMap Color map \param interval Value range \param scaleMap Scale map \param orientation Orientation \param rect Traget rectangle */ void QwtPainter::drawColorBar( QPainter *painter, const QwtColorMap &colorMap, const QwtInterval &interval, const QwtScaleMap &scaleMap, Qt::Orientation orientation, const QRectF &rect ) { QVector colorTable; if ( colorMap.format() == QwtColorMap::Indexed ) colorTable = colorMap.colorTable( interval ); QColor c; const QRect devRect = rect.toAlignedRect(); /* We paint to a pixmap first to have something scalable for printing ( f.e. in a Pdf document ) */ QPixmap pixmap( devRect.size() ); QPainter pmPainter( &pixmap ); pmPainter.translate( -devRect.x(), -devRect.y() ); if ( orientation == Qt::Horizontal ) { QwtScaleMap sMap = scaleMap; sMap.setPaintInterval( rect.left(), rect.right() ); for ( int x = devRect.left(); x <= devRect.right(); x++ ) { const double value = sMap.invTransform( x ); if ( colorMap.format() == QwtColorMap::RGB ) c.setRgb( colorMap.rgb( interval, value ) ); else c = colorTable[colorMap.colorIndex( interval, value )]; pmPainter.setPen( c ); pmPainter.drawLine( x, devRect.top(), x, devRect.bottom() ); } } else // Vertical { QwtScaleMap sMap = scaleMap; sMap.setPaintInterval( rect.bottom(), rect.top() ); for ( int y = devRect.top(); y <= devRect.bottom(); y++ ) { const double value = sMap.invTransform( y ); if ( colorMap.format() == QwtColorMap::RGB ) c.setRgb( colorMap.rgb( interval, value ) ); else c = colorTable[colorMap.colorIndex( interval, value )]; pmPainter.setPen( c ); pmPainter.drawLine( devRect.left(), y, devRect.right(), y ); } } pmPainter.end(); drawPixmap( painter, rect, pixmap ); } static inline void qwtFillRect( const QWidget *widget, QPainter *painter, const QRect &rect, const QBrush &brush) { if ( brush.style() == Qt::TexturePattern ) { painter->save(); painter->setClipRect( rect ); painter->drawTiledPixmap(rect, brush.texture(), rect.topLeft()); painter->restore(); } else if ( brush.gradient() ) { painter->save(); painter->setClipRect( rect ); painter->fillRect(0, 0, widget->width(), widget->height(), brush); painter->restore(); } else { painter->fillRect(rect, brush); } } /*! Fill a pixmap with the content of a widget In Qt >= 5.0 QPixmap::fill() is a nop, in Qt 4.x it is buggy for backgrounds with gradients. Thus fillPixmap() offers an alternative implementation. \param widget Widget \param pixmap Pixmap to be filled \param offset Offset \sa QPixmap::fill() */ void QwtPainter::fillPixmap( const QWidget *widget, QPixmap &pixmap, const QPoint &offset ) { const QRect rect( offset, pixmap.size() ); QPainter painter( &pixmap ); painter.translate( -offset ); const QBrush autoFillBrush = widget->palette().brush( widget->backgroundRole() ); if ( !( widget->autoFillBackground() && autoFillBrush.isOpaque() ) ) { const QBrush bg = widget->palette().brush( QPalette::Window ); qwtFillRect( widget, &painter, rect, bg); } if ( widget->autoFillBackground() ) qwtFillRect( widget, &painter, rect, autoFillBrush); if ( widget->testAttribute(Qt::WA_StyledBackground) ) { painter.setClipRegion( rect ); QStyleOption opt; opt.initFrom( widget ); widget->style()->drawPrimitive( QStyle::PE_Widget, &opt, &painter, widget ); } } /*! Fill rect with the background of a widget \param painter Painter \param rect Rectangle to be filled \param widget Widget \sa QStyle::PE_Widget, QWidget::backgroundRole() */ void QwtPainter::drawBackgound( QPainter *painter, const QRectF &rect, const QWidget *widget ) { if ( widget->testAttribute( Qt::WA_StyledBackground ) ) { QStyleOption opt; opt.initFrom( widget ); opt.rect = rect.toAlignedRect(); widget->style()->drawPrimitive( QStyle::PE_Widget, &opt, painter, widget); } else { const QBrush brush = widget->palette().brush( widget->backgroundRole() ); painter->fillRect( rect, brush ); } } /*! \return A pixmap that can be used as backing store \param widget Widget, for which the backinstore is intended \param size Size of the pixmap */ QPixmap QwtPainter::backingStore( QWidget *widget, const QSize &size ) { QPixmap pm; #define QWT_HIGH_DPI 1 #if QT_VERSION >= 0x050000 && QWT_HIGH_DPI qreal pixelRatio = 1.0; if ( widget && widget->windowHandle() ) { pixelRatio = widget->windowHandle()->devicePixelRatio(); } else { if ( qApp ) pixelRatio = qApp->devicePixelRatio(); } pm = QPixmap( size * pixelRatio ); pm.setDevicePixelRatio( pixelRatio ); #else Q_UNUSED( widget ) pm = QPixmap( size ); #endif #if QT_VERSION < 0x050000 #ifdef Q_WS_X11 if ( widget && isX11GraphicsSystem() ) { if ( pm.x11Info().screen() != widget->x11Info().screen() ) pm.x11SetScreen( widget->x11Info().screen() ); } #endif #endif return pm; } linssid-2.7/qwt-lib/src/qwt_point_data.cpp000644 001750 001750 00000015247 12151666703 021574 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_data.h" #include "qwt_math.h" #include /*! Constructor \param x Array of x values \param y Array of y values \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples() */ QwtPointArrayData::QwtPointArrayData( const QVector &x, const QVector &y ): d_x( x ), d_y( y ) { } /*! Constructor \param x Array of x values \param y Array of y values \param size Size of the x and y arrays \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples() */ QwtPointArrayData::QwtPointArrayData( const double *x, const double *y, size_t size ) { d_x.resize( size ); ::memcpy( d_x.data(), x, size * sizeof( double ) ); d_y.resize( size ); ::memcpy( d_y.data(), y, size * sizeof( double ) ); } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPointArrayData::boundingRect() const { if ( d_boundingRect.width() < 0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } //! \return Size of the data set size_t QwtPointArrayData::size() const { return qMin( d_x.size(), d_y.size() ); } /*! Return the sample at position i \param index Index \return Sample at position i */ QPointF QwtPointArrayData::sample( size_t index ) const { return QPointF( d_x[int( index )], d_y[int( index )] ); } //! \return Array of the x-values const QVector &QwtPointArrayData::xData() const { return d_x; } //! \return Array of the y-values const QVector &QwtPointArrayData::yData() const { return d_y; } /*! Constructor \param x Array of x values \param y Array of y values \param size Size of the x and y arrays \warning The programmer must assure that the memory blocks referenced by the pointers remain valid during the lifetime of the QwtPlotCPointer object. \sa QwtPlotCurve::setData(), QwtPlotCurve::setRawSamples() */ QwtCPointerData::QwtCPointerData( const double *x, const double *y, size_t size ): d_x( x ), d_y( y ), d_size( size ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtCPointerData::boundingRect() const { if ( d_boundingRect.width() < 0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } //! \return Size of the data set size_t QwtCPointerData::size() const { return d_size; } /*! Return the sample at position i \param index Index \return Sample at position i */ QPointF QwtCPointerData::sample( size_t index ) const { return QPointF( d_x[int( index )], d_y[int( index )] ); } //! \return Array of the x-values const double *QwtCPointerData::xData() const { return d_x; } //! \return Array of the y-values const double *QwtCPointerData::yData() const { return d_y; } /*! Constructor \param size Number of points \param interval Bounding interval for the points \sa setInterval(), setSize() */ QwtSyntheticPointData::QwtSyntheticPointData( size_t size, const QwtInterval &interval ): d_size( size ), d_interval( interval ) { } /*! Change the number of points \param size Number of points \sa size(), setInterval() */ void QwtSyntheticPointData::setSize( size_t size ) { d_size = size; } /*! \return Number of points \sa setSize(), interval() */ size_t QwtSyntheticPointData::size() const { return d_size; } /*! Set the bounding interval \param interval Interval \sa interval(), setSize() */ void QwtSyntheticPointData::setInterval( const QwtInterval &interval ) { d_interval = interval.normalized(); } /*! \return Bounding interval \sa setInterval(), size() */ QwtInterval QwtSyntheticPointData::interval() const { return d_interval; } /*! Set a the "rectangle of interest" QwtPlotSeriesItem defines the current area of the plot canvas as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ). If interval().isValid() == false the x values are calculated in the interval rect.left() -> rect.right(). \sa rectOfInterest() */ void QwtSyntheticPointData::setRectOfInterest( const QRectF &rect ) { d_rectOfInterest = rect; d_intervalOfInterest = QwtInterval( rect.left(), rect.right() ).normalized(); } /*! \return "rectangle of interest" \sa setRectOfInterest() */ QRectF QwtSyntheticPointData::rectOfInterest() const { return d_rectOfInterest; } /*! \brief Calculate the bounding rectangle This implementation iterates over all points, what could often be implemented much faster using the characteristics of the series. When there are many points it is recommended to overload and reimplement this method using the characteristics of the series ( if possible ). \return Bounding rectangle */ QRectF QwtSyntheticPointData::boundingRect() const { if ( d_size == 0 || !( d_interval.isValid() || d_intervalOfInterest.isValid() ) ) { return QRectF( 1.0, 1.0, -2.0, -2.0 ); // something invalid } return qwtBoundingRect( *this ); } /*! Calculate the point from an index \param index Index \return QPointF(x(index), y(x(index))); \warning For invalid indices ( index < 0 || index >= size() ) (0, 0) is returned. */ QPointF QwtSyntheticPointData::sample( size_t index ) const { if ( index >= d_size ) return QPointF( 0, 0 ); const double xValue = x( index ); const double yValue = y( xValue ); return QPointF( xValue, yValue ); } /*! Calculate a x-value from an index x values are calculated by dividing an interval into equidistant steps. If !interval().isValid() the interval is calculated from the "rectangle of interest". \param index Index of the requested point \return Calculated x coordinate \sa interval(), rectOfInterest(), y() */ double QwtSyntheticPointData::x( uint index ) const { const QwtInterval &interval = d_interval.isValid() ? d_interval : d_intervalOfInterest; if ( !interval.isValid() || d_size == 0 || index >= d_size ) return 0.0; const double dx = interval.width() / d_size; return interval.minValue() + index * dx; } linssid-2.7/qwt-lib/src/qwt_dial.h000644 001750 001750 00000011543 12151666701 020021 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DIAL_H #define QWT_DIAL_H 1 #include "qwt_global.h" #include "qwt_abstract_slider.h" #include "qwt_abstract_scale_draw.h" #include #include class QwtDialNeedle; class QwtRoundScaleDraw; /*! \brief QwtDial class provides a rounded range control. QwtDial is intended as base class for dial widgets like speedometers, compass widgets, clocks ... \image html dials2.png A dial contains a scale and a needle indicating the current value of the dial. Depending on Mode one of them is fixed and the other is rotating. If not isReadOnly() the dial can be rotated by dragging the mouse or using keyboard inputs (see QwtAbstractSlider::keyPressEvent()). A dial might be wrapping, what means a rotation below/above one limit continues on the other limit (f.e compass). The scale might cover any arc of the dial, its values are related to the origin() of the dial. Often dials have to be updated very often according to values from external devices. For these high refresh rates QwtDial caches as much as possible. For derived classes it might be necessary to clear these caches manually according to attribute changes using invalidateCache(). \sa QwtCompass, QwtAnalogClock, QwtDialNeedle \note The controls and dials examples shows different types of dials. \note QDial is more similar to QwtKnob than to QwtDial */ class QWT_EXPORT QwtDial: public QwtAbstractSlider { Q_OBJECT Q_ENUMS( Shadow Mode Direction ) Q_PROPERTY( int lineWidth READ lineWidth WRITE setLineWidth ) Q_PROPERTY( Shadow frameShadow READ frameShadow WRITE setFrameShadow ) Q_PROPERTY( Mode mode READ mode WRITE setMode ) Q_PROPERTY( double origin READ origin WRITE setOrigin ) Q_PROPERTY( double minScaleArc READ minScaleArc WRITE setMinScaleArc ) Q_PROPERTY( double maxScaleArc READ maxScaleArc WRITE setMaxScaleArc ) public: /*! \brief Frame shadow Unfortunately it is not possible to use QFrame::Shadow as a property of a widget that is not derived from QFrame. The following enum is made for the designer only. It is safe to use QFrame::Shadow instead. */ enum Shadow { //! QFrame::Plain Plain = QFrame::Plain, //! QFrame::Raised Raised = QFrame::Raised, //! QFrame::Sunken Sunken = QFrame::Sunken }; //! Mode controlling whether the needle or the scale is rotating enum Mode { //! The needle is rotating RotateNeedle, //! The needle is fixed, the scales are rotating RotateScale }; explicit QwtDial( QWidget *parent = NULL ); virtual ~QwtDial(); void setFrameShadow( Shadow ); Shadow frameShadow() const; void setLineWidth( int ); int lineWidth() const; void setMode( Mode ); Mode mode() const; void setScaleArc( double min, double max ); void setMinScaleArc( double min ); double minScaleArc() const; void setMaxScaleArc( double min ); double maxScaleArc() const; virtual void setOrigin( double ); double origin() const; void setNeedle( QwtDialNeedle * ); const QwtDialNeedle *needle() const; QwtDialNeedle *needle(); QRect boundingRect() const; QRect innerRect() const; virtual QRect scaleInnerRect() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtRoundScaleDraw * ); QwtRoundScaleDraw *scaleDraw(); const QwtRoundScaleDraw *scaleDraw() const; protected: virtual void wheelEvent( QWheelEvent * ); virtual void paintEvent( QPaintEvent * ); virtual void changeEvent( QEvent * ); virtual void drawFrame( QPainter *p ); virtual void drawContents( QPainter * ) const; virtual void drawFocusIndicator( QPainter * ) const; void invalidateCache(); virtual void drawScale( QPainter *, const QPointF ¢er, double radius ) const; virtual void drawScaleContents( QPainter *painter, const QPointF ¢er, double radius ) const; virtual void drawNeedle( QPainter *, const QPointF &, double radius, double direction, QPalette::ColorGroup ) const; virtual double scrolledTo( const QPoint & ) const; virtual bool isScrollPosition( const QPoint & ) const; virtual void sliderChange(); virtual void scaleChange(); private: void setAngleRange( double angle, double span ); void drawNeedle( QPainter * ) const; class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/textengines/textengines.pri000644 001750 001750 00000002060 12345432400 022645 0ustar00warrenwarren000000 000000 ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ QWT_ROOT = $${PWD}/.. include( $${QWT_ROOT}/qwtconfig.pri ) include( $${QWT_ROOT}/qwtbuild.pri ) include( $${QWT_ROOT}/qwtfunctions.pri ) TEMPLATE = lib DESTDIR = $${QWT_ROOT}/lib INCLUDEPATH += $${QWT_ROOT}/src DEPENDPATH += $${QWT_ROOT}/src contains(QWT_CONFIG, QwtDll) { CONFIG += dll win32|symbian: DEFINES += QT_DLL QWT_DLL QWT_MAKEDLL } else { CONFIG += staticlib } contains(QWT_CONFIG, QwtFramework) { CONFIG += lib_bundle LIBS += -F$${QWT_ROOT}/lib } else { LIBS += -L$${QWT_ROOT}/lib } qwtAddLibrary(qwt) # Install directives target.path = $${QWT_INSTALL_LIBS} doc.path = $${QWT_INSTALL_DOCS} # INSTALLS = target # linssid no install linssid-2.7/debian/docs000664 001750 001750 00000000000 12345373237 015763 0ustar00warrenwarren000000 000000 linssid-2.7/qwt-lib/src/qwt_plot_canvas.h000644 001750 001750 00000011530 12151666701 021415 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CANVAS_H #define QWT_PLOT_CANVAS_H #include "qwt_global.h" #include #include class QwtPlot; class QPixmap; /*! \brief Canvas of a QwtPlot. Canvas is the widget where all plot items are displayed \sa QwtPlot::setCanvas(), QwtPlotGLCanvas */ class QWT_EXPORT QwtPlotCanvas : public QFrame { Q_OBJECT Q_PROPERTY( double borderRadius READ borderRadius WRITE setBorderRadius ) public: /*! \brief Paint attributes The default setting enables BackingStore and Opaque. \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { /*! \brief Paint double buffered reusing the content of the pixmap buffer when possible. Using a backing store might improve the performance significantly, when working with widget overlays ( like rubber bands ). Disabling the cache might improve the performance for incremental paints (using QwtPlotDirectPainter ). \sa backingStore(), invalidateBackingStore() */ BackingStore = 1, /*! \brief Try to fill the complete contents rectangle of the plot canvas When using styled backgrounds Qt assumes, that the canvas doesn't fill its area completely ( f.e because of rounded borders ) and fills the area below the canvas. When this is done with gradients it might result in a serious performance bottleneck - depending on the size. When the Opaque attribute is enabled the canvas tries to identify the gaps with some heuristics and to fill those only. \warning Will not work for semitransparent backgrounds */ Opaque = 2, /*! \brief Try to improve painting of styled backgrounds QwtPlotCanvas supports the box model attributes for customizing the layout with style sheets. Unfortunately the design of Qt style sheets has no concept how to handle backgrounds with rounded corners - beside of padding. When HackStyledBackground is enabled the plot canvas tries to separate the background from the background border by reverse engineering to paint the background before and the border after the plot items. In this order the border gets perfectly antialiased and you can avoid some pixel artifacts in the corners. */ HackStyledBackground = 4, /*! When ImmediatePaint is set replot() calls repaint() instead of update(). \sa replot(), QWidget::repaint(), QWidget::update() */ ImmediatePaint = 8 }; //! Paint attributes typedef QFlags PaintAttributes; /*! \brief Focus indicator The default setting is NoFocusIndicator \sa setFocusIndicator(), focusIndicator(), paintFocus() */ enum FocusIndicator { //! Don't paint a focus indicator NoFocusIndicator, /*! The focus is related to the complete canvas. Paint the focus indicator using paintFocus() */ CanvasFocusIndicator, /*! The focus is related to an item (curve, point, ...) on the canvas. It is up to the application to display a focus indication using f.e. highlighting. */ ItemFocusIndicator }; explicit QwtPlotCanvas( QwtPlot * = NULL ); virtual ~QwtPlotCanvas(); QwtPlot *plot(); const QwtPlot *plot() const; void setFocusIndicator( FocusIndicator ); FocusIndicator focusIndicator() const; void setBorderRadius( double ); double borderRadius() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; const QPixmap *backingStore() const; void invalidateBackingStore(); virtual bool event( QEvent * ); Q_INVOKABLE QPainterPath borderPath( const QRect & ) const; public Q_SLOTS: void replot(); protected: virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); virtual void drawFocusIndicator( QPainter * ); virtual void drawBorder( QPainter * ); void updateStyleSheetInfo(); private: void drawCanvas( QPainter *, bool withBackground ); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCanvas::PaintAttributes ) #endif linssid-2.7/qwt-lib/src/qwt_date.cpp000644 001750 001750 00000037376 12151666703 020376 0ustar00warrenwarren000000 000000 #include "qwt_date.h" #include #include #include #include #include #if QT_VERSION >= 0x050000 typedef qint64 QwtJulianDay; static const QwtJulianDay minJulianDayD = Q_INT64_C( -784350574879 ); static const QwtJulianDay maxJulianDayD = Q_INT64_C( 784354017364 ); #else // QDate stores the Julian day as unsigned int, but // but it is QDate::fromJulianDay( int ). That's why // we have the range [ 1, INT_MAX ] typedef int QwtJulianDay; static const QwtJulianDay minJulianDayD = 1; static const QwtJulianDay maxJulianDayD = std::numeric_limits::max(); #endif static inline Qt::DayOfWeek qwtFirstDayOfWeek() { #if QT_VERSION >= 0x040800 return QLocale().firstDayOfWeek(); #else switch( QLocale().country() ) { case QLocale::Maldives: return Qt::Friday; case QLocale::Afghanistan: case QLocale::Algeria: case QLocale::Bahrain: case QLocale::Djibouti: case QLocale::Egypt: case QLocale::Eritrea: case QLocale::Ethiopia: case QLocale::Iran: case QLocale::Iraq: case QLocale::Jordan: case QLocale::Kenya: case QLocale::Kuwait: case QLocale::LibyanArabJamahiriya: case QLocale::Morocco: case QLocale::Oman: case QLocale::Qatar: case QLocale::SaudiArabia: case QLocale::Somalia: case QLocale::Sudan: case QLocale::Tunisia: case QLocale::Yemen: return Qt::Saturday; case QLocale::AmericanSamoa: case QLocale::Argentina: case QLocale::Azerbaijan: case QLocale::Botswana: case QLocale::Canada: case QLocale::China: case QLocale::FaroeIslands: case QLocale::Georgia: case QLocale::Greenland: case QLocale::Guam: case QLocale::HongKong: case QLocale::Iceland: case QLocale::India: case QLocale::Ireland: case QLocale::Israel: case QLocale::Jamaica: case QLocale::Japan: case QLocale::Kyrgyzstan: case QLocale::Lao: case QLocale::Malta: case QLocale::MarshallIslands: case QLocale::Macau: case QLocale::Mongolia: case QLocale::NewZealand: case QLocale::NorthernMarianaIslands: case QLocale::Pakistan: case QLocale::Philippines: case QLocale::RepublicOfKorea: case QLocale::Singapore: case QLocale::SyrianArabRepublic: case QLocale::Taiwan: case QLocale::Thailand: case QLocale::TrinidadAndTobago: case QLocale::UnitedStates: case QLocale::UnitedStatesMinorOutlyingIslands: case QLocale::USVirginIslands: case QLocale::Uzbekistan: case QLocale::Zimbabwe: return Qt::Sunday; default: return Qt::Monday; } #endif } static inline void qwtFloorTime( QwtDate::IntervalType intervalType, QDateTime &dt ) { // when dt is inside the special hour where DST is ending // an hour is no unique. Therefore we have to // use UTC time. const Qt::TimeSpec timeSpec = dt.timeSpec(); if ( timeSpec == Qt::LocalTime ) dt = dt.toTimeSpec( Qt::UTC ); const QTime t = dt.time(); switch( intervalType ) { case QwtDate::Second: { dt.setTime( QTime( t.hour(), t.minute(), t.second() ) ); break; } case QwtDate::Minute: { dt.setTime( QTime( t.hour(), t.minute(), 0 ) ); break; } case QwtDate::Hour: { dt.setTime( QTime( t.hour(), 0, 0 ) ); break; } default: break; } if ( timeSpec == Qt::LocalTime ) dt = dt.toTimeSpec( Qt::LocalTime ); } static inline QDateTime qwtToTimeSpec( const QDateTime &dt, Qt::TimeSpec spec ) { if ( dt.timeSpec() == spec ) return dt; const qint64 jd = dt.date().toJulianDay(); if ( jd < 0 || jd >= INT_MAX ) { // the conversion between local time and UTC // is internally limited. To avoid // overflows we simply ignore the difference // for those dates QDateTime dt2 = dt; dt2.setTimeSpec( spec ); return dt2; } return dt.toTimeSpec( spec ); } static inline double qwtToJulianDay( int year, int month, int day ) { // code from QDate but using doubles to avoid overflows // for large values const int m1 = ( month - 14 ) / 12; const int m2 = ( 367 * ( month - 2 - 12 * m1 ) ) / 12; const double y1 = ::floor( ( 4900.0 + year + m1 ) / 100 ); return ::floor( ( 1461.0 * ( year + 4800 + m1 ) ) / 4 ) + m2 - ::floor( ( 3 * y1 ) / 4 ) + day - 32075; } static inline qint64 qwtFloorDiv64( qint64 a, int b ) { if ( a < 0 ) a -= b - 1; return a / b; } static inline qint64 qwtFloorDiv( int a, int b ) { if ( a < 0 ) a -= b - 1; return a / b; } static inline QDate qwtToDate( int year, int month = 1, int day = 1 ) { #if QT_VERSION >= 0x050000 return QDate( year, month, day ); #else if ( year > 100000 ) { // code from QDate but using doubles to avoid overflows // for large values const int m1 = ( month - 14 ) / 12; const int m2 = ( 367 * ( month - 2 - 12 * m1 ) ) / 12; const double y1 = ::floor( ( 4900.0 + year + m1 ) / 100 ); const double jd = ::floor( ( 1461.0 * ( year + 4800 + m1 ) ) / 4 ) + m2 - ::floor( ( 3 * y1 ) / 4 ) + day - 32075; if ( jd > maxJulianDayD ) { qWarning() << "qwtToDate: overflow"; return QDate(); } return QDate::fromJulianDay( static_cast( jd ) ); } else { return QDate( year, month, day ); } #endif } /*! Translate from double to QDateTime \param value Number of milliseconds since the epoch, 1970-01-01T00:00:00 UTC \param timeSpec Time specification \return Datetime value \sa toDouble(), QDateTime::setMSecsSinceEpoch() \note The return datetime for Qt::OffsetFromUTC will be Qt::UTC */ QDateTime QwtDate::toDateTime( double value, Qt::TimeSpec timeSpec ) { const int msecsPerDay = 86400000; const double days = static_cast( ::floor( value / msecsPerDay ) ); const double jd = QwtDate::JulianDayForEpoch + days; if ( ( jd > maxJulianDayD ) || ( jd < minJulianDayD ) ) { qWarning() << "QwtDate::toDateTime: overflow"; return QDateTime(); } const QDate d = QDate::fromJulianDay( static_cast( jd ) ); const int msecs = static_cast( value - days * msecsPerDay ); static const QTime timeNull( 0, 0, 0, 0 ); QDateTime dt( d, timeNull.addMSecs( msecs ), Qt::UTC ); if ( timeSpec == Qt::LocalTime ) dt = qwtToTimeSpec( dt, timeSpec ); return dt; } /*! Translate from QDateTime to double \param dateTime Datetime value \return Number of milliseconds since 1970-01-01T00:00:00 UTC has passed. \sa toDateTime(), QDateTime::toMSecsSinceEpoch() \warning For values very far below or above 1970-01-01 UTC rounding errors will happen due to the limited significance of a double. */ double QwtDate::toDouble( const QDateTime &dateTime ) { const int msecsPerDay = 86400000; const QDateTime dt = qwtToTimeSpec( dateTime, Qt::UTC ); const double days = dt.date().toJulianDay() - QwtDate::JulianDayForEpoch; const QTime time = dt.time(); const double secs = 3600.0 * time.hour() + 60.0 * time.minute() + time.second(); return days * msecsPerDay + time.msec() + 1000.0 * secs; } /*! Ceil a datetime according the interval type \param dateTime Datetime value \param intervalType Interval type, how to ceil. F.e. when intervalType = QwtDate::Months, the result will be ceiled to the next beginning of a month \return Ceiled datetime \sa floor() */ QDateTime QwtDate::ceil( const QDateTime &dateTime, IntervalType intervalType ) { if ( dateTime.date() >= QwtDate::maxDate() ) return dateTime; QDateTime dt = dateTime; switch ( intervalType ) { case QwtDate::Millisecond: { break; } case QwtDate::Second: { qwtFloorTime( QwtDate::Second, dt ); if ( dt < dateTime ) dt.addSecs( 1 ); break; } case QwtDate::Minute: { qwtFloorTime( QwtDate::Minute, dt ); if ( dt < dateTime ) dt.addSecs( 60 ); break; } case QwtDate::Hour: { qwtFloorTime( QwtDate::Hour, dt ); if ( dt < dateTime ) dt.addSecs( 3600 ); break; } case QwtDate::Day: { dt.setTime( QTime( 0, 0 ) ); if ( dt < dateTime ) dt = dt.addDays( 1 ); break; } case QwtDate::Week: { dt.setTime( QTime( 0, 0 ) ); if ( dt < dateTime ) dt = dt.addDays( 1 ); int days = qwtFirstDayOfWeek() - dt.date().dayOfWeek(); if ( days < 0 ) days += 7; dt = dt.addDays( days ); break; } case QwtDate::Month: { dt.setTime( QTime( 0, 0 ) ); dt.setDate( qwtToDate( dateTime.date().year(), dateTime.date().month() ) ); if ( dt < dateTime ) dt.addMonths( 1 ); break; } case QwtDate::Year: { dt.setTime( QTime( 0, 0 ) ); const QDate d = dateTime.date(); int year = d.year(); if ( d.month() > 1 || d.day() > 1 || !dateTime.time().isNull() ) year++; if ( year == 0 ) year++; // there is no year 0 dt.setDate( qwtToDate( year ) ); break; } } return dt; } /*! Floor a datetime according the interval type \param dateTime Datetime value \param intervalType Interval type, how to ceil. F.e. when intervalType = QwtDate::Months, the result will be ceiled to the next beginning of a month \return Floored datetime \sa floor() */ QDateTime QwtDate::floor( const QDateTime &dateTime, IntervalType intervalType ) { if ( dateTime.date() <= QwtDate::minDate() ) return dateTime; QDateTime dt = dateTime; switch ( intervalType ) { case QwtDate::Millisecond: { break; } case QwtDate::Second: case QwtDate::Minute: case QwtDate::Hour: { qwtFloorTime( intervalType, dt ); break; } case QwtDate::Day: { dt.setTime( QTime( 0, 0 ) ); break; } case QwtDate::Week: { dt.setTime( QTime( 0, 0 ) ); int days = dt.date().dayOfWeek() - qwtFirstDayOfWeek(); if ( days < 0 ) days += 7; dt = dt.addDays( -days ); break; } case QwtDate::Month: { dt.setTime( QTime( 0, 0 ) ); const QDate date = qwtToDate( dt.date().year(), dt.date().month() ); dt.setDate( date ); break; } case QwtDate::Year: { dt.setTime( QTime( 0, 0 ) ); const QDate date = qwtToDate( dt.date().year() ); dt.setDate( date ); break; } } return dt; } /*! Minimum for the supported date range The range of valid dates depends on how QDate stores the Julian day internally. - For Qt4 it is "Tue Jan 2 -4713" - For Qt5 it is "Thu Jan 1 -2147483648" \return minimum of the date range \sa maxDate() */ QDate QwtDate::minDate() { static QDate date; if ( !date.isValid() ) date = QDate::fromJulianDay( minJulianDayD ); return date; } /*! Maximum for the supported date range The range of valid dates depends on how QDate stores the Julian day internally. - For Qt4 it is "Tue Jun 3 5874898" - For Qt5 it is "Tue Dec 31 2147483647" \return maximum of the date range \sa minDate() \note The maximum differs between Qt4 and Qt5 */ QDate QwtDate::maxDate() { static QDate date; if ( !date.isValid() ) date = QDate::fromJulianDay( maxJulianDayD ); return date; } /*! \brief Date of the first day of the first week for a year The first day of a week depends on the current locale ( QLocale::firstDayOfWeek() ). \param year Year \param type Option how to identify the first week \return First day of week 0 \sa QLocale::firstDayOfWeek(), weekNumber() */ QDate QwtDate::dateOfWeek0( int year, Week0Type type ) { const Qt::DayOfWeek firstDayOfWeek = qwtFirstDayOfWeek(); QDate dt0( year, 1, 1 ); // floor to the first day of the week int days = dt0.dayOfWeek() - firstDayOfWeek; if ( days < 0 ) days += 7; dt0 = dt0.addDays( -days ); if ( type == QwtDate::FirstThursday ) { // according to ISO 8601 the first week is defined // by the first thursday. int d = Qt::Thursday - firstDayOfWeek; if ( d < 0 ) d += 7; if ( dt0.addDays( d ).year() < year ) dt0 = dt0.addDays( 7 ); } return dt0; } /*! Find the week number of a date - QwtDate::FirstThursday\n Corresponding to ISO 8601 ( see QDate::weekNumber() ). - QwtDate::FirstDay\n Number of weeks that have begun since dateOfWeek0(). \param date Date \param type Option how to identify the first week \return Week number, starting with 1 */ int QwtDate::weekNumber( const QDate &date, Week0Type type ) { int weekNo; if ( type == QwtDate::FirstDay ) { const QDate day0 = dateOfWeek0( date.year(), type ); weekNo = day0.daysTo( date ) / 7 + 1; } else { weekNo = date.weekNumber(); } return weekNo; } /*! Offset in seconds from Coordinated Universal Time The offset depends on the time specification of dateTime: - Qt::UTC 0, dateTime has no offset - Qt::OffsetFromUTC returns dateTime.utcOffset() - Qt::LocalTime: number of seconds from the UTC For Qt::LocalTime the offset depends on the timezone and daylight savings. \param dateTime Datetime value \return Offset in seconds */ int QwtDate::utcOffset( const QDateTime &dateTime ) { int seconds = 0; switch( dateTime.timeSpec() ) { case Qt::UTC: { break; } case Qt::OffsetFromUTC: { seconds = dateTime.utcOffset(); } default: { const QDateTime dt1( dateTime.date(), dateTime.time(), Qt::UTC ); seconds = dateTime.secsTo( dt1 ); } } return seconds; } /*! Translate a datetime into a string Beside the format expressions documented in QDateTime::toString() the following expressions are supported: - w\n week number: ( 1 - 53 ) - ww\n week number with a leading zero ( 01 - 53 ) \param dateTime Datetime value \param format Format string \param week0Type Specification of week 0 \return Datetime string \sa QDateTime::toString(), weekNumber(), QwtDateScaleDraw */ QString QwtDate::toString( const QDateTime &dateTime, const QString & format, Week0Type week0Type ) { QString weekNo; weekNo.setNum( QwtDate::weekNumber( dateTime.date(), week0Type ) ); QString weekNoWW; if ( weekNo.length() == 1 ) weekNoWW += "0"; weekNoWW += weekNo; QString fmt = format; fmt.replace( "ww", weekNoWW ); fmt.replace( "w", weekNo ); return dateTime.toString( fmt ); } linssid-2.7/qwt-lib/src/qwt_plot_tradingcurve.cpp000644 001750 001750 00000043617 12151666703 023207 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_tradingcurve.h" #include "qwt_scale_map.h" #include "qwt_clipper.h" #include "qwt_painter.h" #include static inline bool qwtIsSampleInside( const QwtOHLCSample &sample, double tMin, double tMax, double vMin, double vMax ) { const double t = sample.time; const QwtInterval interval = sample.boundingInterval(); const bool isOffScreen = ( t < tMin ) || ( t > tMax ) || ( interval.maxValue() < vMin ) || ( interval.minValue() > vMax ); return !isOffScreen; } class QwtPlotTradingCurve::PrivateData { public: PrivateData(): symbolStyle( QwtPlotTradingCurve::CandleStick ), symbolExtent( 0.6 ), minSymbolWidth( 2.0 ), maxSymbolWidth( -1.0 ), paintAttributes( QwtPlotTradingCurve::ClipSymbols ) { symbolBrush[0] = QBrush( Qt::white ); symbolBrush[1] = QBrush( Qt::black ); } QwtPlotTradingCurve::SymbolStyle symbolStyle; double symbolExtent; double minSymbolWidth; double maxSymbolWidth; QPen symbolPen; QBrush symbolBrush[2]; // Increasing/Decreasing QwtPlotTradingCurve::PaintAttributes paintAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotTradingCurve::QwtPlotTradingCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotTradingCurve::QwtPlotTradingCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotTradingCurve::~QwtPlotTradingCurve() { delete d_data; } //! Initialize internal members void QwtPlotTradingCurve::init() { setItemAttribute( QwtPlotItem::Legend, true ); setItemAttribute( QwtPlotItem::AutoScale, true ); d_data = new PrivateData; setData( new QwtTradingChartData() ); setZ( 19.0 ); } //! \return QwtPlotItem::Rtti_PlotTradingCurve int QwtPlotTradingCurve::rtti() const { return QwtPlotTradingCurve::Rtti_PlotTradingCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off \sa testPaintAttribute() */ void QwtPlotTradingCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa PaintAttribute, setPaintAttribute() */ bool QwtPlotTradingCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Initialize data with an array of samples. \param samples Vector of samples \sa QwtPlotSeriesItem::setData() */ void QwtPlotTradingCurve::setSamples( const QVector &samples ) { setData( new QwtTradingChartData( samples ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotTradingCurve::setSamples( QwtSeriesData *data ) { setData( data ); } /*! Set the symbol style \param style Symbol style \sa symbolStyle(), setSymbolExtent(), setSymbolPen(), setSymbolBrush() */ void QwtPlotTradingCurve::setSymbolStyle( SymbolStyle style ) { if ( style != d_data->symbolStyle ) { d_data->symbolStyle = style; legendChanged(); itemChanged(); } } /*! \return Symbol style \sa setSymbolStyle(), symbolExtent(), symbolPen(), symbolBrush() */ QwtPlotTradingCurve::SymbolStyle QwtPlotTradingCurve::symbolStyle() const { return d_data->symbolStyle; } /*! Build and assign the symbol pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotTradingCurve::setSymbolPen( const QColor &color, qreal width, Qt::PenStyle style ) { setSymbolPen( QPen( color, width, style ) ); } /*! \brief Set the symbol pen The symbol pen is used for rendering the lines of the bar or candlestick symbols \sa symbolPen(), setSymbolBrush() */ void QwtPlotTradingCurve::setSymbolPen( const QPen &pen ) { if ( pen != d_data->symbolPen ) { d_data->symbolPen = pen; legendChanged(); itemChanged(); } } /*! \return Symbol pen \sa setSymbolPen(), symbolBrush() */ QPen QwtPlotTradingCurve::symbolPen() const { return d_data->symbolPen; } /*! Set the symbol brush \param direction Direction type \param brush Brush used to fill the body of all candlestick symbols with the direction \sa symbolBrush(), setSymbolPen() */ void QwtPlotTradingCurve::setSymbolBrush( Direction direction, const QBrush &brush ) { if ( direction < 0 || direction >= 2 ) return; if ( brush != d_data->symbolBrush[ direction ] ) { d_data->symbolBrush[ direction ] = brush; legendChanged(); itemChanged(); } } /*! \param direction \return Brush used to fill the body of all candlestick symbols with the direction \sa setSymbolPen(), symbolBrush() */ QBrush QwtPlotTradingCurve::symbolBrush( Direction direction ) const { if ( direction < 0 || direction >= 2 ) return QBrush(); return d_data->symbolBrush[ direction ]; } /*! \brief Set the extent of the symbol The width of the symbol is given in scale coordinates. When painting a symbol the width is scaled into paint device coordinates by scaledSymbolWidth(). The scaled width is bounded by minSymbolWidth(), maxSymbolWidth() \param extent Symbol width in scale coordinates \sa symbolExtent(), scaledSymbolWidth(), setMinSymbolWidth(), setMaxSymbolWidth() */ void QwtPlotTradingCurve::setSymbolExtent( double extent ) { extent = qMax( 0.0, extent ); if ( extent != d_data->symbolExtent ) { d_data->symbolExtent = extent; legendChanged(); itemChanged(); } } /*! \return Extent of a symbol in scale coordinates \sa setSymbolExtent(), scaledSymbolWidth(), minSymbolWidth(), maxSymbolWidth() */ double QwtPlotTradingCurve::symbolExtent() const { return d_data->symbolExtent; } /*! Set a minimum for the symbol width \param width Width in paint device coordinates \sa minSymbolWidth(), setMaxSymbolWidth(), setSymbolExtent() */ void QwtPlotTradingCurve::setMinSymbolWidth( double width ) { width = qMax( width, 0.0 ); if ( width != d_data->minSymbolWidth ) { d_data->minSymbolWidth = width; legendChanged(); itemChanged(); } } /*! \return Minmum for the symbol width \sa setMinSymbolWidth(), maxSymbolWidth(), symbolExtent() */ double QwtPlotTradingCurve::minSymbolWidth() const { return d_data->minSymbolWidth; } /*! Set a maximum for the symbol width A value <= 0.0 means an unlimited width \param width Width in paint device coordinates \sa maxSymbolWidth(), setMinSymbolWidth(), setSymbolExtent() */ void QwtPlotTradingCurve::setMaxSymbolWidth( double width ) { if ( width != d_data->maxSymbolWidth ) { d_data->maxSymbolWidth = width; legendChanged(); itemChanged(); } } /*! \return Maximum for the symbol width \sa setMaxSymbolWidth(), minSymbolWidth(), symbolExtent() */ double QwtPlotTradingCurve::maxSymbolWidth() const { return d_data->maxSymbolWidth; } /*! \return Bounding rectangle of all samples. For an empty series the rectangle is invalid. */ QRectF QwtPlotTradingCurve::boundingRect() const { QRectF rect = QwtPlotSeriesItem::boundingRect(); if ( rect.isValid() && orientation() == Qt::Vertical ) rect.setRect( rect.y(), rect.x(), rect.height(), rect.width() ); return rect; } /*! Draw an interval of the curve \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. \sa drawSymbols() */ void QwtPlotTradingCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( to < 0 ) to = dataSize() - 1; if ( from < 0 ) from = 0; if ( from > to ) return; painter->save(); if ( d_data->symbolStyle != QwtPlotTradingCurve::NoSymbol ) drawSymbols( painter, xMap, yMap, canvasRect, from, to ); painter->restore(); } /*! Draw symbols \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted \sa drawSeries() */ void QwtPlotTradingCurve::drawSymbols( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const QRectF tr = QwtScaleMap::invTransform( xMap, yMap, canvasRect ); const QwtScaleMap *timeMap, *valueMap; double tMin, tMax, vMin, vMax; const Qt::Orientation orient = orientation(); if ( orient == Qt::Vertical ) { timeMap = &xMap; valueMap = &yMap; tMin = tr.left(); tMax = tr.right(); vMin = tr.top(); vMax = tr.bottom(); } else { timeMap = &yMap; valueMap = &xMap; vMin = tr.left(); vMax = tr.right(); tMin = tr.top(); tMax = tr.bottom(); } const bool inverted = timeMap->isInverting(); const bool doClip = d_data->paintAttributes & ClipSymbols; const bool doAlign = QwtPainter::roundingAlignment( painter ); double symbolWidth = scaledSymbolWidth( xMap, yMap, canvasRect ); if ( doAlign ) symbolWidth = qFloor( 0.5 * symbolWidth ) * 2.0; QPen pen = d_data->symbolPen; pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); for ( int i = from; i <= to; i++ ) { const QwtOHLCSample s = sample( i ); if ( !doClip || qwtIsSampleInside( s, tMin, tMax, vMin, vMax ) ) { QwtOHLCSample translatedSample; translatedSample.time = timeMap->transform( s.time ); translatedSample.open = valueMap->transform( s.open ); translatedSample.high = valueMap->transform( s.high ); translatedSample.low = valueMap->transform( s.low ); translatedSample.close = valueMap->transform( s.close ); const int brushIndex = ( s.open < s.close ) ? QwtPlotTradingCurve::Increasing : QwtPlotTradingCurve::Decreasing; if ( doAlign ) { translatedSample.time = qRound( translatedSample.time ); translatedSample.open = qRound( translatedSample.open ); translatedSample.high = qRound( translatedSample.high ); translatedSample.low = qRound( translatedSample.low ); translatedSample.close = qRound( translatedSample.close ); } switch( d_data->symbolStyle ) { case Bar: { drawBar( painter, translatedSample, orient, inverted, symbolWidth ); break; } case CandleStick: { painter->setBrush( d_data->symbolBrush[ brushIndex ] ); drawCandleStick( painter, translatedSample, orient, symbolWidth ); break; } default: { if ( d_data->symbolStyle >= UserSymbol ) { painter->setBrush( d_data->symbolBrush[ brushIndex ] ); drawUserSymbol( painter, d_data->symbolStyle, translatedSample, orient, inverted, symbolWidth ); } } } } } } /*! \brief Draw a symbol for a symbol style >= UserSymbol The implementation does nothing and is intended to be overloaded \param painter Qt painter, initialized with pen/brush \param symbolStyle Symbol style \param sample Samples already translated into paint device coordinates \param orientation Vertical or horizontal \param inverted True, when the opposite scale ( Qt::Vertical: x, Qt::Horizontal: y ) is increasing in the opposite direction as QPainter coordinates. \param symbolWidth Width of the symbol in paint device coordinates */ void QwtPlotTradingCurve::drawUserSymbol( QPainter *painter, SymbolStyle symbolStyle, const QwtOHLCSample &sample, Qt::Orientation orientation, bool inverted, double symbolWidth ) const { Q_UNUSED( painter ) Q_UNUSED( symbolStyle ) Q_UNUSED( orientation ) Q_UNUSED( inverted ) Q_UNUSED( symbolWidth ) Q_UNUSED( sample ) } /*! \brief Draw a bar \param painter Qt painter, initialized with pen/brush \param sample Sample, already translated into paint device coordinates \param orientation Vertical or horizontal \param inverted When inverted is false the open tick is painted to the left/top, otherwise it is painted right/bottom. The close tick is painted in the opposite direction of the open tick. painted in the opposite d opposite direction. \param width Width or height of the candle, depending on the orientation \sa Bar */ void QwtPlotTradingCurve::drawBar( QPainter *painter, const QwtOHLCSample &sample, Qt::Orientation orientation, bool inverted, double width ) const { double w2 = 0.5 * width; if ( inverted ) w2 *= -1; if ( orientation == Qt::Vertical ) { QwtPainter::drawLine( painter, sample.time, sample.low, sample.time, sample.high ); QwtPainter::drawLine( painter, sample.time - w2, sample.open, sample.time, sample.open ); QwtPainter::drawLine( painter, sample.time + w2, sample.close, sample.time, sample.close ); } else { QwtPainter::drawLine( painter, sample.low, sample.time, sample.high, sample.time ); QwtPainter::drawLine( painter, sample.open, sample.time - w2, sample.open, sample.time ); QwtPainter::drawLine( painter, sample.close, sample.time + w2, sample.close, sample.time ); } } /*! \brief Draw a candle stick \param painter Qt painter, initialized with pen/brush \param sample Samples already translated into paint device coordinates \param orientation Vertical or horizontal \param width Width or height of the candle, depending on the orientation \sa CandleStick */ void QwtPlotTradingCurve::drawCandleStick( QPainter *painter, const QwtOHLCSample &sample, Qt::Orientation orientation, double width ) const { const double t = sample.time; const double v1 = qMin( sample.low, sample.high ); const double v2 = qMin( sample.open, sample.close ); const double v3 = qMax( sample.low, sample.high ); const double v4 = qMax( sample.open, sample.close ); if ( orientation == Qt::Vertical ) { QwtPainter::drawLine( painter, t, v1, t, v2 ); QwtPainter::drawLine( painter, t, v3, t, v4 ); QRectF rect( t - 0.5 * width, sample.open, width, sample.close - sample.open ); QwtPainter::drawRect( painter, rect ); } else { QwtPainter::drawLine( painter, v1, t, v2, t ); QwtPainter::drawLine( painter, v3, t, v4, t ); const QRectF rect( sample.open, t - 0.5 * width, sample.close - sample.open, width ); QwtPainter::drawRect( painter, rect ); } } /*! \return A rectangle filled with the color of the symbol pen \param index Index of the legend entry ( usually there is only one ) \param size Icon size \sa setLegendIconSize(), legendData() */ QwtGraphic QwtPlotTradingCurve::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); return defaultIcon( d_data->symbolPen.color(), size ); } /*! Calculate the symbol width in paint coordinates The width is calculated by scaling the symbol extent into paint device coordinates bounded by the minimum/maximum symbol width. \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \return Symbol width in paint coordinates \sa symbolExtent(), minSymbolWidth(), maxSymbolWidth() */ double QwtPlotTradingCurve::scaledSymbolWidth( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { Q_UNUSED( canvasRect ); if ( d_data->maxSymbolWidth > 0.0 && d_data->minSymbolWidth >= d_data->maxSymbolWidth ) { return d_data->minSymbolWidth; } const QwtScaleMap *map = ( orientation() == Qt::Vertical ) ? &xMap : &yMap; const double pos = map->transform( map->s1() + d_data->symbolExtent ); double width = qAbs( pos - map->p1() ); width = qMax( width, d_data->minSymbolWidth ); if ( d_data->maxSymbolWidth > 0.0 ) width = qMin( width, d_data->maxSymbolWidth ); return width; } linssid-2.7/linssid-app/linssid.svg000664 001750 001750 00000005557 12355414341 020316 0ustar00warrenwarren000000 000000 image/svg+xml linssid-2.7/qwt-lib/src/qwt_compass.h000644 001750 001750 00000004027 12151666701 020554 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COMPASS_H #define QWT_COMPASS_H 1 #include "qwt_global.h" #include "qwt_dial.h" #include "qwt_round_scale_draw.h" #include #include class QwtCompassRose; /*! \brief A special scale draw made for QwtCompass QwtCompassScaleDraw maps values to strings using a special map, that can be modified by the application The default map consists of the labels N, NE, E, SE, S, SW, W, NW. \sa QwtCompass */ class QWT_EXPORT QwtCompassScaleDraw: public QwtRoundScaleDraw { public: explicit QwtCompassScaleDraw(); explicit QwtCompassScaleDraw( const QMap &map ); void setLabelMap( const QMap &map ); QMap labelMap() const; virtual QwtText label( double value ) const; private: QMap d_labelMap; }; /*! \brief A Compass Widget QwtCompass is a widget to display and enter directions. It consists of a scale, an optional needle and rose. \image html dials1.png \note The examples/dials example shows how to use QwtCompass. */ class QWT_EXPORT QwtCompass: public QwtDial { Q_OBJECT public: explicit QwtCompass( QWidget* parent = NULL ); virtual ~QwtCompass(); void setRose( QwtCompassRose *rose ); const QwtCompassRose *rose() const; QwtCompassRose *rose(); protected: virtual void drawRose( QPainter *, const QPointF ¢er, double radius, double north, QPalette::ColorGroup ) const; virtual void drawScaleContents( QPainter *, const QPointF ¢er, double radius ) const; virtual void keyPressEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_series_data.cpp000644 001750 001750 00000021152 12151666703 021725 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_series_data.h" #include "qwt_math.h" static inline QRectF qwtBoundingRect( const QPointF &sample ) { return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtPoint3D &sample ) { return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtPointPolar &sample ) { return QRectF( sample.azimuth(), sample.radius(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtIntervalSample &sample ) { return QRectF( sample.interval.minValue(), sample.value, sample.interval.maxValue() - sample.interval.minValue(), 0.0 ); } static inline QRectF qwtBoundingRect( const QwtSetSample &sample ) { double minY = sample.set[0]; double maxY = sample.set[0]; for ( int i = 1; i < sample.set.size(); i++ ) { if ( sample.set[i] < minY ) minY = sample.set[i]; if ( sample.set[i] > maxY ) maxY = sample.set[i]; } double minX = sample.value; double maxX = sample.value; return QRectF( minX, minY, maxX - minX, maxY - minY ); } static inline QRectF qwtBoundingRect( const QwtOHLCSample &sample ) { const QwtInterval interval = sample.boundingInterval(); return QRectF( interval.minValue(), sample.time, interval.width(), 0.0 ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ template QRectF qwtBoundingRectT( const QwtSeriesData& series, int from, int to ) { QRectF boundingRect( 1.0, 1.0, -2.0, -2.0 ); // invalid; if ( from < 0 ) from = 0; if ( to < 0 ) to = series.size() - 1; if ( to < from ) return boundingRect; int i; for ( i = from; i <= to; i++ ) { const QRectF rect = qwtBoundingRect( series.sample( i ) ); if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) { boundingRect = rect; i++; break; } } for ( ; i <= to; i++ ) { const QRectF rect = qwtBoundingRect( series.sample( i ) ); if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) { boundingRect.setLeft( qMin( boundingRect.left(), rect.left() ) ); boundingRect.setRight( qMax( boundingRect.right(), rect.right() ) ); boundingRect.setTop( qMin( boundingRect.top(), rect.top() ) ); boundingRect.setBottom( qMax( boundingRect.bottom(), rect.bottom() ) ); } } return boundingRect; } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset The horizontal coordinates represent the azimuth, the vertical coordinates the radius. Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! \brief Calculate the bounding rectangle of a series subset Slow implementation, that iterates over the series. \param series Series \param from Index of the first sample, <= 0 means from the beginning \param to Index of the last sample, < 0 means to the end \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series, int from, int to ) { return qwtBoundingRectT( series, from, to ); } /*! Constructor \param samples Samples */ QwtPointSeriesData::QwtPointSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPointSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtPoint3DSeriesData::QwtPoint3DSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPoint3DSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtIntervalSeriesData::QwtIntervalSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtIntervalSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtSetSeriesData::QwtSetSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtSetSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtTradingChartData::QwtTradingChartData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rectangle The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtTradingChartData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } linssid-2.7/qwt-lib/src/qwt_scale_div.cpp000644 001750 001750 00000016626 12151666703 021405 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_div.h" #include "qwt_math.h" #include /*! Construct a division without ticks \param lowerBound First boundary \param upperBound Second boundary \note lowerBound might be greater than upperBound for inverted scales */ QwtScaleDiv::QwtScaleDiv( double lowerBound, double upperBound ): d_lowerBound( lowerBound ), d_upperBound( upperBound ) { } /*! Construct a scale division \param interval Interval \param ticks List of major, medium and minor ticks */ QwtScaleDiv::QwtScaleDiv( const QwtInterval &interval, QList ticks[NTickTypes] ): d_lowerBound( interval.minValue() ), d_upperBound( interval.maxValue() ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; } /*! Construct a scale division \param lowerBound First boundary \param upperBound Second boundary \param ticks List of major, medium and minor ticks \note lowerBound might be greater than upperBound for inverted scales */ QwtScaleDiv::QwtScaleDiv( double lowerBound, double upperBound, QList ticks[NTickTypes] ): d_lowerBound( lowerBound ), d_upperBound( upperBound ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; } /*! Construct a scale division \param lowerBound First boundary \param upperBound Second boundary \param minorTicks List of minor ticks \param mediumTicks List medium ticks \param majorTicks List of major ticks \note lowerBound might be greater than upperBound for inverted scales */ QwtScaleDiv::QwtScaleDiv( double lowerBound, double upperBound, const QList &minorTicks, const QList &mediumTicks, const QList &majorTicks ): d_lowerBound( lowerBound ), d_upperBound( upperBound ) { d_ticks[ MinorTick ] = minorTicks; d_ticks[ MediumTick ] = mediumTicks; d_ticks[ MajorTick ] = majorTicks; } /*! Change the interval \param lowerBound First boundary \param upperBound Second boundary \note lowerBound might be greater than upperBound for inverted scales */ void QwtScaleDiv::setInterval( double lowerBound, double upperBound ) { d_lowerBound = lowerBound; d_upperBound = upperBound; } /*! Change the interval \param interval Interval */ void QwtScaleDiv::setInterval( const QwtInterval &interval ) { d_lowerBound = interval.minValue(); d_upperBound = interval.maxValue(); } /*! \return lowerBound -> upperBound */ QwtInterval QwtScaleDiv::interval() const { return QwtInterval( d_lowerBound, d_upperBound ); } /*! Set the first boundary \param lowerBound First boundary \sa lowerBiound(), setUpperBound() */ void QwtScaleDiv::setLowerBound( double lowerBound ) { d_lowerBound = lowerBound; } /*! \return First boundary \sa upperBound() */ double QwtScaleDiv::lowerBound() const { return d_lowerBound; } /*! Set the second boundary \param upperBound Second boundary \sa upperBound(), setLowerBound() */ void QwtScaleDiv::setUpperBound( double upperBound ) { d_upperBound = upperBound; } /*! \return upper bound \sa lowerBound() */ double QwtScaleDiv::upperBound() const { return d_upperBound; } /*! \return upperBound() - lowerBound() */ double QwtScaleDiv::range() const { return d_upperBound - d_lowerBound; } /*! \brief Equality operator \return true if this instance is equal to other */ bool QwtScaleDiv::operator==( const QwtScaleDiv &other ) const { if ( d_lowerBound != other.d_lowerBound || d_upperBound != other.d_upperBound ) { return false; } for ( int i = 0; i < NTickTypes; i++ ) { if ( d_ticks[i] != other.d_ticks[i] ) return false; } return true; } /*! \brief Inequality \return true if this instance is not equal to other */ bool QwtScaleDiv::operator!=( const QwtScaleDiv &other ) const { return ( !( *this == other ) ); } //! Check if the scale division is empty( lowerBound() == upperBound() ) bool QwtScaleDiv::isEmpty() const { return ( d_lowerBound == d_upperBound ); } //! Check if the scale division is increasing( lowerBound() <= upperBound() ) bool QwtScaleDiv::isIncreasing() const { return d_lowerBound <= d_upperBound; } /*! Return if a value is between lowerBound() and upperBound() \param value Value \return true/false */ bool QwtScaleDiv::contains( double value ) const { const double min = qMin( d_lowerBound, d_upperBound ); const double max = qMax( d_lowerBound, d_upperBound ); return value >= min && value <= max; } /*! Invert the scale division \sa inverted() */ void QwtScaleDiv::invert() { qSwap( d_lowerBound, d_upperBound ); for ( int i = 0; i < NTickTypes; i++ ) { QList& ticks = d_ticks[i]; const int size = ticks.count(); const int size2 = size / 2; for ( int j = 0; j < size2; j++ ) qSwap( ticks[j], ticks[size - 1 - j] ); } } /*! \return A scale division with inverted boundaries and ticks \sa invert() */ QwtScaleDiv QwtScaleDiv::inverted() const { QwtScaleDiv other = *this; other.invert(); return other; } /*! Return a scale division with an interval [lowerBound, upperBound] where all ticks outside this interval are removed \param lowerBound Lower bound \param upperBound Upper bound \return Scale division with all ticks inside of the given interval \note lowerBound might be greater than upperBound for inverted scales */ QwtScaleDiv QwtScaleDiv::bounded( double lowerBound, double upperBound ) const { const double min = qMin( lowerBound, upperBound ); const double max = qMax( lowerBound, upperBound ); QwtScaleDiv sd; sd.setInterval( lowerBound, upperBound ); for ( int tickType = 0; tickType < QwtScaleDiv::NTickTypes; tickType++ ) { const QList &ticks = d_ticks[ tickType ]; QList boundedTicks; for ( int i = 0; i < ticks.size(); i++ ) { const double tick = ticks[i]; if ( tick >= min && tick <= max ) boundedTicks += tick; } sd.setTicks( tickType, boundedTicks ); } return sd; } /*! Assign ticks \param type MinorTick, MediumTick or MajorTick \param ticks Values of the tick positions */ void QwtScaleDiv::setTicks( int type, const QList &ticks ) { if ( type >= 0 && type < NTickTypes ) d_ticks[type] = ticks; } /*! Return a list of ticks \param type MinorTick, MediumTick or MajorTick \return Tick list */ QList QwtScaleDiv::ticks( int type ) const { if ( type >= 0 && type < NTickTypes ) return d_ticks[type]; return QList(); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtScaleDiv &scaleDiv ) { debug << scaleDiv.lowerBound() << "<->" << scaleDiv.upperBound(); debug << "Major: " << scaleDiv.ticks( QwtScaleDiv::MajorTick ); debug << "Medium: " << scaleDiv.ticks( QwtScaleDiv::MediumTick ); debug << "Minor: " << scaleDiv.ticks( QwtScaleDiv::MinorTick ); return debug; } #endif linssid-2.7/qwt-lib/src/qwt_picker.h000644 001750 001750 00000022476 12151666702 020375 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PICKER #define QWT_PICKER 1 #include "qwt_global.h" #include "qwt_text.h" #include "qwt_event_pattern.h" #include #include #include #include #include class QWidget; class QMouseEvent; class QWheelEvent; class QKeyEvent; class QwtPickerMachine; class QwtWidgetOverlay; /*! \brief QwtPicker provides selections on a widget QwtPicker filters all enter, leave, mouse and keyboard events of a widget and translates them into an array of selected points. The way how the points are collected depends on type of state machine that is connected to the picker. Qwt offers a couple of predefined state machines for selecting: - Nothing\n QwtPickerTrackerMachine - Single points\n QwtPickerClickPointMachine, QwtPickerDragPointMachine - Rectangles\n QwtPickerClickRectMachine, QwtPickerDragRectMachine - Polygons\n QwtPickerPolygonMachine While these state machines cover the most common ways to collect points it is also possible to implement individual machines as well. QwtPicker translates the picked points into a selection using the adjustedPoints() method. adjustedPoints() is intended to be reimplemented to fix up the selection according to application specific requirements. (F.e. when an application accepts rectangles of a fixed aspect ratio only.) Optionally QwtPicker support the process of collecting points by a rubber band and tracker displaying a text for the current mouse position. \par Example \verbatim #include #include QwtPicker *picker = new QwtPicker(widget); picker->setStateMachine(new QwtPickerDragRectMachine); picker->setTrackerMode(QwtPicker::ActiveOnly); picker->setRubberBand(QwtPicker::RectRubberBand); \endverbatim\n The state machine triggers the following commands: - begin()\n Activate/Initialize the selection. - append()\n Add a new point - move() \n Change the position of the last point. - remove()\n Remove the last point. - end()\n Terminate the selection and call accept to validate the picked points. The picker is active (isActive()), between begin() and end(). In active state the rubber band is displayed, and the tracker is visible in case of trackerMode is ActiveOnly or AlwaysOn. The cursor can be moved using the arrow keys. All selections can be aborted using the abort key. (QwtEventPattern::KeyPatternCode) \warning In case of QWidget::NoFocus the focus policy of the observed widget is set to QWidget::WheelFocus and mouse tracking will be manipulated while the picker is active, or if trackerMode() is AlwayOn. */ class QWT_EXPORT QwtPicker: public QObject, public QwtEventPattern { Q_OBJECT Q_ENUMS( RubberBand DisplayMode ResizeMode ) Q_PROPERTY( bool isEnabled READ isEnabled WRITE setEnabled ) Q_PROPERTY( ResizeMode resizeMode READ resizeMode WRITE setResizeMode ) Q_PROPERTY( DisplayMode trackerMode READ trackerMode WRITE setTrackerMode ) Q_PROPERTY( QPen trackerPen READ trackerPen WRITE setTrackerPen ) Q_PROPERTY( QFont trackerFont READ trackerFont WRITE setTrackerFont ) Q_PROPERTY( RubberBand rubberBand READ rubberBand WRITE setRubberBand ) Q_PROPERTY( QPen rubberBandPen READ rubberBandPen WRITE setRubberBandPen ) public: /*! Rubber band style The default value is QwtPicker::NoRubberBand. \sa setRubberBand(), rubberBand() */ enum RubberBand { //! No rubberband. NoRubberBand = 0, //! A horizontal line ( only for QwtPickerMachine::PointSelection ) HLineRubberBand, //! A vertical line ( only for QwtPickerMachine::PointSelection ) VLineRubberBand, //! A crosshair ( only for QwtPickerMachine::PointSelection ) CrossRubberBand, //! A rectangle ( only for QwtPickerMachine::RectSelection ) RectRubberBand, //! An ellipse ( only for QwtPickerMachine::RectSelection ) EllipseRubberBand, //! A polygon ( only for QwtPickerMachine::PolygonSelection ) PolygonRubberBand, /*! Values >= UserRubberBand can be used to define additional rubber bands. */ UserRubberBand = 100 }; /*! \brief Display mode \sa setTrackerMode(), trackerMode(), isActive() */ enum DisplayMode { //! Display never AlwaysOff, //! Display always AlwaysOn, //! Display only when the selection is active ActiveOnly }; /*! Controls what to do with the selected points of an active selection when the observed widget is resized. The default value is QwtPicker::Stretch. \sa setResizeMode() */ enum ResizeMode { //! All points are scaled according to the new size, Stretch, //! All points remain unchanged. KeepSize }; explicit QwtPicker( QWidget *parent ); explicit QwtPicker( RubberBand rubberBand, DisplayMode trackerMode, QWidget * ); virtual ~QwtPicker(); void setStateMachine( QwtPickerMachine * ); const QwtPickerMachine *stateMachine() const; QwtPickerMachine *stateMachine(); void setRubberBand( RubberBand ); RubberBand rubberBand() const; void setTrackerMode( DisplayMode ); DisplayMode trackerMode() const; void setResizeMode( ResizeMode ); ResizeMode resizeMode() const; void setRubberBandPen( const QPen & ); QPen rubberBandPen() const; void setTrackerPen( const QPen & ); QPen trackerPen() const; void setTrackerFont( const QFont & ); QFont trackerFont() const; bool isEnabled() const; bool isActive() const; virtual bool eventFilter( QObject *, QEvent * ); QWidget *parentWidget(); const QWidget *parentWidget() const; virtual QPainterPath pickArea() const; virtual void drawRubberBand( QPainter * ) const; virtual void drawTracker( QPainter * ) const; virtual QRegion rubberBandMask() const; virtual QwtText trackerText( const QPoint &pos ) const; QPoint trackerPosition() const; virtual QRect trackerRect( const QFont & ) const; QPolygon selection() const; public Q_SLOTS: void setEnabled( bool ); Q_SIGNALS: /*! A signal indicating, when the picker has been activated. Together with setEnabled() it can be used to implement selections with more than one picker. \param on True, when the picker has been activated */ void activated( bool on ); /*! A signal emitting the selected points, at the end of a selection. \param polygon Selected points */ void selected( const QPolygon &polygon ); /*! A signal emitted when a point has been appended to the selection \param pos Position of the appended point. \sa append(). moved() */ void appended( const QPoint &pos ); /*! A signal emitted whenever the last appended point of the selection has been moved. \param pos Position of the moved last point of the selection. \sa move(), appended() */ void moved( const QPoint &pos ); /*! A signal emitted whenever the last appended point of the selection has been removed. \param pos Position of the point, that has been removed \sa remove(), appended() */ void removed( const QPoint &pos ); /*! A signal emitted when the active selection has been changed. This might happen when the observed widget is resized. \param selection Changed selection \sa stretchSelection() */ void changed( const QPolygon &selection ); protected: virtual QPolygon adjustedPoints( const QPolygon & ) const; virtual void transition( const QEvent * ); virtual void begin(); virtual void append( const QPoint & ); virtual void move( const QPoint & ); virtual void remove(); virtual bool end( bool ok = true ); virtual bool accept( QPolygon & ) const; virtual void reset(); virtual void widgetMousePressEvent( QMouseEvent * ); virtual void widgetMouseReleaseEvent( QMouseEvent * ); virtual void widgetMouseDoubleClickEvent( QMouseEvent * ); virtual void widgetMouseMoveEvent( QMouseEvent * ); virtual void widgetWheelEvent( QWheelEvent * ); virtual void widgetKeyPressEvent( QKeyEvent * ); virtual void widgetKeyReleaseEvent( QKeyEvent * ); virtual void widgetEnterEvent( QEvent * ); virtual void widgetLeaveEvent( QEvent * ); virtual void stretchSelection( const QSize &oldSize, const QSize &newSize ); virtual void updateDisplay(); const QwtWidgetOverlay *rubberBandOverlay() const; const QwtWidgetOverlay *trackerOverlay() const; const QPolygon &pickedPoints() const; private: void init( QWidget *, RubberBand rubberBand, DisplayMode trackerMode ); void setMouseTracking( bool ); class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/linssid-app/Getter.cpp000664 001750 001750 00000006524 12367031376 020067 0ustar00warrenwarren000000 000000 /* * File: Getter.cpp * Author: warren * * Created on October 31, 2012, 8:59 AM */ #include #include #include #include #include #include #include #include #include #include #include #include "Custom.h" #include "Getter.h" #include "MainForm.h" #include "ui_MainForm.h" extern string pipeName; extern string password; extern qint64 startTime; extern string beginBlockString; extern string endBlockString; extern string pipeName; extern ofstream linssidLog; extern bool closing; using namespace std; Getter::Getter() { }; Getter::~Getter() { }; void Getter::run() { // do stuff here exec(); } MainForm* Getter::pMainForm; const QEvent::Type Getter::DATA_WANTED_EVENT = static_cast (DATAWANTED); // Define the custom event subclass class Getter::DataWantedEvent : public QEvent { public: DataWantedEvent(const int customData1) : QEvent(Getter::DATA_WANTED_EVENT), wantedBlockNo(customData1) { } int getWantedBlockNo() const { return wantedBlockNo; } private: int wantedBlockNo; }; void Getter::postDataWantedEvent(const int customData1) { // This method (postDataWantedEvent) can be called from any thread QApplication::postEvent(this, new DataWantedEvent(customData1)); } void Getter::customEvent(QEvent * event) { // When we get here, we've crossed the thread boundary and are now // executing in the Qt object's thread if (event->type() == Getter::DATA_WANTED_EVENT) { handleDataWantedEvent(static_cast (event)); } // use more else ifs to handle other custom events } void Getter::handleDataWantedEvent(const DataWantedEvent *event) { string endCommand; static fstream thePipe(pipeName); thePipe.flush(); int blockNo = event->getWantedBlockNo(); int rcSysCall = 0; ostringstream cppIsStupid; cppIsStupid.str(""); cppIsStupid << " " << blockNo; string lineCommand = "echo \"" + beginBlockString + cppIsStupid.str() + "\\n\" >> " + pipeName; if (pwStatus == NOTNEEDED) { lineCommand += " && iwlist "; } else { lineCommand += " && echo \'" + password + "\' | sudo -kS -p \"\" iwlist "; } lineCommand += Getter::pMainForm->getCurrentInterface() + " scan >> " + pipeName; for (int retries = 0; retries < 20; retries++) { rcSysCall = system(lineCommand.c_str()); if ((rcSysCall == 0) || (closing)) break; else QThread::msleep(500); // wait half a second and try again } if (rcSysCall !=0) { // retries exhausted on multiple failures endCommand = "echo \"" + endBlockString + " -1\\n\" >> " + pipeName; linssidLog << "Getter: command failed block " << blockNo << endl; } else { // success! endCommand = "echo \"" + endBlockString + cppIsStupid.str() + "\\n\" >> " + pipeName; linssidLog << "Getter: block returned " << blockNo << endl; } waste(system(endCommand.c_str())); // put the end block tag in the stream if (!closing) { QThread::msleep(Getter::pMainForm->getNapTime() * 1000 + 500); } Getter::pMainForm->postDataReadyEvent(blockNo); } inline void Getter::waste(int) { // This silliness is to ignore an argument function's return code without // having the compiler whine about it. }linssid-2.7/qwt-lib/src/qwt_system_clock.h000644 001750 001750 00000002464 12151666701 021611 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SYSTEM_CLOCK_H #define QWT_SYSTEM_CLOCK_H #include "qwt_global.h" /*! \brief QwtSystemClock provides high resolution clock time functions. Sometimes the resolution offered by QTime ( millisecond ) is not accurate enough for implementing time measurements ( f.e. sampling ). QwtSystemClock offers a subset of the QTime functionality using higher resolution timers ( if possible ). Precision and time intervals are multiples of milliseconds (ms). \note The implementation uses high-resolution performance counter on Windows, mach_absolute_time() on the Mac or POSIX timers on other systems. If none is available it falls back on QTimer. */ class QWT_EXPORT QwtSystemClock { public: QwtSystemClock(); virtual ~QwtSystemClock(); bool isNull() const; void start(); double restart(); double elapsed() const; private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_zoomer.h000644 001750 001750 00000010306 12151666701 021455 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ZOOMER_H #define QWT_PLOT_ZOOMER_H #include "qwt_global.h" #include "qwt_plot_picker.h" #include /*! \brief QwtPlotZoomer provides stacked zooming for a plot widget QwtPlotZoomer selects rectangles from user inputs ( mouse or keyboard ) translates them into plot coordinates and adjusts the axes to them. The selection is supported by a rubber band and optionally by displaying the coordinates of the current mouse position. Zooming can be repeated as often as possible, limited only by maxStackDepth() or minZoomSize(). Each rectangle is pushed on a stack. The default setting how to select rectangles is a QwtPickerDragRectMachine with the following bindings: - QwtEventPattern::MouseSelect1\n The first point of the zoom rectangle is selected by a mouse press, the second point from the position, where the mouse is released. - QwtEventPattern::KeySelect1\n The first key press selects the first, the second key press selects the second point. - QwtEventPattern::KeyAbort\n Discard the selection in the state, where the first point is selected. To traverse the zoom stack the following bindings are used: - QwtEventPattern::MouseSelect3, QwtEventPattern::KeyUndo\n Zoom out one position on the zoom stack - QwtEventPattern::MouseSelect6, QwtEventPattern::KeyRedo\n Zoom in one position on the zoom stack - QwtEventPattern::MouseSelect2, QwtEventPattern::KeyHome\n Zoom to the zoom base The setKeyPattern() and setMousePattern() functions can be used to configure the zoomer actions. The following example shows, how to configure the 'I' and 'O' keys for zooming in and out one position on the zoom stack. The "Home" key is used to "unzoom" the plot. \code zoomer = new QwtPlotZoomer( plot ); zoomer->setKeyPattern( QwtEventPattern::KeyRedo, Qt::Key_I, Qt::ShiftModifier ); zoomer->setKeyPattern( QwtEventPattern::KeyUndo, Qt::Key_O, Qt::ShiftModifier ); zoomer->setKeyPattern( QwtEventPattern::KeyHome, Qt::Key_Home ); \endcode QwtPlotZoomer is tailored for plots with one x and y axis, but it is allowed to attach a second QwtPlotZoomer ( without rubber band and tracker ) for the other axes. \note The realtime example includes an derived zoomer class that adds scrollbars to the plot canvas. \sa QwtPlotPanner, QwtPlotMagnifier */ class QWT_EXPORT QwtPlotZoomer: public QwtPlotPicker { Q_OBJECT public: explicit QwtPlotZoomer( QWidget *, bool doReplot = true ); explicit QwtPlotZoomer( int xAxis, int yAxis, QWidget *, bool doReplot = true ); virtual ~QwtPlotZoomer(); virtual void setZoomBase( bool doReplot = true ); virtual void setZoomBase( const QRectF & ); QRectF zoomBase() const; QRectF zoomRect() const; virtual void setAxis( int xAxis, int yAxis ); void setMaxStackDepth( int ); int maxStackDepth() const; const QStack &zoomStack() const; void setZoomStack( const QStack &, int zoomRectIndex = -1 ); uint zoomRectIndex() const; public Q_SLOTS: void moveBy( double x, double y ); virtual void moveTo( const QPointF & ); virtual void zoom( const QRectF & ); virtual void zoom( int up ); Q_SIGNALS: /*! A signal emitting the zoomRect(), when the plot has been zoomed in or out. \param rect Current zoom rectangle. */ void zoomed( const QRectF &rect ); protected: virtual void rescale(); virtual QSizeF minZoomSize() const; virtual void widgetMouseReleaseEvent( QMouseEvent * ); virtual void widgetKeyPressEvent( QKeyEvent * ); virtual void begin(); virtual bool end( bool ok = true ); virtual bool accept( QPolygon & ) const; private: void init( bool doReplot ); class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/debian/copyright000664 001750 001750 00000002142 12345376724 017060 0ustar00warrenwarren000000 000000 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: linssid Source: Files: debian/* Copyright: 2012-2014 Warren Severin License: GPL-3 LinSSID graphical wireless scanning for Linux Copyright (c)2012-2013 Warren Severin . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA . On Debian GNU/Linux systems, the complete text of the GNU General Public License can be found in the /usr/share/common-licenses/GPL-3 file. linssid-2.7/qwt-lib/src/qwt_plot_barchart.cpp000644 001750 001750 00000026351 12151666703 022274 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_barchart.h" #include "qwt_scale_map.h" #include "qwt_column_symbol.h" #include "qwt_painter.h" #include class QwtPlotBarChart::PrivateData { public: PrivateData(): symbol( NULL ), legendMode( QwtPlotBarChart::LegendChartTitle ) { } ~PrivateData() { delete symbol; } QwtColumnSymbol *symbol; QwtPlotBarChart::LegendMode legendMode; }; /*! Constructor \param title Title of the curve */ QwtPlotBarChart::QwtPlotBarChart( const QwtText &title ): QwtPlotAbstractBarChart( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotBarChart::QwtPlotBarChart( const QString &title ): QwtPlotAbstractBarChart( QwtText( title ) ) { init(); } //! Destructor QwtPlotBarChart::~QwtPlotBarChart() { delete d_data; } void QwtPlotBarChart::init() { d_data = new PrivateData; setData( new QwtPointSeriesData() ); } //! \return QwtPlotItem::Rtti_PlotBarChart int QwtPlotBarChart::rtti() const { return QwtPlotItem::Rtti_PlotBarChart; } /*! Initialize data with an array of points \param samples Vector of points \note QVector is implicitly shared \note QPolygonF is derived from QVector */ void QwtPlotBarChart::setSamples( const QVector &samples ) { setData( new QwtPointSeriesData( samples ) ); } /*! Initialize data with an array of doubles The indices in the array are taken as x coordinate, while the doubles are interpreted as y values. \param samples Vector of y coordinates \note QVector is implicitly shared */ void QwtPlotBarChart::setSamples( const QVector &samples ) { QVector points; for ( int i = 0; i < samples.size(); i++ ) points += QPointF( i, samples[ i ] ); setData( new QwtPointSeriesData( points ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotBarChart::setSamples( QwtSeriesData *data ) { setData( data ); } /*! \brief Assign a symbol The bar chart will take the ownership of the symbol, hence the previously set symbol will be delete by setting a new one. If \p symbol is \c NULL no symbol will be drawn. \param symbol Symbol \sa symbol() */ void QwtPlotBarChart::setSymbol( QwtColumnSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; legendChanged(); itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtColumnSymbol *QwtPlotBarChart::symbol() const { return d_data->symbol; } /*! Set the mode that decides what to display on the legend In case of LegendBarTitles barTitle() needs to be overloaded to return individual titles for each bar. \param mode New mode \sa legendMode(), legendData(), barTitle(), QwtPlotItem::ItemAttribute */ void QwtPlotBarChart::setLegendMode( LegendMode mode ) { if ( mode != d_data->legendMode ) { d_data->legendMode = mode; legendChanged(); } } /*! \return Legend mode \sa setLegendMode() */ QwtPlotBarChart::LegendMode QwtPlotBarChart::legendMode() const { return d_data->legendMode; } /*! \return Bounding rectangle of all samples. For an empty series the rectangle is invalid. */ QRectF QwtPlotBarChart::boundingRect() const { const size_t numSamples = dataSize(); if ( numSamples == 0 ) return QwtPlotSeriesItem::boundingRect(); const double baseLine = baseline(); QRectF rect = QwtPlotSeriesItem::boundingRect(); if ( rect.bottom() < baseLine ) rect.setBottom( baseLine ); if ( rect.top() > baseLine ) rect.setTop( baseLine ); if ( rect.isValid() && ( orientation() == Qt::Horizontal ) ) rect.setRect( rect.y(), rect.x(), rect.height(), rect.width() ); return rect; } /*! Draw an interval of the bar chart \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. \sa drawSymbols() */ void QwtPlotBarChart::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( to < 0 ) to = dataSize() - 1; if ( from < 0 ) from = 0; if ( from > to ) return; const QRectF br = data()->boundingRect(); const QwtInterval interval( br.left(), br.right() ); painter->save(); for ( int i = from; i <= to; i++ ) { drawSample( painter, xMap, yMap, canvasRect, interval, i, sample( i ) ); } painter->restore(); } /*! Draw a sample \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param boundingInterval Bounding interval of sample values \param index Index of the sample \param sample Value of the sample \sa drawSeries() */ void QwtPlotBarChart::drawSample( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, const QwtInterval &boundingInterval, int index, const QPointF &sample ) const { QwtColumnRect barRect; if ( orientation() == Qt::Horizontal ) { const double barHeight = sampleWidth( yMap, canvasRect.height(), boundingInterval.width(), sample.y() ); const double x1 = xMap.transform( baseline() ); const double x2 = xMap.transform( sample.y() ); const double y = yMap.transform( sample.x() ); const double y1 = y - 0.5 * barHeight; const double y2 = y + 0.5 * barHeight; barRect.direction = ( x1 < x2 ) ? QwtColumnRect::LeftToRight : QwtColumnRect::RightToLeft; barRect.hInterval = QwtInterval( x1, x2 ).normalized(); barRect.vInterval = QwtInterval( y1, y2 ); } else { const double barWidth = sampleWidth( xMap, canvasRect.width(), boundingInterval.width(), sample.y() ); const double x = xMap.transform( sample.x() ); const double x1 = x - 0.5 * barWidth; const double x2 = x + 0.5 * barWidth; const double y1 = yMap.transform( baseline() ); const double y2 = yMap.transform( sample.y() ); barRect.direction = ( y1 < y2 ) ? QwtColumnRect::TopToBottom : QwtColumnRect::BottomToTop; barRect.hInterval = QwtInterval( x1, x2 ); barRect.vInterval = QwtInterval( y1, y2 ).normalized(); } drawBar( painter, index, sample, barRect ); } /*! Draw a bar \param painter Painter \param sampleIndex Index of the sample represented by the bar \param sample Value of the sample \param rect Bounding rectangle of the bar */ void QwtPlotBarChart::drawBar( QPainter *painter, int sampleIndex, const QPointF &sample, const QwtColumnRect &rect ) const { const QwtColumnSymbol *specialSym = specialSymbol( sampleIndex, sample ); const QwtColumnSymbol *sym = specialSym; if ( sym == NULL ) sym = d_data->symbol; if ( sym ) { sym->draw( painter, rect ); } else { // we build a temporary default symbol QwtColumnSymbol sym( QwtColumnSymbol::Box ); sym.setLineWidth( 1 ); sym.setFrameStyle( QwtColumnSymbol::Plain ); sym.draw( painter, rect ); } delete specialSym; } /*! Needs to be overloaded to return a non default symbol for a specific sample \param sampleIndex Index of the sample represented by the bar \param sample Value of the sample \return NULL, indicating to use the default symbol */ QwtColumnSymbol *QwtPlotBarChart::specialSymbol( int sampleIndex, const QPointF &sample ) const { Q_UNUSED( sampleIndex ); Q_UNUSED( sample ); return NULL; } /*! \brief Return the title of a bar In LegendBarTitles mode the title is displayed on the legend entry corresponding to a bar. The default implementation is a dummy, that is intended to be overloaded. \param sampleIndex Index of the bar \return An empty text \sa LegendBarTitles */ QwtText QwtPlotBarChart::barTitle( int sampleIndex ) const { Q_UNUSED( sampleIndex ); return QwtText(); } /*! \brief Return all information, that is needed to represent the item on the legend In case of LegendBarTitles an entry for each bar is returned, otherwise the chart is represented like any other plot item from its title() and the legendIcon(). \return Information, that is needed to represent the item on the legend \sa title(), setLegendMode(), barTitle(), QwtLegend, QwtPlotLegendItem */ QList QwtPlotBarChart::legendData() const { QList list; if ( d_data->legendMode == LegendBarTitles ) { const size_t numSamples = dataSize(); for ( size_t i = 0; i < numSamples; i++ ) { QwtLegendData data; QVariant titleValue; qVariantSetValue( titleValue, barTitle( i ) ); data.setValue( QwtLegendData::TitleRole, titleValue ); if ( !legendIconSize().isEmpty() ) { QVariant iconValue; qVariantSetValue( iconValue, legendIcon( i, legendIconSize() ) ); data.setValue( QwtLegendData::IconRole, iconValue ); } list += data; } } else { return QwtPlotAbstractBarChart::legendData(); } return list; } /*! \return Icon representing a bar or the chart on the legend When the legendMode() is LegendBarTitles the icon shows the bar corresponding to index - otherwise the bar displays the default symbol. \param index Index of the legend entry \param size Icon size \sa setLegendMode(), drawBar(), QwtPlotItem::setLegendIconSize(), QwtPlotItem::legendData() */ QwtGraphic QwtPlotBarChart::legendIcon( int index, const QSizeF &size ) const { QwtColumnRect column; column.hInterval = QwtInterval( 0.0, size.width() - 1.0 ); column.vInterval = QwtInterval( 0.0, size.height() - 1.0 ); QwtGraphic icon; icon.setDefaultSize( size ); icon.setRenderHint( QwtGraphic::RenderPensUnscaled, true ); QPainter painter( &icon ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); int barIndex = -1; if ( d_data->legendMode == QwtPlotBarChart::LegendBarTitles ) barIndex = index; drawBar( &painter, barIndex, QPointF(), column ); return icon; } linssid-2.7/qwt-lib/src/qwt_date_scale_engine.cpp000644 001750 001750 00000102514 12151666703 023055 0ustar00warrenwarren000000 000000 #include "qwt_date_scale_engine.h" #include "qwt_math.h" #include "qwt_transform.h" #include #include static inline double qwtMsecsForType( QwtDate::IntervalType type ) { static const double msecs[] = { 1.0, 1000.0, 60.0 * 1000.0, 3600.0 * 1000.0, 24.0 * 3600.0 * 1000.0, 7.0 * 24.0 * 3600.0 * 1000.0, 30.0 * 24.0 * 3600.0 * 1000.0, 365.0 * 24.0 * 3600.0 * 1000.0, }; if ( type < 0 || type >= static_cast( sizeof( msecs ) / sizeof( msecs[0] ) ) ) return 1.0; return msecs[ type ]; } static inline int qwtAlignValue( double value, double stepSize, bool up ) { double d = value / stepSize; d = up ? ::ceil( d ) : ::floor( d ); return static_cast( d * stepSize ); } static double qwtIntervalWidth( const QDateTime &minDate, const QDateTime &maxDate, QwtDate::IntervalType intervalType ) { switch( intervalType ) { case QwtDate::Millisecond: { const double secsTo = minDate.secsTo( maxDate ); const double msecs = maxDate.time().msec() - minDate.time().msec(); return secsTo * 1000 + msecs; } case QwtDate::Second: { return minDate.secsTo( maxDate ); } case QwtDate::Minute: { const double secsTo = minDate.secsTo( maxDate ); return ::floor( secsTo / 60 ); } case QwtDate::Hour: { const double secsTo = minDate.secsTo( maxDate ); return ::floor( secsTo / 3600 ); } case QwtDate::Day: { return minDate.daysTo( maxDate ); } case QwtDate::Week: { return ::floor( minDate.daysTo( maxDate ) / 7.0 ); } case QwtDate::Month: { const double years = double( maxDate.date().year() ) - minDate.date().year(); int months = maxDate.date().month() - minDate.date().month(); if ( maxDate.date().day() < minDate.date().day() ) months--; return years * 12 + months; } case QwtDate::Year: { double years = double( maxDate.date().year() ) - minDate.date().year(); if ( maxDate.date().month() < minDate.date().month() ) years -= 1.0; return years; } } return 0.0; } static double qwtRoundedIntervalWidth( const QDateTime &minDate, const QDateTime &maxDate, QwtDate::IntervalType intervalType ) { const QDateTime minD = QwtDate::floor( minDate, intervalType ); const QDateTime maxD = QwtDate::ceil( maxDate, intervalType ); return qwtIntervalWidth( minD, maxD, intervalType ); } static inline int qwtStepCount( int intervalSize, int maxSteps, const int limits[], size_t numLimits ) { for ( uint i = 0; i < numLimits; i++ ) { const int numSteps = intervalSize / limits[ i ]; if ( numSteps > 1 && numSteps <= maxSteps && numSteps * limits[ i ] == intervalSize ) { return numSteps; } } return 0; } static int qwtStepSize( int intervalSize, int maxSteps, uint base ) { if ( maxSteps <= 0 ) return 0; if ( maxSteps > 2 ) { for ( int numSteps = maxSteps; numSteps > 1; numSteps-- ) { const double stepSize = double( intervalSize ) / numSteps; const double p = ::floor( ::log( stepSize ) / ::log( double( base ) ) ); const double fraction = qPow( base, p ); for ( uint n = base; n >= 1; n /= 2 ) { if ( qFuzzyCompare( stepSize, n * fraction ) ) return qRound( stepSize ); if ( n == 3 && ( base % 2 ) == 0 ) { if ( qFuzzyCompare( stepSize, 2 * fraction ) ) return qRound( stepSize ); } } } } return 0; } static int qwtDivideInterval( double intervalSize, int numSteps, const int limits[], size_t numLimits ) { const int v = qCeil( intervalSize / double( numSteps ) ); for ( uint i = 0; i < numLimits - 1; i++ ) { if ( v <= limits[i] ) return limits[i]; } return limits[ numLimits - 1 ]; } static double qwtDivideScale( double intervalSize, int numSteps, QwtDate::IntervalType intervalType ) { if ( intervalType != QwtDate::Day ) { if ( ( intervalSize > numSteps ) && ( intervalSize <= 2 * numSteps ) ) { return 2.0; } } double stepSize; switch( intervalType ) { case QwtDate::Second: case QwtDate::Minute: { static int limits[] = { 1, 2, 5, 10, 15, 20, 30, 60 }; stepSize = qwtDivideInterval( intervalSize, numSteps, limits, sizeof( limits ) / sizeof( int ) ); break; } case QwtDate::Hour: { static int limits[] = { 1, 2, 3, 4, 6, 12, 24 }; stepSize = qwtDivideInterval( intervalSize, numSteps, limits, sizeof( limits ) / sizeof( int ) ); break; } case QwtDate::Day: { const double v = intervalSize / double( numSteps ); if ( v <= 5.0 ) stepSize = qCeil( v ); else stepSize = qCeil( v / 7 ) * 7; break; } case QwtDate::Week: { static int limits[] = { 1, 2, 4, 8, 12, 26, 52 }; stepSize = qwtDivideInterval( intervalSize, numSteps, limits, sizeof( limits ) / sizeof( int ) ); break; } case QwtDate::Month: { static int limits[] = { 1, 2, 3, 4, 6, 12 }; stepSize = qwtDivideInterval( intervalSize, numSteps, limits, sizeof( limits ) / sizeof( int ) ); break; } case QwtDate::Year: case QwtDate::Millisecond: default: { stepSize = QwtScaleArithmetic::divideInterval( intervalSize, numSteps, 10 ); } } return stepSize; } static double qwtDivideMajorStep( double stepSize, int maxMinSteps, QwtDate::IntervalType intervalType ) { double minStepSize = 0.0; switch( intervalType ) { case QwtDate::Second: { minStepSize = qwtStepSize( stepSize, maxMinSteps, 10 ); if ( minStepSize == 0.0 ) minStepSize = 0.5 * stepSize; break; } case QwtDate::Minute: { static int limits[] = { 1, 2, 5, 10, 15, 20, 30, 60 }; int numSteps; if ( stepSize > maxMinSteps ) { numSteps = qwtStepCount( stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } else { numSteps = qwtStepCount( stepSize * 60, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; break; } case QwtDate::Hour: { int numSteps = 0; if ( stepSize > maxMinSteps ) { static int limits[] = { 1, 2, 3, 4, 6, 12, 24, 48, 72 }; numSteps = qwtStepCount( stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } else { static int limits[] = { 1, 2, 5, 10, 15, 20, 30, 60 }; numSteps = qwtStepCount( stepSize * 60, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; break; } case QwtDate::Day: { int numSteps = 0; if ( stepSize > maxMinSteps ) { static int limits[] = { 1, 2, 3, 7, 14, 28 }; numSteps = qwtStepCount( stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } else { static int limits[] = { 1, 2, 3, 4, 6, 12, 24, 48, 72 }; numSteps = qwtStepCount( stepSize * 24, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); } if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; break; } case QwtDate::Week: { const int daysInStep = stepSize * 7; if ( maxMinSteps >= daysInStep ) { // we want to have one tick per day minStepSize = 1.0 / 7.0; } else { // when the stepSize is more than a week we want to // have a tick for each week const int stepSizeInWeeks = stepSize; if ( stepSizeInWeeks <= maxMinSteps ) { minStepSize = 1; } else { minStepSize = QwtScaleArithmetic::divideInterval( stepSizeInWeeks, maxMinSteps, 10 ); } } break; } case QwtDate::Month: { // fractions of months doesn't make any sense if ( stepSize < maxMinSteps ) maxMinSteps = static_cast( stepSize ); static int limits[] = { 1, 2, 3, 4, 6, 12 }; int numSteps = qwtStepCount( stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; break; } case QwtDate::Year: { if ( stepSize >= maxMinSteps ) { minStepSize = QwtScaleArithmetic::divideInterval( stepSize, maxMinSteps, 10 ); } else { // something in months static int limits[] = { 1, 2, 3, 4, 6, 12 }; int numSteps = qwtStepCount( 12 * stepSize, maxMinSteps, limits, sizeof( limits ) / sizeof( int ) ); if ( numSteps > 0 ) minStepSize = double( stepSize ) / numSteps; } break; } default: break; } if ( intervalType != QwtDate::Month && minStepSize == 0.0 ) { minStepSize = 0.5 * stepSize; } return minStepSize; } static QList qwtDstTicks( const QDateTime &dateTime, int secondsMajor, int secondsMinor ) { if ( secondsMinor <= 0 ) QList(); QDateTime minDate = dateTime.addSecs( -secondsMajor ); minDate = QwtDate::floor( minDate, QwtDate::Hour ); const double utcOffset = QwtDate::utcOffset( dateTime ); // find the hours where daylight saving time happens double dstMin = QwtDate::toDouble( minDate ); while ( minDate < dateTime && QwtDate::utcOffset( minDate ) != utcOffset ) { minDate = minDate.addSecs( 3600 ); dstMin += 3600 * 1000.0; } QList ticks; for ( int i = 0; i < 3600; i += secondsMinor ) ticks += dstMin + i * 1000.0; return ticks; } static QwtScaleDiv qwtDivideToSeconds( const QDateTime &minDate, const QDateTime &maxDate, double stepSize, int maxMinSteps, QwtDate::IntervalType intervalType ) { // calculate the min step size double minStepSize = 0; if ( maxMinSteps > 1 ) { minStepSize = qwtDivideMajorStep( stepSize, maxMinSteps, intervalType ); } bool daylightSaving = false; if ( minDate.timeSpec() == Qt::LocalTime ) { daylightSaving = intervalType > QwtDate::Hour; if ( intervalType == QwtDate::Hour ) { daylightSaving = stepSize > 1; } } const double s = qwtMsecsForType( intervalType ) / 1000; const int secondsMajor = static_cast( stepSize * s ); const double secondsMinor = minStepSize * s; // UTC excludes daylight savings. So from the difference // of a date and its UTC counterpart we can find out // the daylight saving hours const double utcOffset = QwtDate::utcOffset( minDate ); double dstOff = 0; QList majorTicks; QList mediumTicks; QList minorTicks; for ( QDateTime dt = minDate; dt <= maxDate; dt = dt.addSecs( secondsMajor ) ) { if ( !dt.isValid() ) break; double majorValue = QwtDate::toDouble( dt ); if ( daylightSaving ) { const double offset = utcOffset - QwtDate::utcOffset( dt ); majorValue += offset * 1000.0; if ( offset > dstOff ) { // we add some minor ticks for the DST hour, // otherwise the ticks will be unaligned: 0, 2, 3, 5 ... minorTicks += qwtDstTicks( dt, secondsMajor, qRound( secondsMinor ) ); } dstOff = offset; } if ( majorTicks.isEmpty() || majorTicks.last() != majorValue ) majorTicks += majorValue; if ( secondsMinor > 0.0 ) { const int numMinorSteps = qFloor( secondsMajor / secondsMinor ); for ( int i = 1; i < numMinorSteps; i++ ) { const QDateTime mt = dt.addMSecs( qRound64( i * secondsMinor * 1000 ) ); double minorValue = QwtDate::toDouble( mt ); if ( daylightSaving ) { const double offset = utcOffset - QwtDate::utcOffset( mt ); minorValue += offset * 1000.0; } if ( minorTicks.isEmpty() || minorTicks.last() != minorValue ) { const bool isMedium = ( numMinorSteps % 2 == 0 ) && ( i != 1 ) && ( i == numMinorSteps / 2 ); if ( isMedium ) mediumTicks += minorValue; else minorTicks += minorValue; } } } } QwtScaleDiv scaleDiv; scaleDiv.setInterval( QwtDate::toDouble( minDate ), QwtDate::toDouble( maxDate ) ); scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks ); scaleDiv.setTicks( QwtScaleDiv::MediumTick, mediumTicks ); scaleDiv.setTicks( QwtScaleDiv::MinorTick, minorTicks ); return scaleDiv; } static QwtScaleDiv qwtDivideToMonths( QDateTime &minDate, const QDateTime &maxDate, double stepSize, int maxMinSteps ) { // months are intervals with non // equidistant ( in ms ) steps: we have to build the // scale division manually int minStepDays = 0; int minStepSize = 0.0; if ( maxMinSteps > 1 ) { if ( stepSize == 1 ) { if ( maxMinSteps >= 30 ) minStepDays = 1; else if ( maxMinSteps >= 6 ) minStepDays = 5; else if ( maxMinSteps >= 3 ) minStepDays = 10; minStepDays = 15; } else { minStepSize = qwtDivideMajorStep( stepSize, maxMinSteps, QwtDate::Month ); } } QList majorTicks; QList mediumTicks; QList minorTicks; for ( QDateTime dt = minDate; dt <= maxDate; dt = dt.addMonths( stepSize ) ) { if ( !dt.isValid() ) break; majorTicks += QwtDate::toDouble( dt ); if ( minStepDays > 0 ) { for ( int days = minStepDays; days < 30; days += minStepDays ) { const double tick = QwtDate::toDouble( dt.addDays( days ) ); if ( days == 15 && minStepDays != 15 ) mediumTicks += tick; else minorTicks += tick; } } else if ( minStepSize > 0.0 ) { const int numMinorSteps = qRound( stepSize / (double) minStepSize ); for ( int i = 1; i < numMinorSteps; i++ ) { const double minorValue = QwtDate::toDouble( dt.addMonths( i * minStepSize ) ); if ( ( numMinorSteps % 2 == 0 ) && ( i == numMinorSteps / 2 ) ) mediumTicks += minorValue; else minorTicks += minorValue; } } } QwtScaleDiv scaleDiv; scaleDiv.setInterval( QwtDate::toDouble( minDate ), QwtDate::toDouble( maxDate ) ); scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks ); scaleDiv.setTicks( QwtScaleDiv::MediumTick, mediumTicks ); scaleDiv.setTicks( QwtScaleDiv::MinorTick, minorTicks ); return scaleDiv; } static QwtScaleDiv qwtDivideToYears( const QDateTime &minDate, const QDateTime &maxDate, double stepSize, int maxMinSteps ) { QList majorTicks; QList mediumTicks; QList minorTicks; double minStepSize = 0.0; if ( maxMinSteps > 1 ) { minStepSize = qwtDivideMajorStep( stepSize, maxMinSteps, QwtDate::Year ); } int numMinorSteps = 0; if ( minStepSize > 0.0 ) numMinorSteps = qFloor( stepSize / minStepSize ); bool dateBC = minDate.date().year() < -1; for ( QDateTime dt = minDate; dt <= maxDate; dt = dt.addYears( stepSize ) ) { if ( dateBC && dt.date().year() > 1 ) { // there is no year 0 in the Julian calendar dt = dt.addYears( -1 ); dateBC = false; } if ( !dt.isValid() ) break; majorTicks += QwtDate::toDouble( dt ); for ( int i = 1; i < numMinorSteps; i++ ) { QDateTime tickDate; const double years = qRound( i * minStepSize ); if ( years >= INT_MAX / 12 ) { tickDate = dt.addYears( years ); } else { tickDate = dt.addMonths( qRound( years * 12 ) ); } const bool isMedium = ( numMinorSteps > 2 ) && ( numMinorSteps % 2 == 0 ) && ( i == numMinorSteps / 2 ); const double minorValue = QwtDate::toDouble( tickDate ); if ( isMedium ) mediumTicks += minorValue; else minorTicks += minorValue; } if ( QwtDate::maxDate().addYears( -stepSize ) < dt.date() ) { break; } } QwtScaleDiv scaleDiv; scaleDiv.setInterval( QwtDate::toDouble( minDate ), QwtDate::toDouble( maxDate ) ); scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks ); scaleDiv.setTicks( QwtScaleDiv::MediumTick, mediumTicks ); scaleDiv.setTicks( QwtScaleDiv::MinorTick, minorTicks ); return scaleDiv; } class QwtDateScaleEngine::PrivateData { public: PrivateData( Qt::TimeSpec spec ): timeSpec( spec ), utcOffset( 0 ), week0Type( QwtDate::FirstThursday ), maxWeeks( 4 ) { } Qt::TimeSpec timeSpec; int utcOffset; QwtDate::Week0Type week0Type; int maxWeeks; }; /*! \brief Constructor The engine is initialized to build scales for the given time specification. It classifies intervals > 4 weeks as >= Qt::Month. The first week of a year is defined like for QwtDate::FirstThursday. \param timeSpec Time specification \sa setTimeSpec(), setMaxWeeks(), setWeek0Type() */ QwtDateScaleEngine::QwtDateScaleEngine( Qt::TimeSpec timeSpec ): QwtLinearScaleEngine( 10 ) { d_data = new PrivateData( timeSpec ); } //! Destructor QwtDateScaleEngine::~QwtDateScaleEngine() { delete d_data; } /*! Set the time specification used by the engine \param timeSpec Time specification \sa timeSpec(), setUtcOffset(), toDateTime() */ void QwtDateScaleEngine::setTimeSpec( Qt::TimeSpec timeSpec ) { d_data->timeSpec = timeSpec; } /*! \return Time specification used by the engine \sa setTimeSpec(), utcOffset(), toDateTime() */ Qt::TimeSpec QwtDateScaleEngine::timeSpec() const { return d_data->timeSpec; } /*! Set the offset in seconds from Coordinated Universal Time \param seconds Offset in seconds \note The offset has no effect beside for the time specification Qt::OffsetFromUTC. \sa QDate::utcOffset(), setTimeSpec(), toDateTime() */ void QwtDateScaleEngine::setUtcOffset( int seconds ) { d_data->utcOffset = seconds; } /*! \return Offset in seconds from Coordinated Universal Time \note The offset has no effect beside for the time specification Qt::OffsetFromUTC. \sa QDate::setUtcOffset(), setTimeSpec(), toDateTime() */ int QwtDateScaleEngine::utcOffset() const { return d_data->utcOffset; } /*! Sets how to identify the first week of a year. \param week0Type Mode how to identify the first week of a year \sa week0Type(), setMaxWeeks() \note week0Type has no effect beside for intervals classified as QwtDate::Week. */ void QwtDateScaleEngine::setWeek0Type( QwtDate::Week0Type week0Type ) { d_data->week0Type = week0Type; } /*! \return Setting how to identify the first week of a year. \sa setWeek0Type(), maxWeeks() */ QwtDate::Week0Type QwtDateScaleEngine::week0Type() const { return d_data->week0Type; } /*! Set a upper limit for the number of weeks, when an interval can be classified as Qt::Week. The default setting is 4 weeks. \param weeks Upper limit for the number of weeks \note In business charts a year is often devided into weeks [1-52] \sa maxWeeks(), setWeek0Type() */ void QwtDateScaleEngine::setMaxWeeks( int weeks ) { d_data->maxWeeks = qMax( weeks, 0 ); } /*! \return Upper limit for the number of weeks, when an interval can be classified as Qt::Week. \sa setMaxWeeks(), week0Type() */ int QwtDateScaleEngine::maxWeeks() const { return d_data->maxWeeks; } /*! Classification of a date/time interval division \param minDate Minimum ( = earlier ) of the interval \param maxDate Maximum ( = later ) of the interval \param maxSteps Maximum for the number of steps \return Interval classification */ QwtDate::IntervalType QwtDateScaleEngine::intervalType( const QDateTime &minDate, const QDateTime &maxDate, int maxSteps ) const { const double jdMin = minDate.date().toJulianDay(); const double jdMax = maxDate.date().toJulianDay(); if ( ( jdMax - jdMin ) / 365 > maxSteps ) return QwtDate::Year; const int months = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Month ); if ( months > maxSteps * 6 ) return QwtDate::Year; const int days = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Day ); const int weeks = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Week ); if ( weeks > d_data->maxWeeks ) { if ( days > 4 * maxSteps * 7 ) return QwtDate::Month; } if ( days > maxSteps * 7 ) return QwtDate::Week; const int hours = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Hour ); if ( hours > maxSteps * 24 ) return QwtDate::Day; const int seconds = qwtRoundedIntervalWidth( minDate, maxDate, QwtDate::Second ); if ( seconds >= maxSteps * 3600 ) return QwtDate::Hour; if ( seconds >= maxSteps * 60 ) return QwtDate::Minute; if ( seconds >= maxSteps ) return QwtDate::Second; return QwtDate::Millisecond; } /*! Align and divide an interval The algorithm aligns and divides the interval into steps. Datetime interval divisions are usually not equidistant and the calculated stepSize is can only be used as an approximation for the steps calculated by divideScale(). \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa QwtScaleEngine::setAttribute() */ void QwtDateScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { stepSize = 0.0; QwtInterval interval( x1, x2 ); interval = interval.normalized(); interval.setMinValue( interval.minValue() - lowerMargin() ); interval.setMaxValue( interval.maxValue() + upperMargin() ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) interval = interval.symmetrize( reference() ); if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( reference() ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); const QDateTime from = toDateTime( interval.minValue() ); const QDateTime to = toDateTime( interval.maxValue() ); if ( from.isValid() && to.isValid() ) { if ( maxNumSteps < 1 ) maxNumSteps = 1; const QwtDate::IntervalType intvType = intervalType( from, to, maxNumSteps ); double width = qwtIntervalWidth( from, to, intvType ); width = QwtScaleArithmetic::divideInterval( width, maxNumSteps, 10 ); if ( width != 0.0 && !testAttribute( QwtScaleEngine::Floating ) ) { const QDateTime d1 = alignDate( from, width, intvType, false ); const QDateTime d2 = alignDate( to, width, intvType, true ); interval.setMinValue( QwtDate::toDouble( d1 ) ); interval.setMaxValue( QwtDate::toDouble( d2 ) ); } stepSize = width * qwtMsecsForType( intvType ); } x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division for a date/time interval \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the scaleEngine calculates one. \return Calculated scale division */ QwtScaleDiv QwtDateScaleEngine::divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize ) const { if ( maxMajorSteps < 1 ) maxMajorSteps = 1; const double min = qMin( x1, x2 ); const double max = qMax( x1, x2 ); const QDateTime from = toDateTime( min ); const QDateTime to = toDateTime( max ); if ( from == to ) return QwtScaleDiv(); stepSize = qAbs( stepSize ); if ( stepSize > 0.0 ) { // as interval types above hours are not equidistant // ( even days might have 23/25 hours because of daylight saving ) // the stepSize is used as a hint only maxMajorSteps = qCeil( ( max - min ) / stepSize ); } const QwtDate::IntervalType intvType = intervalType( from, to, maxMajorSteps ); QwtScaleDiv scaleDiv; if ( intvType == QwtDate::Millisecond ) { // for milliseconds and below we can use the decimal system scaleDiv = QwtLinearScaleEngine::divideScale( min, max, maxMajorSteps, maxMinorSteps, stepSize ); } else { const QDateTime minDate = QwtDate::floor( from, intvType ); const QDateTime maxDate = QwtDate::ceil( to, intvType ); scaleDiv = buildScaleDiv( minDate, maxDate, maxMajorSteps, maxMinorSteps, intvType ); // scaleDiv has been calculated from an extended interval // adjusted to the step size. We have to shrink it again. scaleDiv = scaleDiv.bounded( min, max ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } QwtScaleDiv QwtDateScaleEngine::buildScaleDiv( const QDateTime &minDate, const QDateTime &maxDate, int maxMajorSteps, int maxMinorSteps, QwtDate::IntervalType intervalType ) const { // calculate the step size const double stepSize = qwtDivideScale( qwtIntervalWidth( minDate, maxDate, intervalType ), maxMajorSteps, intervalType ); // align minDate to the step size QDateTime dt0 = alignDate( minDate, stepSize, intervalType, false ); if ( !dt0.isValid() ) { // the floored date is out of the range of a // QDateTime - we ceil instead. dt0 = alignDate( minDate, stepSize, intervalType, true ); } QwtScaleDiv scaleDiv; if ( intervalType <= QwtDate::Week ) { scaleDiv = qwtDivideToSeconds( dt0, maxDate, stepSize, maxMinorSteps, intervalType ); } else { if( intervalType == QwtDate::Month ) { scaleDiv = qwtDivideToMonths( dt0, maxDate, stepSize, maxMinorSteps ); } else if ( intervalType == QwtDate::Year ) { scaleDiv = qwtDivideToYears( dt0, maxDate, stepSize, maxMinorSteps ); } } return scaleDiv; } /*! Align a date/time value for a step size For Qt::Day alignments there is no "natural day 0" - instead the first day of the year is used to avoid jumping major ticks positions when panning a scale. For other alignments ( f.e according to the first day of the month ) alignDate() has to be overloaded. \param dateTime Date/time value \param stepSize Step size \param intervalType Interval type \param up When true dateTime is ceiled - otherwise it is floored \return Aligned date/time value */ QDateTime QwtDateScaleEngine::alignDate( const QDateTime &dateTime, double stepSize, QwtDate::IntervalType intervalType, bool up ) const { // what about: (year == 1582 && month == 10 && day > 4 && day < 15) ?? QDateTime dt = dateTime; if ( dateTime.timeSpec() == Qt::OffsetFromUTC ) { dt.setUtcOffset( 0 ); } switch( intervalType ) { case QwtDate::Millisecond: { const int ms = qwtAlignValue( dt.time().msec(), stepSize, up ) ; dt = QwtDate::floor( dateTime, QwtDate::Second ); dt = dt.addMSecs( ms ); break; } case QwtDate::Second: { const int s = qwtAlignValue( dt.time().second(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Minute ); dt = dt.addSecs( s ); break; } case QwtDate::Minute: { const int m = qwtAlignValue( dt.time().minute(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Hour ); dt = dt.addSecs( m * 60 ); break; } case QwtDate::Hour: { const int h = qwtAlignValue( dt.time().hour(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Day ); dt = dt.addSecs( h * 3600 ); break; } case QwtDate::Day: { // What date do we expect f.e. from an alignment of 5 days ?? // Aligning them to the beginning of the year avoids at least // jumping major ticks when panning const int d = qwtAlignValue( dt.date().dayOfYear(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Year ); dt = dt.addDays( d - 1 ); break; } case QwtDate::Week: { const QDate date = QwtDate::dateOfWeek0( dt.date().year(), d_data->week0Type ); const int numWeeks = date.daysTo( dt.date() ) / 7; const int d = qwtAlignValue( numWeeks, stepSize, up ) * 7; dt = QwtDate::floor( dt, QwtDate::Day ); dt.setDate( date ); dt = dt.addDays( d ); break; } case QwtDate::Month: { const int m = qwtAlignValue( dt.date().month() - 1, stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Year ); dt = dt.addMonths( m ); break; } case QwtDate::Year: { const int y = qwtAlignValue( dateTime.date().year(), stepSize, up ); dt = QwtDate::floor( dt, QwtDate::Day ); if ( y == 0 ) { // there is no year 0 in the Julian calendar dt.setDate( QDate( stepSize, 1, 1 ).addYears( -stepSize ) ); } else { dt.setDate( QDate( y, 1, 1 ) ); } break; } } if ( dateTime.timeSpec() == Qt::OffsetFromUTC ) { dt.setUtcOffset( dateTime.utcOffset() ); } return dt; } /*! Translate a double value into a QDateTime object. For QDateTime result is bounded by QwtDate::minDate() and QwtDate::maxDate() \return QDateTime object initialized with timeSpec() and utcOffset(). \sa timeSpec(), utcOffset(), QwtDate::toDateTime() */ QDateTime QwtDateScaleEngine::toDateTime( double value ) const { QDateTime dt = QwtDate::toDateTime( value, d_data->timeSpec ); if ( !dt.isValid() ) { const QDate date = ( value <= 0.0 ) ? QwtDate::minDate() : QwtDate::maxDate(); dt = QDateTime( date, QTime( 0, 0 ), d_data->timeSpec ); } if ( d_data->timeSpec == Qt::OffsetFromUTC ) { dt = dt.addSecs( d_data->utcOffset ); dt.setUtcOffset( d_data->utcOffset ); } return dt; } linssid-2.7/qwt-lib/src/qwt_plot_zoneitem.cpp000644 001750 001750 00000016056 12151666703 022341 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_zoneitem.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include class QwtPlotZoneItem::PrivateData { public: PrivateData(): orientation( Qt::Vertical ), pen( Qt::NoPen ) { QColor c( Qt::darkGray ); c.setAlpha( 100 ); brush = QBrush( c ); } Qt::Orientation orientation; QPen pen; QBrush brush; QwtInterval interval; }; /*! \brief Constructor Initializes the zone with no pen and a semi transparent gray brush Sets the following item attributes: - QwtPlotItem::AutoScale: false - QwtPlotItem::Legend: false The z value is initialized by 5 \sa QwtPlotItem::setItemAttribute(), QwtPlotItem::setZ() */ QwtPlotZoneItem::QwtPlotZoneItem(): QwtPlotItem( QwtText( "Zone" ) ) { d_data = new PrivateData; setItemAttribute( QwtPlotItem::AutoScale, false ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 5 ); } //! Destructor QwtPlotZoneItem::~QwtPlotZoneItem() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotZone int QwtPlotZoneItem::rtti() const { return QwtPlotItem::Rtti_PlotZone; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotZoneItem::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! \brief Assign a pen The pen is used to draw the border lines of the zone \param pen Pen \sa pen(), setBrush() */ void QwtPlotZoneItem::setPen( const QPen &pen ) { if ( d_data->pen != pen ) { d_data->pen = pen; itemChanged(); } } /*! \return Pen used to draw the border lines \sa setPen(), brush() */ const QPen &QwtPlotZoneItem::pen() const { return d_data->pen; } /*! \brief Assign a brush The brush is used to fill the zone \param brush Brush \sa pen(), setBrush() */ void QwtPlotZoneItem::setBrush( const QBrush &brush ) { if ( d_data->brush != brush ) { d_data->brush = brush; itemChanged(); } } /*! \return Brush used to fill the zone \sa setPen(), brush() */ const QBrush &QwtPlotZoneItem::brush() const { return d_data->brush; } /*! \brief Set the orientation of the zone A horizontal zone highlights an interval of the y axis, a vertical zone of the x axis. It is unbounded in the opposite direction. \sa orientation(), QwtPlotItem::setAxes() */ void QwtPlotZoneItem::setOrientation( Qt::Orientation orientation ) { if ( d_data->orientation != orientation ) { d_data->orientation = orientation; itemChanged(); } } /*! \return Orientation of the zone \sa setOrientation() */ Qt::Orientation QwtPlotZoneItem::orientation() { return d_data->orientation; } /*! Set the interval of the zone For a horizontal zone the interval is related to the y axis, for a vertical zone it is related to the x axis. \param min Minimum of the interval \param max Maximum of the interval \sa interval(), setOrientation() */ void QwtPlotZoneItem::setInterval( double min, double max ) { setInterval( QwtInterval( min, max ) ); } /*! Set the interval of the zone For a horizontal zone the interval is related to the y axis, for a vertical zone it is related to the x axis. \param interval Zone interval \sa interval(), setOrientation() */ void QwtPlotZoneItem::setInterval( const QwtInterval &interval ) { if ( d_data->interval != interval ) { d_data->interval = interval; itemChanged(); } } /*! \return Zone interval \sa setInterval(), orientation() */ QwtInterval QwtPlotZoneItem::interval() const { return d_data->interval; } /*! Draw the zone \param painter Painter \param xMap x Scale Map \param yMap y Scale Map \param canvasRect Contents rectangle of the canvas in painter coordinates */ void QwtPlotZoneItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { if ( !d_data->interval.isValid() ) return; QPen pen = d_data->pen; pen.setCapStyle( Qt::FlatCap ); const bool doAlign = QwtPainter::roundingAlignment( painter ); if ( d_data->orientation == Qt::Horizontal ) { double y1 = yMap.transform( d_data->interval.minValue() ); double y2 = yMap.transform( d_data->interval.maxValue() ); if ( doAlign ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QRectF r( canvasRect.left(), y1, canvasRect.width(), y2 - y1 ); r = r.normalized(); if ( ( d_data->brush.style() != Qt::NoBrush ) && ( y1 != y2 ) ) { QwtPainter::fillRect( painter, r, d_data->brush ); } if ( d_data->pen.style() != Qt::NoPen ) { painter->setPen( d_data->pen ); QwtPainter::drawLine( painter, r.left(), r.top(), r.right(), r.top() ); QwtPainter::drawLine( painter, r.left(), r.bottom(), r.right(), r.bottom() ); } } else { double x1 = xMap.transform( d_data->interval.minValue() ); double x2 = xMap.transform( d_data->interval.maxValue() ); if ( doAlign ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QRectF r( x1, canvasRect.top(), x2 - x1, canvasRect.height() ); r = r.normalized(); if ( ( d_data->brush.style() != Qt::NoBrush ) && ( x1 != x2 ) ) { QwtPainter::fillRect( painter, r, d_data->brush ); } if ( d_data->pen.style() != Qt::NoPen ) { painter->setPen( d_data->pen ); QwtPainter::drawLine( painter, r.left(), r.top(), r.left(), r.bottom() ); QwtPainter::drawLine( painter, r.right(), r.top(), r.right(), r.bottom() ); } } } /*! The bounding rectangle is build from the interval in one direction and something invalid for the opposite direction. \return An invalid rectangle with valid boundaries in one direction */ QRectF QwtPlotZoneItem::boundingRect() const { QRectF br = QwtPlotItem::boundingRect(); const QwtInterval &intv = d_data->interval; if ( intv.isValid() ) { if ( d_data->orientation == Qt::Horizontal ) { br.setTop( intv.minValue() ); br.setBottom( intv.maxValue() ); } else { br.setLeft( intv.minValue() ); br.setRight( intv.maxValue() ); } } return br; } linssid-2.7/qwt-lib/src/qwt_plot_curve.h000644 001750 001750 00000024115 12151666701 021271 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CURVE_H #define QWT_PLOT_CURVE_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" #include "qwt_text.h" #include #include class QPainter; class QPolygonF; class QwtScaleMap; class QwtSymbol; class QwtCurveFitter; /*! \brief A plot item, that represents a series of points A curve is the representation of a series of points in the x-y plane. It supports different display styles, interpolation ( f.e. spline ) and symbols. \par Usage
a) Assign curve properties
When a curve is created, it is configured to draw black solid lines with in QwtPlotCurve::Lines style and no symbols. You can change this by calling setPen(), setStyle() and setSymbol().
b) Connect/Assign data.
QwtPlotCurve gets its points using a QwtSeriesData object offering a bridge to the real storage of the points ( like QAbstractItemModel ). There are several convenience classes derived from QwtSeriesData, that also store the points inside ( like QStandardItemModel ). QwtPlotCurve also offers a couple of variations of setSamples(), that build QwtSeriesData objects from arrays internally.
c) Attach the curve to a plot
See QwtPlotItem::attach()
\par Example: see examples/bode \sa QwtPointSeriesData, QwtSymbol, QwtScaleMap */ class QWT_EXPORT QwtPlotCurve: public QwtPlotSeriesItem, public QwtSeriesStore { public: /*! Curve styles. \sa setStyle(), style() */ enum CurveStyle { /*! Don't draw a curve. Note: This doesn't affect the symbols. */ NoCurve = -1, /*! Connect the points with straight lines. The lines might be interpolated depending on the 'Fitted' attribute. Curve fitting can be configured using setCurveFitter(). */ Lines, /*! Draw vertical or horizontal sticks ( depending on the orientation() ) from a baseline which is defined by setBaseline(). */ Sticks, /*! Connect the points with a step function. The step function is drawn from the left to the right or vice versa, depending on the QwtPlotCurve::Inverted attribute. */ Steps, /*! Draw dots at the locations of the data points. Note: This is different from a dotted line (see setPen()), and faster as a curve in QwtPlotCurve::NoStyle style and a symbol painting a point. */ Dots, /*! Styles >= QwtPlotCurve::UserCurve are reserved for derived classes of QwtPlotCurve that overload drawCurve() with additional application specific curve types. */ UserCurve = 100 }; /*! Attribute for drawing the curve \sa setCurveAttribute(), testCurveAttribute(), curveFitter() */ enum CurveAttribute { /*! For QwtPlotCurve::Steps only. Draws a step function from the right to the left. */ Inverted = 0x01, /*! Only in combination with QwtPlotCurve::Lines A QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. \note Curve fitting requires temporary memory for calculating coefficients and additional points. If painting in QwtPlotCurve::Fitted mode is slow it might be better to fit the points, before they are passed to QwtPlotCurve. */ Fitted = 0x02 }; //! Curve attributes typedef QFlags CurveAttributes; /*! Attributes how to represent the curve on the legend \sa setLegendAttribute(), testLegendAttribute(), QwtPlotItem::legendData(), legendIcon() */ enum LegendAttribute { /*! QwtPlotCurve tries to find a color representing the curve and paints a rectangle with it. */ LegendNoAttribute = 0x00, /*! If the style() is not QwtPlotCurve::NoCurve a line is painted with the curve pen(). */ LegendShowLine = 0x01, /*! If the curve has a valid symbol it is painted. */ LegendShowSymbol = 0x02, /*! If the curve has a brush a rectangle filled with the curve brush() is painted. */ LegendShowBrush = 0x04 }; //! Legend attributes typedef QFlags LegendAttributes; /*! Attributes to modify the drawing algorithm. The default setting enables ClipPolygons | FilterPoints \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { /*! Clip polygons before painting them. In situations, where points are far outside the visible area (f.e when zooming deep) this might be a substantial improvement for the painting performance */ ClipPolygons = 0x01, /*! Tries to reduce the data that has to be painted, by sorting out duplicates, or paintings outside the visible area. Might have a notable impact on curves with many close points. Only a couple of very basic filtering algorithms are implemented. */ FilterPoints = 0x02, /*! Minimize memory usage that is temporarily needed for the translated points, before they get painted. This might slow down the performance of painting */ MinimizeMemory = 0x04, /*! Render the points to a temporary image and paint the image. This is a very special optimization for Dots style, when having a huge amount of points. With a reasonable number of points QPainter::drawPoints() will be faster. */ ImageBuffer = 0x08 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotCurve( const QString &title = QString::null ); explicit QwtPlotCurve( const QwtText &title ); virtual ~QwtPlotCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLegendAttribute( LegendAttribute, bool on = true ); bool testLegendAttribute( LegendAttribute ) const; #ifndef QWT_NO_COMPAT void setRawSamples( const double *xData, const double *yData, int size ); void setSamples( const double *xData, const double *yData, int size ); void setSamples( const QVector &xData, const QVector &yData ); #endif void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); int closestPoint( const QPoint &pos, double *dist = NULL ) const; double minXValue() const; double maxXValue() const; double minYValue() const; double maxYValue() const; void setCurveAttribute( CurveAttribute, bool on = true ); bool testCurveAttribute( CurveAttribute ) const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; void setBaseline( double ); double baseline() const; void setStyle( CurveStyle style ); CurveStyle style() const; void setSymbol( QwtSymbol * ); const QwtSymbol *symbol() const; void setCurveFitter( QwtCurveFitter * ); QwtCurveFitter *curveFitter() const; virtual void drawSeries( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: void init(); virtual void drawCurve( QPainter *p, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSymbols( QPainter *p, const QwtSymbol &, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawLines( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSticks( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawDots( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSteps( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void fillCurve( QPainter *, const QwtScaleMap &, const QwtScaleMap &, const QRectF &canvasRect, QPolygonF & ) const; void closePolyline( QPainter *, const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const; private: class PrivateData; PrivateData *d_data; }; //! boundingRect().left() inline double QwtPlotCurve::minXValue() const { return boundingRect().left(); } //! boundingRect().right() inline double QwtPlotCurve::maxXValue() const { return boundingRect().right(); } //! boundingRect().top() inline double QwtPlotCurve::minYValue() const { return boundingRect().top(); } //! boundingRect().bottom() inline double QwtPlotCurve::maxYValue() const { return boundingRect().bottom(); } Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::PaintAttributes ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::LegendAttributes ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotCurve::CurveAttributes ) #endif linssid-2.7/qwt-lib/src/qwt_scale_div.h000644 001750 001750 00000005304 12151666702 021040 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_DIV_H #define QWT_SCALE_DIV_H #include "qwt_global.h" #include "qwt_interval.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A class representing a scale division A Qwt scale is defined by its boundaries and 3 list for the positions of the major, medium and minor ticks. The upperLimit() might be smaller than the lowerLimit() to indicate inverted scales. Scale divisions can be calculated from a QwtScaleEngine. \sa QwtScaleEngine::divideScale(), QwtPlot::setAxisScaleDiv(), QwtAbstractSlider::setScaleDiv() */ class QWT_EXPORT QwtScaleDiv { public: //! Scale tick types enum TickType { //! No ticks NoTick = -1, //! Minor ticks MinorTick, //! Medium ticks MediumTick, //! Major ticks MajorTick, //! Number of valid tick types NTickTypes }; explicit QwtScaleDiv( double lowerBound = 0.0, double upperBound = 0.0 ); explicit QwtScaleDiv( const QwtInterval &, QList[NTickTypes] ); explicit QwtScaleDiv( double lowerBound, double upperBound, QList[NTickTypes] ); explicit QwtScaleDiv( double lowerBound, double upperBound, const QList &minorTicks, const QList &mediumTicks, const QList &majorTicks ); bool operator==( const QwtScaleDiv & ) const; bool operator!=( const QwtScaleDiv & ) const; void setInterval( double lowerBound, double upperBound ); void setInterval( const QwtInterval & ); QwtInterval interval() const; void setLowerBound( double ); double lowerBound() const; void setUpperBound( double ); double upperBound() const; double range() const; bool contains( double value ) const; void setTicks( int tickType, const QList & ); QList ticks( int tickType ) const; bool isEmpty() const; bool isIncreasing() const; void invert(); QwtScaleDiv inverted() const; QwtScaleDiv bounded( double lowerBound, double upperBound ) const; private: double d_lowerBound; double d_upperBound; QList d_ticks[NTickTypes]; }; Q_DECLARE_TYPEINFO( QwtScaleDiv, Q_MOVABLE_TYPE ); #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtScaleDiv & ); #endif #endif linssid-2.7/linssid-app/AboutBox.h000664 001750 001750 00000000477 12355414341 020020 0ustar00warrenwarren000000 000000 /* * File: aboutBox.h * Author: warren * * Created on November 20, 2012, 8:12 PM */ #ifndef _ABOUTBOX_H #define _ABOUTBOX_H #include "ui_AboutBox.h" class AboutBox : public QDialog { Q_OBJECT public: AboutBox(); virtual ~AboutBox(); private: Ui::aboutBox widget; }; #endif /* _ABOUTBOX_H */ linssid-2.7/qwt-lib/src/qwt_plot_legenditem.h000644 001750 001750 00000007210 12151666702 022260 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_LEGEND_ITEM_H #define QWT_PLOT_LEGEND_ITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_legend_data.h" class QFont; /*! \brief A class which draws a legend inside the plot canvas QwtPlotLegendItem can be used to draw a inside the plot canvas. It can be used together with a QwtLegend or instead of it to have more space for the plot canvas. In opposite to QwtLegend the legend item is not interactive. To identify mouse clicks on a legend item an event filter needs to be installed catching mouse events ob the plot canvas. The geometries of the legend items are available using legendGeometries(). The legend item is aligned to plot canvas according to its alignment() flags. It might have a background for the complete legend ( usually semi transparent ) or for each legend item. \note An external QwtLegend with a transparent background on top the plot canvas might be another option with a similar effect. */ class QWT_EXPORT QwtPlotLegendItem: public QwtPlotItem { public: /*! \brief Background mode Depending on the mode the complete legend or each item might have an background. The default setting is LegendBackground. \sa setBackgroundMode(), setBackgroundBrush(), drawBackground() */ enum BackgroundMode { //! The legend has a background LegendBackground, //! Each item has a background ItemBackground }; explicit QwtPlotLegendItem(); virtual ~QwtPlotLegendItem(); virtual int rtti() const; void setAlignment( Qt::Alignment ); Qt::Alignment alignment() const; void setMaxColumns( uint ); uint maxColumns() const; void setMargin( int ); int margin() const; void setSpacing( int ); int spacing() const; void setItemMargin( int ); int itemMargin() const; void setItemSpacing( int ); int itemSpacing() const; void setFont( const QFont& ); QFont font() const; void setBorderDistance( int numPixels ); int borderDistance() const; void setBorderRadius( double ); double borderRadius() const; void setBorderPen( const QPen & ); QPen borderPen() const; void setBackgroundBrush( const QBrush & ); QBrush backgroundBrush() const; void setBackgroundMode( BackgroundMode ); BackgroundMode backgroundMode() const; void setTextPen( const QPen & ); QPen textPen() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) const; void clearLegend(); virtual void updateLegend( const QwtPlotItem *, const QList & ); virtual QRect geometry( const QRectF &canvasRect ) const; virtual QSize minimumSize( const QwtLegendData & ) const; virtual int heightForWidth( const QwtLegendData &, int w ) const; QList< const QwtPlotItem * > plotItems() const; QList< QRect > legendGeometries( const QwtPlotItem * ) const; protected: virtual void drawLegendData( QPainter *painter, const QwtPlotItem *, const QwtLegendData &, const QRectF & ) const; virtual void drawBackground( QPainter *, const QRectF &rect ) const; private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_text_engine.h000644 001750 001750 00000011367 12151666702 021426 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_ENGINE_H #define QWT_TEXT_ENGINE_H 1 #include "qwt_global.h" #include class QFont; class QRectF; class QString; class QPainter; /*! \brief Abstract base class for rendering text strings A text engine is responsible for rendering texts for a specific text format. They are used by QwtText to render a text. QwtPlainTextEngine and QwtRichTextEngine are part of the Qwt library. The implementation of QwtMathMLTextEngine uses code from the Qt solution package. Because of license implications it is built into a separate library. \sa QwtText::setTextEngine() */ class QWT_EXPORT QwtTextEngine { public: virtual ~QwtTextEngine(); /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const = 0; /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered \return Calculated size */ virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const = 0; /*! Test if a string can be rendered by this text engine \param text Text to be tested \return true, if it can be rendered */ virtual bool mightRender( const QString &text ) const = 0; /*! Return margins around the texts The textSize might include margins around the text, like QFontMetrics::descent(). In situations where texts need to be aligned in detail, knowing these margins might improve the layout calculations. \param font Font of the text \param text Text to be rendered \param left Return value for the left margin \param right Return value for the right margin \param top Return value for the top margin \param bottom Return value for the bottom margin */ virtual void textMargins( const QFont &font, const QString &text, double &left, double &right, double &top, double &bottom ) const = 0; /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText() \param text Text to be rendered */ virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const = 0; protected: QwtTextEngine(); }; /*! \brief A text engine for plain texts QwtPlainTextEngine renders texts using the basic Qt classes QPainter and QFontMetrics. */ class QWT_EXPORT QwtPlainTextEngine: public QwtTextEngine { public: QwtPlainTextEngine(); virtual ~QwtPlainTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; private: class PrivateData; PrivateData *d_data; }; #ifndef QT_NO_RICHTEXT /*! \brief A text engine for Qt rich texts QwtRichTextEngine renders Qt rich texts using the classes of the Scribe framework of Qt. */ class QWT_EXPORT QwtRichTextEngine: public QwtTextEngine { public: QwtRichTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; private: QString taggedText( const QString &, int flags ) const; }; #endif // !QT_NO_RICHTEXT #endif linssid-2.7/qwt-lib/src/qwt_picker.cpp000644 001750 001750 00000114521 12151666703 020722 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_picker.h" #include "qwt_picker_machine.h" #include "qwt_painter.h" #include "qwt_math.h" #include "qwt_widget_overlay.h" #include #include #include #include #include #include #include #include #include static inline QRegion qwtMaskRegion( const QRect &r, int penWidth ) { const int pw = qMax( penWidth, 1 ); const int pw2 = penWidth / 2; int x1 = r.left() - pw2; int x2 = r.right() + 1 + pw2 + ( pw % 2 ); int y1 = r.top() - pw2; int y2 = r.bottom() + 1 + pw2 + ( pw % 2 ); QRegion region; region += QRect( x1, y1, x2 - x1, pw ); region += QRect( x1, y1, pw, y2 - y1 ); region += QRect( x1, y2 - pw, x2 - x1, pw ); region += QRect( x2 - pw, y1, pw, y2 - y1 ); return region; } static inline QRegion qwtMaskRegion( const QLine &l, int penWidth ) { const int pw = qMax( penWidth, 1 ); const int pw2 = penWidth / 2; QRegion region; if ( l.x1() == l.x2() ) { region += QRect( l.x1() - pw2, l.y1(), pw, l.y2() ).normalized(); } else if ( l.y1() == l.y2() ) { region += QRect( l.x1(), l.y1() - pw2, l.x2(), pw ).normalized(); } return region; } class QwtPickerRubberband: public QwtWidgetOverlay { public: QwtPickerRubberband( QwtPicker *, QWidget * ); protected: virtual void drawOverlay( QPainter * ) const; virtual QRegion maskHint() const; QwtPicker *d_picker; }; class QwtPickerTracker: public QwtWidgetOverlay { public: QwtPickerTracker( QwtPicker *, QWidget * ); protected: virtual void drawOverlay( QPainter * ) const; virtual QRegion maskHint() const; QwtPicker *d_picker; }; class QwtPicker::PrivateData { public: PrivateData(): enabled( false ), stateMachine( NULL ), resizeMode( QwtPicker::Stretch ), rubberBand( QwtPicker::NoRubberBand ), trackerMode( QwtPicker::AlwaysOff ), isActive( false ), trackerPosition( -1, -1 ), mouseTracking( false ), openGL( false ) { } bool enabled; QwtPickerMachine *stateMachine; QwtPicker::ResizeMode resizeMode; QwtPicker::RubberBand rubberBand; QPen rubberBandPen; QwtPicker::DisplayMode trackerMode; QPen trackerPen; QFont trackerFont; QPolygon pickedPoints; bool isActive; QPoint trackerPosition; bool mouseTracking; // used to save previous value QPointer< QwtPickerRubberband > rubberBandOverlay; QPointer< QwtPickerTracker> trackerOverlay; bool openGL; }; QwtPickerRubberband::QwtPickerRubberband( QwtPicker *picker, QWidget *parent ): QwtWidgetOverlay( parent ), d_picker( picker ) { setMaskMode( QwtWidgetOverlay::MaskHint ); } QRegion QwtPickerRubberband::maskHint() const { return d_picker->rubberBandMask(); } void QwtPickerRubberband::drawOverlay( QPainter *painter ) const { painter->setPen( d_picker->rubberBandPen() ); d_picker->drawRubberBand( painter ); } QwtPickerTracker::QwtPickerTracker( QwtPicker *picker, QWidget *parent ): QwtWidgetOverlay( parent ), d_picker( picker ) { setMaskMode( QwtWidgetOverlay::MaskHint ); } QRegion QwtPickerTracker::maskHint() const { return d_picker->trackerRect( font() ); } void QwtPickerTracker::drawOverlay( QPainter *painter ) const { painter->setPen( d_picker->trackerPen() ); d_picker->drawTracker( painter ); } /*! Constructor Creates an picker that is enabled, but without a state machine. rubber band and tracker are disabled. \param parent Parent widget, that will be observed */ QwtPicker::QwtPicker( QWidget *parent ): QObject( parent ) { init( parent, NoRubberBand, AlwaysOff ); } /*! Constructor \param rubberBand Rubber band style \param trackerMode Tracker mode \param parent Parent widget, that will be observed */ QwtPicker::QwtPicker( RubberBand rubberBand, DisplayMode trackerMode, QWidget *parent ): QObject( parent ) { init( parent, rubberBand, trackerMode ); } //! Destructor QwtPicker::~QwtPicker() { setMouseTracking( false ); delete d_data->stateMachine; delete d_data->rubberBandOverlay; delete d_data->trackerOverlay; delete d_data; } //! Initialize the picker - used by the constructors void QwtPicker::init( QWidget *parent, RubberBand rubberBand, DisplayMode trackerMode ) { d_data = new PrivateData; d_data->rubberBand = rubberBand; if ( parent ) { if ( parent->focusPolicy() == Qt::NoFocus ) parent->setFocusPolicy( Qt::WheelFocus ); d_data->openGL = parent->inherits( "QGLWidget" ); d_data->trackerFont = parent->font(); d_data->mouseTracking = parent->hasMouseTracking(); setEnabled( true ); } setTrackerMode( trackerMode ); } /*! Set a state machine and delete the previous one \param stateMachine State machine \sa stateMachine() */ void QwtPicker::setStateMachine( QwtPickerMachine *stateMachine ) { if ( d_data->stateMachine != stateMachine ) { reset(); delete d_data->stateMachine; d_data->stateMachine = stateMachine; if ( d_data->stateMachine ) d_data->stateMachine->reset(); } } /*! \return Assigned state machine \sa setStateMachine() */ QwtPickerMachine *QwtPicker::stateMachine() { return d_data->stateMachine; } /*! \return Assigned state machine \sa setStateMachine() */ const QwtPickerMachine *QwtPicker::stateMachine() const { return d_data->stateMachine; } //! Return the parent widget, where the selection happens QWidget *QwtPicker::parentWidget() { QObject *obj = parent(); if ( obj && obj->isWidgetType() ) return static_cast( obj ); return NULL; } //! Return the parent widget, where the selection happens const QWidget *QwtPicker::parentWidget() const { QObject *obj = parent(); if ( obj && obj->isWidgetType() ) return static_cast< const QWidget *>( obj ); return NULL; } /*! Set the rubber band style \param rubberBand Rubber band style The default value is NoRubberBand. \sa rubberBand(), RubberBand, setRubberBandPen() */ void QwtPicker::setRubberBand( RubberBand rubberBand ) { d_data->rubberBand = rubberBand; } /*! \return Rubber band style \sa setRubberBand(), RubberBand, rubberBandPen() */ QwtPicker::RubberBand QwtPicker::rubberBand() const { return d_data->rubberBand; } /*! \brief Set the display mode of the tracker. A tracker displays information about current position of the cursor as a string. The display mode controls if the tracker has to be displayed whenever the observed widget has focus and cursor (AlwaysOn), never (AlwaysOff), or only when the selection is active (ActiveOnly). \param mode Tracker display mode \warning In case of AlwaysOn, mouseTracking will be enabled for the observed widget. \sa trackerMode(), DisplayMode */ void QwtPicker::setTrackerMode( DisplayMode mode ) { if ( d_data->trackerMode != mode ) { d_data->trackerMode = mode; setMouseTracking( d_data->trackerMode == AlwaysOn ); } } /*! \return Tracker display mode \sa setTrackerMode(), DisplayMode */ QwtPicker::DisplayMode QwtPicker::trackerMode() const { return d_data->trackerMode; } /*! \brief Set the resize mode. The resize mode controls what to do with the selected points of an active selection when the observed widget is resized. Stretch means the points are scaled according to the new size, KeepSize means the points remain unchanged. The default mode is Stretch. \param mode Resize mode \sa resizeMode(), ResizeMode */ void QwtPicker::setResizeMode( ResizeMode mode ) { d_data->resizeMode = mode; } /*! \return Resize mode \sa setResizeMode(), ResizeMode */ QwtPicker::ResizeMode QwtPicker::resizeMode() const { return d_data->resizeMode; } /*! \brief En/disable the picker When enabled is true an event filter is installed for the observed widget, otherwise the event filter is removed. \param enabled true or false \sa isEnabled(), eventFilter() */ void QwtPicker::setEnabled( bool enabled ) { if ( d_data->enabled != enabled ) { d_data->enabled = enabled; QWidget *w = parentWidget(); if ( w ) { if ( enabled ) w->installEventFilter( this ); else w->removeEventFilter( this ); } updateDisplay(); } } /*! \return true when enabled, false otherwise \sa setEnabled(), eventFilter() */ bool QwtPicker::isEnabled() const { return d_data->enabled; } /*! Set the font for the tracker \param font Tracker font \sa trackerFont(), setTrackerMode(), setTrackerPen() */ void QwtPicker::setTrackerFont( const QFont &font ) { if ( font != d_data->trackerFont ) { d_data->trackerFont = font; updateDisplay(); } } /*! \return Tracker font \sa setTrackerFont(), trackerMode(), trackerPen() */ QFont QwtPicker::trackerFont() const { return d_data->trackerFont; } /*! Set the pen for the tracker \param pen Tracker pen \sa trackerPen(), setTrackerMode(), setTrackerFont() */ void QwtPicker::setTrackerPen( const QPen &pen ) { if ( pen != d_data->trackerPen ) { d_data->trackerPen = pen; updateDisplay(); } } /*! \return Tracker pen \sa setTrackerPen(), trackerMode(), trackerFont() */ QPen QwtPicker::trackerPen() const { return d_data->trackerPen; } /*! Set the pen for the rubberband \param pen Rubber band pen \sa rubberBandPen(), setRubberBand() */ void QwtPicker::setRubberBandPen( const QPen &pen ) { if ( pen != d_data->rubberBandPen ) { d_data->rubberBandPen = pen; updateDisplay(); } } /*! \return Rubber band pen \sa setRubberBandPen(), rubberBand() */ QPen QwtPicker::rubberBandPen() const { return d_data->rubberBandPen; } /*! \brief Return the label for a position In case of HLineRubberBand the label is the value of the y position, in case of VLineRubberBand the value of the x position. Otherwise the label contains x and y position separated by a ',' . The format for the string conversion is "%d". \param pos Position \return Converted position as string */ QwtText QwtPicker::trackerText( const QPoint &pos ) const { QString label; switch ( rubberBand() ) { case HLineRubberBand: label.sprintf( "%d", pos.y() ); break; case VLineRubberBand: label.sprintf( "%d", pos.x() ); break; default: label.sprintf( "%d, %d", pos.x(), pos.y() ); } return label; } /*! Calculate the mask for the rubber band overlay \return Region for the mask \sa QWidget::setMask() */ QRegion QwtPicker::rubberBandMask() const { QRegion mask; if ( !isActive() || rubberBand() == NoRubberBand || rubberBandPen().style() == Qt::NoPen ) { return mask; } const QPolygon pa = adjustedPoints( d_data->pickedPoints ); QwtPickerMachine::SelectionType selectionType = QwtPickerMachine::NoSelection; if ( d_data->stateMachine ) selectionType = d_data->stateMachine->selectionType(); switch ( selectionType ) { case QwtPickerMachine::NoSelection: case QwtPickerMachine::PointSelection: { if ( pa.count() < 1 ) return mask; const QPoint pos = pa[0]; const int pw = rubberBandPen().width(); const QRect pRect = pickArea().boundingRect().toRect(); switch ( rubberBand() ) { case VLineRubberBand: { mask += qwtMaskRegion( QLine( pos.x(), pRect.top(), pos.x(), pRect.bottom() ), pw ); break; } case HLineRubberBand: { mask += qwtMaskRegion( QLine( pRect.left(), pos.y(), pRect.right(), pos.y() ), pw ); break; } case CrossRubberBand: { mask += qwtMaskRegion( QLine( pos.x(), pRect.top(), pos.x(), pRect.bottom() ), pw ); mask += qwtMaskRegion( QLine( pRect.left(), pos.y(), pRect.right(), pos.y() ), pw ); break; } default: break; } break; } case QwtPickerMachine::RectSelection: { if ( pa.count() < 2 ) return mask; const int pw = rubberBandPen().width(); switch ( rubberBand() ) { case RectRubberBand: { const QRect r = QRect( pa.first(), pa.last() ); mask = qwtMaskRegion( r.normalized(), pw ); break; } case EllipseRubberBand: { const QRect r = QRect( pa.first(), pa.last() ); mask += r.adjusted( -pw, -pw, pw, pw ); break; } default: break; } break; } case QwtPickerMachine::PolygonSelection: { const int pw = rubberBandPen().width(); if ( pw <= 1 ) { // because of the join style we better // return a mask for a pen width <= 1 only const int off = 2 * pw; const QRect r = pa.boundingRect(); mask += r.adjusted( -off, -off, off, off ); } break; } default: break; } return mask; } /*! Draw a rubber band, depending on rubberBand() \param painter Painter, initialized with a clip region \sa rubberBand(), RubberBand */ void QwtPicker::drawRubberBand( QPainter *painter ) const { if ( !isActive() || rubberBand() == NoRubberBand || rubberBandPen().style() == Qt::NoPen ) { return; } const QPolygon pa = adjustedPoints( d_data->pickedPoints ); QwtPickerMachine::SelectionType selectionType = QwtPickerMachine::NoSelection; if ( d_data->stateMachine ) selectionType = d_data->stateMachine->selectionType(); switch ( selectionType ) { case QwtPickerMachine::NoSelection: case QwtPickerMachine::PointSelection: { if ( pa.count() < 1 ) return; const QPoint pos = pa[0]; const QRect pRect = pickArea().boundingRect().toRect(); switch ( rubberBand() ) { case VLineRubberBand: { QwtPainter::drawLine( painter, pos.x(), pRect.top(), pos.x(), pRect.bottom() ); break; } case HLineRubberBand: { QwtPainter::drawLine( painter, pRect.left(), pos.y(), pRect.right(), pos.y() ); break; } case CrossRubberBand: { QwtPainter::drawLine( painter, pos.x(), pRect.top(), pos.x(), pRect.bottom() ); QwtPainter::drawLine( painter, pRect.left(), pos.y(), pRect.right(), pos.y() ); break; } default: break; } break; } case QwtPickerMachine::RectSelection: { if ( pa.count() < 2 ) return; const QRect rect = QRect( pa.first(), pa.last() ).normalized(); switch ( rubberBand() ) { case EllipseRubberBand: { QwtPainter::drawEllipse( painter, rect ); break; } case RectRubberBand: { QwtPainter::drawRect( painter, rect ); break; } default: break; } break; } case QwtPickerMachine::PolygonSelection: { if ( rubberBand() == PolygonRubberBand ) painter->drawPolyline( pa ); break; } default: break; } } /*! Draw the tracker \param painter Painter \sa trackerRect(), trackerText() */ void QwtPicker::drawTracker( QPainter *painter ) const { const QRect textRect = trackerRect( painter->font() ); if ( !textRect.isEmpty() ) { const QwtText label = trackerText( d_data->trackerPosition ); if ( !label.isEmpty() ) label.draw( painter, textRect ); } } /*! \brief Map the pickedPoints() into a selection() adjustedPoints() maps the points, that have been collected on the parentWidget() into a selection(). The default implementation simply returns the points unmodified. The reason, why a selection() differs from the picked points depends on the application requirements. F.e. : - A rectangular selection might need to have a specific aspect ratio only.\n - A selection could accept non intersecting polygons only.\n - ...\n The example below is for a rectangular selection, where the first point is the center of the selected rectangle. \par Example \verbatim QPolygon MyPicker::adjustedPoints(const QPolygon &points) const { QPolygon adjusted; if ( points.size() == 2 ) { const int width = qAbs(points[1].x() - points[0].x()); const int height = qAbs(points[1].y() - points[0].y()); QRect rect(0, 0, 2 * width, 2 * height); rect.moveCenter(points[0]); adjusted += rect.topLeft(); adjusted += rect.bottomRight(); } return adjusted; }\endverbatim\n \param points Selected points \return Selected points unmodified */ QPolygon QwtPicker::adjustedPoints( const QPolygon &points ) const { return points; } /*! \return Selected points \sa pickedPoints(), adjustedPoints() */ QPolygon QwtPicker::selection() const { return adjustedPoints( d_data->pickedPoints ); } //! \return Current position of the tracker QPoint QwtPicker::trackerPosition() const { return d_data->trackerPosition; } /*! Calculate the bounding rectangle for the tracker text from the current position of the tracker \param font Font of the tracker text \return Bounding rectangle of the tracker text \sa trackerPosition() */ QRect QwtPicker::trackerRect( const QFont &font ) const { if ( trackerMode() == AlwaysOff || ( trackerMode() == ActiveOnly && !isActive() ) ) { return QRect(); } if ( d_data->trackerPosition.x() < 0 || d_data->trackerPosition.y() < 0 ) return QRect(); QwtText text = trackerText( d_data->trackerPosition ); if ( text.isEmpty() ) return QRect(); const QSizeF textSize = text.textSize( font ); QRect textRect( 0, 0, qCeil( textSize.width() ), qCeil( textSize.height() ) ); const QPoint &pos = d_data->trackerPosition; int alignment = 0; if ( isActive() && d_data->pickedPoints.count() > 1 && rubberBand() != NoRubberBand ) { const QPoint last = d_data->pickedPoints[int( d_data->pickedPoints.count() ) - 2]; alignment |= ( pos.x() >= last.x() ) ? Qt::AlignRight : Qt::AlignLeft; alignment |= ( pos.y() > last.y() ) ? Qt::AlignBottom : Qt::AlignTop; } else alignment = Qt::AlignTop | Qt::AlignRight; const int margin = 5; int x = pos.x(); if ( alignment & Qt::AlignLeft ) x -= textRect.width() + margin; else if ( alignment & Qt::AlignRight ) x += margin; int y = pos.y(); if ( alignment & Qt::AlignBottom ) y += margin; else if ( alignment & Qt::AlignTop ) y -= textRect.height() + margin; textRect.moveTopLeft( QPoint( x, y ) ); const QRect pickRect = pickArea().boundingRect().toRect(); int right = qMin( textRect.right(), pickRect.right() - margin ); int bottom = qMin( textRect.bottom(), pickRect.bottom() - margin ); textRect.moveBottomRight( QPoint( right, bottom ) ); int left = qMax( textRect.left(), pickRect.left() + margin ); int top = qMax( textRect.top(), pickRect.top() + margin ); textRect.moveTopLeft( QPoint( left, top ) ); return textRect; } /*! \brief Event filter When isEnabled() is true all events of the observed widget are filtered. Mouse and keyboard events are translated into widgetMouse- and widgetKey- and widgetWheel-events. Paint and Resize events are handled to keep rubber band and tracker up to date. \param object Object to be filtered \param event Event \return Always false. \sa widgetEnterEvent(), widgetLeaveEvent(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent(), QObject::installEventFilter(), QObject::event() */ bool QwtPicker::eventFilter( QObject *object, QEvent *event ) { if ( object && object == parentWidget() ) { switch ( event->type() ) { case QEvent::Resize: { const QResizeEvent *re = static_cast( event ); if ( d_data->resizeMode == Stretch ) stretchSelection( re->oldSize(), re->size() ); break; } case QEvent::Enter: { widgetEnterEvent( event ); break; } case QEvent::Leave: { widgetLeaveEvent( event ); break; } case QEvent::MouseButtonPress: { widgetMousePressEvent( static_cast( event ) ); break; } case QEvent::MouseButtonRelease: { widgetMouseReleaseEvent( static_cast( event ) ); break; } case QEvent::MouseButtonDblClick: { widgetMouseDoubleClickEvent( static_cast( event ) ); break; } case QEvent::MouseMove: { widgetMouseMoveEvent( static_cast( event ) ); break; } case QEvent::KeyPress: { widgetKeyPressEvent( static_cast( event ) ); break; } case QEvent::KeyRelease: { widgetKeyReleaseEvent( static_cast( event ) ); break; } case QEvent::Wheel: { widgetWheelEvent( static_cast( event ) ); break; } default: break; } } return false; } /*! Handle a mouse press event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetMousePressEvent( QMouseEvent *mouseEvent ) { transition( mouseEvent ); } /*! Handle a mouse move event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetMouseMoveEvent( QMouseEvent *mouseEvent ) { if ( pickArea().contains( mouseEvent->pos() ) ) d_data->trackerPosition = mouseEvent->pos(); else d_data->trackerPosition = QPoint( -1, -1 ); if ( !isActive() ) updateDisplay(); transition( mouseEvent ); } /*! Handle a enter event for the observed widget. \param event Qt event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetEnterEvent( QEvent *event ) { transition( event ); } /*! Handle a leave event for the observed widget. \param event Qt event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetLeaveEvent( QEvent *event ) { transition( event ); d_data->trackerPosition = QPoint( -1, -1 ); if ( !isActive() ) updateDisplay(); } /*! Handle a mouse release event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetMouseReleaseEvent( QMouseEvent *mouseEvent ) { transition( mouseEvent ); } /*! Handle mouse double click event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetMouseDoubleClickEvent( QMouseEvent *mouseEvent ) { transition( mouseEvent ); } /*! Handle a wheel event for the observed widget. Move the last point of the selection in case of isActive() == true \param wheelEvent Wheel event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent() */ void QwtPicker::widgetWheelEvent( QWheelEvent *wheelEvent ) { if ( pickArea().contains( wheelEvent->pos() ) ) d_data->trackerPosition = wheelEvent->pos(); else d_data->trackerPosition = QPoint( -1, -1 ); updateDisplay(); transition( wheelEvent ); } /*! Handle a key press event for the observed widget. Selections can be completely done by the keyboard. The arrow keys move the cursor, the abort key aborts a selection. All other keys are handled by the current state machine. \param keyEvent Key event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyReleaseEvent(), stateMachine(), QwtEventPattern::KeyPatternCode */ void QwtPicker::widgetKeyPressEvent( QKeyEvent *keyEvent ) { int dx = 0; int dy = 0; int offset = 1; if ( keyEvent->isAutoRepeat() ) offset = 5; if ( keyMatch( KeyLeft, keyEvent ) ) dx = -offset; else if ( keyMatch( KeyRight, keyEvent ) ) dx = offset; else if ( keyMatch( KeyUp, keyEvent ) ) dy = -offset; else if ( keyMatch( KeyDown, keyEvent ) ) dy = offset; else if ( keyMatch( KeyAbort, keyEvent ) ) { reset(); } else transition( keyEvent ); if ( dx != 0 || dy != 0 ) { const QRect rect = pickArea().boundingRect().toRect(); const QPoint pos = parentWidget()->mapFromGlobal( QCursor::pos() ); int x = pos.x() + dx; x = qMax( rect.left(), x ); x = qMin( rect.right(), x ); int y = pos.y() + dy; y = qMax( rect.top(), y ); y = qMin( rect.bottom(), y ); QCursor::setPos( parentWidget()->mapToGlobal( QPoint( x, y ) ) ); } } /*! Handle a key release event for the observed widget. Passes the event to the state machine. \param keyEvent Key event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent(), stateMachine() */ void QwtPicker::widgetKeyReleaseEvent( QKeyEvent *keyEvent ) { transition( keyEvent ); } /*! Passes an event to the state machine and executes the resulting commands. Append and Move commands use the current position of the cursor ( QCursor::pos() ). \param event Event */ void QwtPicker::transition( const QEvent *event ) { if ( !d_data->stateMachine ) return; const QList commandList = d_data->stateMachine->transition( *this, event ); QPoint pos; switch ( event->type() ) { case QEvent::MouseButtonDblClick: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseMove: { const QMouseEvent *me = static_cast< const QMouseEvent * >( event ); pos = me->pos(); break; } default: pos = parentWidget()->mapFromGlobal( QCursor::pos() ); } for ( int i = 0; i < commandList.count(); i++ ) { switch ( commandList[i] ) { case QwtPickerMachine::Begin: { begin(); break; } case QwtPickerMachine::Append: { append( pos ); break; } case QwtPickerMachine::Move: { move( pos ); break; } case QwtPickerMachine::Remove: { remove(); break; } case QwtPickerMachine::End: { end(); break; } } } } /*! Open a selection setting the state to active \sa isActive(), end(), append(), move() */ void QwtPicker::begin() { if ( d_data->isActive ) return; d_data->pickedPoints.resize( 0 ); d_data->isActive = true; Q_EMIT activated( true ); if ( trackerMode() != AlwaysOff ) { if ( d_data->trackerPosition.x() < 0 || d_data->trackerPosition.y() < 0 ) { QWidget *w = parentWidget(); if ( w ) d_data->trackerPosition = w->mapFromGlobal( QCursor::pos() ); } } updateDisplay(); setMouseTracking( true ); } /*! \brief Close a selection setting the state to inactive. The selection is validated and maybe fixed by accept(). \param ok If true, complete the selection and emit a selected signal otherwise discard the selection. \return true if the selection is accepted, false otherwise \sa isActive(), begin(), append(), move(), selected(), accept() */ bool QwtPicker::end( bool ok ) { if ( d_data->isActive ) { setMouseTracking( false ); d_data->isActive = false; Q_EMIT activated( false ); if ( trackerMode() == ActiveOnly ) d_data->trackerPosition = QPoint( -1, -1 ); if ( ok ) ok = accept( d_data->pickedPoints ); if ( ok ) Q_EMIT selected( d_data->pickedPoints ); else d_data->pickedPoints.resize( 0 ); updateDisplay(); } else ok = false; return ok; } /*! Reset the state machine and terminate ( end(false) ) the selection */ void QwtPicker::reset() { if ( d_data->stateMachine ) d_data->stateMachine->reset(); if ( isActive() ) end( false ); } /*! Append a point to the selection and update rubber band and tracker. The appended() signal is emitted. \param pos Additional point \sa isActive(), begin(), end(), move(), appended() */ void QwtPicker::append( const QPoint &pos ) { if ( d_data->isActive ) { const int idx = d_data->pickedPoints.count(); d_data->pickedPoints.resize( idx + 1 ); d_data->pickedPoints[idx] = pos; updateDisplay(); Q_EMIT appended( pos ); } } /*! Move the last point of the selection The moved() signal is emitted. \param pos New position \sa isActive(), begin(), end(), append() */ void QwtPicker::move( const QPoint &pos ) { if ( d_data->isActive ) { const int idx = d_data->pickedPoints.count() - 1; if ( idx >= 0 ) { if ( d_data->pickedPoints[idx] != pos ) { d_data->pickedPoints[idx] = pos; updateDisplay(); Q_EMIT moved( pos ); } } } } /*! Remove the last point of the selection The removed() signal is emitted. \sa isActive(), begin(), end(), append(), move() */ void QwtPicker::remove() { if ( d_data->isActive ) { const int idx = d_data->pickedPoints.count() - 1; if ( idx > 0 ) { const int idx = d_data->pickedPoints.count(); const QPoint pos = d_data->pickedPoints[idx - 1]; d_data->pickedPoints.resize( idx - 1 ); updateDisplay(); Q_EMIT removed( pos ); } } } /*! \brief Validate and fix up the selection Accepts all selections unmodified \param selection Selection to validate and fix up \return true, when accepted, false otherwise */ bool QwtPicker::accept( QPolygon &selection ) const { Q_UNUSED( selection ); return true; } /*! A picker is active between begin() and end(). \return true if the selection is active. */ bool QwtPicker::isActive() const { return d_data->isActive; } /*! Return the points, that have been collected so far. The selection() is calculated from the pickedPoints() in adjustedPoints(). \return Picked points */ const QPolygon &QwtPicker::pickedPoints() const { return d_data->pickedPoints; } /*! Scale the selection by the ratios of oldSize and newSize The changed() signal is emitted. \param oldSize Previous size \param newSize Current size \sa ResizeMode, setResizeMode(), resizeMode() */ void QwtPicker::stretchSelection( const QSize &oldSize, const QSize &newSize ) { if ( oldSize.isEmpty() ) { // avoid division by zero. But scaling for small sizes also // doesn't make much sense, because of rounding losses. TODO ... return; } const double xRatio = double( newSize.width() ) / double( oldSize.width() ); const double yRatio = double( newSize.height() ) / double( oldSize.height() ); for ( int i = 0; i < int( d_data->pickedPoints.count() ); i++ ) { QPoint &p = d_data->pickedPoints[i]; p.setX( qRound( p.x() * xRatio ) ); p.setY( qRound( p.y() * yRatio ) ); Q_EMIT changed( d_data->pickedPoints ); } } /*! Set mouse tracking for the observed widget. In case of enable is true, the previous value is saved, that is restored when enable is false. \warning Even when enable is false, mouse tracking might be restored to true. When mouseTracking for the observed widget has been changed directly by QWidget::setMouseTracking while mouse tracking has been set to true, this value can't be restored. */ void QwtPicker::setMouseTracking( bool enable ) { QWidget *widget = parentWidget(); if ( !widget ) return; if ( enable ) { d_data->mouseTracking = widget->hasMouseTracking(); widget->setMouseTracking( true ); } else { widget->setMouseTracking( d_data->mouseTracking ); } } /*! Find the area of the observed widget, where selection might happen. \return parentWidget()->contentsRect() */ QPainterPath QwtPicker::pickArea() const { QPainterPath path; const QWidget *widget = parentWidget(); if ( widget ) path.addRect( widget->contentsRect() ); return path; } //! Update the state of rubber band and tracker label void QwtPicker::updateDisplay() { QWidget *w = parentWidget(); bool showRubberband = false; bool showTracker = false; if ( w && w->isVisible() && d_data->enabled ) { if ( rubberBand() != NoRubberBand && isActive() && rubberBandPen().style() != Qt::NoPen ) { showRubberband = true; } if ( trackerMode() == AlwaysOn || ( trackerMode() == ActiveOnly && isActive() ) ) { if ( trackerPen() != Qt::NoPen && !trackerRect( QFont() ).isEmpty() ) { showTracker = true; } } } QPointer< QwtPickerRubberband > &rw = d_data->rubberBandOverlay; if ( showRubberband ) { if ( rw.isNull() ) { rw = new QwtPickerRubberband( this, w ); rw->setObjectName( "PickerRubberBand" ); rw->resize( w->size() ); } if ( d_data->rubberBand <= RectRubberBand ) rw->setMaskMode( QwtWidgetOverlay::MaskHint ); else rw->setMaskMode( QwtWidgetOverlay::AlphaMask ); rw->updateOverlay(); } else { if ( d_data->openGL ) { // Qt 4.8 crashes for a delete if ( !rw.isNull() ) { rw->hide(); rw->deleteLater(); rw = NULL; } } else { delete rw; } } QPointer< QwtPickerTracker > &tw = d_data->trackerOverlay; if ( showTracker ) { if ( tw.isNull() ) { tw = new QwtPickerTracker( this, w ); tw->setObjectName( "PickerTracker" ); tw->resize( w->size() ); } tw->setFont( d_data->trackerFont ); tw->updateOverlay(); } else { if ( d_data->openGL ) { // Qt 4.8 crashes for a delete if ( !tw.isNull() ) { tw->hide(); tw->deleteLater(); tw = NULL; } } else { delete tw; } } } //! \return Overlay displaying the rubber band const QwtWidgetOverlay *QwtPicker::rubberBandOverlay() const { return d_data->rubberBandOverlay; } //! \return Overlay displaying the tracker text const QwtWidgetOverlay *QwtPicker::trackerOverlay() const { return d_data->trackerOverlay; } linssid-2.7/qwt-lib/qwt-lib.pro000644 001750 001750 00000001474 12345436147 017364 0ustar00warrenwarren000000 000000 ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ include( qwtconfig.pri ) TEMPLATE = subdirs CONFIG += ordered SUBDIRS = \ src \ textengines # doc # linssid no install contains(QWT_CONFIG, QwtDesigner ) { SUBDIRS += designer } contains(QWT_CONFIG, QwtExamples ) { SUBDIRS += examples } contains(QWT_CONFIG, QwtPlayground ) { SUBDIRS += playground } qwtspec.files = qwtconfig.pri qwtfunctions.pri qwt.prf qwtspec.path = $${QWT_INSTALL_FEATURES} # INSTALLS += qwtspec # linssid no install linssid-2.7/qwt-lib/src/qwt_event_pattern.h000644 001750 001750 00000013517 12151666701 021771 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_EVENT_PATTERN #define QWT_EVENT_PATTERN 1 #include "qwt_global.h" #include #include class QMouseEvent; class QKeyEvent; /*! \brief A collection of event patterns QwtEventPattern introduces an level of indirection for mouse and keyboard inputs. Those are represented by symbolic names, so the application code can be configured by individual mappings. \sa QwtPicker, QwtPickerMachine, QwtPlotZoomer */ class QWT_EXPORT QwtEventPattern { public: /*! \brief Symbolic mouse input codes QwtEventPattern implements 3 different settings for mice with 1, 2, or 3 buttons that can be activated using initMousePattern(). The default setting is for 3 button mice. Individual settings can be configured using setMousePattern(). \sa initMousePattern(), setMousePattern(), setKeyPattern() */ enum MousePatternCode { /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton - Qt::LeftButton - Qt::LeftButton */ MouseSelect1, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::ControlModifier - Qt::RightButton - Qt::RightButton */ MouseSelect2, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::AltModifier - Qt::LeftButton + Qt::AltModifier - Qt::MidButton */ MouseSelect3, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::ShiftModifier - Qt::LeftButton + Qt::ShiftModifier - Qt::LeftButton + Qt::ShiftModifier */ MouseSelect4, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::ControlButton | Qt::ShiftModifier - Qt::RightButton + Qt::ShiftModifier - Qt::RightButton + Qt::ShiftModifier */ MouseSelect5, /*! The default setting for 1, 2 and 3 button mice is: - Qt::LeftButton + Qt::AltModifier + Qt::ShiftModifier - Qt::LeftButton + Qt::AltModifier | Qt::ShiftModifier - Qt::MidButton + Qt::ShiftModifier */ MouseSelect6, //! Number of mouse patterns MousePatternCount }; /*! \brief Symbolic keyboard input codes Individual settings can be configured using setKeyPattern() \sa setKeyPattern(), setMousePattern() */ enum KeyPatternCode { //! Qt::Key_Return KeySelect1, //! Qt::Key_Space KeySelect2, //! Qt::Key_Escape KeyAbort, //! Qt::Key_Left KeyLeft, //! Qt::Key_Right KeyRight, //! Qt::Key_Up KeyUp, //! Qt::Key_Down KeyDown, //! Qt::Key_Plus KeyRedo, //! Qt::Key_Minus KeyUndo, //! Qt::Key_Escape KeyHome, //! Number of key patterns KeyPatternCount }; //! A pattern for mouse events class MousePattern { public: //! Constructor MousePattern( Qt::MouseButton btn = Qt::NoButton, Qt::KeyboardModifiers modifierCodes = Qt::NoModifier ): button( btn ), modifiers( modifierCodes ) { } //! Button Qt::MouseButton button; //! Keyboard modifier Qt::KeyboardModifiers modifiers; }; //! A pattern for key events class KeyPattern { public: //! Constructor KeyPattern( int keyCode = Qt::Key_unknown, Qt::KeyboardModifiers modifierCodes = Qt::NoModifier ): key( keyCode ), modifiers( modifierCodes ) { } //! Key code int key; //! Modifiers Qt::KeyboardModifiers modifiers; }; QwtEventPattern(); virtual ~QwtEventPattern(); void initMousePattern( int numButtons ); void initKeyPattern(); void setMousePattern( MousePatternCode, Qt::MouseButton button, Qt::KeyboardModifiers = Qt::NoModifier ); void setKeyPattern( KeyPatternCode, int keyCode, Qt::KeyboardModifiers modifierCodes = Qt::NoModifier ); void setMousePattern( const QVector & ); void setKeyPattern( const QVector & ); const QVector &mousePattern() const; const QVector &keyPattern() const; QVector &mousePattern(); QVector &keyPattern(); bool mouseMatch( MousePatternCode, const QMouseEvent * ) const; bool keyMatch( KeyPatternCode, const QKeyEvent * ) const; protected: virtual bool mouseMatch( const MousePattern &, const QMouseEvent * ) const; virtual bool keyMatch( const KeyPattern &, const QKeyEvent * ) const; private: #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable: 4251) #endif QVector d_mousePattern; QVector d_keyPattern; #if defined(_MSC_VER) #pragma warning(pop) #endif }; //! Compare operator inline bool operator==( QwtEventPattern::MousePattern b1, QwtEventPattern::MousePattern b2 ) { return b1.button == b2.button && b1.modifiers == b2.modifiers; } //! Compare operator inline bool operator==( QwtEventPattern::KeyPattern b1, QwtEventPattern::KeyPattern b2 ) { return b1.key == b2.key && b1.modifiers == b2.modifiers; } #endif linssid-2.7/linssid-app/Getter.h000664 001750 001750 00000001451 12367017241 017521 0ustar00warrenwarren000000 000000 /* * File: Getter.h * Author: warren * * Created on October 31, 2012, 8:59 AM */ #ifndef GETTER_H #define GETTER_H #include #include #include "Custom.h" using namespace std; class MainForm; // forward declare class Getter : public QThread { Q_OBJECT public: Getter(); virtual ~Getter(); static MainForm* pMainForm; // a pointer to the instance of the MainForm that calls this Getter void run(); static const QEvent::Type DATA_WANTED_EVENT; class DataWantedEvent; int getWantedBlockNo(); void postDataWantedEvent(const int); inline void waste(int); protected: void customEvent(QEvent *); // This overrides QObject::customEvent() private: void handleDataWantedEvent(const DataWantedEvent *); }; #endif /* GETTER_H */ linssid-2.7/qwt-lib/src/qwt_dial_needle.h000644 001750 001750 00000007772 12151666702 021347 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DIAL_NEEDLE_H #define QWT_DIAL_NEEDLE_H 1 #include "qwt_global.h" #include class QPainter; class QPoint; /*! \brief Base class for needles that can be used in a QwtDial. QwtDialNeedle is a pointer that indicates a value by pointing to a specific direction. \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialNeedle { public: QwtDialNeedle(); virtual ~QwtDialNeedle(); virtual void setPalette( const QPalette & ); const QPalette &palette() const; virtual void draw( QPainter *painter, const QPointF ¢er, double length, double direction, QPalette::ColorGroup = QPalette::Active ) const; protected: /*! \brief Draw the needle The origin of the needle is at position (0.0, 0.0 ) pointing in direction 0.0 ( = east ). The painter is already initialized with translation and rotation. \param painter Painter \param length Length of the needle \param colorGroup Color group, used for painting \sa setPalette(), palette() */ virtual void drawNeedle( QPainter *painter, double length, QPalette::ColorGroup colorGroup ) const = 0; virtual void drawKnob( QPainter *, double width, const QBrush &, bool sunken ) const; private: QPalette d_palette; }; /*! \brief A needle for dial widgets The following colors are used: - QPalette::Mid\n Pointer - QPalette::Base\n Knob \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialSimpleNeedle: public QwtDialNeedle { public: //! Style of the needle enum Style { //! Arrow Arrow, //! A straight line from the center Ray }; QwtDialSimpleNeedle( Style, bool hasKnob = true, const QColor &mid = Qt::gray, const QColor &base = Qt::darkGray ); void setWidth( double width ); double width() const; protected: virtual void drawNeedle( QPainter *, double length, QPalette::ColorGroup ) const; private: Style d_style; bool d_hasKnob; double d_width; }; /*! \brief A magnet needle for compass widgets A magnet needle points to two opposite directions indicating north and south. The following colors are used: - QPalette::Light\n Used for pointing south - QPalette::Dark\n Used for pointing north - QPalette::Base\n Knob (ThinStyle only) \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtCompassMagnetNeedle: public QwtDialNeedle { public: //! Style of the needle enum Style { //! A needle with a triangular shape TriangleStyle, //! A thin needle ThinStyle }; QwtCompassMagnetNeedle( Style = TriangleStyle, const QColor &light = Qt::white, const QColor &dark = Qt::red ); protected: virtual void drawNeedle( QPainter *, double length, QPalette::ColorGroup ) const; private: Style d_style; }; /*! \brief An indicator for the wind direction QwtCompassWindArrow shows the direction where the wind comes from. - QPalette::Light\n Used for Style1, or the light half of Style2 - QPalette::Dark\n Used for the dark half of Style2 \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtCompassWindArrow: public QwtDialNeedle { public: //! Style of the arrow enum Style { //! A needle pointing to the center Style1, //! A needle pointing to the center Style2 }; QwtCompassWindArrow( Style, const QColor &light = Qt::white, const QColor &dark = Qt::gray ); protected: virtual void drawNeedle( QPainter *, double length, QPalette::ColorGroup ) const; private: Style d_style; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_spectrocurve.cpp000644 001750 001750 00000017207 12151666703 023232 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_spectrocurve.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include "qwt_painter.h" #include class QwtPlotSpectroCurve::PrivateData { public: PrivateData(): colorRange( 0.0, 1000.0 ), penWidth(0.0), paintAttributes( QwtPlotSpectroCurve::ClipPoints ) { colorMap = new QwtLinearColorMap(); } ~PrivateData() { delete colorMap; } QwtColorMap *colorMap; QwtInterval colorRange; QVector colorTable; double penWidth; QwtPlotSpectroCurve::PaintAttributes paintAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotSpectroCurve::QwtPlotSpectroCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotSpectroCurve::QwtPlotSpectroCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotSpectroCurve::~QwtPlotSpectroCurve() { delete d_data; } /*! \brief Initialize data members */ void QwtPlotSpectroCurve::init() { setItemAttribute( QwtPlotItem::Legend ); setItemAttribute( QwtPlotItem::AutoScale ); d_data = new PrivateData; setData( new QwtPoint3DSeriesData() ); setZ( 20.0 ); } //! \return QwtPlotItem::Rtti_PlotSpectroCurve int QwtPlotSpectroCurve::rtti() const { return QwtPlotItem::Rtti_PlotSpectroCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off /sa PaintAttribute, testPaintAttribute() */ void QwtPlotSpectroCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa PaintAttribute, setPaintAttribute() */ bool QwtPlotSpectroCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Initialize data with an array of samples. \param samples Vector of points */ void QwtPlotSpectroCurve::setSamples( const QVector &samples ) { setData( new QwtPoint3DSeriesData( samples ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotSpectroCurve::setSamples( QwtSeriesData *data ) { setData( data ); } /*! Change the color map Often it is useful to display the mapping between intensities and colors as an additional plot axis, showing a color bar. \param colorMap Color Map \sa colorMap(), setColorRange(), QwtColorMap::color(), QwtScaleWidget::setColorBarEnabled(), QwtScaleWidget::setColorMap() */ void QwtPlotSpectroCurve::setColorMap( QwtColorMap *colorMap ) { if ( colorMap != d_data->colorMap ) { delete d_data->colorMap; d_data->colorMap = colorMap; } legendChanged(); itemChanged(); } /*! \return Color Map used for mapping the intensity values to colors \sa setColorMap(), setColorRange(), QwtColorMap::color() */ const QwtColorMap *QwtPlotSpectroCurve::colorMap() const { return d_data->colorMap; } /*! Set the value interval, that corresponds to the color map \param interval interval.minValue() corresponds to 0.0, interval.maxValue() to 1.0 on the color map. \sa colorRange(), setColorMap(), QwtColorMap::color() */ void QwtPlotSpectroCurve::setColorRange( const QwtInterval &interval ) { if ( interval != d_data->colorRange ) { d_data->colorRange = interval; legendChanged(); itemChanged(); } } /*! \return Value interval, that corresponds to the color map \sa setColorRange(), setColorMap(), QwtColorMap::color() */ QwtInterval &QwtPlotSpectroCurve::colorRange() const { return d_data->colorRange; } /*! Assign a pen width \param penWidth New pen width \sa penWidth() */ void QwtPlotSpectroCurve::setPenWidth(double penWidth) { if ( penWidth < 0.0 ) penWidth = 0.0; if ( d_data->penWidth != penWidth ) { d_data->penWidth = penWidth; legendChanged(); itemChanged(); } } /*! \return Pen width used to draw a dot \sa setPenWidth() */ double QwtPlotSpectroCurve::penWidth() const { return d_data->penWidth; } /*! Draw a subset of the points \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the series will be painted to its last sample. \sa drawDots() */ void QwtPlotSpectroCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( !painter || dataSize() <= 0 ) return; if ( to < 0 ) to = dataSize() - 1; if ( from < 0 ) from = 0; if ( from > to ) return; drawDots( painter, xMap, yMap, canvasRect, from, to ); } /*! Draw a subset of the points \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the series will be painted to its last sample. \sa drawSeries() */ void QwtPlotSpectroCurve::drawDots( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( !d_data->colorRange.isValid() ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); const QwtColorMap::Format format = d_data->colorMap->format(); if ( format == QwtColorMap::Indexed ) d_data->colorTable = d_data->colorMap->colorTable( d_data->colorRange ); const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QwtPoint3D sample = series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( d_data->paintAttributes & QwtPlotSpectroCurve::ClipPoints ) { if ( !canvasRect.contains( xi, yi ) ) continue; } if ( format == QwtColorMap::RGB ) { const QRgb rgb = d_data->colorMap->rgb( d_data->colorRange, sample.z() ); painter->setPen( QPen( QColor( rgb ), d_data->penWidth ) ); } else { const unsigned char index = d_data->colorMap->colorIndex( d_data->colorRange, sample.z() ); painter->setPen( QPen( QColor( d_data->colorTable[index] ), d_data->penWidth ) ); } QwtPainter::drawPoint( painter, QPointF( xi, yi ) ); } d_data->colorTable.clear(); } linssid-2.7/debian/source/format000664 001750 001750 00000000014 12345373236 017627 0ustar00warrenwarren000000 000000 3.0 (quilt) linssid-2.7/debian/source/000755 001750 001750 00000000000 12345373236 016417 5ustar00warrenwarren000000 000000 linssid-2.7/qwt-lib/src/qwt_legend_data.cpp000644 001750 001750 00000005252 12151666703 021674 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend_data.h" //! Constructor QwtLegendData::QwtLegendData() { } //! Destructor QwtLegendData::~QwtLegendData() { } /*! Set the legend attributes QwtLegendData actually is a QMap with some convenience interfaces \param map Values \sa values() */ void QwtLegendData::setValues( const QMap &map ) { d_map = map; } /*! \return Legend attributes \sa setValues() */ const QMap &QwtLegendData::values() const { return d_map; } /*! \param role Attribute role \return True, when the internal map has an entry for role */ bool QwtLegendData::hasRole( int role ) const { return d_map.contains( role ); } /*! Set an attribute value \param role Attribute role \param data Attribute value \sa value() */ void QwtLegendData::setValue( int role, const QVariant &data ) { d_map[role] = data; } /*! \param role Attribute role \return Attribute value for a specific role */ QVariant QwtLegendData::value( int role ) const { if ( !d_map.contains( role ) ) return QVariant(); return d_map[role]; } //! \return True, when the internal map is empty bool QwtLegendData::isValid() const { return !d_map.isEmpty(); } //! \return Value of the TitleRole attribute QwtText QwtLegendData::title() const { QwtText text; const QVariant titleValue = value( QwtLegendData::TitleRole ); if ( titleValue.canConvert() ) { text = qvariant_cast( titleValue ); } else if ( titleValue.canConvert() ) { text.setText( qvariant_cast( titleValue ) ); } return text; } //! \return Value of the IconRole attribute QwtGraphic QwtLegendData::icon() const { const QVariant iconValue = value( QwtLegendData::IconRole ); QwtGraphic graphic; if ( iconValue.canConvert() ) { graphic = qvariant_cast( iconValue ); } return graphic; } //! \return Value of the ModeRole attribute QwtLegendData::Mode QwtLegendData::mode() const { const QVariant modeValue = value( QwtLegendData::ModeRole ); if ( modeValue.canConvert() ) { const int mode = qvariant_cast( modeValue ); return static_cast( mode ); } return QwtLegendData::ReadOnly; } linssid-2.7/linssid-app/prefsDialog.h000664 001750 001750 00000001235 12355414341 020525 0ustar00warrenwarren000000 000000 /* * File: Preferences.h * Author: warren * * Created on January 2, 2013, 2:40 PM */ #ifndef _PREFERENCES_H #define _PREFERENCES_H #include "ui_prefsDialog.h" struct sEntryValue; class prefsDialog : public QDialog { Q_OBJECT public: prefsDialog(int, int, bool, int, QObject*); virtual ~prefsDialog(); static sEntryValue entryValue; public slots: // void returnPrefsOK(); void bailOut(int); void minSbChanged(int); void maxSbChanged(int); void gridChanged(int); // void interceptClose(int); signals: void plotPrefsChanged(int, int, bool); private: Ui::prefsDialog widget; }; #endif /* _PREFERENCES_H */ linssid-2.7/qwt-lib/src/qwt_spline.cpp000644 001750 001750 00000020412 12151666703 020732 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_spline.h" #include "qwt_math.h" class QwtSpline::PrivateData { public: PrivateData(): splineType( QwtSpline::Natural ) { } QwtSpline::SplineType splineType; // coefficient vectors QVector a; QVector b; QVector c; // control points QPolygonF points; }; static int lookup( double x, const QPolygonF &values ) { #if 0 //qLowerBound/qHigherBound ??? #endif int i1; const int size = values.size(); if ( x <= values[0].x() ) i1 = 0; else if ( x >= values[size - 2].x() ) i1 = size - 2; else { i1 = 0; int i2 = size - 2; int i3 = 0; while ( i2 - i1 > 1 ) { i3 = i1 + ( ( i2 - i1 ) >> 1 ); if ( values[i3].x() > x ) i2 = i3; else i1 = i3; } } return i1; } //! Constructor QwtSpline::QwtSpline() { d_data = new PrivateData; } /*! Copy constructor \param other Spline used for initialization */ QwtSpline::QwtSpline( const QwtSpline& other ) { d_data = new PrivateData( *other.d_data ); } /*! Assignment operator \param other Spline used for initialization \return *this */ QwtSpline &QwtSpline::operator=( const QwtSpline & other ) { *d_data = *other.d_data; return *this; } //! Destructor QwtSpline::~QwtSpline() { delete d_data; } /*! Select the algorithm used for calculating the spline \param splineType Spline type \sa splineType() */ void QwtSpline::setSplineType( SplineType splineType ) { d_data->splineType = splineType; } /*! \return the spline type \sa setSplineType() */ QwtSpline::SplineType QwtSpline::splineType() const { return d_data->splineType; } /*! \brief Calculate the spline coefficients Depending on the value of \a periodic, this function will determine the coefficients for a natural or a periodic spline and store them internally. \param points Points \return true if successful \warning The sequence of x (but not y) values has to be strictly monotone increasing, which means points[i].x() < points[i+1].x(). If this is not the case, the function will return false */ bool QwtSpline::setPoints( const QPolygonF& points ) { const int size = points.size(); if ( size <= 2 ) { reset(); return false; } d_data->points = points; d_data->a.resize( size - 1 ); d_data->b.resize( size - 1 ); d_data->c.resize( size - 1 ); bool ok; if ( d_data->splineType == Periodic ) ok = buildPeriodicSpline( points ); else ok = buildNaturalSpline( points ); if ( !ok ) reset(); return ok; } /*! \return Points, that have been by setPoints() */ QPolygonF QwtSpline::points() const { return d_data->points; } //! \return A coefficients const QVector &QwtSpline::coefficientsA() const { return d_data->a; } //! \return B coefficients const QVector &QwtSpline::coefficientsB() const { return d_data->b; } //! \return C coefficients const QVector &QwtSpline::coefficientsC() const { return d_data->c; } //! Free allocated memory and set size to 0 void QwtSpline::reset() { d_data->a.resize( 0 ); d_data->b.resize( 0 ); d_data->c.resize( 0 ); d_data->points.resize( 0 ); } //! True if valid bool QwtSpline::isValid() const { return d_data->a.size() > 0; } /*! Calculate the interpolated function value corresponding to a given argument x. \param x Coordinate \return Interpolated coordinate */ double QwtSpline::value( double x ) const { if ( d_data->a.size() == 0 ) return 0.0; const int i = lookup( x, d_data->points ); const double delta = x - d_data->points[i].x(); return( ( ( ( d_data->a[i] * delta ) + d_data->b[i] ) * delta + d_data->c[i] ) * delta + d_data->points[i].y() ); } /*! \brief Determines the coefficients for a natural spline \return true if successful */ bool QwtSpline::buildNaturalSpline( const QPolygonF &points ) { int i; const QPointF *p = points.data(); const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); // set up tridiagonal equation system; use coefficient // vectors as temporary buffers QVector h( size - 1 ); for ( i = 0; i < size - 1; i++ ) { h[i] = p[i+1].x() - p[i].x(); if ( h[i] <= 0 ) return false; } QVector d( size - 1 ); double dy1 = ( p[1].y() - p[0].y() ) / h[0]; for ( i = 1; i < size - 1; i++ ) { b[i] = c[i] = h[i]; a[i] = 2.0 * ( h[i-1] + h[i] ); const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i]; d[i] = 6.0 * ( dy1 - dy2 ); dy1 = dy2; } // // solve it // // L-U Factorization for ( i = 1; i < size - 2; i++ ) { c[i] /= a[i]; a[i+1] -= b[i] * c[i]; } // forward elimination QVector s( size ); s[1] = d[1]; for ( i = 2; i < size - 1; i++ ) s[i] = d[i] - c[i-1] * s[i-1]; // backward elimination s[size - 2] = - s[size - 2] / a[size - 2]; for ( i = size - 3; i > 0; i-- ) s[i] = - ( s[i] + b[i] * s[i+1] ) / a[i]; s[size - 1] = s[0] = 0.0; // // Finally, determine the spline coefficients // for ( i = 0; i < size - 1; i++ ) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] ); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; } /*! \brief Determines the coefficients for a periodic spline \return true if successful */ bool QwtSpline::buildPeriodicSpline( const QPolygonF &points ) { int i; const QPointF *p = points.data(); const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); QVector d( size - 1 ); QVector h( size - 1 ); QVector s( size ); // // setup equation system; use coefficient // vectors as temporary buffers // for ( i = 0; i < size - 1; i++ ) { h[i] = p[i+1].x() - p[i].x(); if ( h[i] <= 0.0 ) return false; } const int imax = size - 2; double htmp = h[imax]; double dy1 = ( p[0].y() - p[imax].y() ) / htmp; for ( i = 0; i <= imax; i++ ) { b[i] = c[i] = h[i]; a[i] = 2.0 * ( htmp + h[i] ); const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i]; d[i] = 6.0 * ( dy1 - dy2 ); dy1 = dy2; htmp = h[i]; } // // solve it // // L-U Factorization a[0] = qSqrt( a[0] ); c[0] = h[imax] / a[0]; double sum = 0; for ( i = 0; i < imax - 1; i++ ) { b[i] /= a[i]; if ( i > 0 ) c[i] = - c[i-1] * b[i-1] / a[i]; a[i+1] = qSqrt( a[i+1] - qwtSqr( b[i] ) ); sum += qwtSqr( c[i] ); } b[imax-1] = ( b[imax-1] - c[imax-2] * b[imax-2] ) / a[imax-1]; a[imax] = qSqrt( a[imax] - qwtSqr( b[imax-1] ) - sum ); // forward elimination s[0] = d[0] / a[0]; sum = 0; for ( i = 1; i < imax; i++ ) { s[i] = ( d[i] - b[i-1] * s[i-1] ) / a[i]; sum += c[i-1] * s[i-1]; } s[imax] = ( d[imax] - b[imax-1] * s[imax-1] - sum ) / a[imax]; // backward elimination s[imax] = - s[imax] / a[imax]; s[imax-1] = -( s[imax-1] + b[imax-1] * s[imax] ) / a[imax-1]; for ( i = imax - 2; i >= 0; i-- ) s[i] = - ( s[i] + b[i] * s[i+1] + c[i] * s[imax] ) / a[i]; // // Finally, determine the spline coefficients // s[size-1] = s[0]; for ( i = 0; i < size - 1; i++ ) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] ); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; } linssid-2.7/qwt-lib/README000644 001750 001750 00000001622 12151666676 016145 0ustar00warrenwarren000000 000000 The Qwt Widget Library ---------------------- Qwt is an extension to the libraries of the Qt Project. The Qwt library contains widgets and components which are primarily useful for technical and scientifical purposes. It includes a 2-D plotting widget, different kinds of sliders, and much more. Qwt is hosted at http://qwt.sf.net Installation ------------ Read INSTALL how to build and install Qwt. Copyright --------- Qwt Widget Library Copyright (C) 1997 Josef Wilgen Copyright (C) 2002 Uwe Rathmann Qwt is published under the Qwt License, Version 1.0. You should have received a copy of this licence in the file COPYING. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. linssid-2.7/qwt-lib/src/qwt_text_engine.cpp000644 001750 001750 00000021133 12151666703 021752 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text_engine.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #include static QString taggedRichText( const QString &text, int flags ) { QString richText = text; // By default QSimpleRichText is Qt::AlignLeft if ( flags & Qt::AlignJustify ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } else if ( flags & Qt::AlignRight ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } else if ( flags & Qt::AlignHCenter ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } return richText; } class QwtRichTextDocument: public QTextDocument { public: QwtRichTextDocument( const QString &text, int flags, const QFont &font ) { setUndoRedoEnabled( false ); setDefaultFont( font ); setHtml( text ); // make sure we have a document layout ( void )documentLayout(); QTextOption option = defaultTextOption(); if ( flags & Qt::TextWordWrap ) option.setWrapMode( QTextOption::WordWrap ); else option.setWrapMode( QTextOption::NoWrap ); option.setAlignment( static_cast( flags ) ); setDefaultTextOption( option ); QTextFrame *root = rootFrame(); QTextFrameFormat fm = root->frameFormat(); fm.setBorder( 0 ); fm.setMargin( 0 ); fm.setPadding( 0 ); fm.setBottomMargin( 0 ); fm.setLeftMargin( 0 ); root->setFrameFormat( fm ); adjustSize(); } }; class QwtPlainTextEngine::PrivateData { public: int effectiveAscent( const QFont &font ) const { const QString fontKey = font.key(); QMap::const_iterator it = d_ascentCache.find( fontKey ); if ( it == d_ascentCache.end() ) { int ascent = findAscent( font ); it = d_ascentCache.insert( fontKey, ascent ); } return ( *it ); } private: int findAscent( const QFont &font ) const { static const QString dummy( "E" ); static const QColor white( Qt::white ); const QFontMetrics fm( font ); QPixmap pm( fm.width( dummy ), fm.height() ); pm.fill( white ); QPainter p( &pm ); p.setFont( font ); p.drawText( 0, 0, pm.width(), pm.height(), 0, dummy ); p.end(); const QImage img = pm.toImage(); int row = 0; for ( row = 0; row < img.height(); row++ ) { const QRgb *line = reinterpret_cast( img.scanLine( row ) ); const int w = pm.width(); for ( int col = 0; col < w; col++ ) { if ( line[col] != white.rgb() ) return fm.ascent() - row + 1; } } return fm.ascent(); } mutable QMap d_ascentCache; }; //! Constructor QwtTextEngine::QwtTextEngine() { } //! Destructor QwtTextEngine::~QwtTextEngine() { } //! Constructor QwtPlainTextEngine::QwtPlainTextEngine() { d_data = new PrivateData; } //! Destructor QwtPlainTextEngine::~QwtPlainTextEngine() { delete d_data; } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ double QwtPlainTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double width ) const { const QFontMetricsF fm( font ); const QRectF rect = fm.boundingRect( QRectF( 0, 0, width, QWIDGETSIZE_MAX ), flags, text ); return rect.height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \return Caluclated size */ QSizeF QwtPlainTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { const QFontMetricsF fm( font ); const QRectF rect = fm.boundingRect( QRectF( 0, 0, QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ), flags, text ); return rect.size(); } /*! Return margins around the texts \param font Font of the text \param left Return 0 \param right Return 0 \param top Return value for the top margin \param bottom Return value for the bottom margin */ void QwtPlainTextEngine::textMargins( const QFont &font, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = 0; const QFontMetricsF fm( font ); top = fm.ascent() - d_data->effectiveAscent( font ); bottom = fm.descent(); } /*! \brief Draw the text in a clipping rectangle A wrapper for QPainter::drawText. \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered */ void QwtPlainTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtPainter::drawText( painter, rect, flags, text ); } /*! Test if a string can be rendered by this text engine. \return Always true. All texts can be rendered by QwtPlainTextEngine */ bool QwtPlainTextEngine::mightRender( const QString & ) const { return true; } #ifndef QT_NO_RICHTEXT //! Constructor QwtRichTextEngine::QwtRichTextEngine() { } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText() \param text Text to be rendered \param width Width \return Calculated height */ double QwtRichTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double width ) const { QwtRichTextDocument doc( text, flags, font ); doc.setPageSize( QSizeF( width, QWIDGETSIZE_MAX ) ); return doc.documentLayout()->documentSize().height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText() \param text Text to be rendered \return Caluclated size */ QSizeF QwtRichTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { QwtRichTextDocument doc( text, flags, font ); QTextOption option = doc.defaultTextOption(); if ( option.wrapMode() != QTextOption::NoWrap ) { option.setWrapMode( QTextOption::NoWrap ); doc.setDefaultTextOption( option ); doc.adjustSize(); } return doc.size(); } /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText() \param text Text to be rendered */ void QwtRichTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtRichTextDocument doc( text, flags, painter->font() ); QwtPainter::drawSimpleRichText( painter, rect, flags, doc ); } /*! Wrap text into
tags according flags \param text Text \param flags Bitwise OR of the flags like in for QPainter::drawText() \return Tagged text */ QString QwtRichTextEngine::taggedText( const QString &text, int flags ) const { return taggedRichText( text, flags ); } /*! Test if a string can be rendered by this text engine \param text Text to be tested \return Qt::mightBeRichText(text); */ bool QwtRichTextEngine::mightRender( const QString &text ) const { return Qt::mightBeRichText( text ); } /*! Return margins around the texts \param left Return 0 \param right Return 0 \param top Return 0 \param bottom Return 0 */ void QwtRichTextEngine::textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = bottom = 0; } #endif // !QT_NO_RICHTEXT linssid-2.7/qwt-lib/textengines/000755 001750 001750 00000000000 12356261672 017613 5ustar00warrenwarren000000 000000 linssid-2.7/qwt-lib/src/qwt_interval_symbol.h000644 001750 001750 00000004314 12151666701 022317 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_INTERVAL_SYMBOL_H #define QWT_INTERVAL_SYMBOL_H #include "qwt_global.h" #include #include class QPainter; class QRect; class QPointF; /*! \brief A drawing primitive for displaying an interval like an error bar \sa QwtPlotIntervalCurve */ class QWT_EXPORT QwtIntervalSymbol { public: //! Symbol style enum Style { //! No Style. The symbol cannot be drawn. NoSymbol = -1, /*! The symbol displays a line with caps at the beginning/end. The size of the caps depends on the symbol width(). */ Bar, /*! The symbol displays a plain rectangle using pen() and brush(). The size of the rectangle depends on the translated interval and the width(), */ Box, /*! Styles >= UserSymbol are reserved for derived classes of QwtIntervalSymbol that overload draw() with additional application specific symbol types. */ UserSymbol = 1000 }; public: QwtIntervalSymbol( Style = NoSymbol ); QwtIntervalSymbol( const QwtIntervalSymbol & ); virtual ~QwtIntervalSymbol(); QwtIntervalSymbol &operator=( const QwtIntervalSymbol & ); bool operator==( const QwtIntervalSymbol & ) const; bool operator!=( const QwtIntervalSymbol & ) const; void setWidth( int ); int width() const; void setBrush( const QBrush& b ); const QBrush& brush() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen& pen() const; void setStyle( Style ); Style style() const; virtual void draw( QPainter *, Qt::Orientation, const QPointF& from, const QPointF& to ) const; private: class PrivateData; PrivateData* d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_dict.h000644 001750 001750 00000003170 12151666701 021066 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file !*/ #ifndef QWT_PLOT_DICT #define QWT_PLOT_DICT #include "qwt_global.h" #include "qwt_plot_item.h" #include /// \var typedef QList< QwtPlotItem *> QwtPlotItemList /// \brief See QT 4.x assistant documentation for QList typedef QList QwtPlotItemList; typedef QList::ConstIterator QwtPlotItemIterator; /*! \brief A dictionary for plot items QwtPlotDict organizes plot items in increasing z-order. If autoDelete() is enabled, all attached items will be deleted in the destructor of the dictionary. QwtPlotDict can be used to get access to all QwtPlotItem items - or all items of a specific type - that are currently on the plot. \sa QwtPlotItem::attach(), QwtPlotItem::detach(), QwtPlotItem::z() */ class QWT_EXPORT QwtPlotDict { public: explicit QwtPlotDict(); virtual ~QwtPlotDict(); void setAutoDelete( bool ); bool autoDelete() const; const QwtPlotItemList& itemList() const; QwtPlotItemList itemList( int rtti ) const; void detachItems( int rtti = QwtPlotItem::Rtti_PlotItem, bool autoDelete = true ); protected: void insertItem( QwtPlotItem * ); void removeItem( QwtPlotItem * ); private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_legenditem.cpp000644 001750 001750 00000046316 12151666703 022626 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_legenditem.h" #include "qwt_dyngrid_layout.h" #include "qwt_scale_map.h" #include "qwt_painter.h" #include #include #include #include #include class QwtLegendLayoutItem: public QLayoutItem { public: QwtLegendLayoutItem( const QwtPlotLegendItem *, const QwtPlotItem * ); virtual ~QwtLegendLayoutItem(); const QwtPlotItem *plotItem() const; void setData( const QwtLegendData & ); const QwtLegendData &data() const; virtual Qt::Orientations expandingDirections() const; virtual QRect geometry() const; virtual bool hasHeightForWidth() const; virtual int heightForWidth( int w ) const; virtual bool isEmpty() const; virtual QSize maximumSize() const; virtual int minimumHeightForWidth( int w ) const; virtual QSize minimumSize() const; virtual void setGeometry( const QRect & r ); virtual QSize sizeHint() const; private: const QwtPlotLegendItem *d_legendItem; const QwtPlotItem *d_plotItem; QwtLegendData d_data; QRect d_rect; }; QwtLegendLayoutItem::QwtLegendLayoutItem( const QwtPlotLegendItem *legendItem, const QwtPlotItem *plotItem ): d_legendItem( legendItem ), d_plotItem( plotItem) { } QwtLegendLayoutItem::~QwtLegendLayoutItem() { } const QwtPlotItem *QwtLegendLayoutItem::plotItem() const { return d_plotItem; } void QwtLegendLayoutItem::setData( const QwtLegendData &data ) { d_data = data; } const QwtLegendData &QwtLegendLayoutItem::data() const { return d_data; } Qt::Orientations QwtLegendLayoutItem::expandingDirections() const { return Qt::Horizontal; } bool QwtLegendLayoutItem::hasHeightForWidth() const { return !d_data.title().isEmpty(); } int QwtLegendLayoutItem::minimumHeightForWidth( int w ) const { return d_legendItem->heightForWidth( d_data, w ); } int QwtLegendLayoutItem::heightForWidth( int w ) const { return d_legendItem->heightForWidth( d_data, w ); } bool QwtLegendLayoutItem::isEmpty() const { return false; } QSize QwtLegendLayoutItem::maximumSize() const { return QSize( QLAYOUTSIZE_MAX, QLAYOUTSIZE_MAX ); } QSize QwtLegendLayoutItem::minimumSize() const { return d_legendItem->minimumSize( d_data ); } QSize QwtLegendLayoutItem::sizeHint() const { return minimumSize(); } void QwtLegendLayoutItem::setGeometry( const QRect &rect ) { d_rect = rect; } QRect QwtLegendLayoutItem::geometry() const { return d_rect; } class QwtPlotLegendItem::PrivateData { public: PrivateData(): itemMargin( 4 ), itemSpacing( 4 ), borderRadius( 0.0 ), borderPen( Qt::NoPen ), backgroundBrush( Qt::NoBrush ), backgroundMode( QwtPlotLegendItem::LegendBackground ), borderDistance( 10 ), alignment( Qt::AlignRight | Qt::AlignBottom ) { layout = new QwtDynGridLayout(); layout->setMaxColumns( 2 ); layout->setSpacing( 0 ); layout->setContentsMargins( 0, 0, 0, 0 ); } ~PrivateData() { delete layout; } QFont font; QPen textPen; int itemMargin; int itemSpacing; double borderRadius; QPen borderPen; QBrush backgroundBrush; QwtPlotLegendItem::BackgroundMode backgroundMode; int borderDistance; Qt::Alignment alignment; QMap< const QwtPlotItem *, QList > map; QwtDynGridLayout *layout; }; //! Constructor QwtPlotLegendItem::QwtPlotLegendItem(): QwtPlotItem( QwtText( "Legend" ) ) { d_data = new PrivateData; setItemInterest( QwtPlotItem::LegendInterest, true ); setZ( 100.0 ); } //! Destructor QwtPlotLegendItem::~QwtPlotLegendItem() { clearLegend(); delete d_data; } //! \return QwtPlotItem::Rtti_PlotLegend int QwtPlotLegendItem::rtti() const { return QwtPlotItem::Rtti_PlotLegend; } /*! \brief Set the alignmnet Alignment means the position of the legend relative to the geometry of the plot canvas. \param alignment Alignment flags \sa alignment(), setMaxColumns() \note To align a legend with many items horizontally the number of columns need to be limited */ void QwtPlotLegendItem::setAlignment( Qt::Alignment alignment ) { if ( d_data->alignment != alignment ) { d_data->alignment = alignment; itemChanged(); } } /*! \return Alignment flags \sa setAlignment() */ Qt::Alignment QwtPlotLegendItem::alignment() const { return d_data->alignment; } /*! \brief Limit the number of columns When aligning the legend horizontally ( Qt::AlignLeft, Qt::AlignRight ) the number of columns needs to be limited to avoid, that the width of the legend grows with an increasing number of entries. \param maxColumns Maximum number of columns. 0 means unlimited. \sa maxColumns(), QwtDynGridLayout::setMaxColumns() */ void QwtPlotLegendItem::setMaxColumns( uint maxColumns ) { if ( maxColumns != d_data->layout->maxColumns() ) { d_data->layout->setMaxColumns( maxColumns ); itemChanged(); } } /*! \return Maximum number of columns \sa maxColumns(), QwtDynGridLayout::maxColumns() */ uint QwtPlotLegendItem::maxColumns() const { return d_data->layout->maxColumns(); } /*! \brief Set the margin around legend items The default setting for the margin is 0. \param margin Margin in pixels \sa margin(), setSpacing(), setItemMargin(), setItemSpacing */ void QwtPlotLegendItem::setMargin( int margin ) { margin = qMax( margin, 0 ); if ( margin != this->margin() ) { d_data->layout->setContentsMargins( margin, margin, margin, margin ); itemChanged(); } } /*! \return Margin around the legend items \sa setMargin(), spacing(), itemMargin(), itemSpacing() */ int QwtPlotLegendItem::margin() const { int left; d_data->layout->getContentsMargins( &left, NULL, NULL, NULL ); return left; } /*! \brief Set the spacing between the legend items \param spacing Spacing in pixels \sa spacing(), setMargin() */ void QwtPlotLegendItem::setSpacing( int spacing ) { spacing = qMax( spacing, 0 ); if ( spacing != d_data->layout->spacing() ) { d_data->layout->setSpacing( spacing ); itemChanged(); } } /*! \return Spacing between the legend items \sa setSpacing(), margin(), itemSpacing(), itemMargin() */ int QwtPlotLegendItem::spacing() const { return d_data->layout->spacing(); } /*! Set the margin around each item \param margin Margin \sa itemMargin(), setItemSpacing(), setMargin(), setSpacing() */ void QwtPlotLegendItem::setItemMargin( int margin ) { margin = qMax( margin, 0 ); if ( margin != d_data->itemMargin ) { d_data->itemMargin = margin; d_data->layout->invalidate(); itemChanged(); } } /*! \return Margin around each item \sa setItemMargin(), itemSpacing(), margin(), spacing() */ int QwtPlotLegendItem::itemMargin() const { return d_data->itemMargin; } /*! Set the spacing inside of each item \param spacing Spacing \sa itemSpacing(), setItemMargin(), setMargin(), setSpacing() */ void QwtPlotLegendItem::setItemSpacing( int spacing ) { spacing = qMax( spacing, 0 ); if ( spacing != d_data->itemSpacing ) { d_data->itemSpacing = spacing; d_data->layout->invalidate(); itemChanged(); } } /*! \return Spacing inside of each item \sa setItemSpacing(), itemMargin(), margin(), spacing() */ int QwtPlotLegendItem::itemSpacing() const { return d_data->itemSpacing; } /*! Change the font used for drawing the text label \param font Legend font \sa font() */ void QwtPlotLegendItem::setFont( const QFont &font ) { if ( font != d_data->font ) { d_data->font = font; d_data->layout->invalidate(); itemChanged(); } } /*! \return Font used for drawing the text label \sa setFont() */ QFont QwtPlotLegendItem::font() const { return d_data->font; } /*! \brief Set the margin between the legend and the canvas border The default setting for the margin is 10 pixels. \param distance Margin in pixels \sa setMargin() */ void QwtPlotLegendItem::setBorderDistance( int distance ) { if ( distance < 0 ) distance = -1; if ( distance != d_data->borderDistance ) { d_data->borderDistance = distance; itemChanged(); } } /*! \return Margin between the legend and the canvas border \sa margin() */ int QwtPlotLegendItem::borderDistance() const { return d_data->borderDistance; } /*! Set the radius for the border \param radius A value <= 0 defines a rectangular border \sa borderRadius(), setBorderPen() */ void QwtPlotLegendItem::setBorderRadius( double radius ) { radius = qMax( 0.0, radius ); if ( radius != d_data->borderRadius ) { d_data->borderRadius = radius; itemChanged(); } } /*! \return Radius of the border \sa setBorderRadius(), setBorderPen() */ double QwtPlotLegendItem::borderRadius() const { return d_data->borderRadius; } /*! Set the pen for drawing the border \param pen Border pen \sa borderPen(), setBackgroundBrush() */ void QwtPlotLegendItem::setBorderPen( const QPen &pen ) { if ( d_data->borderPen != pen ) { d_data->borderPen = pen; itemChanged(); } } /*! \return Pen for drawing the border \sa setBorderPen(), backgroundBrush() */ QPen QwtPlotLegendItem::borderPen() const { return d_data->borderPen; } /*! \brief Set the background brush The brush is used to fill the background \param brush Brush \sa backgroundBrush(), setBackgroundMode(), drawBackground() */ void QwtPlotLegendItem::setBackgroundBrush( const QBrush &brush ) { if ( d_data->backgroundBrush != brush ) { d_data->backgroundBrush = brush; itemChanged(); } } /*! \return Brush is used to fill the background \sa setBackgroundBrush(), backgroundMode(), drawBackground() */ QBrush QwtPlotLegendItem::backgroundBrush() const { return d_data->backgroundBrush; } /*! \brief Set the background mode Depending on the mode the complete legend or each item might have an background. The default setting is LegendBackground. \sa backgroundMode(), setBackgroundBrush(), drawBackground() */ void QwtPlotLegendItem::setBackgroundMode( BackgroundMode mode ) { if ( mode != d_data->backgroundMode ) { d_data->backgroundMode = mode; itemChanged(); } } /*! \return backgroundMode \sa setBackgroundMode(), backgroundBrush(), drawBackground() */ QwtPlotLegendItem::BackgroundMode QwtPlotLegendItem::backgroundMode() const { return d_data->backgroundMode; } /*! \brief Set the pen for drawing text labels \param pen Text pen \sa textPen(), setFont() */ void QwtPlotLegendItem::setTextPen( const QPen &pen ) { if ( d_data->textPen != pen ) { d_data->textPen = pen; itemChanged(); } } /*! \return Pen for drawing text labels \sa setTextPen(), font() */ QPen QwtPlotLegendItem::textPen() const { return d_data->textPen; } /*! Draw the legend \param painter Painter \param xMap x Scale Map \param yMap y Scale Map \param canvasRect Contents rectangle of the canvas in painter coordinates */ void QwtPlotLegendItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { Q_UNUSED( xMap ); Q_UNUSED( yMap ); d_data->layout->setGeometry( geometry( canvasRect ) ); if ( d_data->backgroundMode == QwtPlotLegendItem::LegendBackground ) drawBackground( painter, d_data->layout->geometry() ); for ( int i = 0; i < d_data->layout->count(); i++ ) { const QwtLegendLayoutItem *layoutItem = static_cast( d_data->layout->itemAt( i ) ); if ( d_data->backgroundMode == QwtPlotLegendItem::ItemBackground ) drawBackground( painter, layoutItem->geometry() ); painter->save(); drawLegendData( painter, layoutItem->plotItem(), layoutItem->data(), layoutItem->geometry() ); painter->restore(); } } /*! Draw a rounded rect \param painter Painter \param rect Bounding rectangle \sa setBorderRadius(), setBorderPen(), setBackgroundBrush(), setBackgroundMode() */ void QwtPlotLegendItem::drawBackground( QPainter *painter, const QRectF &rect ) const { painter->save(); painter->setPen( d_data->borderPen ); painter->setBrush( d_data->backgroundBrush ); const double radius = d_data->borderRadius; painter->drawRoundedRect( rect, radius, radius ); painter->restore(); } /*! Calculate the geometry of the legend on the canvas \param canvasRect Geometry of the canvas \return Geometry of the legend */ QRect QwtPlotLegendItem::geometry( const QRectF &canvasRect ) const { QRect rect; rect.setSize( d_data->layout->sizeHint() ); int margin = d_data->borderDistance; if ( d_data->alignment & Qt::AlignHCenter ) { int x = qRound( canvasRect.center().x() ); rect.moveCenter( QPoint( x, rect.center().y() ) ); } else if ( d_data->alignment & Qt::AlignRight ) { rect.moveRight( qFloor( canvasRect.right() - margin ) ); } else { rect.moveLeft( qCeil( canvasRect.left() + margin ) ); } if ( d_data->alignment & Qt::AlignVCenter ) { int y = qRound( canvasRect.center().y() ); rect.moveCenter( QPoint( rect.center().x(), y ) ); } else if ( d_data->alignment & Qt::AlignBottom ) { rect.moveBottom( qFloor( canvasRect.bottom() - margin ) ); } else { rect.moveTop( qCeil( canvasRect.top() + margin ) ); } return rect; } /*! Update the legend items according to modifications of a plot item \param plotItem Plot item \param data Attributes of the legend entries */ void QwtPlotLegendItem::updateLegend( const QwtPlotItem *plotItem, const QList &data ) { if ( plotItem == NULL ) return; QList layoutItems; QMap >::iterator it = d_data->map.find( plotItem ); if ( it != d_data->map.end() ) layoutItems = it.value(); bool changed = false; if ( data.size() != layoutItems.size() ) { changed = true; for ( int i = 0; i < layoutItems.size(); i++ ) { d_data->layout->removeItem( layoutItems[i] ); delete layoutItems[i]; } if ( it != d_data->map.end() ) d_data->map.remove( plotItem ); if ( !data.isEmpty() ) { for ( int i = 0; i < data.size(); i++ ) { QwtLegendLayoutItem *layoutItem = new QwtLegendLayoutItem( this, plotItem ); d_data->layout->addItem( layoutItem ); layoutItems += layoutItem; } d_data->map.insert( plotItem, layoutItems ); } } for ( int i = 0; i < data.size(); i++ ) { if ( layoutItems[i]->data().values() != data[i].values() ) { layoutItems[i]->setData( data[i] ); changed = true; } } if ( changed ) { d_data->layout->invalidate(); itemChanged(); } } //! Remove all items from the legend void QwtPlotLegendItem::clearLegend() { if ( !d_data->map.isEmpty() ) { d_data->map.clear(); for ( int i = d_data->layout->count() - 1; i >= 0; i-- ) delete d_data->layout->takeAt( i ); itemChanged(); } } /*! Draw an entry on the legend \param painter Qt Painter \param plotItem Plot item, represented by the entry \param data Attributes of the legend entry \param rect Bounding rectangle for the entry */ void QwtPlotLegendItem::drawLegendData( QPainter *painter, const QwtPlotItem *plotItem, const QwtLegendData &data, const QRectF &rect ) const { Q_UNUSED( plotItem ); const int m = d_data->itemMargin; const QRectF r = rect.toRect().adjusted( m, m, -m, -m ); painter->setClipRect( r, Qt::IntersectClip ); int titleOff = 0; const QwtGraphic graphic = data.icon(); if ( !graphic.isEmpty() ) { QRectF iconRect( r.topLeft(), graphic.defaultSize() ); iconRect.moveCenter( QPoint( iconRect.center().x(), rect.center().y() ) ); graphic.render( painter, iconRect, Qt::KeepAspectRatio ); titleOff += iconRect.width() + d_data->itemSpacing; } const QwtText text = data.title(); if ( !text.isEmpty() ) { painter->setPen( textPen() ); painter->setFont( font() ); const QRectF textRect = r.adjusted( titleOff, 0, 0, 0 ); text.draw( painter, textRect ); } } /*! Minimum size hint needed to display an entry \param data Attributes of the legend entry \return Minimum size */ QSize QwtPlotLegendItem::minimumSize( const QwtLegendData &data ) const { QSize size( 2 * d_data->itemMargin, 2 * d_data->itemMargin ); if ( !data.isValid() ) return size; const QwtGraphic graphic = data.icon(); const QwtText text = data.title(); int w = 0; int h = 0; if ( !graphic.isNull() ) { w = graphic.width(); h = graphic.height(); } if ( !text.isEmpty() ) { const QSizeF sz = text.textSize( font() ); w += qCeil( sz.width() ); h = qMax( h, qCeil( sz.height() ) ); } if ( graphic.width() > 0 && !text.isEmpty() ) w += d_data->itemSpacing; size += QSize( w, h ); return size; } /*! \return The preferred height, for a width. \param data Attributes of the legend entry \param width Width */ int QwtPlotLegendItem::heightForWidth( const QwtLegendData &data, int width ) const { width -= 2 * d_data->itemMargin; const QwtGraphic graphic = data.icon(); const QwtText text = data.title(); if ( text.isEmpty() ) return graphic.height(); if ( graphic.width() > 0 ) width -= graphic.width() + d_data->itemSpacing; int h = text.heightForWidth( width, font() ); h += 2 * d_data->itemMargin; return qMax( graphic.height(), h ); } /*! \return All plot items with an entry on the legend \note A plot item might have more than one entry on the legend */ QList< const QwtPlotItem * > QwtPlotLegendItem::plotItems() const { return d_data->map.keys(); } /*! \return Geometries of the items of a plot item \note Usually a plot item has only one entry on the legend */ QList< QRect > QwtPlotLegendItem::legendGeometries( const QwtPlotItem *plotItem ) const { QList layoutItems; QMap >::iterator it = d_data->map.find( plotItem ); if ( it != d_data->map.end() ) layoutItems = it.value(); QList geometries; for ( int i = 0; i < layoutItems.size(); i++ ) geometries += layoutItems[i]->geometry(); return geometries; } linssid-2.7/qwt-lib/src/qwt_wheel.cpp000644 001750 001750 00000072470 12151666703 020557 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_wheel.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #define qFastSin(x) ::sin(x) #define qExp(x) ::exp(x) #endif class QwtWheel::PrivateData { public: PrivateData(): orientation( Qt::Horizontal ), viewAngle( 175.0 ), totalAngle( 360.0 ), tickCount( 10 ), wheelBorderWidth( 2 ), borderWidth( 2 ), wheelWidth( 20 ), isScrolling( false ), mouseOffset( 0.0 ), tracking( true ), pendingValueChanged( false ), updateInterval( 50 ), mass( 0.0 ), timerId( 0 ), speed( 0.0 ), mouseValue( 0.0 ), flyingValue( 0.0 ), minimum( 0.0 ), maximum( 100.0 ), singleStep( 1.0 ), pageStepCount( 1 ), stepAlignment( true ), value( 0.0 ), inverted( false ), wrapping( false ) { }; Qt::Orientation orientation; double viewAngle; double totalAngle; int tickCount; int wheelBorderWidth; int borderWidth; int wheelWidth; bool isScrolling; double mouseOffset; bool tracking; bool pendingValueChanged; // when not tracking int updateInterval; double mass; // for the flying wheel effect int timerId; QTime time; double speed; double mouseValue; double flyingValue; double minimum; double maximum; double singleStep; int pageStepCount; bool stepAlignment; double value; bool inverted; bool wrapping; }; //! Constructor QwtWheel::QwtWheel( QWidget *parent ): QWidget( parent ) { d_data = new PrivateData; setFocusPolicy( Qt::StrongFocus ); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } //! Destructor QwtWheel::~QwtWheel() { delete d_data; } /*! \brief En/Disable tracking If tracking is enabled (the default), the wheel emits the valueChanged() signal while the wheel is moving. If tracking is disabled, the wheel emits the valueChanged() signal only when the wheel movement is terminated. The wheelMoved() signal is emitted regardless id tracking is enabled or not. \param enable On/Off \sa isTracking() */ void QwtWheel::setTracking( bool enable ) { d_data->tracking = enable; } /*! \return True, when tracking is enabled \sa setTracking(), valueChanged(), wheelMoved() */ bool QwtWheel::isTracking() const { return d_data->tracking; } /*! \brief Specify the update interval when the wheel is flying Default and minimum value is 50 ms. \param interval Interval in milliseconds \sa updateInterval(), setMass(), setTracking() */ void QwtWheel::setUpdateInterval( int interval ) { d_data->updateInterval = qMax( interval, 50 ); } /*! \return Update interval when the wheel is flying \sa setUpdateInterval(), mass(), isTracking() */ int QwtWheel::updateInterval() const { return d_data->updateInterval; } /*! \brief Mouse press event handler Start movement of the wheel. \param event Mouse event */ void QwtWheel::mousePressEvent( QMouseEvent *event ) { stopFlying(); d_data->isScrolling = wheelRect().contains( event->pos() ); if ( d_data->isScrolling ) { d_data->time.start(); d_data->speed = 0.0; d_data->mouseValue = valueAt( event->pos() ); d_data->mouseOffset = d_data->mouseValue - d_data->value; d_data->pendingValueChanged = false; Q_EMIT wheelPressed(); } } /*! \brief Mouse Move Event handler Turn the wheel according to the mouse position \param event Mouse event */ void QwtWheel::mouseMoveEvent( QMouseEvent *event ) { if ( !d_data->isScrolling ) return; double mouseValue = valueAt( event->pos() ); if ( d_data->mass > 0.0 ) { double ms = d_data->time.restart(); // the interval when mouse move events are posted are somehow // random. To avoid unrealistic speed values we limit ms ms = qMax( ms, 5.0 ); d_data->speed = ( mouseValue - d_data->mouseValue ) / ms; } d_data->mouseValue = mouseValue; double value = boundedValue( mouseValue - d_data->mouseOffset ); if ( d_data->stepAlignment ) value = alignedValue( value ); if ( value != d_data->value ) { d_data->value = value; update(); Q_EMIT wheelMoved( d_data->value ); if ( d_data->tracking ) Q_EMIT valueChanged( d_data->value ); else d_data->pendingValueChanged = true; } } /*! \brief Mouse Release Event handler When the wheel has no mass the movement of the wheel stops, otherwise it starts flying. \param event Mouse event */ void QwtWheel::mouseReleaseEvent( QMouseEvent *event ) { Q_UNUSED( event ); if ( !d_data->isScrolling ) return; d_data->isScrolling = false; bool startFlying = false; if ( d_data->mass > 0.0 ) { const int ms = d_data->time.elapsed(); if ( ( qFabs( d_data->speed ) > 0.0 ) && ( ms < 50 ) ) startFlying = true; } if ( startFlying ) { d_data->flyingValue = boundedValue( d_data->mouseValue - d_data->mouseOffset ); d_data->timerId = startTimer( d_data->updateInterval ); } else { if ( d_data->pendingValueChanged ) Q_EMIT valueChanged( d_data->value ); } d_data->pendingValueChanged = false; d_data->mouseOffset = 0.0; Q_EMIT wheelReleased(); } /*! \brief Qt timer event The flying wheel effect is implemented using a timer \param event Timer event \sa updateInterval() */ void QwtWheel::timerEvent( QTimerEvent *event ) { if ( event->timerId() != d_data->timerId ) { QWidget::timerEvent( event ); return; } d_data->speed *= qExp( -d_data->updateInterval * 0.001 / d_data->mass ); d_data->flyingValue += d_data->speed * d_data->updateInterval; d_data->flyingValue = boundedValue( d_data->flyingValue ); double value = d_data->flyingValue; if ( d_data->stepAlignment ) value = alignedValue( value ); if ( qFabs( d_data->speed ) < 0.001 * d_data->singleStep ) { // stop if d_data->speed < one step per second stopFlying(); } if ( value != d_data->value ) { d_data->value = value; update(); if ( d_data->tracking || d_data->timerId == 0 ) Q_EMIT valueChanged( d_data->value ); } } /*! \brief Handle wheel events In/Decrement the value \param event Wheel event */ void QwtWheel::wheelEvent( QWheelEvent *event ) { if ( !wheelRect().contains( event->pos() ) ) { event->ignore(); return; } if ( d_data->isScrolling ) return; stopFlying(); double increment = 0.0; if ( ( event->modifiers() & Qt::ControlModifier) || ( event->modifiers() & Qt::ShiftModifier ) ) { // one page regardless of delta increment = d_data->singleStep * d_data->pageStepCount; if ( event->delta() < 0 ) increment = -increment; } else { const int numSteps = event->delta() / 120; increment = d_data->singleStep * numSteps; } if ( d_data->orientation == Qt::Vertical && d_data->inverted ) increment = -increment; double value = boundedValue( d_data->value + increment ); if ( d_data->stepAlignment ) value = alignedValue( value ); if ( value != d_data->value ) { d_data->value = value; update(); Q_EMIT valueChanged( d_data->value ); Q_EMIT wheelMoved( d_data->value ); } } /*! Handle key events - Qt::Key_Home\n Step to minimum() - Qt::Key_End\n Step to maximum() - Qt::Key_Up\n In case of a horizontal or not inverted vertical wheel the value will be incremented by the step size. For an inverted vertical wheel the value will be decremented by the step size. - Qt::Key_Down\n In case of a horizontal or not inverted vertical wheel the value will be decremented by the step size. For an inverted vertical wheel the value will be incremented by the step size. - Qt::Key_PageUp\n The value will be incremented by pageStepSize() * singleStepSize(). - Qt::Key_PageDown\n The value will be decremented by pageStepSize() * singleStepSize(). \param event Key event */ void QwtWheel::keyPressEvent( QKeyEvent *event ) { if ( d_data->isScrolling ) { // don't interfere mouse scrolling return; } double value = d_data->value; double increment = 0.0; switch ( event->key() ) { case Qt::Key_Down: { if ( d_data->orientation == Qt::Vertical && d_data->inverted ) increment = d_data->singleStep; else increment = -d_data->singleStep; break; } case Qt::Key_Up: { if ( d_data->orientation == Qt::Vertical && d_data->inverted ) increment = -d_data->singleStep; else increment = d_data->singleStep; break; } case Qt::Key_Left: { if ( d_data->orientation == Qt::Horizontal ) { if ( d_data->inverted ) increment = d_data->singleStep; else increment = -d_data->singleStep; } break; } case Qt::Key_Right: { if ( d_data->orientation == Qt::Horizontal ) { if ( d_data->inverted ) increment = -d_data->singleStep; else increment = d_data->singleStep; } break; } case Qt::Key_PageUp: { increment = d_data->pageStepCount * d_data->singleStep; break; } case Qt::Key_PageDown: { increment = -d_data->pageStepCount * d_data->singleStep; break; } case Qt::Key_Home: { value = d_data->minimum; break; } case Qt::Key_End: { value = d_data->maximum; break; } default:; { event->ignore(); } } if ( event->isAccepted() ) stopFlying(); if ( increment != 0.0 ) { value = boundedValue( d_data->value + increment ); if ( d_data->stepAlignment ) value = alignedValue( value ); } if ( value != d_data->value ) { d_data->value = value; update(); Q_EMIT valueChanged( d_data->value ); Q_EMIT wheelMoved( d_data->value ); } } /*! \brief Adjust the number of grooves in the wheel's surface. The number of grooves is limited to 6 <= count <= 50. Values outside this range will be clipped. The default value is 10. \param count Number of grooves per 360 degrees \sa tickCount() */ void QwtWheel::setTickCount( int count ) { count = qBound( 6, count, 50 ); if ( count != d_data->tickCount ) { d_data->tickCount = qBound( 6, count, 50 ); update(); } } /*! \return Number of grooves in the wheel's surface. \sa setTickCnt() */ int QwtWheel::tickCount() const { return d_data->tickCount; } /*! \brief Set the wheel border width of the wheel. The wheel border must not be smaller than 1 and is limited in dependence on the wheel's size. Values outside the allowed range will be clipped. The wheel border defaults to 2. \param borderWidth Border width \sa internalBorder() */ void QwtWheel::setWheelBorderWidth( int borderWidth ) { const int d = qMin( width(), height() ) / 3; borderWidth = qMin( borderWidth, d ); d_data->wheelBorderWidth = qMax( borderWidth, 1 ); update(); } /*! \return Wheel border width \sa setWheelBorderWidth() */ int QwtWheel::wheelBorderWidth() const { return d_data->wheelBorderWidth; } /*! \brief Set the border width The border defaults to 2. \param width Border width \sa borderWidth() */ void QwtWheel::setBorderWidth( int width ) { d_data->borderWidth = qMax( width, 0 ); update(); } /*! \return Border width \sa setBorderWidth() */ int QwtWheel::borderWidth() const { return d_data->borderWidth; } /*! \return Rectangle of the wheel without the outer border */ QRect QwtWheel::wheelRect() const { const int bw = d_data->borderWidth; return contentsRect().adjusted( bw, bw, -bw, -bw ); } /*! \brief Set the total angle which the wheel can be turned. One full turn of the wheel corresponds to an angle of 360 degrees. A total angle of n*360 degrees means that the wheel has to be turned n times around its axis to get from the minimum value to the maximum value. The default setting of the total angle is 360 degrees. \param angle total angle in degrees \sa totalAngle() */ void QwtWheel::setTotalAngle( double angle ) { if ( angle < 0.0 ) angle = 0.0; d_data->totalAngle = angle; update(); } /*! \return Total angle which the wheel can be turned. \sa setTotalAngle() */ double QwtWheel::totalAngle() const { return d_data->totalAngle; } /*! \brief Set the wheel's orientation. The default orientation is Qt::Horizontal. \param orientation Qt::Horizontal or Qt::Vertical. \sa orientation() */ void QwtWheel::setOrientation( Qt::Orientation orientation ) { if ( d_data->orientation == orientation ) return; if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } d_data->orientation = orientation; update(); } /*! \return Orientation \sa setOrientation() */ Qt::Orientation QwtWheel::orientation() const { return d_data->orientation; } /*! \brief Specify the visible portion of the wheel. You may use this function for fine-tuning the appearance of the wheel. The default value is 175 degrees. The value is limited from 10 to 175 degrees. \param angle Visible angle in degrees \sa viewAngle(), setTotalAngle() */ void QwtWheel::setViewAngle( double angle ) { d_data->viewAngle = qBound( 10.0, angle, 175.0 ); update(); } /*! \return Visible portion of the wheel \sa setViewAngle(), totalAngle() */ double QwtWheel::viewAngle() const { return d_data->viewAngle; } /*! Determine the value corresponding to a specified point \param pos Position \return Value corresponding to pos */ double QwtWheel::valueAt( const QPoint &pos ) const { const QRectF rect = wheelRect(); double w, dx; if ( d_data->orientation == Qt::Vertical ) { w = rect.height(); dx = rect.top() - pos.y(); } else { w = rect.width(); dx = pos.x() - rect.left(); } if ( w == 0.0 ) return 0.0; if ( d_data->inverted ) { dx = w - dx; } // w pixels is an arc of viewAngle degrees, // so we convert change in pixels to change in angle const double ang = dx * d_data->viewAngle / w; // value range maps to totalAngle degrees, // so convert the change in angle to a change in value const double val = ang * ( maximum() - minimum() ) / d_data->totalAngle; return val; } /*! \brief Qt Paint Event \param event Paint event */ void QwtWheel::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); qDrawShadePanel( &painter, contentsRect(), palette(), true, d_data->borderWidth ); drawWheelBackground( &painter, wheelRect() ); drawTicks( &painter, wheelRect() ); if ( hasFocus() ) QwtPainter::drawFocusRect( &painter, this ); } /*! Draw the Wheel's background gradient \param painter Painter \param rect Geometry for the wheel */ void QwtWheel::drawWheelBackground( QPainter *painter, const QRectF &rect ) { painter->save(); QPalette pal = palette(); // draw shaded background QLinearGradient gradient( rect.topLeft(), ( d_data->orientation == Qt::Horizontal ) ? rect.topRight() : rect.bottomLeft() ); gradient.setColorAt( 0.0, pal.color( QPalette::Button ) ); gradient.setColorAt( 0.2, pal.color( QPalette::Midlight ) ); gradient.setColorAt( 0.7, pal.color( QPalette::Mid ) ); gradient.setColorAt( 1.0, pal.color( QPalette::Dark ) ); painter->fillRect( rect, gradient ); // draw internal border const QPen lightPen( palette().color( QPalette::Light ), d_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap ); const QPen darkPen( pal.color( QPalette::Dark ), d_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap ); const double bw2 = 0.5 * d_data->wheelBorderWidth; if ( d_data->orientation == Qt::Horizontal ) { painter->setPen( lightPen ); painter->drawLine( QPointF( rect.left(), rect.top() + bw2 ), QPointF( rect.right(), rect.top() + bw2 ) ); painter->setPen( darkPen ); painter->drawLine( QPointF( rect.left(), rect.bottom() - bw2 ), QPointF( rect.right(), rect.bottom() - bw2 ) ); } else // Qt::Vertical { painter->setPen( lightPen ); painter->drawLine( QPointF( rect.left() + bw2, rect.top() ), QPointF( rect.left() + bw2, rect.bottom() ) ); painter->setPen( darkPen ); painter->drawLine( QPointF( rect.right() - bw2, rect.top() ), QPointF( rect.right() - bw2, rect.bottom() ) ); } painter->restore(); } /*! Draw the Wheel's ticks \param painter Painter \param rect Geometry for the wheel */ void QwtWheel::drawTicks( QPainter *painter, const QRectF &rect ) { const double range = d_data->maximum - d_data->minimum; if ( range == 0.0 || d_data->totalAngle == 0.0 ) { return; } const QPen lightPen( palette().color( QPalette::Light ), 0, Qt::SolidLine, Qt::FlatCap ); const QPen darkPen( palette().color( QPalette::Dark ), 0, Qt::SolidLine, Qt::FlatCap ); const double cnvFactor = qAbs( d_data->totalAngle / range ); const double halfIntv = 0.5 * d_data->viewAngle / cnvFactor; const double loValue = value() - halfIntv; const double hiValue = value() + halfIntv; const double tickWidth = 360.0 / double( d_data->tickCount ) / cnvFactor; const double sinArc = qFastSin( d_data->viewAngle * M_PI / 360.0 ); if ( d_data->orientation == Qt::Horizontal ) { const double radius = rect.width() * 0.5; double l1 = rect.top() + d_data->wheelBorderWidth; double l2 = rect.bottom() - d_data->wheelBorderWidth - 1; // draw one point over the border if border > 1 if ( d_data->wheelBorderWidth > 1 ) { l1--; l2++; } const double maxpos = rect.right() - 2; const double minpos = rect.left() + 2; // draw tick marks for ( double tickValue = ::ceil( loValue / tickWidth ) * tickWidth; tickValue < hiValue; tickValue += tickWidth ) { const double angle = qwtRadians( tickValue - value() ); const double s = qFastSin( angle * cnvFactor ); const double off = radius * ( sinArc + s ) / sinArc; double tickPos; if ( d_data->inverted ) tickPos = rect.left() + off; else tickPos = rect.right() - off; if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) ) { painter->setPen( darkPen ); painter->drawLine( QPointF( tickPos - 1 , l1 ), QPointF( tickPos - 1, l2 ) ); painter->setPen( lightPen ); painter->drawLine( QPointF( tickPos, l1 ), QPointF( tickPos, l2 ) ); } } } else // Qt::Vertical { const double radius = rect.height() * 0.5; double l1 = rect.left() + d_data->wheelBorderWidth; double l2 = rect.right() - d_data->wheelBorderWidth - 1; if ( d_data->wheelBorderWidth > 1 ) { l1--; l2++; } const double maxpos = rect.bottom() - 2; const double minpos = rect.top() + 2; for ( double tickValue = ::ceil( loValue / tickWidth ) * tickWidth; tickValue < hiValue; tickValue += tickWidth ) { const double angle = qwtRadians( tickValue - value() ); const double s = qFastSin( angle * cnvFactor ); const double off = radius * ( sinArc + s ) / sinArc; double tickPos; if ( d_data->inverted ) tickPos = rect.bottom() - off; else tickPos = rect.top() + off; if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) ) { painter->setPen( darkPen ); painter->drawLine( QPointF( l1, tickPos - 1 ), QPointF( l2, tickPos - 1 ) ); painter->setPen( lightPen ); painter->drawLine( QPointF( l1, tickPos ), QPointF( l2, tickPos ) ); } } } } /*! \brief Set the width of the wheel Corresponds to the wheel height for horizontal orientation, and the wheel width for vertical orientation. \param width the wheel's width \sa wheelWidth() */ void QwtWheel::setWheelWidth( int width ) { d_data->wheelWidth = width; update(); } /*! \return Width of the wheel \sa setWheelWidth() */ int QwtWheel::wheelWidth() const { return d_data->wheelWidth; } /*! \return a size hint */ QSize QwtWheel::sizeHint() const { const QSize hint = minimumSizeHint(); return hint.expandedTo( QApplication::globalStrut() ); } /*! \return Minimum size hint \warning The return value is based on the wheel width. */ QSize QwtWheel::minimumSizeHint() const { QSize sz( 3 * d_data->wheelWidth + 2 * d_data->borderWidth, d_data->wheelWidth + 2 * d_data->borderWidth ); if ( d_data->orientation != Qt::Horizontal ) sz.transpose(); return sz; } /*! \brief Set the step size of the counter A value <= 0.0 disables stepping \param stepSize Single step size \sa singleStep(), setPageStepCount() */ void QwtWheel::setSingleStep( double stepSize ) { d_data->singleStep = qMax( stepSize, 0.0 ); } /*! \return Single step size \sa setSingleStep() */ double QwtWheel::singleStep() const { return d_data->singleStep; } /*! \brief En/Disable step alignment When step alignment is enabled value changes initiated by user input ( mouse, keyboard, wheel ) are aligned to the multiples of the single step. \param on On/Off \sa stepAlignment(), setSingleStep() */ void QwtWheel::setStepAlignment( bool on ) { if ( on != d_data->stepAlignment ) { d_data->stepAlignment = on; } } /*! \return True, when the step alignment is enabled \sa setStepAlignment(), singleStep() */ bool QwtWheel::stepAlignment() const { return d_data->stepAlignment; } /*! \brief Set the page step count pageStepCount is a multiplicator for the single step size that typically corresponds to the user pressing PageUp or PageDown. A value of 0 disables page stepping. The default value is 1. \param count Multiplicator for the single step size \sa pageStepCount(), setSingleStep() */ void QwtWheel::setPageStepCount( int count ) { d_data->pageStepCount = qMax( 0, count ); } /*! \return Page step count \sa setPageStepCount(), singleStep() */ int QwtWheel::pageStepCount() const { return d_data->pageStepCount; } /*! \brief Set the minimum and maximum values The maximum is adjusted if necessary to ensure that the range remains valid. The value might be modified to be inside of the range. \param min Minimum value \param max Maximum value \sa minimum(), maximum() */ void QwtWheel::setRange( double min, double max ) { max = qMax( min, max ); if ( d_data->minimum == min && d_data->maximum == max ) return; d_data->minimum = min; d_data->maximum = max; if ( d_data->value < min || d_data->value > max ) { d_data->value = qBound( min, d_data->value, max ); update(); Q_EMIT valueChanged( d_data->value ); } } /*! Set the minimum value of the range \param value Minimum value \sa setRange(), setMaximum(), minimum() \note The maximum is adjusted if necessary to ensure that the range remains valid. */ void QwtWheel::setMinimum( double value ) { setRange( value, maximum() ); } /*! \return The minimum of the range \sa setRange(), setMinimum(), maximum() */ double QwtWheel::minimum() const { return d_data->minimum; } /*! Set the maximum value of the range \param value Maximum value \sa setRange(), setMinimum(), maximum() */ void QwtWheel::setMaximum( double value ) { setRange( minimum(), value ); } /*! \return The maximum of the range \sa setRange(), setMaximum(), minimum() */ double QwtWheel::maximum() const { return d_data->maximum; } /*! \brief Set a new value without adjusting to the step raster \param value New value \sa value(), valueChanged() \warning The value is clipped when it lies outside the range. */ void QwtWheel::setValue( double value ) { stopFlying(); d_data->isScrolling = false; value = qBound( d_data->minimum, value, d_data->maximum ); if ( d_data->value != value ) { d_data->value = value; update(); Q_EMIT valueChanged( d_data->value ); } } /*! \return Current value of the wheel \sa setValue(), valueChanged() */ double QwtWheel::value() const { return d_data->value; } /*! \brief En/Disable inverted appearance An inverted wheel increases its values in the opposite direction. The direction of an inverted horizontal wheel will be from right to left an inverted vertical wheel will increase from bottom to top. \param on En/Disable inverted appearance \sa isInverted() */ void QwtWheel::setInverted( bool on ) { if ( d_data->inverted != on ) { d_data->inverted = on; update(); } } /*! \return True, when the wheel is inverted \sa setInverted() */ bool QwtWheel::isInverted() const { return d_data->inverted; } /*! \brief En/Disable wrapping If wrapping is true stepping up from maximum() value will take you to the minimum() value and vice versa. \param on En/Disable wrapping \sa wrapping() */ void QwtWheel::setWrapping( bool on ) { d_data->wrapping = on; } /*! \return True, when wrapping is set \sa setWrapping() */ bool QwtWheel::wrapping() const { return d_data->wrapping; } /*! \brief Set the slider's mass for flywheel effect. If the slider's mass is greater then 0, it will continue to move after the mouse button has been released. Its speed decreases with time at a rate depending on the slider's mass. A large mass means that it will continue to move for a long time. Derived widgets may overload this function to make it public. \param mass New mass in kg \bug If the mass is smaller than 1g, it is set to zero. The maximal mass is limited to 100kg. \sa mass() */ void QwtWheel::setMass( double mass ) { if ( mass < 0.001 ) { d_data->mass = 0.0; } else { d_data->mass = qMin( 100.0, mass ); } if ( d_data->mass <= 0.0 ) stopFlying(); } /*! \return mass \sa setMass() */ double QwtWheel::mass() const { return d_data->mass; } //! Stop the flying movement of the wheel void QwtWheel::stopFlying() { if ( d_data->timerId != 0 ) { killTimer( d_data->timerId ); d_data->timerId = 0; d_data->speed = 0.0; } } double QwtWheel::boundedValue( double value ) const { const double range = d_data->maximum - d_data->minimum; if ( d_data->wrapping && range >= 0.0 ) { if ( value < d_data->minimum ) { value += ::ceil( ( d_data->minimum - value ) / range ) * range; } else if ( value > d_data->maximum ) { value -= ::ceil( ( value - d_data->maximum ) / range ) * range; } } else { value = qBound( d_data->minimum, value, d_data->maximum ); } return value; } double QwtWheel::alignedValue( double value ) const { const double stepSize = d_data->singleStep; if ( stepSize > 0.0 ) { value = d_data->minimum + qRound( ( value - d_data->minimum ) / stepSize ) * stepSize; // correct rounding error at the border if ( qFuzzyCompare( value, d_data->maximum ) ) value = d_data->maximum; // correct rounding error if value = 0 if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 0.0; } return value; } linssid-2.7/qwt-lib/src/qwt_sampling_thread.cpp000644 001750 001750 00000004267 12151666703 022613 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_sampling_thread.h" #include "qwt_system_clock.h" class QwtSamplingThread::PrivateData { public: QwtSystemClock clock; double interval; bool isStopped; }; //! Constructor QwtSamplingThread::QwtSamplingThread( QObject *parent ): QThread( parent ) { d_data = new PrivateData; d_data->interval = 1000; // 1 second d_data->isStopped = true; } //! Destructor QwtSamplingThread::~QwtSamplingThread() { delete d_data; } /*! Change the interval (in ms), when sample() is called. The default interval is 1000.0 ( = 1s ) \param interval Interval \sa interval() */ void QwtSamplingThread::setInterval( double interval ) { if ( interval < 0.0 ) interval = 0.0; d_data->interval = interval; } /*! \return Interval (in ms), between 2 calls of sample() \sa setInterval() */ double QwtSamplingThread::interval() const { return d_data->interval; } /*! \return Time (in ms) since the thread was started \sa QThread::start(), run() */ double QwtSamplingThread::elapsed() const { if ( d_data->isStopped ) return 0.0; return d_data->clock.elapsed(); } /*! Terminate the collecting thread \sa QThread::start(), run() */ void QwtSamplingThread::stop() { d_data->isStopped = true; } /*! Loop collecting samples started from QThread::start() \sa stop() */ void QwtSamplingThread::run() { d_data->clock.start(); d_data->isStopped = false; while ( !d_data->isStopped ) { const double elapsed = d_data->clock.elapsed(); sample( elapsed / 1000.0 ); if ( d_data->interval > 0.0 ) { const double msecs = d_data->interval - ( d_data->clock.elapsed() - elapsed ); if ( msecs > 0.0 ) usleep( qRound( 1000.0 * msecs ) ); } } } linssid-2.7/qwt-lib/src/qwt_text.h000644 001750 001750 00000014026 12151666701 020073 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_H #define QWT_TEXT_H #include "qwt_global.h" #include #include #include #include class QColor; class QPen; class QBrush; class QRectF; class QPainter; class QwtTextEngine; /*! \brief A class representing a text A QwtText is a text including a set of attributes how to render it. - Format\n A text might include control sequences (f.e tags) describing how to render it. Each format (f.e MathML, TeX, Qt Rich Text) has its own set of control sequences, that can be handles by a special QwtTextEngine for this format. - Background\n A text might have a background, defined by a QPen and QBrush to improve its visibility. The corners of the background might be rounded. - Font\n A text might have an individual font. - Color\n A text might have an individual color. - Render Flags\n Flags from Qt::AlignmentFlag and Qt::TextFlag used like in QPainter::drawText(). \sa QwtTextEngine, QwtTextLabel */ class QWT_EXPORT QwtText { public: /*! \brief Text format The text format defines the QwtTextEngine, that is used to render the text. \sa QwtTextEngine, setTextEngine() */ enum TextFormat { /*! The text format is determined using QwtTextEngine::mightRender() for all available text engines in increasing order > PlainText. If none of the text engines can render the text is rendered like QwtText::PlainText. */ AutoText = 0, //! Draw the text as it is, using a QwtPlainTextEngine. PlainText, //! Use the Scribe framework (Qt Rich Text) to render the text. RichText, /*! Use a MathML (http://en.wikipedia.org/wiki/MathML) render engine to display the text. The Qwt MathML extension offers such an engine based on the MathML renderer of the Qt solutions package. To enable MathML support the following code needs to be added to the application: \verbatim QwtText::setTextEngine(QwtText::MathMLText, new QwtMathMLTextEngine()); \endverbatim */ MathMLText, /*! Use a TeX (http://en.wikipedia.org/wiki/TeX) render engine to display the text ( not implemented yet ). */ TeXText, /*! The number of text formats can be extended using setTextEngine. Formats >= QwtText::OtherFormat are not used by Qwt. */ OtherFormat = 100 }; /*! \brief Paint Attributes Font and color and background are optional attributes of a QwtText. The paint attributes hold the information, if they are set. */ enum PaintAttribute { //! The text has an individual font. PaintUsingTextFont = 0x01, //! The text has an individual color. PaintUsingTextColor = 0x02, //! The text has an individual background. PaintBackground = 0x04 }; //! Paint attributes typedef QFlags PaintAttributes; /*! \brief Layout Attributes The layout attributes affects some aspects of the layout of the text. */ enum LayoutAttribute { /*! Layout the text without its margins. This mode is useful if a text needs to be aligned accurately, like the tick labels of a scale. If QwtTextEngine::textMargins is not implemented for the format of the text, MinimumLayout has no effect. */ MinimumLayout = 0x01 }; //! Layout attributes typedef QFlags LayoutAttributes; QwtText( const QString & = QString::null, TextFormat textFormat = AutoText ); QwtText( const QwtText & ); ~QwtText(); QwtText &operator=( const QwtText & ); bool operator==( const QwtText & ) const; bool operator!=( const QwtText & ) const; void setText( const QString &, QwtText::TextFormat textFormat = AutoText ); QString text() const; bool isNull() const; bool isEmpty() const; void setFont( const QFont & ); QFont font() const; QFont usedFont( const QFont & ) const; void setRenderFlags( int flags ); int renderFlags() const; void setColor( const QColor & ); QColor color() const; QColor usedColor( const QColor & ) const; void setBorderRadius( double ); double borderRadius() const; void setBorderPen( const QPen & ); QPen borderPen() const; void setBackgroundBrush( const QBrush & ); QBrush backgroundBrush() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLayoutAttribute( LayoutAttribute, bool on = true ); bool testLayoutAttribute( LayoutAttribute ) const; double heightForWidth( double width, const QFont & = QFont() ) const; QSizeF textSize( const QFont & = QFont() ) const; void draw( QPainter *painter, const QRectF &rect ) const; static const QwtTextEngine *textEngine( const QString &text, QwtText::TextFormat = AutoText ); static const QwtTextEngine *textEngine( QwtText::TextFormat ); static void setTextEngine( QwtText::TextFormat, QwtTextEngine * ); private: class PrivateData; PrivateData *d_data; class LayoutCache; LayoutCache *d_layoutCache; }; //! \return text().isNull() inline bool QwtText::isNull() const { return text().isNull(); } //! \return text().isEmpty() inline bool QwtText::isEmpty() const { return text().isEmpty(); } Q_DECLARE_OPERATORS_FOR_FLAGS( QwtText::PaintAttributes ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtText::LayoutAttributes ) Q_DECLARE_METATYPE( QwtText ) #endif linssid-2.7/qwt-lib/textengines/mathml/mathml.pro000644 001750 001750 00000002666 12345432507 023106 0ustar00warrenwarren000000 000000 ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ message(The qwtmathml library contains code of the MML Widget from the Qt solutions package.) message(Beside the Qwt license you also have to take care of its license. ) include( $${PWD}/../textengines.pri ) TARGET = $$qwtLibraryTarget(qwtmathml) QT += xml greaterThan(QT_MAJOR_VERSION, 4) { QT += widgets } HEADERS = \ qwt_mathml_text_engine.h SOURCES = \ qwt_mathml_text_engine.cpp # qwt_mml_document.h/qwt_mml_document.cpp has been stripped down from # the mathml widgets offered in the Qt solutions package. HEADERS += qwt_mml_document.h SOURCES += qwt_mml_document.cpp qwtmathmlspec.files = qwtmathml.prf qwtmathmlspec.path = $${QWT_INSTALL_FEATURES} # INSTALLS += qwtmathmlspec # linssid no install CONFIG(lib_bundle) { FRAMEWORK_HEADERS.version = Versions FRAMEWORK_HEADERS.files = qwt_mathml_text_engine.h FRAMEWORK_HEADERS.path = Headers QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS } else { headers.files = qwt_mathml_text_engine.h headers.path = $${QWT_INSTALL_HEADERS} # INSTALLS += headers # linssid no install } linssid-2.7/qwt-lib/src/qwt_plot_shapeitem.h000644 001750 001750 00000006304 12151666701 022124 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_SHAPE_ITEM_H #define QWT_PLOT_SHAPE_ITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include /*! \brief A plot item, which displays any graphical shape, that can be defined by a QPainterPath A QPainterPath is a shape composed from intersecting and uniting regions, rectangles, ellipses or irregular areas defined by lines, and curves. QwtPlotShapeItem displays a shape with a pen and brush. QwtPlotShapeItem offers a couple of optimizations like clipping or weeding. These algorithms need to convert the painter path into polygons that might be less performant for paths built from curves and ellipses. \sa QwtPlotZone */ class QWT_EXPORT QwtPlotShapeItem: public QwtPlotItem { public: /*! Attributes to modify the drawing algorithm. The default disables all attributes \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { /*! Clip polygons before painting them. In situations, where points are far outside the visible area (f.e when zooming deep) this might be a substantial improvement for the painting performance But polygon clipping will convert the painter path into polygons what might introduce a negative impact on the performance of paths composed from curves or ellipses. */ ClipPolygons = 0x01, }; //! Paint attributes typedef QFlags PaintAttributes; //! Mode how to display the item on the legend enum LegendMode { //! Display a scaled down version of the shape LegendShape, //! Display a filled rectangle LegendColor }; explicit QwtPlotShapeItem( const QString &title = QString::null ); explicit QwtPlotShapeItem( const QwtText &title ); virtual ~QwtPlotShapeItem(); void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLegendMode( LegendMode ); LegendMode legendMode() const; void setRect( const QRectF & ); void setPolygon( const QPolygonF & ); void setShape( const QPainterPath & ); QPainterPath shape() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); QPen pen() const; void setBrush( const QBrush & ); QBrush brush() const; void setRenderTolerance( double ); double renderTolerance() const; virtual QRectF boundingRect() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; virtual int rtti() const; private: void init(); class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_grid.h000644 001750 001750 00000004603 12151666701 021072 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_GRID_H #define QWT_PLOT_GRID_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_scale_div.h" class QPainter; class QPen; class QwtScaleMap; class QwtScaleDiv; /*! \brief A class which draws a coordinate grid The QwtPlotGrid class can be used to draw a coordinate grid. A coordinate grid consists of major and minor vertical and horizontal grid lines. The locations of the grid lines are determined by the X and Y scale divisions which can be assigned with setXDiv() and setYDiv(). The draw() member draws the grid within a bounding rectangle. */ class QWT_EXPORT QwtPlotGrid: public QwtPlotItem { public: explicit QwtPlotGrid(); virtual ~QwtPlotGrid(); virtual int rtti() const; void enableX( bool tf ); bool xEnabled() const; void enableY( bool tf ); bool yEnabled() const; void enableXMin( bool tf ); bool xMinEnabled() const; void enableYMin( bool tf ); bool yMinEnabled() const; void setXDiv( const QwtScaleDiv &sx ); const QwtScaleDiv &xScaleDiv() const; void setYDiv( const QwtScaleDiv &sy ); const QwtScaleDiv &yScaleDiv() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); void setMajorPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setMajorPen( const QPen & ); const QPen& majorPen() const; void setMinorPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setMinorPen( const QPen &p ); const QPen& minorPen() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) const; virtual void updateScaleDiv( const QwtScaleDiv &xMap, const QwtScaleDiv &yMap ); private: void drawLines( QPainter *painter, const QRectF &, Qt::Orientation orientation, const QwtScaleMap &, const QList & ) const; class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_abstract_barchart.h000644 001750 001750 00000005042 12151666701 023614 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ABSTRACT_BAR_CHART_H #define QWT_PLOT_ABSTRACT_BAR_CHART_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" /*! \brief Abstract base class for bar chart items In opposite to almost all other plot items bar charts can't be displayed inside of their bounding rectangle and need a special API how to calculate the width of the bars and how they affect the layout of the attached plot. */ class QWT_EXPORT QwtPlotAbstractBarChart: public QwtPlotSeriesItem { public: /*! \brief Mode how to calculate the bar width setLayoutPolicy(), setLayoutHint(), barWidthHint() */ enum LayoutPolicy { /*! The sample width is calculated by dividing the bounding rectangle by the number of samples. \sa boundingRectangle() \note The layoutHint() is ignored */ AutoAdjustSamples, /*! layoutHint() defines an interval in axis coordinates */ ScaleSamplesToAxes, /*! The bar width is calculated by multiplying layoutHint() with the height or width of the canvas. \sa boundingRectangle() */ ScaleSampleToCanvas, /*! layoutHint() defines a fixed width in paint device coordinates. */ FixedSampleSize }; explicit QwtPlotAbstractBarChart( const QwtText &title ); virtual ~QwtPlotAbstractBarChart(); void setLayoutPolicy( LayoutPolicy ); LayoutPolicy layoutPolicy() const; void setLayoutHint( double ); double layoutHint() const; void setSpacing( int ); int spacing() const; void setMargin( int ); int margin() const; void setBaseline( double ); double baseline() const; virtual void getCanvasMarginHint( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, double &left, double &top, double &right, double &bottom) const; protected: double sampleWidth( const QwtScaleMap &map, double canvasSize, double dataSize, double value ) const; private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_counter.h000644 001750 001750 00000010365 12151666701 020570 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COUNTER_H #define QWT_COUNTER_H #include "qwt_global.h" #include /*! \brief The Counter Widget A Counter consists of a label displaying a number and one ore more (up to three) push buttons on each side of the label which can be used to increment or decrement the counter's value. A counter has a range from a minimum value to a maximum value and a step size. When the wrapping property is set the counter is circular. The number of steps by which a button increments or decrements the value can be specified using setIncSteps(). The number of buttons can be changed with setNumButtons(). Example: \code #include QwtCounter *counter = new QwtCounter(parent); counter->setRange(0.0, 100.0); // From 0.0 to 100 counter->setSingleStep( 1.0 ); // Step size 1.0 counter->setNumButtons(2); // Two buttons each side counter->setIncSteps(QwtCounter::Button1, 1); // Button 1 increments 1 step counter->setIncSteps(QwtCounter::Button2, 20); // Button 2 increments 20 steps connect(counter, SIGNAL(valueChanged(double)), myClass, SLOT(newValue(double))); \endcode */ class QWT_EXPORT QwtCounter : public QWidget { Q_OBJECT Q_PROPERTY( double value READ value WRITE setValue ) Q_PROPERTY( double minimum READ minimum WRITE setMinimum ) Q_PROPERTY( double maximum READ maximum WRITE setMaximum ) Q_PROPERTY( double singleStep READ singleStep WRITE setSingleStep ) Q_PROPERTY( int numButtons READ numButtons WRITE setNumButtons ) Q_PROPERTY( int stepButton1 READ stepButton1 WRITE setStepButton1 ) Q_PROPERTY( int stepButton2 READ stepButton2 WRITE setStepButton2 ) Q_PROPERTY( int stepButton3 READ stepButton3 WRITE setStepButton3 ) Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly ) Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping ) public: //! Button index enum Button { //! Button intended for minor steps Button1, //! Button intended for medium steps Button2, //! Button intended for large steps Button3, //! Number of buttons ButtonCnt }; explicit QwtCounter( QWidget *parent = NULL ); virtual ~QwtCounter(); void setValid( bool ); bool isValid() const; void setWrapping( bool ); bool wrapping() const; bool isReadOnly() const; void setReadOnly( bool ); void setNumButtons( int n ); int numButtons() const; void setIncSteps( QwtCounter::Button btn, int nSteps ); int incSteps( QwtCounter::Button btn ) const; virtual QSize sizeHint() const; double singleStep() const; void setSingleStep( double s ); void setRange( double min, double max ); double minimum() const; void setMinimum( double min ); double maximum() const; void setMaximum( double max ); void setStepButton1( int nSteps ); int stepButton1() const; void setStepButton2( int nSteps ); int stepButton2() const; void setStepButton3( int nSteps ); int stepButton3() const; double value() const; public Q_SLOTS: void setValue( double ); Q_SIGNALS: /*! This signal is emitted when a button has been released \param value The new value */ void buttonReleased ( double value ); /*! This signal is emitted when the counter's value has changed \param value The new value */ void valueChanged ( double value ); protected: virtual bool event( QEvent * ); virtual void wheelEvent( QWheelEvent * ); virtual void keyPressEvent( QKeyEvent * ); private Q_SLOTS: void btnReleased(); void btnClicked(); void textChanged(); private: void incrementValue( int numSteps ); void initCounter(); void updateButtons(); void showNumber( double ); class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/000755 001750 001750 00000000000 12356261660 016042 5ustar00warrenwarren000000 000000 linssid-2.7/qwt-lib/src/qwt_interval.h000644 001750 001750 00000015776 12151666701 020750 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_INTERVAL_H #define QWT_INTERVAL_H #include "qwt_global.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A class representing an interval The interval is represented by 2 doubles, the lower and the upper limit. */ class QWT_EXPORT QwtInterval { public: /*! Flag indicating if a border is included or excluded \sa setBorderFlags(), borderFlags() */ enum BorderFlag { //! Min/Max values are inside the interval IncludeBorders = 0x00, //! Min value is not included in the interval ExcludeMinimum = 0x01, //! Max value is not included in the interval ExcludeMaximum = 0x02, //! Min/Max values are not included in the interval ExcludeBorders = ExcludeMinimum | ExcludeMaximum }; //! Border flags typedef QFlags BorderFlags; QwtInterval(); QwtInterval( double minValue, double maxValue, BorderFlags = IncludeBorders ); void setInterval( double minValue, double maxValue, BorderFlags = IncludeBorders ); QwtInterval normalized() const; QwtInterval inverted() const; QwtInterval limited( double minValue, double maxValue ) const; bool operator==( const QwtInterval & ) const; bool operator!=( const QwtInterval & ) const; void setBorderFlags( BorderFlags ); BorderFlags borderFlags() const; double minValue() const; double maxValue() const; double width() const; void setMinValue( double ); void setMaxValue( double ); bool contains( double value ) const; bool intersects( const QwtInterval & ) const; QwtInterval intersect( const QwtInterval & ) const; QwtInterval unite( const QwtInterval & ) const; QwtInterval operator|( const QwtInterval & ) const; QwtInterval operator&( const QwtInterval & ) const; QwtInterval &operator|=( const QwtInterval & ); QwtInterval &operator&=( const QwtInterval & ); QwtInterval extend( double value ) const; QwtInterval operator|( double ) const; QwtInterval &operator|=( double ); bool isValid() const; bool isNull() const; void invalidate(); QwtInterval symmetrize( double value ) const; private: double d_minValue; double d_maxValue; BorderFlags d_borderFlags; }; Q_DECLARE_TYPEINFO(QwtInterval, Q_MOVABLE_TYPE); /*! \brief Default Constructor Creates an invalid interval [0.0, -1.0] \sa setInterval(), isValid() */ inline QwtInterval::QwtInterval(): d_minValue( 0.0 ), d_maxValue( -1.0 ), d_borderFlags( IncludeBorders ) { } /*! Constructor Build an interval with from min/max values \param minValue Minimum value \param maxValue Maximum value \param borderFlags Include/Exclude borders */ inline QwtInterval::QwtInterval( double minValue, double maxValue, BorderFlags borderFlags ): d_minValue( minValue ), d_maxValue( maxValue ), d_borderFlags( borderFlags ) { } /*! Assign the limits of the interval \param minValue Minimum value \param maxValue Maximum value \param borderFlags Include/Exclude borders */ inline void QwtInterval::setInterval( double minValue, double maxValue, BorderFlags borderFlags ) { d_minValue = minValue; d_maxValue = maxValue; d_borderFlags = borderFlags; } /*! Change the border flags \param borderFlags Or'd BorderMode flags \sa borderFlags() */ inline void QwtInterval::setBorderFlags( BorderFlags borderFlags ) { d_borderFlags = borderFlags; } /*! \return Border flags \sa setBorderFlags() */ inline QwtInterval::BorderFlags QwtInterval::borderFlags() const { return d_borderFlags; } /*! Assign the lower limit of the interval \param minValue Minimum value */ inline void QwtInterval::setMinValue( double minValue ) { d_minValue = minValue; } /*! Assign the upper limit of the interval \param maxValue Maximum value */ inline void QwtInterval::setMaxValue( double maxValue ) { d_maxValue = maxValue; } //! \return Lower limit of the interval inline double QwtInterval::minValue() const { return d_minValue; } //! \return Upper limit of the interval inline double QwtInterval::maxValue() const { return d_maxValue; } /*! A interval is valid when minValue() <= maxValue(). In case of QwtInterval::ExcludeBorders it is true when minValue() < maxValue() \return True, when the interval is valid */ inline bool QwtInterval::isValid() const { if ( ( d_borderFlags & ExcludeBorders ) == 0 ) return d_minValue <= d_maxValue; else return d_minValue < d_maxValue; } /*! \brief Return the width of an interval The width of invalid intervals is 0.0, otherwise the result is maxValue() - minValue(). \return Interval width \sa isValid() */ inline double QwtInterval::width() const { return isValid() ? ( d_maxValue - d_minValue ) : 0.0; } /*! \brief Intersection of two intervals \param other Interval to intersect with \return Intersection of this and other \sa intersect() */ inline QwtInterval QwtInterval::operator&( const QwtInterval &other ) const { return intersect( other ); } /*! Union of two intervals \param other Interval to unite with \return Union of this and other \sa unite() */ inline QwtInterval QwtInterval::operator|( const QwtInterval &other ) const { return unite( other ); } /*! \brief Compare two intervals \param other Interval to compare with \return True, when this and other are equal */ inline bool QwtInterval::operator==( const QwtInterval &other ) const { return ( d_minValue == other.d_minValue ) && ( d_maxValue == other.d_maxValue ) && ( d_borderFlags == other.d_borderFlags ); } /*! \brief Compare two intervals \param other Interval to compare with \return True, when this and other are not equal */ inline bool QwtInterval::operator!=( const QwtInterval &other ) const { return ( !( *this == other ) ); } /*! Extend an interval \param value Value \return Extended interval \sa extend() */ inline QwtInterval QwtInterval::operator|( double value ) const { return extend( value ); } //! \return true, if isValid() && (minValue() >= maxValue()) inline bool QwtInterval::isNull() const { return isValid() && d_minValue >= d_maxValue; } /*! Invalidate the interval The limits are set to interval [0.0, -1.0] \sa isValid() */ inline void QwtInterval::invalidate() { d_minValue = 0.0; d_maxValue = -1.0; } Q_DECLARE_OPERATORS_FOR_FLAGS( QwtInterval::BorderFlags ) Q_DECLARE_METATYPE( QwtInterval ) #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtInterval & ); #endif #endif linssid-2.7/qwt-lib/src/qwt_symbol.cpp000644 001750 001750 00000126321 12151666703 020753 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_symbol.h" #include "qwt_painter.h" #include "qwt_graphic.h" #include #include #include #include #include #include #ifndef QWT_NO_SVG #include #endif namespace QwtTriangle { enum Type { Left, Right, Up, Down }; } static QwtGraphic qwtPathGraphic( const QPainterPath &path, const QPen &pen, const QBrush& brush ) { QwtGraphic graphic; graphic.setRenderHint( QwtGraphic::RenderPensUnscaled ); QPainter painter( &graphic ); painter.setPen( pen ); painter.setBrush( brush ); painter.drawPath( path ); painter.end(); return graphic; } static inline QRectF qwtScaledBoundingRect( const QwtGraphic &graphic, const QSizeF size ) { QSizeF scaledSize = size; if ( scaledSize.isEmpty() ) scaledSize = graphic.defaultSize(); const QSizeF sz = graphic.controlPointRect().size(); double sx = 1.0; if ( sz.width() > 0.0 ) sx = scaledSize.width() / sz.width(); double sy = 1.0; if ( sz.height() > 0.0 ) sy = scaledSize.height() / sz.height(); return graphic.scaledBoundingRect( sx, sy ); } static inline void qwtDrawPixmapSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { QSize size = symbol.size(); if ( size.isEmpty() ) size = symbol.pixmap().size(); const QTransform transform = painter->transform(); if ( transform.isScaling() ) { const QRect r( 0, 0, size.width(), size.height() ); size = transform.mapRect( r ).size(); } QPixmap pm = symbol.pixmap(); if ( pm.size() != size ) pm = pm.scaled( size ); QPointF pinPoint( 0.5 * size.width(), 0.5 * size.height() ); if ( symbol.isPinPointEnabled() ) pinPoint = symbol.pinPoint(); painter->resetTransform(); for ( int i = 0; i < numPoints; i++ ) { const QPointF pos = transform.map( points[i] ) - pinPoint; QwtPainter::drawPixmap( painter, QRect( pos.toPoint(), pm.size() ), pm ); } } #ifndef QWT_NO_SVG static inline void qwtDrawSvgSymbols( QPainter *painter, const QPointF *points, int numPoints, QSvgRenderer *renderer, const QwtSymbol &symbol ) { if ( renderer == NULL || !renderer->isValid() ) return; const QRectF viewBox = renderer->viewBoxF(); if ( viewBox.isEmpty() ) return; QSizeF sz = symbol.size(); if ( !sz.isValid() ) sz = viewBox.size(); const double sx = sz.width() / viewBox.width(); const double sy = sz.height() / viewBox.height(); QPointF pinPoint = viewBox.center(); if ( symbol.isPinPointEnabled() ) pinPoint = symbol.pinPoint(); const double dx = sx * ( pinPoint.x() - viewBox.left() ); const double dy = sy * ( pinPoint.y() - viewBox.top() ); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x() - dx; const double y = points[i].y() - dy; renderer->render( painter, QRectF( x, y, sz.width(), sz.height() ) ); } } #endif static inline void qwtDrawGraphicSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtGraphic &graphic, const QwtSymbol &symbol ) { const QRectF pointRect = graphic.controlPointRect(); if ( pointRect.isEmpty() ) return; double sx = 1.0; double sy = 1.0; const QSize sz = symbol.size(); if ( sz.isValid() ) { sx = sz.width() / pointRect.width(); sy = sz.height() / pointRect.height(); } QPointF pinPoint = pointRect.center(); if ( symbol.isPinPointEnabled() ) pinPoint = symbol.pinPoint(); const QTransform transform = painter->transform(); for ( int i = 0; i < numPoints; i++ ) { QTransform tr = transform; tr.translate( points[i].x(), points[i].y() ); tr.scale( sx, sy ); tr.translate( -pinPoint.x(), -pinPoint.y() ); painter->setTransform( tr ); graphic.render( painter ); } painter->setTransform( transform ); } static inline void qwtDrawEllipseSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { painter->setBrush( symbol.brush() ); painter->setPen( symbol.pen() ); const QSize size = symbol.size(); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawEllipse( painter, r ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x(); const double y = points[i].y(); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawEllipse( painter, r ); } } } static inline void qwtDrawRectSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); painter->setRenderHint( QPainter::Antialiasing, false ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const QRect r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawRect( painter, r ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x(); const double y = points[i].y(); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawRect( painter, r ); } } } static inline void qwtDrawDiamondSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); if ( QwtPainter::roundingAlignment( painter ) ) { for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const int x1 = x - size.width() / 2; const int y1 = y - size.height() / 2; const int x2 = x1 + size.width(); const int y2 = y1 + size.height(); QPolygonF polygon; polygon += QPointF( x, y1 ); polygon += QPointF( x1, y ); polygon += QPointF( x, y2 ); polygon += QPointF( x2, y ); QwtPainter::drawPolygon( painter, polygon ); } } else { for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const double x1 = pos.x() - 0.5 * size.width(); const double y1 = pos.y() - 0.5 * size.height(); const double x2 = x1 + size.width(); const double y2 = y1 + size.height(); QPolygonF polygon; polygon += QPointF( pos.x(), y1 ); polygon += QPointF( x2, pos.y() ); polygon += QPointF( pos.x(), y2 ); polygon += QPointF( x1, pos.y() ); QwtPainter::drawPolygon( painter, polygon ); } } } static inline void qwtDrawTriangleSymbols( QPainter *painter, QwtTriangle::Type type, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const bool doAlign = QwtPainter::roundingAlignment( painter ); double sw2 = 0.5 * size.width(); double sh2 = 0.5 * size.height(); if ( doAlign ) { sw2 = qFloor( sw2 ); sh2 = qFloor( sh2 ); } QPolygonF triangle( 3 ); QPointF *trianglePoints = triangle.data(); for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; double x = pos.x(); double y = pos.y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } const double x1 = x - sw2; const double x2 = x1 + size.width(); const double y1 = y - sh2; const double y2 = y1 + size.height(); switch ( type ) { case QwtTriangle::Left: { trianglePoints[0].rx() = x2; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x1; trianglePoints[1].ry() = y; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Right: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x2; trianglePoints[1].ry() = y; trianglePoints[2].rx() = x1; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Up: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y2; trianglePoints[1].rx() = x; trianglePoints[1].ry() = y1; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Down: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x; trianglePoints[1].ry() = y2; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y1; break; } } QwtPainter::drawPolygon( painter, triangle ); } } static inline void qwtDrawLineSymbols( QPainter *painter, int orientations, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); int off = 0; QPen pen = symbol.pen(); if ( pen.width() > 1 ) { pen.setCapStyle( Qt::FlatCap ); off = 1; } painter->setPen( pen ); painter->setRenderHint( QPainter::Antialiasing, false ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = qFloor( size.width() ); const int sh = qFloor( size.height() ); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { if ( orientations & Qt::Horizontal ) { const int x = qRound( points[i].x() ) - sw2; const int y = qRound( points[i].y() ); QwtPainter::drawLine( painter, x, y, x + sw + off, y ); } if ( orientations & Qt::Vertical ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ) - sh2; QwtPainter::drawLine( painter, x, y, x, y + sh + off ); } } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { if ( orientations & Qt::Horizontal ) { const double x = points[i].x() - sw2; const double y = points[i].y(); QwtPainter::drawLine( painter, x, y, x + sw, y ); } if ( orientations & Qt::Vertical ) { const double y = points[i].y() - sh2; const double x = points[i].x(); QwtPainter::drawLine( painter, x, y, x, y + sh ); } } } } static inline void qwtDrawXCrossSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); int off = 0; QPen pen = symbol.pen(); if ( pen.width() > 1 ) { pen.setCapStyle( Qt::FlatCap ); off = 1; } painter->setPen( pen ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const int x = qRound( pos.x() ); const int y = qRound( pos.y() ); const int x1 = x - sw2; const int x2 = x1 + sw + off; const int y1 = y - sh2; const int y2 = y1 + sh + off; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); QwtPainter::drawLine( painter, x2, y1, x1, y2 ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const double x1 = pos.x() - sw2; const double x2 = x1 + sw; const double y1 = pos.y() - sh2; const double y2 = y1 + sh; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); QwtPainter::drawLine( painter, x1, y2, x2, y1 ); } } } static inline void qwtDrawStar1Symbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); painter->setPen( symbol.pen() ); if ( QwtPainter::roundingAlignment( painter ) ) { QRect r( 0, 0, size.width(), size.height() ); for ( int i = 0; i < numPoints; i++ ) { r.moveCenter( points[i].toPoint() ); const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */ const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 ); QwtPainter::drawLine( painter, qRound( r.left() + d1 ), qRound( r.top() + d1 ), qRound( r.right() - d1 ), qRound( r.bottom() - d1 ) ); QwtPainter::drawLine( painter, qRound( r.left() + d1 ), qRound( r.bottom() - d1 ), qRound( r .right() - d1), qRound( r.top() + d1 ) ); const QPoint c = r.center(); QwtPainter::drawLine( painter, c.x(), r.top(), c.x(), r.bottom() ); QwtPainter::drawLine( painter, r.left(), c.y(), r.right(), c.y() ); } } else { QRectF r( 0, 0, size.width(), size.height() ); for ( int i = 0; i < numPoints; i++ ) { r.moveCenter( points[i] ); const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */ const QPointF c = r.center(); const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 ); QwtPainter::drawLine( painter, r.left() + d1, r.top() + d1, r.right() - d1, r.bottom() - d1 ); QwtPainter::drawLine( painter, r.left() + d1, r.bottom() - d1, r.right() - d1, r.top() + d1 ); QwtPainter::drawLine( painter, c.x(), r.top(), c.x(), r.bottom() ); QwtPainter::drawLine( painter, r.left(), c.y(), r.right(), c.y() ); } } } static inline void qwtDrawStar2Symbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { QPen pen = symbol.pen(); if ( pen.width() > 1 ) pen.setCapStyle( Qt::FlatCap ); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const double cos30 = 0.866025; // cos(30°) const double dy = 0.25 * symbol.size().height(); const double dx = 0.5 * symbol.size().width() * cos30 / 3.0; QPolygonF star( 12 ); QPointF *starPoints = star.data(); const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < numPoints; i++ ) { double x = points[i].x(); double y = points[i].y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } double x1 = x - 3 * dx; double y1 = y - 2 * dy; if ( doAlign ) { x1 = qRound( x - 3 * dx ); y1 = qRound( y - 2 * dy ); } const double x2 = x1 + 1 * dx; const double x3 = x1 + 2 * dx; const double x4 = x1 + 3 * dx; const double x5 = x1 + 4 * dx; const double x6 = x1 + 5 * dx; const double x7 = x1 + 6 * dx; const double y2 = y1 + 1 * dy; const double y3 = y1 + 2 * dy; const double y4 = y1 + 3 * dy; const double y5 = y1 + 4 * dy; starPoints[0].rx() = x4; starPoints[0].ry() = y1; starPoints[1].rx() = x5; starPoints[1].ry() = y2; starPoints[2].rx() = x7; starPoints[2].ry() = y2; starPoints[3].rx() = x6; starPoints[3].ry() = y3; starPoints[4].rx() = x7; starPoints[4].ry() = y4; starPoints[5].rx() = x5; starPoints[5].ry() = y4; starPoints[6].rx() = x4; starPoints[6].ry() = y5; starPoints[7].rx() = x3; starPoints[7].ry() = y4; starPoints[8].rx() = x1; starPoints[8].ry() = y4; starPoints[9].rx() = x2; starPoints[9].ry() = y3; starPoints[10].rx() = x1; starPoints[10].ry() = y2; starPoints[11].rx() = x3; starPoints[11].ry() = y2; QwtPainter::drawPolygon( painter, star ); } } static inline void qwtDrawHexagonSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { painter->setBrush( symbol.brush() ); painter->setPen( symbol.pen() ); const double cos30 = 0.866025; // cos(30°) const double dx = 0.5 * ( symbol.size().width() - cos30 ); const double dy = 0.25 * symbol.size().height(); QPolygonF hexaPolygon( 6 ); QPointF *hexaPoints = hexaPolygon.data(); const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < numPoints; i++ ) { double x = points[i].x(); double y = points[i].y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } double x1 = x - dx; double y1 = y - 2 * dy; if ( doAlign ) { x1 = qCeil( x1 ); y1 = qCeil( y1 ); } const double x2 = x1 + 1 * dx; const double x3 = x1 + 2 * dx; const double y2 = y1 + 1 * dy; const double y3 = y1 + 3 * dy; const double y4 = y1 + 4 * dy; hexaPoints[0].rx() = x2; hexaPoints[0].ry() = y1; hexaPoints[1].rx() = x3; hexaPoints[1].ry() = y2; hexaPoints[2].rx() = x3; hexaPoints[2].ry() = y3; hexaPoints[3].rx() = x2; hexaPoints[3].ry() = y4; hexaPoints[4].rx() = x1; hexaPoints[4].ry() = y3; hexaPoints[5].rx() = x1; hexaPoints[5].ry() = y2; QwtPainter::drawPolygon( painter, hexaPolygon ); } } class QwtSymbol::PrivateData { public: PrivateData( QwtSymbol::Style st, const QBrush &br, const QPen &pn, const QSize &sz ): style( st ), size( sz ), brush( br ), pen( pn ), isPinPointEnabled( false ) { cache.policy = QwtSymbol::AutoCache; #ifndef QWT_NO_SVG svg.renderer = NULL; #endif } ~PrivateData() { #ifndef QWT_NO_SVG delete svg.renderer; #endif } Style style; QSize size; QBrush brush; QPen pen; bool isPinPointEnabled; QPointF pinPoint; struct Path { QPainterPath path; QwtGraphic graphic; } path; struct Pixmap { QPixmap pixmap; } pixmap; struct Graphic { QwtGraphic graphic; } graphic; #ifndef QWT_NO_SVG struct SVG { QSvgRenderer *renderer; } svg; #endif struct PaintCache { QwtSymbol::CachePolicy policy; QPixmap pixmap; } cache; }; /*! Default Constructor \param style Symbol Style The symbol is constructed with gray interior, black outline with zero width, no size and style 'NoSymbol'. */ QwtSymbol::QwtSymbol( Style style ) { d_data = new PrivateData( style, QBrush( Qt::gray ), QPen( Qt::black, 0 ), QSize() ); } /*! \brief Constructor \param style Symbol Style \param brush brush to fill the interior \param pen outline pen \param size size \sa setStyle(), setBrush(), setPen(), setSize() */ QwtSymbol::QwtSymbol( QwtSymbol::Style style, const QBrush &brush, const QPen &pen, const QSize &size ) { d_data = new PrivateData( style, brush, pen, size ); } /*! \brief Constructor The symbol gets initialized by a painter path. The style is set to QwtSymbol::Path, the size is set to empty ( the path is displayed unscaled ). \param path painter path \param brush brush to fill the interior \param pen outline pen \sa setPath(), setBrush(), setPen(), setSize() */ QwtSymbol::QwtSymbol( const QPainterPath &path, const QBrush &brush, const QPen &pen ) { d_data = new PrivateData( QwtSymbol::Path, brush, pen, QSize() ); setPath( path ); } //! Destructor QwtSymbol::~QwtSymbol() { delete d_data; } /*! Change the cache policy The default policy is AutoCache \param policy Cache policy \sa CachePolicy, cachePolicy() */ void QwtSymbol::setCachePolicy( QwtSymbol::CachePolicy policy ) { if ( d_data->cache.policy != policy ) { d_data->cache.policy = policy; invalidateCache(); } } /*! \return Cache policy \sa CachePolicy, setCachePolicy() */ QwtSymbol::CachePolicy QwtSymbol::cachePolicy() const { return d_data->cache.policy; } /*! \brief Set a painter path as symbol The symbol is represented by a painter path, where the origin ( 0, 0 ) of the path coordinate system is mapped to the position of the symbol. When the symbol has valid size the painter path gets scaled to fit into the size. Otherwise the symbol size depends on the bounding rectangle of the path. The following code defines a symbol drawing an arrow: \verbatim #include QwtSymbol *symbol = new QwtSymbol(); QPen pen( Qt::black, 2 ); pen.setJoinStyle( Qt::MiterJoin ); symbol->setPen( pen ); symbol->setBrush( Qt::red ); QPainterPath path; path.moveTo( 0, 8 ); path.lineTo( 0, 5 ); path.lineTo( -3, 5 ); path.lineTo( 0, 0 ); path.lineTo( 3, 5 ); path.lineTo( 0, 5 ); QTransform transform; transform.rotate( -30.0 ); path = transform.map( path ); symbol->setPath( path ); symbol->setPinPoint( QPointF( 0.0, 0.0 ) ); setSize( 10, 14 ); \endverbatim \param path Painter path \note The style is implicitely set to QwtSymbol::Path. \sa path(), setSize() */ void QwtSymbol::setPath( const QPainterPath &path ) { d_data->style = QwtSymbol::Path; d_data->path.path = path; d_data->path.graphic.reset(); } /*! \return Painter path for displaying the symbol \sa setPath() */ const QPainterPath &QwtSymbol::path() const { return d_data->path.path; } /*! Set a pixmap as symbol \param pixmap Pixmap \sa pixmap(), setGraphic() \note the style() is set to QwtSymbol::Pixmap \note brush() and pen() have no effect */ void QwtSymbol::setPixmap( const QPixmap &pixmap ) { d_data->style = QwtSymbol::Pixmap; d_data->pixmap.pixmap = pixmap; } /*! \return Assigned pixmap \sa setPixmap() */ const QPixmap &QwtSymbol::pixmap() const { return d_data->pixmap.pixmap; } /*! Set a graphic as symbol \param graphic Graphic \sa graphic(), setPixmap() \note the style() is set to QwtSymbol::Graphic \note brush() and pen() have no effect */ void QwtSymbol::setGraphic( const QwtGraphic &graphic ) { d_data->style = QwtSymbol::Graphic; d_data->graphic.graphic = graphic; } /*! \return Assigned graphic \sa setGraphic() */ const QwtGraphic &QwtSymbol::graphic() const { return d_data->graphic.graphic; } #ifndef QWT_NO_SVG /*! Set a SVG icon as symbol \param svgDocument SVG icon \sa setGraphic(), setPixmap() \note the style() is set to QwtSymbol::SvgDocument \note brush() and pen() have no effect */ void QwtSymbol::setSvgDocument( const QByteArray &svgDocument ) { d_data->style = QwtSymbol::SvgDocument; if ( d_data->svg.renderer == NULL ) d_data->svg.renderer = new QSvgRenderer(); d_data->svg.renderer->load( svgDocument ); } #endif /*! \brief Specify the symbol's size If the 'h' parameter is left out or less than 0, and the 'w' parameter is greater than or equal to 0, the symbol size will be set to (w,w). \param width Width \param height Height (defaults to -1) \sa size() */ void QwtSymbol::setSize( int width, int height ) { if ( ( width >= 0 ) && ( height < 0 ) ) height = width; setSize( QSize( width, height ) ); } /*! Set the symbol's size \param size Size \sa size() */ void QwtSymbol::setSize( const QSize &size ) { if ( size.isValid() && size != d_data->size ) { d_data->size = size; invalidateCache(); } } /*! \return Size \sa setSize() */ const QSize& QwtSymbol::size() const { return d_data->size; } /*! \brief Assign a brush The brush is used to draw the interior of the symbol. \param brush Brush \sa brush() */ void QwtSymbol::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; invalidateCache(); if ( d_data->style == QwtSymbol::Path ) d_data->path.graphic.reset(); } } /*! \return Brush \sa setBrush() */ const QBrush& QwtSymbol::brush() const { return d_data->brush; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtSymbol::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen The pen is used to draw the symbol's outline. \param pen Pen \sa pen(), setBrush() */ void QwtSymbol::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; invalidateCache(); if ( d_data->style == QwtSymbol::Path ) d_data->path.graphic.reset(); } } /*! \return Pen \sa setPen(), brush() */ const QPen& QwtSymbol::pen() const { return d_data->pen; } /*! \brief Set the color of the symbol Change the color of the brush for symbol types with a filled area. For all other symbol types the color will be assigned to the pen. \param color Color \sa setBrush(), setPen(), brush(), pen() */ void QwtSymbol::setColor( const QColor &color ) { switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star2: case QwtSymbol::Hexagon: { if ( d_data->brush.color() != color ) { d_data->brush.setColor( color ); invalidateCache(); } break; } case QwtSymbol::Cross: case QwtSymbol::XCross: case QwtSymbol::HLine: case QwtSymbol::VLine: case QwtSymbol::Star1: { if ( d_data->pen.color() != color ) { d_data->pen.setColor( color ); invalidateCache(); } break; } default: { if ( d_data->brush.color() != color || d_data->pen.color() != color ) { invalidateCache(); } d_data->brush.setColor( color ); d_data->pen.setColor( color ); } } } /*! \brief Set and enable a pin point The position of a complex symbol is not always aligned to its center ( f.e an arrow, where the peak points to a position ). The pin point defines the position inside of a Pixmap, Graphic, SvgDocument or PainterPath symbol where the represented point has to be aligned to. \param pos Position \param enable En/Disable the pin point alignment \sa pinPoint(), setPinPointEnabled() */ void QwtSymbol::setPinPoint( const QPointF &pos, bool enable ) { if ( d_data->pinPoint != pos ) { d_data->pinPoint = pos; if ( d_data->isPinPointEnabled ) { invalidateCache(); } } setPinPointEnabled( enable ); } /*! \return Pin point \sa setPinPoint(), setPinPointEnabled() */ QPointF QwtSymbol::pinPoint() const { return d_data->pinPoint; } /*! En/Disable the pin point alignment \param on Enabled, when on is true \sa setPinPoint(), isPinPointEnabled() */ void QwtSymbol::setPinPointEnabled( bool on ) { if ( d_data->isPinPointEnabled != on ) { d_data->isPinPointEnabled = on; invalidateCache(); } } /*! \return True, when the pin point translation is enabled \sa setPinPoint(), setPinPointEnabled() */ bool QwtSymbol::isPinPointEnabled() const { return d_data->isPinPointEnabled; } /*! Render an array of symbols Painting several symbols is more effective than drawing symbols one by one, as a couple of layout calculations and setting of pen/brush can be done once for the complete array. \param painter Painter \param points Array of points \param numPoints Number of points */ void QwtSymbol::drawSymbols( QPainter *painter, const QPointF *points, int numPoints ) const { if ( numPoints <= 0 ) return; bool useCache = false; // Don't use the pixmap, when the paint device // could generate scalable vectors if ( QwtPainter::roundingAlignment( painter ) && !painter->transform().isScaling() ) { if ( d_data->cache.policy == QwtSymbol::Cache ) { useCache = true; } else if ( d_data->cache.policy == QwtSymbol::AutoCache ) { if ( painter->paintEngine()->type() == QPaintEngine::Raster ) { useCache = true; } else { switch( d_data->style ) { case QwtSymbol::XCross: case QwtSymbol::HLine: case QwtSymbol::VLine: case QwtSymbol::Cross: break; case QwtSymbol::Pixmap: { if ( !d_data->size.isEmpty() && d_data->size != d_data->pixmap.pixmap.size() ) { useCache = true; } break; } default: useCache = true; } } } } if ( useCache ) { const QRect br = boundingRect(); const QRect rect( 0, 0, br.width(), br.height() ); if ( d_data->cache.pixmap.isNull() ) { d_data->cache.pixmap = QwtPainter::backingStore( NULL, br.size() ); d_data->cache.pixmap.fill( Qt::transparent ); QPainter p( &d_data->cache.pixmap ); p.setRenderHints( painter->renderHints() ); p.translate( -br.topLeft() ); const QPointF pos; renderSymbols( &p, &pos, 1 ); } const int dx = br.left(); const int dy = br.top(); for ( int i = 0; i < numPoints; i++ ) { const int left = qRound( points[i].x() ) + dx; const int top = qRound( points[i].y() ) + dy; painter->drawPixmap( left, top, d_data->cache.pixmap ); } } else { painter->save(); renderSymbols( painter, points, numPoints ); painter->restore(); } } /*! \brief Draw the symbol into a rectangle The symbol is painted centered and scaled into the target rectangle. It is always painted uncached and the pin point is ignored. This method is primarily intended for drawing a symbol to the legend. \param painter Painter \param rect Target rectangle for the symbol */ void QwtSymbol::drawSymbol( QPainter *painter, const QRectF &rect ) const { if ( d_data->style == QwtSymbol::NoSymbol ) return; if ( d_data->style == QwtSymbol::Graphic ) { d_data->graphic.graphic.render( painter, rect, Qt::KeepAspectRatio ); } else if ( d_data->style == QwtSymbol::Path ) { if ( d_data->path.graphic.isNull() ) { d_data->path.graphic = qwtPathGraphic( d_data->path.path, d_data->pen, d_data->brush ); } d_data->path.graphic.render( painter, rect, Qt::KeepAspectRatio ); return; } else if ( d_data->style == QwtSymbol::SvgDocument ) { #ifndef QWT_NO_SVG if ( d_data->svg.renderer ) { QRectF scaledRect; QSizeF sz = d_data->svg.renderer->viewBoxF().size(); if ( !sz.isEmpty() ) { sz.scale( rect.size(), Qt::KeepAspectRatio ); scaledRect.setSize( sz ); scaledRect.moveCenter( rect.center() ); } else { scaledRect = rect; } d_data->svg.renderer->render( painter, scaledRect ); } #endif } else { const QRect br = boundingRect(); // scale the symbol size to fit into rect. const double ratio = qMin( rect.width() / br.width(), rect.height() / br.height() ); painter->save(); painter->translate( rect.center() ); painter->scale( ratio, ratio ); const bool isPinPointEnabled = d_data->isPinPointEnabled; d_data->isPinPointEnabled = false; const QPointF pos; renderSymbols( painter, &pos, 1 ); d_data->isPinPointEnabled = isPinPointEnabled; painter->restore(); } } /*! Render the symbol to series of points \param painter Qt painter \param points Positions of the symbols \param numPoints Number of points */ void QwtSymbol::renderSymbols( QPainter *painter, const QPointF *points, int numPoints ) const { switch ( d_data->style ) { case QwtSymbol::Ellipse: { qwtDrawEllipseSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Rect: { qwtDrawRectSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Diamond: { qwtDrawDiamondSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Cross: { qwtDrawLineSymbols( painter, Qt::Horizontal | Qt::Vertical, points, numPoints, *this ); break; } case QwtSymbol::XCross: { qwtDrawXCrossSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Triangle: case QwtSymbol::UTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Up, points, numPoints, *this ); break; } case QwtSymbol::DTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Down, points, numPoints, *this ); break; } case QwtSymbol::RTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Right, points, numPoints, *this ); break; } case QwtSymbol::LTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Left, points, numPoints, *this ); break; } case QwtSymbol::HLine: { qwtDrawLineSymbols( painter, Qt::Horizontal, points, numPoints, *this ); break; } case QwtSymbol::VLine: { qwtDrawLineSymbols( painter, Qt::Vertical, points, numPoints, *this ); break; } case QwtSymbol::Star1: { qwtDrawStar1Symbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Star2: { qwtDrawStar2Symbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Hexagon: { qwtDrawHexagonSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Path: { if ( d_data->path.graphic.isNull() ) { d_data->path.graphic = qwtPathGraphic( d_data->path.path, d_data->pen, d_data->brush ); } qwtDrawGraphicSymbols( painter, points, numPoints, d_data->path.graphic, *this ); break; } case QwtSymbol::Pixmap: { qwtDrawPixmapSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Graphic: { qwtDrawGraphicSymbols( painter, points, numPoints, d_data->graphic.graphic, *this ); break; } case QwtSymbol::SvgDocument: { #ifndef QWT_NO_SVG qwtDrawSvgSymbols( painter, points, numPoints, d_data->svg.renderer, *this ); #endif break; } default:; } } /*! Calculate the bounding rectangle for a symbol at position (0,0). \return Bounding rectangle */ QRect QwtSymbol::boundingRect() const { QRectF rect; switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Hexagon: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); rect.setSize( d_data->size + QSizeF( pw, pw ) ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); break; } case QwtSymbol::XCross: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star1: case QwtSymbol::Star2: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); rect.setSize( d_data->size + QSizeF( 2 * pw, 2 * pw ) ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); break; } case QwtSymbol::Path: { if ( d_data->path.graphic.isNull() ) { d_data->path.graphic = qwtPathGraphic( d_data->path.path, d_data->pen, d_data->brush ); } rect = qwtScaledBoundingRect( d_data->path.graphic, d_data->size ); break; } case QwtSymbol::Pixmap: { if ( d_data->size.isEmpty() ) rect.setSize( d_data->pixmap.pixmap.size() ); else rect.setSize( d_data->size ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); // pinpoint ??? break; } case QwtSymbol::Graphic: { rect = qwtScaledBoundingRect( d_data->graphic.graphic, d_data->size ); break; } #ifndef QWT_NO_SVG case QwtSymbol::SvgDocument: { if ( d_data->svg.renderer ) rect = d_data->svg.renderer->viewBoxF(); if ( d_data->size.isValid() && !rect.isEmpty() ) { QSizeF sz = rect.size(); const double sx = d_data->size.width() / sz.width(); const double sy = d_data->size.height() / sz.height(); QTransform transform; transform.scale( sx, sy ); rect = transform.mapRect( rect ); } break; } #endif default: { rect.setSize( d_data->size ); rect.moveCenter( QPointF( 0.0, 0.0 ) ); } } if ( d_data->style == QwtSymbol::Graphic || d_data->style == QwtSymbol::SvgDocument || d_data->style == QwtSymbol::Path ) { QPointF pinPoint( 0.0, 0.0 ); if ( d_data->isPinPointEnabled ) pinPoint = rect.center() - d_data->pinPoint; rect.moveCenter( pinPoint ); } QRect r; r.setLeft( qFloor( rect.left() ) ); r.setTop( qFloor( rect.top() ) ); r.setRight( qCeil( rect.right() ) ); r.setBottom( qCeil( rect.bottom() ) ); if ( d_data->style != QwtSymbol::Pixmap ) r.adjust( -1, -1, 1, 1 ); // for antialiasing return r; } /*! Invalidate the cached symbol pixmap The symbol invalidates its cache, whenever an attribute is changed that has an effect ob how to display a symbol. In case of derived classes with individual styles ( >= QwtSymbol::UserStyle ) it might be necessary to call invalidateCache() for attributes that are relevant for this style. \sa CachePolicy, setCachePolicy(), drawSymbols() */ void QwtSymbol::invalidateCache() { if ( !d_data->cache.pixmap.isNull() ) d_data->cache.pixmap = QPixmap(); } /*! Specify the symbol style \param style Style \sa style() */ void QwtSymbol::setStyle( QwtSymbol::Style style ) { if ( d_data->style != style ) { d_data->style = style; invalidateCache(); } } /*! \return Current symbol style \sa setStyle() */ QwtSymbol::Style QwtSymbol::style() const { return d_data->style; } linssid-2.7/qwt-lib/src/qwt_picker_machine.h000644 001750 001750 00000013136 12151666701 022051 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PICKER_MACHINE #define QWT_PICKER_MACHINE 1 #include "qwt_global.h" #include class QEvent; class QwtEventPattern; /*! \brief A state machine for QwtPicker selections QwtPickerMachine accepts key and mouse events and translates them into selection commands. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerMachine { public: /*! Type of a selection. \sa selectionType() */ enum SelectionType { //! The state machine not usable for any type of selection. NoSelection = -1, //! The state machine is for selecting a single point. PointSelection, //! The state machine is for selecting a rectangle (2 points). RectSelection, //! The state machine is for selecting a polygon (many points). PolygonSelection }; //! Commands - the output of a state machine enum Command { Begin, Append, Move, Remove, End }; QwtPickerMachine( SelectionType ); virtual ~QwtPickerMachine(); //! Transition virtual QList transition( const QwtEventPattern &, const QEvent * ) = 0; void reset(); int state() const; void setState( int ); SelectionType selectionType() const; private: const SelectionType d_selectionType; int d_state; }; /*! \brief A state machine for indicating mouse movements QwtPickerTrackerMachine supports displaying information corresponding to mouse movements, but is not intended for selecting anything. Begin/End are related to Enter/Leave events. */ class QWT_EXPORT QwtPickerTrackerMachine: public QwtPickerMachine { public: QwtPickerTrackerMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for point selections Pressing QwtEventPattern::MouseSelect1 or QwtEventPattern::KeySelect1 selects a point. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerClickPointMachine: public QwtPickerMachine { public: QwtPickerClickPointMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for point selections Pressing QwtEventPattern::MouseSelect1 or QwtEventPattern::KeySelect1 starts the selection, releasing QwtEventPattern::MouseSelect1 or a second press of QwtEventPattern::KeySelect1 terminates it. */ class QWT_EXPORT QwtPickerDragPointMachine: public QwtPickerMachine { public: QwtPickerDragPointMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for rectangle selections Pressing QwtEventPattern::MouseSelect1 starts the selection, releasing it selects the first point. Pressing it again selects the second point and terminates the selection. Pressing QwtEventPattern::KeySelect1 also starts the selection, a second press selects the first point. A third one selects the second point and terminates the selection. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerClickRectMachine: public QwtPickerMachine { public: QwtPickerClickRectMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for rectangle selections Pressing QwtEventPattern::MouseSelect1 selects the first point, releasing it the second point. Pressing QwtEventPattern::KeySelect1 also selects the first point, a second press selects the second point and terminates the selection. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerDragRectMachine: public QwtPickerMachine { public: QwtPickerDragRectMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for line selections Pressing QwtEventPattern::MouseSelect1 selects the first point, releasing it the second point. Pressing QwtEventPattern::KeySelect1 also selects the first point, a second press selects the second point and terminates the selection. A common use case of QwtPickerDragLineMachine are pickers for distance measurements. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerDragLineMachine: public QwtPickerMachine { public: QwtPickerDragLineMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; /*! \brief A state machine for polygon selections Pressing QwtEventPattern::MouseSelect1 or QwtEventPattern::KeySelect1 starts the selection and selects the first point, or appends a point. Pressing QwtEventPattern::MouseSelect2 or QwtEventPattern::KeySelect2 appends the last point and terminates the selection. \sa QwtEventPattern::MousePatternCode, QwtEventPattern::KeyPatternCode */ class QWT_EXPORT QwtPickerPolygonMachine: public QwtPickerMachine { public: QwtPickerPolygonMachine(); virtual QList transition( const QwtEventPattern &, const QEvent * ); }; #endif linssid-2.7/qwt-lib/src/qwt_knob.cpp000644 001750 001750 00000047716 12151666703 020411 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_knob.h" #include "qwt_round_scale_draw.h" #include "qwt_math.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #define qFabs(x) ::fabs(x) #define qFastCos(x) qCos(x) #define qFastSin(x) qSin(x) #endif static QSize qwtKnobSizeHint( const QwtKnob *knob, int min ) { int knobWidth = knob->knobWidth(); if ( knobWidth <= 0 ) knobWidth = qMax( 3 * knob->markerSize(), min ); // Add the scale radial thickness to the knobWidth const int extent = qCeil( knob->scaleDraw()->extent( knob->font() ) ); const int d = 2 * ( extent + 4 ) + knobWidth; int left, right, top, bottom; knob->getContentsMargins( &left, &top, &right, &bottom ); return QSize( d + left + right, d + top + bottom ); } static inline double qwtToScaleAngle( double angle ) { // the map is counter clockwise with the origin // at 90° using angles from -180° -> 180° double a = 90.0 - angle; if ( a <= -180.0 ) a += 360.0; else if ( a >= 180.0 ) a -= 360.0; return a; } static double qwtToDegrees( double value ) { return qwtNormalizeDegrees( 90.0 - value ); } class QwtKnob::PrivateData { public: PrivateData(): knobStyle( QwtKnob::Raised ), markerStyle( QwtKnob::Notch ), borderWidth( 2 ), borderDist( 4 ), scaleDist( 4 ), maxScaleTicks( 11 ), knobWidth( 0 ), alignment( Qt::AlignCenter ), markerSize( 8 ), totalAngle( 270.0 ), mouseOffset( 0.0 ) { } QwtKnob::KnobStyle knobStyle; QwtKnob::MarkerStyle markerStyle; int borderWidth; int borderDist; int scaleDist; int maxScaleTicks; int knobWidth; Qt::Alignment alignment; int markerSize; double totalAngle; double mouseOffset; }; /*! \brief Constructor Construct a knob with an angle of 270°. The style is QwtKnob::Raised and the marker style is QwtKnob::Notch. The width of the knob is set to 50 pixels. \param parent Parent widget \sa setTotalAngle() */ QwtKnob::QwtKnob( QWidget* parent ): QwtAbstractSlider( parent ) { d_data = new PrivateData; setScaleDraw( new QwtRoundScaleDraw() ); setTotalAngle( 270.0 ); setScale( 0.0, 10.0 ); setValue( 0.0 ); setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ); } //! Destructor QwtKnob::~QwtKnob() { delete d_data; } /*! \brief Set the knob type \param knobStyle Knob type \sa knobStyle(), setBorderWidth() */ void QwtKnob::setKnobStyle( KnobStyle knobStyle ) { if ( d_data->knobStyle != knobStyle ) { d_data->knobStyle = knobStyle; update(); } } /*! \return Marker type of the knob \sa setKnobStyle(), setBorderWidth() */ QwtKnob::KnobStyle QwtKnob::knobStyle() const { return d_data->knobStyle; } /*! \brief Set the marker type of the knob \param markerStyle Marker type \sa markerStyle(), setMarkerSize() */ void QwtKnob::setMarkerStyle( MarkerStyle markerStyle ) { if ( d_data->markerStyle != markerStyle ) { d_data->markerStyle = markerStyle; update(); } } /*! \return Marker type of the knob \sa setMarkerStyle(), setMarkerSize() */ QwtKnob::MarkerStyle QwtKnob::markerStyle() const { return d_data->markerStyle; } /*! \brief Set the total angle by which the knob can be turned \param angle Angle in degrees. The angle has to be between [10, 360] degrees. Angles above 360 ( so that the knob can be turned several times around its axis ) have to be set using setNumTurns(). The default angle is 270 degrees. \sa totalAngle(), setNumTurns() */ void QwtKnob::setTotalAngle ( double angle ) { angle = qBound( 10.0, angle, 360.0 ); if ( angle != d_data->totalAngle ) { d_data->totalAngle = angle; scaleDraw()->setAngleRange( -0.5 * d_data->totalAngle, 0.5 * d_data->totalAngle ); updateGeometry(); update(); } } /*! \return the total angle \sa setTotalAngle(), setNumTurns(), numTurns() */ double QwtKnob::totalAngle() const { return d_data->totalAngle; } /*! \brief Set the number of turns When numTurns > 1 the knob can be turned several times around its axis - otherwise the total angle is floored to 360°. \sa numTurns(), totalAngle(), setTotalAngle() */ void QwtKnob::setNumTurns( int numTurns ) { numTurns = qMax( numTurns, 1 ); if ( numTurns == 1 && d_data->totalAngle <= 360.0 ) return; const double angle = numTurns * 360.0; if ( angle != d_data->totalAngle ) { d_data->totalAngle = angle; scaleDraw()->setAngleRange( -0.5 * d_data->totalAngle, 0.5 * d_data->totalAngle ); updateGeometry(); update(); } } /*! \return Number of turns. When the total angle is below 360° numTurns() is ceiled to 1. \sa setNumTurns(), setTotalAngle(), totalAngle() */ int QwtKnob::numTurns() const { return qCeil( d_data->totalAngle / 360.0 ); } /*! Change the scale draw of the knob For changing the labels of the scales, it is necessary to derive from QwtRoundScaleDraw and overload QwtRoundScaleDraw::label(). \sa scaleDraw() */ void QwtKnob::setScaleDraw( QwtRoundScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); setTotalAngle( d_data->totalAngle ); } /*! \return the scale draw of the knob \sa setScaleDraw() */ const QwtRoundScaleDraw *QwtKnob::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the knob \sa setScaleDraw() */ QwtRoundScaleDraw *QwtKnob::scaleDraw() { return static_cast( abstractScaleDraw() ); } /*! Calculate the bounding rectangle of the knob without the scale \return Bounding rectangle of the knob \sa knobWidth(), alignment(), QWidget::contentsRect() */ QRect QwtKnob::knobRect() const { const QRect cr = contentsRect(); const int extent = qCeil( scaleDraw()->extent( font() ) ); const int d = extent + d_data->scaleDist; int w = d_data->knobWidth; if ( w <= 0 ) { const int dim = qMin( cr.width(), cr.height() ); w = dim - 2 * ( d ); w = qMax( 0, w ); } QRect r( 0, 0, w, w ); if ( d_data->alignment & Qt::AlignLeft ) { r.moveLeft( cr.left() + d ); } else if ( d_data->alignment & Qt::AlignRight ) { r.moveRight( cr.right() - d ); } else { r.moveCenter( QPoint( cr.center().x(), r.center().y() ) ); } if ( d_data->alignment & Qt::AlignTop ) { r.moveTop( cr.top() + d ); } else if ( d_data->alignment & Qt::AlignBottom ) { r.moveBottom( cr.bottom() - d ); } else { r.moveCenter( QPoint( r.center().x(), cr.center().y() ) ); } return r; } /*! \brief Determine what to do when the user presses a mouse button. \param pos Mouse position \retval True, when pos is inside the circle of the knob. \sa scrolledTo() */ bool QwtKnob::isScrollPosition( const QPoint &pos ) const { const QRect kr = knobRect(); const QRegion region( kr, QRegion::Ellipse ); if ( region.contains( pos ) && ( pos != kr.center() ) ) { const double angle = QLineF( kr.center(), pos ).angle(); const double valueAngle = qwtToDegrees( transform( value() ) ); d_data->mouseOffset = qwtNormalizeDegrees( angle - valueAngle ); return true; } return false; } /*! \brief Determine the value for a new position of the mouse \param pos Mouse position \return Value for the mouse position \sa isScrollPosition() */ double QwtKnob::scrolledTo( const QPoint &pos ) const { double angle = QLineF( rect().center(), pos ).angle(); angle = qwtNormalizeDegrees( angle - d_data->mouseOffset ); if ( scaleMap().pDist() > 360.0 ) { angle = qwtToDegrees( angle ); const double v = transform( value() ); int numTurns = qFloor( ( v - scaleMap().p1() ) / 360.0 ); double valueAngle = qwtNormalizeDegrees( v ); if ( qAbs( valueAngle - angle ) > 180.0 ) { numTurns += ( angle > valueAngle ) ? -1 : 1; } angle += scaleMap().p1() + numTurns * 360.0; if ( !wrapping() ) { const double boundedAngle = qBound( scaleMap().p1(), angle, scaleMap().p2() ); d_data->mouseOffset += ( boundedAngle - angle ); angle = boundedAngle; } } else { angle = qwtToScaleAngle( angle ); const double boundedAngle = qBound( scaleMap().p1(), angle, scaleMap().p2() ); if ( !wrapping() ) d_data->mouseOffset += ( boundedAngle - angle ); angle = boundedAngle; } return invTransform( angle ); } /*! Handle QEvent::StyleChange and QEvent::FontChange; \param event Change event */ void QwtKnob::changeEvent( QEvent *event ) { switch( event->type() ) { case QEvent::StyleChange: case QEvent::FontChange: { updateGeometry(); update(); break; } default: break; } } /*! Repaint the knob \param event Paint event */ void QwtKnob::paintEvent( QPaintEvent *event ) { const QRectF knobRect = this->knobRect(); QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); painter.setRenderHint( QPainter::Antialiasing, true ); if ( !knobRect.contains( event->region().boundingRect() ) ) { scaleDraw()->setRadius( 0.5 * knobRect.width() + d_data->scaleDist ); scaleDraw()->moveCenter( knobRect.center() ); scaleDraw()->draw( &painter, palette() ); } drawKnob( &painter, knobRect ); drawMarker( &painter, knobRect, qwtNormalizeDegrees( transform( value() ) ) ); painter.setRenderHint( QPainter::Antialiasing, false ); if ( hasFocus() ) drawFocusIndicator( &painter ); } /*! \brief Draw the knob \param painter painter \param knobRect Bounding rectangle of the knob (without scale) */ void QwtKnob::drawKnob( QPainter *painter, const QRectF &knobRect ) const { double dim = qMin( knobRect.width(), knobRect.height() ); dim -= d_data->borderWidth * 0.5; QRectF aRect( 0, 0, dim, dim ); aRect.moveCenter( knobRect.center() ); QPen pen( Qt::NoPen ); if ( d_data->borderWidth > 0 ) { QColor c1 = palette().color( QPalette::Light ); QColor c2 = palette().color( QPalette::Dark ); QLinearGradient gradient( aRect.topLeft(), aRect.bottomRight() ); gradient.setColorAt( 0.0, c1 ); gradient.setColorAt( 0.3, c1 ); gradient.setColorAt( 0.7, c2 ); gradient.setColorAt( 1.0, c2 ); pen = QPen( gradient, d_data->borderWidth ); } QBrush brush; switch( d_data->knobStyle ) { case QwtKnob::Raised: { double off = 0.3 * knobRect.width(); QRadialGradient gradient( knobRect.center(), knobRect.width(), knobRect.topLeft() + QPointF( off, off ) ); gradient.setColorAt( 0.0, palette().color( QPalette::Midlight ) ); gradient.setColorAt( 1.0, palette().color( QPalette::Button ) ); brush = QBrush( gradient ); break; } case QwtKnob::Styled: { QRadialGradient gradient(knobRect.center().x() - knobRect.width() / 3, knobRect.center().y() - knobRect.height() / 2, knobRect.width() * 1.3, knobRect.center().x(), knobRect.center().y() - knobRect.height() / 2); const QColor c = palette().color( QPalette::Button ); gradient.setColorAt(0, c.lighter(110)); gradient.setColorAt(qreal(0.5), c); gradient.setColorAt(qreal(0.501), c.darker(102)); gradient.setColorAt(1, c.darker(115)); brush = QBrush( gradient ); break; } case QwtKnob::Sunken: { QLinearGradient gradient( knobRect.topLeft(), knobRect.bottomRight() ); gradient.setColorAt( 0.0, palette().color( QPalette::Mid ) ); gradient.setColorAt( 0.5, palette().color( QPalette::Button ) ); gradient.setColorAt( 1.0, palette().color( QPalette::Midlight ) ); brush = QBrush( gradient ); break; } case QwtKnob::Flat: default: brush = palette().brush( QPalette::Button ); } painter->setPen( pen ); painter->setBrush( brush ); painter->drawEllipse( aRect ); } /*! \brief Draw the marker at the knob's front \param painter Painter \param rect Bounding rectangle of the knob without scale \param angle Angle of the marker in degrees ( clockwise, 0 at the 12 o'clock position ) */ void QwtKnob::drawMarker( QPainter *painter, const QRectF &rect, double angle ) const { if ( d_data->markerStyle == NoMarker || !isValid() ) return; const double radians = qwtRadians( angle ); const double sinA = -qFastSin( radians ); const double cosA = qFastCos( radians ); const double xm = rect.center().x(); const double ym = rect.center().y(); const double margin = 4.0; double radius = 0.5 * ( rect.width() - d_data->borderWidth ) - margin; if ( radius < 1.0 ) radius = 1.0; int markerSize = d_data->markerSize; if ( markerSize <= 0 ) markerSize = qRound( 0.4 * radius ); switch ( d_data->markerStyle ) { case Notch: case Nub: { const double dotWidth = qMin( double( markerSize ), radius); const double dotCenterDist = radius - 0.5 * dotWidth; if ( dotCenterDist > 0.0 ) { const QPointF center( xm - sinA * dotCenterDist, ym - cosA * dotCenterDist ); QRectF ellipse( 0.0, 0.0, dotWidth, dotWidth ); ellipse.moveCenter( center ); QColor c1 = palette().color( QPalette::Light ); QColor c2 = palette().color( QPalette::Mid ); if ( d_data->markerStyle == Notch ) qSwap( c1, c2 ); QLinearGradient gradient( ellipse.topLeft(), ellipse.bottomRight() ); gradient.setColorAt( 0.0, c1 ); gradient.setColorAt( 1.0, c2 ); painter->setPen( Qt::NoPen ); painter->setBrush( gradient ); painter->drawEllipse( ellipse ); } break; } case Dot: { const double dotWidth = qMin( double( markerSize ), radius); const double dotCenterDist = radius - 0.5 * dotWidth; if ( dotCenterDist > 0.0 ) { const QPointF center( xm - sinA * dotCenterDist, ym - cosA * dotCenterDist ); QRectF ellipse( 0.0, 0.0, dotWidth, dotWidth ); ellipse.moveCenter( center ); painter->setPen( Qt::NoPen ); painter->setBrush( palette().color( QPalette::ButtonText ) ); painter->drawEllipse( ellipse ); } break; } case Tick: { const double rb = qMax( radius - markerSize, 1.0 ); const double re = radius; const QLineF line( xm - sinA * rb, ym - cosA * rb, xm - sinA * re, ym - cosA * re ); QPen pen( palette().color( QPalette::ButtonText ), 0 ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); painter->drawLine ( line ); break; } case Triangle: { const double rb = qMax( radius - markerSize, 1.0 ); const double re = radius; painter->translate( rect.center() ); painter->rotate( angle - 90.0 ); QPolygonF polygon; polygon += QPointF( re, 0.0 ); polygon += QPointF( rb, 0.5 * ( re - rb ) ); polygon += QPointF( rb, -0.5 * ( re - rb ) ); painter->setPen( Qt::NoPen ); painter->setBrush( palette().color( QPalette::ButtonText ) ); painter->drawPolygon( polygon ); painter->resetTransform(); break; } default: break; } } /*! Draw the focus indicator \param painter Painter */ void QwtKnob::drawFocusIndicator( QPainter *painter ) const { const QRect cr = contentsRect(); int w = d_data->knobWidth; if ( w <= 0 ) { w = qMin( cr.width(), cr.height() ); } else { const int extent = qCeil( scaleDraw()->extent( font() ) ); w += 2 * ( extent + d_data->scaleDist ); } QRect focusRect( 0, 0, w, w ); focusRect.moveCenter( cr.center() ); QwtPainter::drawFocusRect( painter, this, focusRect ); } /*! \brief Set the alignment of the knob Similar to a QLabel::alignment() the flags decide how to align the knob inside of contentsRect(). The default setting is Qt::AlignCenter \param alignment Or'd alignment flags \sa alignment(), setKnobWidth(), knobRect() */ void QwtKnob::setAlignment( Qt::Alignment alignment ) { if ( d_data->alignment != alignment ) { d_data->alignment = alignment; update(); } } /*! \return Alignment of the knob inside of contentsRect() \sa setAlignment(), knobWidth(), knobRect() */ Qt::Alignment QwtKnob::alignment() const { return d_data->alignment; } /*! \brief Change the knob's width. Setting a fixed value for the diameter of the knob is helpful for aligning several knobs in a row. \param width New width \sa knobWidth(), setAlignment() \note Modifies the sizePolicy() */ void QwtKnob::setKnobWidth( int width ) { width = qMax( width, 0 ); if ( width != d_data->knobWidth ) { QSizePolicy::Policy policy; if ( width > 0 ) policy = QSizePolicy::Minimum; else policy = QSizePolicy::MinimumExpanding; setSizePolicy( policy, policy ); d_data->knobWidth = width; updateGeometry(); update(); } } //! Return the width of the knob int QwtKnob::knobWidth() const { return d_data->knobWidth; } /*! \brief Set the knob's border width \param borderWidth new border width */ void QwtKnob::setBorderWidth( int borderWidth ) { d_data->borderWidth = qMax( borderWidth, 0 ); updateGeometry(); update(); } //! Return the border width int QwtKnob::borderWidth() const { return d_data->borderWidth; } /*! \brief Set the size of the marker When setting a size <= 0 the marker will automatically scaled to 40% of the radius of the knob. \sa markerSize(), markerStyle() */ void QwtKnob::setMarkerSize( int size ) { if ( d_data->markerSize != size ) { d_data->markerSize = size; update(); } } /*! \return Marker size \sa setMarkerSize() */ int QwtKnob::markerSize() const { return d_data->markerSize; } /*! \return sizeHint() */ QSize QwtKnob::sizeHint() const { const QSize hint = qwtKnobSizeHint( this, 50 ); return hint.expandedTo( QApplication::globalStrut() ); } /*! \return Minimum size hint \sa sizeHint() */ QSize QwtKnob::minimumSizeHint() const { return qwtKnobSizeHint( this, 20 ); } linssid-2.7/qwt-lib/src/qwt_column_symbol.cpp000644 001750 001750 00000015276 12151666703 022336 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_column_symbol.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include static void qwtDrawBox( QPainter *p, const QRectF &rect, const QPalette &pal, double lw ) { if ( lw > 0.0 ) { if ( rect.width() == 0.0 ) { p->setPen( pal.dark().color() ); p->drawLine( rect.topLeft(), rect.bottomLeft() ); return; } if ( rect.height() == 0.0 ) { p->setPen( pal.dark().color() ); p->drawLine( rect.topLeft(), rect.topRight() ); return; } lw = qMin( lw, rect.height() / 2.0 - 1.0 ); lw = qMin( lw, rect.width() / 2.0 - 1.0 ); const QRectF outerRect = rect.adjusted( 0, 0, 1, 1 ); QPolygonF polygon( outerRect ); if ( outerRect.width() > 2 * lw && outerRect.height() > 2 * lw ) { const QRectF innerRect = outerRect.adjusted( lw, lw, -lw, -lw ); polygon = polygon.subtracted( innerRect ); } p->setPen( Qt::NoPen ); p->setBrush( pal.dark() ); p->drawPolygon( polygon ); } const QRectF windowRect = rect.adjusted( lw, lw, -lw + 1, -lw + 1 ); if ( windowRect.isValid() ) p->fillRect( windowRect, pal.window() ); } static void qwtDrawPanel( QPainter *painter, const QRectF &rect, const QPalette &pal, double lw ) { if ( lw > 0.0 ) { if ( rect.width() == 0.0 ) { painter->setPen( pal.window().color() ); painter->drawLine( rect.topLeft(), rect.bottomLeft() ); return; } if ( rect.height() == 0.0 ) { painter->setPen( pal.window().color() ); painter->drawLine( rect.topLeft(), rect.topRight() ); return; } lw = qMin( lw, rect.height() / 2.0 - 1.0 ); lw = qMin( lw, rect.width() / 2.0 - 1.0 ); const QRectF outerRect = rect.adjusted( 0, 0, 1, 1 ); const QRectF innerRect = outerRect.adjusted( lw, lw, -lw, -lw ); QPolygonF lines[2]; lines[0] += outerRect.bottomLeft(); lines[0] += outerRect.topLeft(); lines[0] += outerRect.topRight(); lines[0] += innerRect.topRight(); lines[0] += innerRect.topLeft(); lines[0] += innerRect.bottomLeft(); lines[1] += outerRect.topRight(); lines[1] += outerRect.bottomRight(); lines[1] += outerRect.bottomLeft(); lines[1] += innerRect.bottomLeft(); lines[1] += innerRect.bottomRight(); lines[1] += innerRect.topRight(); painter->setPen( Qt::NoPen ); painter->setBrush( pal.light() ); painter->drawPolygon( lines[0] ); painter->setBrush( pal.dark() ); painter->drawPolygon( lines[1] ); } painter->fillRect( rect.adjusted( lw, lw, -lw + 1, -lw + 1 ), pal.window() ); } class QwtColumnSymbol::PrivateData { public: PrivateData(): style( QwtColumnSymbol::Box ), frameStyle( QwtColumnSymbol::Raised ), lineWidth( 2 ) { palette = QPalette( Qt::gray ); } QwtColumnSymbol::Style style; QwtColumnSymbol::FrameStyle frameStyle; QPalette palette; int lineWidth; }; /*! Constructor \param style Style of the symbol \sa setStyle(), style(), Style */ QwtColumnSymbol::QwtColumnSymbol( Style style ) { d_data = new PrivateData(); d_data->style = style; } //! Destructor QwtColumnSymbol::~QwtColumnSymbol() { delete d_data; } /*! Specify the symbol style \param style Style \sa style(), setPalette() */ void QwtColumnSymbol::setStyle( Style style ) { d_data->style = style; } /*! \return Current symbol style \sa setStyle() */ QwtColumnSymbol::Style QwtColumnSymbol::style() const { return d_data->style; } /*! Assign a palette for the symbol \param palette Palette \sa palette(), setStyle() */ void QwtColumnSymbol::setPalette( const QPalette &palette ) { d_data->palette = palette; } /*! \return Current palette \sa setPalette() */ const QPalette& QwtColumnSymbol::palette() const { return d_data->palette; } /*! Set the frame, that is used for the Box style. \param frameStyle Frame style \sa frameStyle(), setLineWidth(), setStyle() */ void QwtColumnSymbol::setFrameStyle( FrameStyle frameStyle ) { d_data->frameStyle = frameStyle; } /*! \return Current frame style, that is used for the Box style. \sa setFrameStyle(), lineWidth(), setStyle() */ QwtColumnSymbol::FrameStyle QwtColumnSymbol::frameStyle() const { return d_data->frameStyle; } /*! Set the line width of the frame, that is used for the Box style. \param width Width \sa lineWidth(), setFrameStyle() */ void QwtColumnSymbol::setLineWidth( int width ) { if ( width < 0 ) width = 0; d_data->lineWidth = width; } /*! \return Line width of the frame, that is used for the Box style. \sa setLineWidth(), frameStyle(), setStyle() */ int QwtColumnSymbol::lineWidth() const { return d_data->lineWidth; } /*! Draw the symbol depending on its style. \param painter Painter \param rect Directed rectangle \sa drawBox() */ void QwtColumnSymbol::draw( QPainter *painter, const QwtColumnRect &rect ) const { painter->save(); switch ( d_data->style ) { case QwtColumnSymbol::Box: { drawBox( painter, rect ); break; } default:; } painter->restore(); } /*! Draw the symbol when it is in Box style. \param painter Painter \param rect Directed rectangle \sa draw() */ void QwtColumnSymbol::drawBox( QPainter *painter, const QwtColumnRect &rect ) const { QRectF r = rect.toRect(); if ( QwtPainter::roundingAlignment( painter ) ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } switch ( d_data->frameStyle ) { case QwtColumnSymbol::Raised: { qwtDrawPanel( painter, r, d_data->palette, d_data->lineWidth ); break; } case QwtColumnSymbol::Plain: { qwtDrawBox( painter, r, d_data->palette, d_data->lineWidth ); break; } default: { painter->fillRect( r, d_data->palette.window() ); } } } linssid-2.7/qwt-lib/src/qwt_plot_panner.h000644 001750 001750 00000002740 12151666701 021430 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_PANNER_H #define QWT_PLOT_PANNER_H 1 #include "qwt_global.h" #include "qwt_panner.h" class QwtPlot; /*! \brief QwtPlotPanner provides panning of a plot canvas QwtPlotPanner is a panner for a plot canvas, that adjusts the scales of the axes after dropping the canvas on its new position. Together with QwtPlotZoomer and QwtPlotMagnifier powerful ways of navigating on a QwtPlot widget can be implemented easily. \note The axes are not updated, while dragging the canvas \sa QwtPlotZoomer, QwtPlotMagnifier */ class QWT_EXPORT QwtPlotPanner: public QwtPanner { Q_OBJECT public: explicit QwtPlotPanner( QWidget * ); virtual ~QwtPlotPanner(); QWidget *canvas(); const QWidget *canvas() const; QwtPlot *plot(); const QwtPlot *plot() const; void setAxisEnabled( int axis, bool on ); bool isAxisEnabled( int axis ) const; protected Q_SLOTS: virtual void moveCanvas( int dx, int dy ); protected: virtual QBitmap contentsMask() const; virtual QPixmap grab() const; private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_spectrogram.cpp000644 001750 001750 00000041275 12151666703 023036 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_spectrogram.h" #include "qwt_painter.h" #include "qwt_interval.h" #include "qwt_scale_map.h" #include "qwt_color_map.h" #include #include #include #include #include #if QT_VERSION >= 0x040400 #include #include #include #endif class QwtPlotSpectrogram::PrivateData { public: PrivateData(): data( NULL ) { colorMap = new QwtLinearColorMap(); displayMode = ImageMode; conrecFlags = QwtRasterData::IgnoreAllVerticesOnLevel; #if 0 conrecFlags |= QwtRasterData::IgnoreOutOfRange; #endif } ~PrivateData() { delete data; delete colorMap; } QwtRasterData *data; QwtColorMap *colorMap; DisplayModes displayMode; QList contourLevels; QPen defaultContourPen; QwtRasterData::ConrecFlags conrecFlags; }; /*! Sets the following item attributes: - QwtPlotItem::AutoScale: true - QwtPlotItem::Legend: false The z value is initialized by 8.0. \param title Title \sa QwtPlotItem::setItemAttribute(), QwtPlotItem::setZ() */ QwtPlotSpectrogram::QwtPlotSpectrogram( const QString &title ): QwtPlotRasterItem( title ) { d_data = new PrivateData(); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 8.0 ); } //! Destructor QwtPlotSpectrogram::~QwtPlotSpectrogram() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotSpectrogram int QwtPlotSpectrogram::rtti() const { return QwtPlotItem::Rtti_PlotSpectrogram; } /*! The display mode controls how the raster data will be represented. \param mode Display mode \param on On/Off The default setting enables ImageMode. \sa DisplayMode, displayMode() */ void QwtPlotSpectrogram::setDisplayMode( DisplayMode mode, bool on ) { if ( on != bool( mode & d_data->displayMode ) ) { if ( on ) d_data->displayMode |= mode; else d_data->displayMode &= ~mode; } legendChanged(); itemChanged(); } /*! The display mode controls how the raster data will be represented. \param mode Display mode \return true if mode is enabled */ bool QwtPlotSpectrogram::testDisplayMode( DisplayMode mode ) const { return ( d_data->displayMode & mode ); } /*! Change the color map Often it is useful to display the mapping between intensities and colors as an additional plot axis, showing a color bar. \param colorMap Color Map \sa colorMap(), QwtScaleWidget::setColorBarEnabled(), QwtScaleWidget::setColorMap() */ void QwtPlotSpectrogram::setColorMap( QwtColorMap *colorMap ) { if ( d_data->colorMap != colorMap ) { delete d_data->colorMap; d_data->colorMap = colorMap; } invalidateCache(); legendChanged(); itemChanged(); } /*! \return Color Map used for mapping the intensity values to colors \sa setColorMap() */ const QwtColorMap *QwtPlotSpectrogram::colorMap() const { return d_data->colorMap; } /*! Build and assign the default pen for the contour lines In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotSpectrogram::setDefaultContourPen( const QColor &color, qreal width, Qt::PenStyle style ) { setDefaultContourPen( QPen( color, width, style ) ); } /*! \brief Set the default pen for the contour lines If the spectrogram has a valid default contour pen a contour line is painted using the default contour pen. Otherwise (pen.style() == Qt::NoPen) the pen is calculated for each contour level using contourPen(). \sa defaultContourPen(), contourPen() */ void QwtPlotSpectrogram::setDefaultContourPen( const QPen &pen ) { if ( pen != d_data->defaultContourPen ) { d_data->defaultContourPen = pen; legendChanged(); itemChanged(); } } /*! \return Default contour pen \sa setDefaultContourPen() */ QPen QwtPlotSpectrogram::defaultContourPen() const { return d_data->defaultContourPen; } /*! \brief Calculate the pen for a contour line The color of the pen is the color for level calculated by the color map \param level Contour level \return Pen for the contour line \note contourPen is only used if defaultContourPen().style() == Qt::NoPen \sa setDefaultContourPen(), setColorMap(), setContourLevels() */ QPen QwtPlotSpectrogram::contourPen( double level ) const { if ( d_data->data == NULL || d_data->colorMap == NULL ) return QPen(); const QwtInterval intensityRange = d_data->data->interval(Qt::ZAxis); const QColor c( d_data->colorMap->rgb( intensityRange, level ) ); return QPen( c ); } /*! Modify an attribute of the CONREC algorithm, used to calculate the contour lines. \param flag CONREC flag \param on On/Off \sa testConrecFlag(), renderContourLines(), QwtRasterData::contourLines() */ void QwtPlotSpectrogram::setConrecFlag( QwtRasterData::ConrecFlag flag, bool on ) { if ( bool( d_data->conrecFlags & flag ) == on ) return; if ( on ) d_data->conrecFlags |= flag; else d_data->conrecFlags &= ~flag; itemChanged(); } /*! Test an attribute of the CONREC algorithm, used to calculate the contour lines. \param flag CONREC flag \return true, is enabled The default setting enables QwtRasterData::IgnoreAllVerticesOnLevel \sa setConrecClag(), renderContourLines(), QwtRasterData::contourLines() */ bool QwtPlotSpectrogram::testConrecFlag( QwtRasterData::ConrecFlag flag ) const { return d_data->conrecFlags & flag; } /*! Set the levels of the contour lines \param levels Values of the contour levels \sa contourLevels(), renderContourLines(), QwtRasterData::contourLines() \note contourLevels returns the same levels but sorted. */ void QwtPlotSpectrogram::setContourLevels( const QList &levels ) { d_data->contourLevels = levels; qSort( d_data->contourLevels ); legendChanged(); itemChanged(); } /*! \return Levels of the contour lines. The levels are sorted in increasing order. \sa contourLevels(), renderContourLines(), QwtRasterData::contourLines() */ QList QwtPlotSpectrogram::contourLevels() const { return d_data->contourLevels; } /*! Set the data to be displayed \param data Spectrogram Data \sa data() */ void QwtPlotSpectrogram::setData( QwtRasterData *data ) { if ( data != d_data->data ) { delete d_data->data; d_data->data = data; invalidateCache(); itemChanged(); } } /*! \return Spectrogram data \sa setData() */ const QwtRasterData *QwtPlotSpectrogram::data() const { return d_data->data; } /*! \return Spectrogram data \sa setData() */ QwtRasterData *QwtPlotSpectrogram::data() { return d_data->data; } /*! \return Bounding interval for an axis The default implementation returns the interval of the associated raster data object. \param axis X, Y, or Z axis \sa QwtRasterData::interval() */ QwtInterval QwtPlotSpectrogram::interval(Qt::Axis axis) const { if ( d_data->data == NULL ) return QwtInterval(); return d_data->data->interval( axis ); } /*! \brief Pixel hint The geometry of a pixel is used to calculated the resolution and alignment of the rendered image. The default implementation returns data()->pixelHint( rect ); \param area In most implementations the resolution of the data doesn't depend on the requested area. \return Bounding rectangle of a pixel \sa QwtPlotRasterItem::pixelHint(), QwtRasterData::pixelHint(), render(), renderImage() */ QRectF QwtPlotSpectrogram::pixelHint( const QRectF &area ) const { if ( d_data->data == NULL ) return QRectF(); return d_data->data->pixelHint( area ); } /*! \brief Render an image from data and color map. For each pixel of area the value is mapped into a color. \param xMap X-Scale Map \param yMap Y-Scale Map \param area Requested area for the image in scale coordinates \param imageSize Size of the requested image \return A QImage::Format_Indexed8 or QImage::Format_ARGB32 depending on the color map. \sa QwtRasterData::value(), QwtColorMap::rgb(), QwtColorMap::colorIndex() */ QImage QwtPlotSpectrogram::renderImage( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &area, const QSize &imageSize ) const { if ( imageSize.isEmpty() || d_data->data == NULL || d_data->colorMap == NULL ) { return QImage(); } const QwtInterval intensityRange = d_data->data->interval( Qt::ZAxis ); if ( !intensityRange.isValid() ) return QImage(); QImage::Format format = ( d_data->colorMap->format() == QwtColorMap::RGB ) ? QImage::Format_ARGB32 : QImage::Format_Indexed8; QImage image( imageSize, format ); if ( d_data->colorMap->format() == QwtColorMap::Indexed ) image.setColorTable( d_data->colorMap->colorTable( intensityRange ) ); d_data->data->initRaster( area, image.size() ); #if QT_VERSION >= 0x040400 && !defined(QT_NO_QFUTURE) uint numThreads = renderThreadCount(); if ( numThreads <= 0 ) numThreads = QThread::idealThreadCount(); if ( numThreads <= 0 ) numThreads = 1; const int numRows = imageSize.height() / numThreads; QList< QFuture > futures; for ( uint i = 0; i < numThreads; i++ ) { QRect tile( 0, i * numRows, image.width(), numRows ); if ( i == numThreads - 1 ) { tile.setHeight( image.height() - i * numRows ); renderTile( xMap, yMap, tile, &image ); } else { futures += QtConcurrent::run( this, &QwtPlotSpectrogram::renderTile, xMap, yMap, tile, &image ); } } for ( int i = 0; i < futures.size(); i++ ) futures[i].waitForFinished(); #else // QT_VERSION < 0x040400 const QRect tile( 0, 0, image.width(), image.height() ); renderTile( xMap, yMap, tile, &image ); #endif d_data->data->discardRaster(); return image; } /*! \brief Render a tile of an image. Rendering in tiles can be used to composite an image in parallel threads. \param xMap X-Scale Map \param yMap Y-Scale Map \param tile Geometry of the tile in image coordinates \param image Image to be rendered */ void QwtPlotSpectrogram::renderTile( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRect &tile, QImage *image ) const { const QwtInterval range = d_data->data->interval( Qt::ZAxis ); if ( !range.isValid() ) return; if ( d_data->colorMap->format() == QwtColorMap::RGB ) { for ( int y = tile.top(); y <= tile.bottom(); y++ ) { const double ty = yMap.invTransform( y ); QRgb *line = reinterpret_cast( image->scanLine( y ) ); line += tile.left(); for ( int x = tile.left(); x <= tile.right(); x++ ) { const double tx = xMap.invTransform( x ); *line++ = d_data->colorMap->rgb( range, d_data->data->value( tx, ty ) ); } } } else if ( d_data->colorMap->format() == QwtColorMap::Indexed ) { for ( int y = tile.top(); y <= tile.bottom(); y++ ) { const double ty = yMap.invTransform( y ); unsigned char *line = image->scanLine( y ); line += tile.left(); for ( int x = tile.left(); x <= tile.right(); x++ ) { const double tx = xMap.invTransform( x ); *line++ = d_data->colorMap->colorIndex( range, d_data->data->value( tx, ty ) ); } } } } /*! \brief Return the raster to be used by the CONREC contour algorithm. A larger size will improve the precision of the CONREC algorithm, but will slow down the time that is needed to calculate the lines. The default implementation returns rect.size() / 2 bounded to the resolution depending on pixelSize(). \param area Rectangle, where to calculate the contour lines \param rect Rectangle in pixel coordinates, where to paint the contour lines \return Raster to be used by the CONREC contour algorithm. \note The size will be bounded to rect.size(). \sa drawContourLines(), QwtRasterData::contourLines() */ QSize QwtPlotSpectrogram::contourRasterSize( const QRectF &area, const QRect &rect ) const { QSize raster = rect.size() / 2; const QRectF pixelRect = pixelHint( area ); if ( !pixelRect.isEmpty() ) { const QSize res( qCeil( rect.width() / pixelRect.width() ), qCeil( rect.height() / pixelRect.height() ) ); raster = raster.boundedTo( res ); } return raster; } /*! Calculate contour lines \param rect Rectangle, where to calculate the contour lines \param raster Raster, used by the CONREC algorithm \return Calculated contour lines \sa contourLevels(), setConrecFlag(), QwtRasterData::contourLines() */ QwtRasterData::ContourLines QwtPlotSpectrogram::renderContourLines( const QRectF &rect, const QSize &raster ) const { if ( d_data->data == NULL ) return QwtRasterData::ContourLines(); return d_data->data->contourLines( rect, raster, d_data->contourLevels, d_data->conrecFlags ); } /*! Paint the contour lines \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param contourLines Contour lines \sa renderContourLines(), defaultContourPen(), contourPen() */ void QwtPlotSpectrogram::drawContourLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtRasterData::ContourLines &contourLines ) const { if ( d_data->data == NULL ) return; const int numLevels = d_data->contourLevels.size(); for ( int l = 0; l < numLevels; l++ ) { const double level = d_data->contourLevels[l]; QPen pen = defaultContourPen(); if ( pen.style() == Qt::NoPen ) pen = contourPen( level ); if ( pen.style() == Qt::NoPen ) continue; painter->setPen( pen ); const QPolygonF &lines = contourLines[level]; for ( int i = 0; i < lines.size(); i += 2 ) { const QPointF p1( xMap.transform( lines[i].x() ), yMap.transform( lines[i].y() ) ); const QPointF p2( xMap.transform( lines[i+1].x() ), yMap.transform( lines[i+1].y() ) ); QwtPainter::drawLine( painter, p1, p2 ); } } } /*! \brief Draw the spectrogram \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas in painter coordinates \sa setDisplayMode(), renderImage(), QwtPlotRasterItem::draw(), drawContourLines() */ void QwtPlotSpectrogram::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { if ( d_data->displayMode & ImageMode ) QwtPlotRasterItem::draw( painter, xMap, yMap, canvasRect ); if ( d_data->displayMode & ContourMode ) { // Add some pixels at the borders const int margin = 2; QRectF rasterRect( canvasRect.x() - margin, canvasRect.y() - margin, canvasRect.width() + 2 * margin, canvasRect.height() + 2 * margin ); QRectF area = QwtScaleMap::invTransform( xMap, yMap, rasterRect ); const QRectF br = boundingRect(); if ( br.isValid() ) { area &= br; if ( area.isEmpty() ) return; rasterRect = QwtScaleMap::transform( xMap, yMap, area ); } QSize raster = contourRasterSize( area, rasterRect.toRect() ); raster = raster.boundedTo( rasterRect.toRect().size() ); if ( raster.isValid() ) { const QwtRasterData::ContourLines lines = renderContourLines( area, raster ); drawContourLines( painter, xMap, yMap, lines ); } } } linssid-2.7/qwt-lib/src/qwt_plot.cpp000644 001750 001750 00000073756 12151666703 020441 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_plot_dict.h" #include "qwt_plot_layout.h" #include "qwt_scale_widget.h" #include "qwt_scale_engine.h" #include "qwt_text_label.h" #include "qwt_legend.h" #include "qwt_legend_data.h" #include "qwt_plot_canvas.h" #include #include #include #include #include #include static inline void qwtEnableLegendItems( QwtPlot *plot, bool on ) { if ( on ) { QObject::connect( plot, SIGNAL( legendDataChanged( const QVariant &, const QList & ) ), plot, SLOT( updateLegendItems( const QVariant &, const QList & ) ) ); } else { QObject::disconnect( plot, SIGNAL( legendDataChanged( const QVariant &, const QList & ) ), plot, SLOT( updateLegendItems( const QVariant &, const QList & ) ) ); } } static void qwtSetTabOrder( QWidget *first, QWidget *second, bool withChildren ) { QList tabChain; tabChain += first; tabChain += second; if ( withChildren ) { QList children = second->findChildren(); QWidget *w = second->nextInFocusChain(); while ( children.contains( w ) ) { children.removeAll( w ); tabChain += w; w = w->nextInFocusChain(); } } for ( int i = 0; i < tabChain.size() - 1; i++ ) { QWidget *from = tabChain[i]; QWidget *to = tabChain[i+1]; const Qt::FocusPolicy policy1 = from->focusPolicy(); const Qt::FocusPolicy policy2 = to->focusPolicy(); QWidget *proxy1 = from->focusProxy(); QWidget *proxy2 = to->focusProxy(); from->setFocusPolicy( Qt::TabFocus ); from->setFocusProxy( NULL); to->setFocusPolicy( Qt::TabFocus ); to->setFocusProxy( NULL); QWidget::setTabOrder( from, to ); from->setFocusPolicy( policy1 ); from->setFocusProxy( proxy1); to->setFocusPolicy( policy2 ); to->setFocusProxy( proxy2 ); } } class QwtPlot::PrivateData { public: QPointer titleLabel; QPointer footerLabel; QPointer canvas; QPointer legend; QwtPlotLayout *layout; bool autoReplot; }; /*! \brief Constructor \param parent Parent widget */ QwtPlot::QwtPlot( QWidget *parent ): QFrame( parent ) { initPlot( QwtText() ); } /*! \brief Constructor \param title Title text \param parent Parent widget */ QwtPlot::QwtPlot( const QwtText &title, QWidget *parent ): QFrame( parent ) { initPlot( title ); } //! Destructor QwtPlot::~QwtPlot() { detachItems( QwtPlotItem::Rtti_PlotItem, autoDelete() ); delete d_data->layout; deleteAxesData(); delete d_data; } /*! \brief Initializes a QwtPlot instance \param title Title text */ void QwtPlot::initPlot( const QwtText &title ) { d_data = new PrivateData; d_data->layout = new QwtPlotLayout; d_data->autoReplot = false; // title d_data->titleLabel = new QwtTextLabel( this ); d_data->titleLabel->setObjectName( "QwtPlotTitle" ); d_data->titleLabel->setFont( QFont( fontInfo().family(), 14, QFont::Bold ) ); QwtText text( title ); text.setRenderFlags( Qt::AlignCenter | Qt::TextWordWrap ); d_data->titleLabel->setText( text ); // footer d_data->footerLabel = new QwtTextLabel( this ); d_data->footerLabel->setObjectName( "QwtPlotFooter" ); QwtText footer; footer.setRenderFlags( Qt::AlignCenter | Qt::TextWordWrap ); d_data->footerLabel->setText( footer ); // legend d_data->legend = NULL; // axis initAxesData(); // canvas d_data->canvas = new QwtPlotCanvas( this ); d_data->canvas->setObjectName( "QwtPlotCanvas" ); d_data->canvas->installEventFilter( this ); setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ); resize( 200, 200 ); QList focusChain; focusChain << this << d_data->titleLabel << axisWidget( xTop ) << axisWidget( yLeft ) << d_data->canvas << axisWidget( yRight ) << axisWidget( xBottom ) << d_data->footerLabel; for ( int i = 0; i < focusChain.size() - 1; i++ ) qwtSetTabOrder( focusChain[i], focusChain[i+1], false ); qwtEnableLegendItems( this, true ); } /*! \brief Set the drawing canvas of the plot widget QwtPlot invokes methods of the canvas as meta methods ( see QMetaObject ). In opposite to using conventional C++ techniques like virtual methods they allow to use canvas implementations that are derived from QWidget or QGLWidget. The following meta methods could be implemented: - replot() When the canvas doesn't offer a replot method, QwtPlot calls update() instead. - borderPath() The border path is necessary to clip the content of the canvas When the canvas doesn't have any special border ( f.e rounded corners ) it is o.k. not to implement this method. The default canvas is a QwtPlotCanvas \param canvas Canvas Widget \sa canvas() */ void QwtPlot::setCanvas( QWidget *canvas ) { if ( canvas == d_data->canvas ) return; delete d_data->canvas; d_data->canvas = canvas; if ( canvas ) { canvas->setParent( this ); canvas->installEventFilter( this ); if ( isVisible() ) canvas->show(); } } /*! \brief Adds handling of layout requests \param event Event \return See QFrame::event() */ bool QwtPlot::event( QEvent *event ) { bool ok = QFrame::event( event ); switch ( event->type() ) { case QEvent::LayoutRequest: updateLayout(); break; case QEvent::PolishRequest: replot(); break; default:; } return ok; } /*! \brief Event filter The plot handles the following events for the canvas: - QEvent::Resize The canvas margins might depend on its size - QEvent::ContentsRectChange The layout needs to be recalculated \param object Object to be filtered \param event Event \return See QFrame::eventFilter() \sa updateCanvasMargins(), updateLayout() */ bool QwtPlot::eventFilter( QObject *object, QEvent *event ) { if ( object == d_data->canvas ) { if ( event->type() == QEvent::Resize ) { updateCanvasMargins(); } else if ( event->type() == QEvent::ContentsRectChange ) { updateLayout(); } } return QFrame::eventFilter( object, event ); } //! Replots the plot if autoReplot() is \c true. void QwtPlot::autoRefresh() { if ( d_data->autoReplot ) replot(); } /*! \brief Set or reset the autoReplot option If the autoReplot option is set, the plot will be updated implicitly by manipulating member functions. Since this may be time-consuming, it is recommended to leave this option switched off and call replot() explicitly if necessary. The autoReplot option is set to false by default, which means that the user has to call replot() in order to make changes visible. \param tf \c true or \c false. Defaults to \c true. \sa replot() */ void QwtPlot::setAutoReplot( bool tf ) { d_data->autoReplot = tf; } /*! \return true if the autoReplot option is set. \sa setAutoReplot() */ bool QwtPlot::autoReplot() const { return d_data->autoReplot; } /*! Change the plot's title \param title New title */ void QwtPlot::setTitle( const QString &title ) { if ( title != d_data->titleLabel->text().text() ) { d_data->titleLabel->setText( title ); updateLayout(); } } /*! Change the plot's title \param title New title */ void QwtPlot::setTitle( const QwtText &title ) { if ( title != d_data->titleLabel->text() ) { d_data->titleLabel->setText( title ); updateLayout(); } } //! \return Title of the plot QwtText QwtPlot::title() const { return d_data->titleLabel->text(); } //! \return Title label widget. QwtTextLabel *QwtPlot::titleLabel() { return d_data->titleLabel; } //! \return Title label widget. const QwtTextLabel *QwtPlot::titleLabel() const { return d_data->titleLabel; } /*! Change the text the footer \param text New text of the footer */ void QwtPlot::setFooter( const QString &text ) { if ( text != d_data->footerLabel->text().text() ) { d_data->footerLabel->setText( text ); updateLayout(); } } /*! Change the text the footer \param text New text of the footer */ void QwtPlot::setFooter( const QwtText &text ) { if ( text != d_data->footerLabel->text() ) { d_data->footerLabel->setText( text ); updateLayout(); } } //! \return Text of the footer QwtText QwtPlot::footer() const { return d_data->footerLabel->text(); } //! \return Footer label widget. QwtTextLabel *QwtPlot::footerLabel() { return d_data->footerLabel; } //! \return Footer label widget. const QwtTextLabel *QwtPlot::footerLabel() const { return d_data->footerLabel; } /*! \brief Assign a new plot layout \param layout Layout() \sa plotLayout() */ void QwtPlot::setPlotLayout( QwtPlotLayout *layout ) { if ( layout != d_data->layout ) { delete d_data->layout; layout = d_data->layout; updateLayout(); } } //! \return the plot's layout QwtPlotLayout *QwtPlot::plotLayout() { return d_data->layout; } //! \return the plot's layout const QwtPlotLayout *QwtPlot::plotLayout() const { return d_data->layout; } /*! \return the plot's legend \sa insertLegend() */ QwtAbstractLegend *QwtPlot::legend() { return d_data->legend; } /*! \return the plot's legend \sa insertLegend() */ const QwtAbstractLegend *QwtPlot::legend() const { return d_data->legend; } /*! \return the plot's canvas */ QWidget *QwtPlot::canvas() { return d_data->canvas; } /*! \return the plot's canvas */ const QWidget *QwtPlot::canvas() const { return d_data->canvas; } /*! \return Size hint for the plot widget \sa minimumSizeHint() */ QSize QwtPlot::sizeHint() const { int dw = 0; int dh = 0; for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( axisEnabled( axisId ) ) { const int niceDist = 40; const QwtScaleWidget *scaleWidget = axisWidget( axisId ); const QwtScaleDiv &scaleDiv = scaleWidget->scaleDraw()->scaleDiv(); const int majCnt = scaleDiv.ticks( QwtScaleDiv::MajorTick ).count(); if ( axisId == yLeft || axisId == yRight ) { int hDiff = ( majCnt - 1 ) * niceDist - scaleWidget->minimumSizeHint().height(); if ( hDiff > dh ) dh = hDiff; } else { int wDiff = ( majCnt - 1 ) * niceDist - scaleWidget->minimumSizeHint().width(); if ( wDiff > dw ) dw = wDiff; } } } return minimumSizeHint() + QSize( dw, dh ); } /*! \brief Return a minimum size hint */ QSize QwtPlot::minimumSizeHint() const { QSize hint = d_data->layout->minimumSizeHint( this ); hint += QSize( 2 * frameWidth(), 2 * frameWidth() ); return hint; } /*! Resize and update internal layout \param e Resize event */ void QwtPlot::resizeEvent( QResizeEvent *e ) { QFrame::resizeEvent( e ); updateLayout(); } /*! \brief Redraw the plot If the autoReplot option is not set (which is the default) or if any curves are attached to raw data, the plot has to be refreshed explicitly in order to make changes visible. \sa updateAxes(), setAutoReplot() */ void QwtPlot::replot() { bool doAutoReplot = autoReplot(); setAutoReplot( false ); updateAxes(); /* Maybe the layout needs to be updated, because of changed axes labels. We need to process them here before painting to avoid that scales and canvas get out of sync. */ QApplication::sendPostedEvents( this, QEvent::LayoutRequest ); if ( d_data->canvas ) { const bool ok = QMetaObject::invokeMethod( d_data->canvas, "replot", Qt::DirectConnection ); if ( !ok ) { // fallback, when canvas has no a replot method d_data->canvas->update( d_data->canvas->contentsRect() ); } } setAutoReplot( doAutoReplot ); } /*! \brief Adjust plot content to its current size. \sa resizeEvent() */ void QwtPlot::updateLayout() { d_data->layout->activate( this, contentsRect() ); QRect titleRect = d_data->layout->titleRect().toRect(); QRect footerRect = d_data->layout->footerRect().toRect(); QRect scaleRect[QwtPlot::axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) scaleRect[axisId] = d_data->layout->scaleRect( axisId ).toRect(); QRect legendRect = d_data->layout->legendRect().toRect(); QRect canvasRect = d_data->layout->canvasRect().toRect(); // resize and show the visible widgets if ( !d_data->titleLabel->text().isEmpty() ) { d_data->titleLabel->setGeometry( titleRect ); if ( !d_data->titleLabel->isVisibleTo( this ) ) d_data->titleLabel->show(); } else d_data->titleLabel->hide(); if ( !d_data->footerLabel->text().isEmpty() ) { d_data->footerLabel->setGeometry( footerRect ); if ( !d_data->footerLabel->isVisibleTo( this ) ) d_data->footerLabel->show(); } else d_data->footerLabel->hide(); for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( axisEnabled( axisId ) ) { axisWidget( axisId )->setGeometry( scaleRect[axisId] ); #if 1 if ( axisId == xBottom || axisId == xTop ) { // do we need this code any longer ??? QRegion r( scaleRect[axisId] ); if ( axisEnabled( yLeft ) ) r = r.subtracted( QRegion( scaleRect[yLeft] ) ); if ( axisEnabled( yRight ) ) r = r.subtracted( QRegion( scaleRect[yRight] ) ); r.translate( -scaleRect[ axisId ].x(), -scaleRect[axisId].y() ); axisWidget( axisId )->setMask( r ); } #endif if ( !axisWidget( axisId )->isVisibleTo( this ) ) axisWidget( axisId )->show(); } else axisWidget( axisId )->hide(); } if ( d_data->legend ) { if ( d_data->legend->isEmpty() ) { d_data->legend->hide(); } else { d_data->legend->setGeometry( legendRect ); d_data->legend->show(); } } d_data->canvas->setGeometry( canvasRect ); } /*! \brief Calculate the canvas margins \param maps QwtPlot::axisCnt maps, mapping between plot and paint device coordinates \param canvasRect Bounding rectangle where to paint \param left Return parameter for the left margin \param top Return parameter for the top margin \param right Return parameter for the right margin \param bottom Return parameter for the bottom margin Plot items might indicate, that they need some extra space at the borders of the canvas by the QwtPlotItem::Margins flag. updateCanvasMargins(), QwtPlotItem::getCanvasMarginHint() */ void QwtPlot::getCanvasMarginsHint( const QwtScaleMap maps[], const QRectF &canvasRect, double &left, double &top, double &right, double &bottom) const { left = top = right = bottom = -1.0; const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { const QwtPlotItem *item = *it; if ( item->testItemAttribute( QwtPlotItem::Margins ) ) { double m[ QwtPlot::axisCnt ]; item->getCanvasMarginHint( maps[ item->xAxis() ], maps[ item->yAxis() ], canvasRect, m[yLeft], m[xTop], m[yRight], m[xBottom] ); left = qMax( left, m[yLeft] ); top = qMax( top, m[xTop] ); right = qMax( right, m[yRight] ); bottom = qMax( bottom, m[xBottom] ); } } } /*! \brief Update the canvas margins Plot items might indicate, that they need some extra space at the borders of the canvas by the QwtPlotItem::Margins flag. getCanvasMarginsHint(), QwtPlotItem::getCanvasMarginHint() */ void QwtPlot::updateCanvasMargins() { QwtScaleMap maps[axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) maps[axisId] = canvasMap( axisId ); double margins[axisCnt]; getCanvasMarginsHint( maps, canvas()->contentsRect(), margins[yLeft], margins[xTop], margins[yRight], margins[xBottom] ); bool doUpdate = false; for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( margins[axisId] >= 0.0 ) { const int m = qCeil( margins[axisId] ); plotLayout()->setCanvasMargin( m, axisId); doUpdate = true; } } if ( doUpdate ) updateLayout(); } /*! Redraw the canvas. \param painter Painter used for drawing \warning drawCanvas calls drawItems what is also used for printing. Applications that like to add individual plot items better overload drawItems() \sa drawItems() */ void QwtPlot::drawCanvas( QPainter *painter ) { QwtScaleMap maps[axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) maps[axisId] = canvasMap( axisId ); drawItems( painter, d_data->canvas->contentsRect(), maps ); } /*! Redraw the canvas items. \param painter Painter used for drawing \param canvasRect Bounding rectangle where to paint \param maps QwtPlot::axisCnt maps, mapping between plot and paint device coordinates \note Usually canvasRect is contentsRect() of the plot canvas. Due to a bug in Qt this rectangle might be wrong for certain frame styles ( f.e QFrame::Box ) and it might be necessary to fix the margins manually using QWidget::setContentsMargins() */ void QwtPlot::drawItems( QPainter *painter, const QRectF &canvasRect, const QwtScaleMap maps[axisCnt] ) const { const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; if ( item && item->isVisible() ) { painter->save(); painter->setRenderHint( QPainter::Antialiasing, item->testRenderHint( QwtPlotItem::RenderAntialiased ) ); painter->setRenderHint( QPainter::HighQualityAntialiasing, item->testRenderHint( QwtPlotItem::RenderAntialiased ) ); item->draw( painter, maps[item->xAxis()], maps[item->yAxis()], canvasRect ); painter->restore(); } } } /*! \param axisId Axis \return Map for the axis on the canvas. With this map pixel coordinates can translated to plot coordinates and vice versa. \sa QwtScaleMap, transform(), invTransform() */ QwtScaleMap QwtPlot::canvasMap( int axisId ) const { QwtScaleMap map; if ( !d_data->canvas ) return map; map.setTransformation( axisScaleEngine( axisId )->transformation() ); const QwtScaleDiv &sd = axisScaleDiv( axisId ); map.setScaleInterval( sd.lowerBound(), sd.upperBound() ); if ( axisEnabled( axisId ) ) { const QwtScaleWidget *s = axisWidget( axisId ); if ( axisId == yLeft || axisId == yRight ) { double y = s->y() + s->startBorderDist() - d_data->canvas->y(); double h = s->height() - s->startBorderDist() - s->endBorderDist(); map.setPaintInterval( y + h, y ); } else { double x = s->x() + s->startBorderDist() - d_data->canvas->x(); double w = s->width() - s->startBorderDist() - s->endBorderDist(); map.setPaintInterval( x, x + w ); } } else { int margin = 0; if ( !plotLayout()->alignCanvasToScale( axisId ) ) margin = plotLayout()->canvasMargin( axisId ); const QRect &canvasRect = d_data->canvas->contentsRect(); if ( axisId == yLeft || axisId == yRight ) { map.setPaintInterval( canvasRect.bottom() - margin, canvasRect.top() + margin ); } else { map.setPaintInterval( canvasRect.left() + margin, canvasRect.right() - margin ); } } return map; } /*! \brief Change the background of the plotting area Sets brush to QPalette::Window of all color groups of the palette of the canvas. Using canvas()->setPalette() is a more powerful way to set these colors. \param brush New background brush \sa canvasBackground() */ void QwtPlot::setCanvasBackground( const QBrush &brush ) { QPalette pal = d_data->canvas->palette(); pal.setBrush( QPalette::Window, brush ); canvas()->setPalette( pal ); } /*! Nothing else than: canvas()->palette().brush( QPalette::Normal, QPalette::Window); \return Background brush of the plotting area. \sa setCanvasBackground() */ QBrush QwtPlot::canvasBackground() const { return canvas()->palette().brush( QPalette::Normal, QPalette::Window ); } /*! \return \c true if the specified axis exists, otherwise \c false \param axisId axis index */ bool QwtPlot::axisValid( int axisId ) { return ( ( axisId >= QwtPlot::yLeft ) && ( axisId < QwtPlot::axisCnt ) ); } /*! \brief Insert a legend If the position legend is \c QwtPlot::LeftLegend or \c QwtPlot::RightLegend the legend will be organized in one column from top to down. Otherwise the legend items will be placed in a table with a best fit number of columns from left to right. insertLegend() will set the plot widget as parent for the legend. The legend will be deleted in the destructor of the plot or when another legend is inserted. Legends, that are not inserted into the layout of the plot widget need to connect to the legendDataChanged() signal. Calling updateLegend() initiates this signal for an initial update. When the application code wants to implement its own layout this also needs to be done for rendering plots to a document ( see QwtPlotRenderer ). \param legend Legend \param pos The legend's position. For top/left position the number of columns will be limited to 1, otherwise it will be set to unlimited. \param ratio Ratio between legend and the bounding rectangle of title, canvas and axes. The legend will be shrunk if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. \sa legend(), QwtPlotLayout::legendPosition(), QwtPlotLayout::setLegendPosition() */ void QwtPlot::insertLegend( QwtAbstractLegend *legend, QwtPlot::LegendPosition pos, double ratio ) { d_data->layout->setLegendPosition( pos, ratio ); if ( legend != d_data->legend ) { if ( d_data->legend && d_data->legend->parent() == this ) delete d_data->legend; d_data->legend = legend; if ( d_data->legend ) { connect( this, SIGNAL( legendDataChanged( const QVariant &, const QList & ) ), d_data->legend, SLOT( updateLegend( const QVariant &, const QList & ) ) ); if ( d_data->legend->parent() != this ) d_data->legend->setParent( this ); qwtEnableLegendItems( this, false ); updateLegend(); qwtEnableLegendItems( this, true ); QwtLegend *lgd = qobject_cast( legend ); if ( lgd ) { switch ( d_data->layout->legendPosition() ) { case LeftLegend: case RightLegend: { if ( lgd->maxColumns() == 0 ) lgd->setMaxColumns( 1 ); // 1 column: align vertical break; } case TopLegend: case BottomLegend: { lgd->setMaxColumns( 0 ); // unlimited break; } default: break; } } QWidget *previousInChain = NULL; switch ( d_data->layout->legendPosition() ) { case LeftLegend: { previousInChain = axisWidget( QwtPlot::xTop ); break; } case TopLegend: { previousInChain = this; break; } case RightLegend: { previousInChain = axisWidget( QwtPlot::yRight ); break; } case BottomLegend: { previousInChain = footerLabel(); break; } } if ( previousInChain ) qwtSetTabOrder( previousInChain, legend, true ); } } updateLayout(); } /*! Emit legendDataChanged() for all plot item \sa QwtPlotItem::legendData(), legendDataChanged() */ void QwtPlot::updateLegend() { const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { updateLegend( *it ); } } /*! Emit legendDataChanged() for a plot item \param plotItem Plot item \sa QwtPlotItem::legendData(), legendDataChanged() */ void QwtPlot::updateLegend( const QwtPlotItem *plotItem ) { if ( plotItem == NULL ) return; QList legendData; if ( plotItem->testItemAttribute( QwtPlotItem::Legend ) ) legendData = plotItem->legendData(); const QVariant itemInfo = itemToInfo( const_cast< QwtPlotItem *>( plotItem) ); Q_EMIT legendDataChanged( itemInfo, legendData ); } /*! \brief Update all plot items interested in legend attributes Call QwtPlotItem::updateLegend(), when the QwtPlotItem::LegendInterest flag is set. \param itemInfo Info about the plot item \param legendData Entries to be displayed for the plot item ( usually 1 ) \sa QwtPlotItem::LegendInterest, QwtPlotLegendItem, QwtPlotItem::updateLegend() */ void QwtPlot::updateLegendItems( const QVariant &itemInfo, const QList &legendData ) { QwtPlotItem *plotItem = infoToItem( itemInfo ); if ( plotItem ) { const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; if ( item->testItemInterest( QwtPlotItem::LegendInterest ) ) item->updateLegend( plotItem, legendData ); } } } /*! \brief Attach/Detach a plot item \param plotItem Plot item \param on When true attach the item, otherwise detach it */ void QwtPlot::attachItem( QwtPlotItem *plotItem, bool on ) { if ( plotItem->testItemInterest( QwtPlotItem::LegendInterest ) ) { // plotItem is some sort of legend const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; QList legendData; if ( on && item->testItemAttribute( QwtPlotItem::Legend ) ) { legendData = item->legendData(); plotItem->updateLegend( item, legendData ); } } } if ( on ) insertItem( plotItem ); else removeItem( plotItem ); Q_EMIT itemAttached( plotItem, on ); if ( plotItem->testItemAttribute( QwtPlotItem::Legend ) ) { // the item wants to be represented on the legend if ( on ) { updateLegend( plotItem ); } else { const QVariant itemInfo = itemToInfo( plotItem ); Q_EMIT legendDataChanged( itemInfo, QList() ); } } if ( autoReplot() ) update(); } /*! \brief Build an information, that can be used to identify a plot item on the legend. The default implementation simply wraps the plot item into a QVariant object. When overloading itemToInfo() usually infoToItem() needs to reimplemeted too. \code QVariant itemInfo; qVariantSetValue( itemInfo, plotItem ); \endcode \param plotItem Plot item \return Plot item embedded in a QVariant \sa infoToItem() */ QVariant QwtPlot::itemToInfo( QwtPlotItem *plotItem ) const { QVariant itemInfo; qVariantSetValue( itemInfo, plotItem ); return itemInfo; } /*! \brief Identify the plot item according to an item info object, that has bee generated from itemToInfo(). The default implementation simply tries to unwrap a QwtPlotItem pointer: \code if ( itemInfo.canConvert() ) return qvariant_cast( itemInfo ); \endcode \param itemInfo Plot item \return A plot item, when successful, otherwise a NULL pointer. \sa itemToInfo() */ QwtPlotItem *QwtPlot::infoToItem( const QVariant &itemInfo ) const { if ( itemInfo.canConvert() ) return qvariant_cast( itemInfo ); return NULL; } linssid-2.7/qwt-lib/src/qwt_point_data.h000644 001750 001750 00000006770 12151666702 021241 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_POINT_DATA_H #define QWT_POINT_DATA_H 1 #include "qwt_global.h" #include "qwt_series_data.h" /*! \brief Interface for iterating over two QVector objects. */ class QWT_EXPORT QwtPointArrayData: public QwtSeriesData { public: QwtPointArrayData( const QVector &x, const QVector &y ); QwtPointArrayData( const double *x, const double *y, size_t size ); virtual QRectF boundingRect() const; virtual size_t size() const; virtual QPointF sample( size_t i ) const; const QVector &xData() const; const QVector &yData() const; private: QVector d_x; QVector d_y; }; /*! \brief Data class containing two pointers to memory blocks of doubles. */ class QWT_EXPORT QwtCPointerData: public QwtSeriesData { public: QwtCPointerData( const double *x, const double *y, size_t size ); virtual QRectF boundingRect() const; virtual size_t size() const; virtual QPointF sample( size_t i ) const; const double *xData() const; const double *yData() const; private: const double *d_x; const double *d_y; size_t d_size; }; /*! \brief Synthetic point data QwtSyntheticPointData provides a fixed number of points for an interval. The points are calculated in equidistant steps in x-direction. If the interval is invalid, the points are calculated for the "rectangle of interest", what normally is the displayed area on the plot canvas. In this mode you get different levels of detail, when zooming in/out. \par Example The following example shows how to implement a sinus curve. \code #include #include #include #include #include class SinusData: public QwtSyntheticPointData { public: SinusData(): QwtSyntheticPointData( 100 ) { } virtual double y( double x ) const { return qSin( x ); } }; int main(int argc, char **argv) { QApplication a( argc, argv ); QwtPlot plot; plot.setAxisScale( QwtPlot::xBottom, 0.0, 10.0 ); plot.setAxisScale( QwtPlot::yLeft, -1.0, 1.0 ); QwtPlotCurve *curve = new QwtPlotCurve( "y = sin(x)" ); curve->setData( new SinusData() ); curve->attach( &plot ); plot.show(); return a.exec(); } \endcode */ class QWT_EXPORT QwtSyntheticPointData: public QwtSeriesData { public: QwtSyntheticPointData( size_t size, const QwtInterval & = QwtInterval() ); void setSize( size_t size ); virtual size_t size() const; void setInterval( const QwtInterval& ); QwtInterval interval() const; virtual QRectF boundingRect() const; virtual QPointF sample( size_t i ) const; /*! Calculate a y value for a x value \param x x value \return Corresponding y value */ virtual double y( double x ) const = 0; virtual double x( uint index ) const; virtual void setRectOfInterest( const QRectF & ); QRectF rectOfInterest() const; private: size_t d_size; QwtInterval d_interval; QRectF d_rectOfInterest; QwtInterval d_intervalOfInterest; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_intervalcurve.h000644 001750 001750 00000007640 12151666701 023042 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_INTERVAL_CURVE_H #define QWT_PLOT_INTERVAL_CURVE_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" class QwtIntervalSymbol; /*! \brief QwtPlotIntervalCurve represents a series of samples, where each value is associated with an interval ( \f$[y1,y2] = f(x)\f$ ). The representation depends on the style() and an optional symbol() that is displayed for each interval. QwtPlotIntervalCurve might be used to display error bars or the area between 2 curves. */ class QWT_EXPORT QwtPlotIntervalCurve: public QwtPlotSeriesItem, public QwtSeriesStore { public: /*! \brief Curve styles. The default setting is QwtPlotIntervalCurve::Tube. \sa setStyle(), style() */ enum CurveStyle { /*! Don't draw a curve. Note: This doesn't affect the symbols. */ NoCurve, /*! Build 2 curves from the upper and lower limits of the intervals and draw them with the pen(). The area between the curves is filled with the brush(). */ Tube, /*! Styles >= QwtPlotIntervalCurve::UserCurve are reserved for derived classes that overload drawSeries() with additional application specific curve types. */ UserCurve = 100 }; /*! Attributes to modify the drawing algorithm. \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { /*! Clip polygons before painting them. In situations, where points are far outside the visible area (f.e when zooming deep) this might be a substantial improvement for the painting performance. */ ClipPolygons = 0x01, //! Check if a symbol is on the plot canvas before painting it. ClipSymbol = 0x02 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotIntervalCurve( const QString &title = QString::null ); explicit QwtPlotIntervalCurve( const QwtText &title ); virtual ~QwtPlotIntervalCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; void setStyle( CurveStyle style ); CurveStyle style() const; void setSymbol( const QwtIntervalSymbol * ); const QwtIntervalSymbol *symbol() const; virtual void drawSeries( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: void init(); virtual void drawTube( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSymbols( QPainter *, const QwtIntervalSymbol &, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotIntervalCurve::PaintAttributes ) #endif linssid-2.7/qwt-lib/qwtfunctions.pri000644 001750 001750 00000003072 12151666703 020535 0ustar00warrenwarren000000 000000 ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ # Copied and modified from qt_functions.prf defineReplace(qwtLibraryTarget) { unset(LIBRARY_NAME) LIBRARY_NAME = $$1 mac:contains(QWT_CONFIG, QwtFramework) { QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME export(QMAKE_FRAMEWORK_BUNDLE_NAME) } contains(TEMPLATE, .*lib):CONFIG(debug, debug|release) { !debug_and_release|build_pass { mac:RET = $$member(LIBRARY_NAME, 0)_debug win32:RET = $$member(LIBRARY_NAME, 0)d } } isEmpty(RET):RET = $$LIBRARY_NAME return($$RET) } defineTest(qwtAddLibrary) { LIB_NAME = $$1 unset(LINKAGE) mac:contains(QWT_CONFIG, QwtFramework) { LINKAGE = -framework $${LIB_NAME}$${QT_LIBINFIX} } isEmpty(LINKAGE) { if(!debug_and_release|build_pass):CONFIG(debug, debug|release) { mac:LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}_debug win32:LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}d } } isEmpty(LINKAGE) { LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX} } !isEmpty(QMAKE_LSB) { QMAKE_LFLAGS *= --lsb-shared-libs=$${LIB_NAME}$${QT_LIBINFIX} } LIBS += $$LINKAGE export(LIBS) export(QMAKE_LFLAGS) return(true) } linssid-2.7/qwt-lib/src/qwt_analog_clock.h000644 001750 001750 00000004171 12151666702 021524 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ANALOG_CLOCK_H #define QWT_ANALOG_CLOCK_H #include "qwt_global.h" #include "qwt_dial.h" #include "qwt_dial_needle.h" #include /*! \brief An analog clock \image html analogclock.png \par Example \code #include QwtAnalogClock *clock = new QwtAnalogClock(...); clock->scaleDraw()->setPenWidth(3); clock->setLineWidth(6); clock->setFrameShadow(QwtDial::Sunken); clock->setTime(); // update the clock every second QTimer *timer = new QTimer(clock); timer->connect(timer, SIGNAL(timeout()), clock, SLOT(setCurrentTime())); timer->start(1000); \endcode \note The examples/dials example shows how to use QwtAnalogClock. */ class QWT_EXPORT QwtAnalogClock: public QwtDial { Q_OBJECT public: /*! Hand type \sa setHand(), hand() */ enum Hand { //! Needle displaying the seconds SecondHand, //! Needle displaying the minutes MinuteHand, //! Needle displaying the hours HourHand, //! Number of needles NHands }; explicit QwtAnalogClock( QWidget* parent = NULL ); virtual ~QwtAnalogClock(); void setHand( Hand, QwtDialNeedle * ); const QwtDialNeedle *hand( Hand ) const; QwtDialNeedle *hand( Hand ); public Q_SLOTS: void setCurrentTime(); void setTime( const QTime & ); protected: virtual void drawNeedle( QPainter *, const QPointF &, double radius, double direction, QPalette::ColorGroup ) const; virtual void drawHand( QPainter *, Hand, const QPointF &, double radius, double direction, QPalette::ColorGroup ) const; private: // use setHand instead void setNeedle( QwtDialNeedle * ); QwtDialNeedle *d_hand[NHands]; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_rasteritem.cpp000644 001750 001750 00000062026 12151666703 022664 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_rasteritem.h" #include "qwt_scale_map.h" #include "qwt_painter.h" #include #include #include #include #include #if QT_VERSION >= 0x040400 #include #include #include #endif #include class QwtPlotRasterItem::PrivateData { public: PrivateData(): alpha( -1 ), paintAttributes( QwtPlotRasterItem::PaintInDeviceResolution ) { cache.policy = QwtPlotRasterItem::NoCache; } int alpha; QwtPlotRasterItem::PaintAttributes paintAttributes; struct ImageCache { QwtPlotRasterItem::CachePolicy policy; QRectF area; QSizeF size; QImage image; } cache; }; static QRectF qwtAlignRect(const QRectF &rect) { QRectF r; r.setLeft( qRound( rect.left() ) ); r.setRight( qRound( rect.right() ) ); r.setTop( qRound( rect.top() ) ); r.setBottom( qRound( rect.bottom() ) ); return r; } static QRectF qwtStripRect(const QRectF &rect, const QRectF &area, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtInterval &xInterval, const QwtInterval &yInterval) { QRectF r = rect; if ( xInterval.borderFlags() & QwtInterval::ExcludeMinimum ) { if ( area.left() <= xInterval.minValue() ) { if ( xMap.isInverting() ) r.adjust(0, 0, -1, 0); else r.adjust(1, 0, 0, 0); } } if ( xInterval.borderFlags() & QwtInterval::ExcludeMaximum ) { if ( area.right() >= xInterval.maxValue() ) { if ( xMap.isInverting() ) r.adjust(1, 0, 0, 0); else r.adjust(0, 0, -1, 0); } } if ( yInterval.borderFlags() & QwtInterval::ExcludeMinimum ) { if ( area.top() <= yInterval.minValue() ) { if ( yMap.isInverting() ) r.adjust(0, 0, 0, -1); else r.adjust(0, 1, 0, 0); } } if ( yInterval.borderFlags() & QwtInterval::ExcludeMaximum ) { if ( area.bottom() >= yInterval.maxValue() ) { if ( yMap.isInverting() ) r.adjust(0, 1, 0, 0); else r.adjust(0, 0, 0, -1); } } return r; } static QImage qwtExpandImage(const QImage &image, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &area, const QRectF &area2, const QRectF &paintRect, const QwtInterval &xInterval, const QwtInterval &yInterval ) { const QRectF strippedRect = qwtStripRect(paintRect, area2, xMap, yMap, xInterval, yInterval); const QSize sz = strippedRect.toRect().size(); const int w = image.width(); const int h = image.height(); const QRectF r = QwtScaleMap::transform(xMap, yMap, area).normalized(); const double pw = ( r.width() - 1) / w; const double ph = ( r.height() - 1) / h; double px0, py0; if ( !xMap.isInverting() ) { px0 = xMap.transform( area2.left() ); px0 = qRound( px0 ); px0 = px0 - xMap.transform( area.left() ); } else { px0 = xMap.transform( area2.right() ); px0 = qRound( px0 ); px0 -= xMap.transform( area.right() ); px0 -= 1.0; } px0 += strippedRect.left() - paintRect.left(); if ( !yMap.isInverting() ) { py0 = yMap.transform( area2.top() ); py0 = qRound( py0 ); py0 -= yMap.transform( area.top() ); } else { py0 = yMap.transform( area2.bottom() ); py0 = qRound( py0 ); py0 -= yMap.transform( area.bottom() ); py0 -= 1.0; } py0 += strippedRect.top() - paintRect.top(); QImage expanded(sz, image.format()); switch( image.depth() ) { case 32: { for ( int y1 = 0; y1 < h; y1++ ) { int yy1; if ( y1 == 0 ) { yy1 = 0; } else { yy1 = qRound( y1 * ph - py0 ); if ( yy1 < 0 ) yy1 = 0; } int yy2; if ( y1 == h - 1 ) { yy2 = sz.height(); } else { yy2 = qRound( ( y1 + 1 ) * ph - py0 ); if ( yy2 > sz.height() ) yy2 = sz.height(); } const quint32 *line1 = reinterpret_cast( image.scanLine( y1 ) ); for ( int x1 = 0; x1 < w; x1++ ) { int xx1; if ( x1 == 0 ) { xx1 = 0; } else { xx1 = qRound( x1 * pw - px0 ); if ( xx1 < 0 ) xx1 = 0; } int xx2; if ( x1 == w - 1 ) { xx2 = sz.width(); } else { xx2 = qRound( ( x1 + 1 ) * pw - px0 ); if ( xx2 > sz.width() ) xx2 = sz.width(); } const quint32 rgb( line1[x1] ); for ( int y2 = yy1; y2 < yy2; y2++ ) { quint32 *line2 = reinterpret_cast( expanded.scanLine( y2 ) ); for ( int x2 = xx1; x2 < xx2; x2++ ) line2[x2] = rgb; } } } break; } case 8: { for ( int y1 = 0; y1 < h; y1++ ) { int yy1; if ( y1 == 0 ) { yy1 = 0; } else { yy1 = qRound( y1 * ph - py0 ); if ( yy1 < 0 ) yy1 = 0; } int yy2; if ( y1 == h - 1 ) { yy2 = sz.height(); } else { yy2 = qRound( ( y1 + 1 ) * ph - py0 ); if ( yy2 > sz.height() ) yy2 = sz.height(); } const uchar *line1 = image.scanLine( y1 ); for ( int x1 = 0; x1 < w; x1++ ) { int xx1; if ( x1 == 0 ) { xx1 = 0; } else { xx1 = qRound( x1 * pw - px0 ); if ( xx1 < 0 ) xx1 = 0; } int xx2; if ( x1 == w - 1 ) { xx2 = sz.width(); } else { xx2 = qRound( ( x1 + 1 ) * pw - px0 ); if ( xx2 > sz.width() ) xx2 = sz.width(); } for ( int y2 = yy1; y2 < yy2; y2++ ) { uchar *line2 = expanded.scanLine( y2 ); memset( line2 + xx1, line1[x1], xx2 - xx1 ); } } } break; } default: expanded = image; } return expanded; } static QRectF qwtExpandToPixels(const QRectF &rect, const QRectF &pixelRect) { const double pw = pixelRect.width(); const double ph = pixelRect.height(); const double dx1 = pixelRect.left() - rect.left(); const double dx2 = pixelRect.right() - rect.right(); const double dy1 = pixelRect.top() - rect.top(); const double dy2 = pixelRect.bottom() - rect.bottom(); QRectF r; r.setLeft( pixelRect.left() - qCeil( dx1 / pw ) * pw ); r.setTop( pixelRect.top() - qCeil( dy1 / ph ) * ph ); r.setRight( pixelRect.right() - qFloor( dx2 / pw ) * pw ); r.setBottom( pixelRect.bottom() - qFloor( dy2 / ph ) * ph ); return r; } static void qwtTransformMaps( const QTransform &tr, const QwtScaleMap &xMap, const QwtScaleMap &yMap, QwtScaleMap &xxMap, QwtScaleMap &yyMap ) { const QPointF p1 = tr.map( QPointF( xMap.p1(), yMap.p1() ) ); const QPointF p2 = tr.map( QPointF( xMap.p2(), yMap.p2() ) ); xxMap = xMap; xxMap.setPaintInterval( p1.x(), p2.x() ); yyMap = yMap; yyMap.setPaintInterval( p1.y(), p2.y() ); } static void qwtAdjustMaps( QwtScaleMap &xMap, QwtScaleMap &yMap, const QRectF &area, const QRectF &paintRect) { double sx1 = area.left(); double sx2 = area.right(); if ( xMap.isInverting() ) qSwap(sx1, sx2); double sy1 = area.top(); double sy2 = area.bottom(); if ( yMap.isInverting() ) qSwap(sy1, sy2); xMap.setPaintInterval(paintRect.left(), paintRect.right()); xMap.setScaleInterval(sx1, sx2); yMap.setPaintInterval(paintRect.top(), paintRect.bottom()); yMap.setScaleInterval(sy1, sy2); } static bool qwtUseCache( QwtPlotRasterItem::CachePolicy policy, const QPainter *painter ) { bool doCache = false; if ( policy == QwtPlotRasterItem::PaintCache ) { // Caching doesn't make sense, when the item is // not painted to screen switch ( painter->paintEngine()->type() ) { case QPaintEngine::SVG: case QPaintEngine::Pdf: case QPaintEngine::PostScript: case QPaintEngine::MacPrinter: case QPaintEngine::Picture: break; default:; doCache = true; } } return doCache; } static void qwtToRgba( const QImage* from, QImage* to, const QRect& tile, int alpha ) { const QRgb mask1 = qRgba( 0, 0, 0, alpha ); const QRgb mask2 = qRgba( 255, 255, 255, 0 ); const QRgb mask3 = qRgba( 0, 0, 0, 255 ); const int y0 = tile.top(); const int y1 = tile.bottom(); const int x0 = tile.left(); const int x1 = tile.right(); if ( from->depth() == 8 ) { for ( int y = y0; y <= y1; y++ ) { QRgb *alphaLine = reinterpret_cast( to->scanLine( y ) ); const unsigned char *line = from->scanLine( y ); for ( int x = x0; x <= x1; x++ ) *alphaLine++ = ( from->color( *line++ ) & mask2 ) | mask1; } } else if ( from->depth() == 32 ) { for ( int y = y0; y <= y1; y++ ) { QRgb *alphaLine = reinterpret_cast( to->scanLine( y ) ); const QRgb *line = reinterpret_cast( from->scanLine( y ) ); for ( int x = x0; x <= x1; x++ ) { const QRgb rgb = *line++; if ( rgb & mask3 ) // alpha != 0 *alphaLine++ = ( rgb & mask2 ) | mask1; else *alphaLine++ = rgb; } } } } //! Constructor QwtPlotRasterItem::QwtPlotRasterItem( const QString& title ): QwtPlotItem( QwtText( title ) ) { init(); } //! Constructor QwtPlotRasterItem::QwtPlotRasterItem( const QwtText& title ): QwtPlotItem( title ) { init(); } //! Destructor QwtPlotRasterItem::~QwtPlotRasterItem() { delete d_data; } void QwtPlotRasterItem::init() { d_data = new PrivateData(); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 8.0 ); } /*! Specify an attribute how to draw the raster item \param attribute Paint attribute \param on On/Off /sa PaintAttribute, testPaintAttribute() */ void QwtPlotRasterItem::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa PaintAttribute, setPaintAttribute() */ bool QwtPlotRasterItem::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! \brief Set an alpha value for the raster data Often a plot has several types of raster data organized in layers. ( f.e a geographical map, with weather statistics ). Using setAlpha() raster items can be stacked easily. The alpha value is a value [0, 255] to control the transparency of the image. 0 represents a fully transparent color, while 255 represents a fully opaque color. \param alpha Alpha value - alpha >= 0\n All alpha values of the pixels returned by renderImage() will be set to alpha, beside those with an alpha value of 0 (invalid pixels). - alpha < 0 The alpha values returned by renderImage() are not changed. The default alpha value is -1. \sa alpha() */ void QwtPlotRasterItem::setAlpha( int alpha ) { if ( alpha < 0 ) alpha = -1; if ( alpha > 255 ) alpha = 255; if ( alpha != d_data->alpha ) { d_data->alpha = alpha; itemChanged(); } } /*! \return Alpha value of the raster item \sa setAlpha() */ int QwtPlotRasterItem::alpha() const { return d_data->alpha; } /*! Change the cache policy The default policy is NoCache \param policy Cache policy \sa CachePolicy, cachePolicy() */ void QwtPlotRasterItem::setCachePolicy( QwtPlotRasterItem::CachePolicy policy ) { if ( d_data->cache.policy != policy ) { d_data->cache.policy = policy; invalidateCache(); itemChanged(); } } /*! \return Cache policy \sa CachePolicy, setCachePolicy() */ QwtPlotRasterItem::CachePolicy QwtPlotRasterItem::cachePolicy() const { return d_data->cache.policy; } /*! Invalidate the paint cache \sa setCachePolicy() */ void QwtPlotRasterItem::invalidateCache() { d_data->cache.image = QImage(); d_data->cache.area = QRect(); d_data->cache.size = QSize(); } /*! \brief Pixel hint The geometry of a pixel is used to calculated the resolution and alignment of the rendered image. Width and height of the hint need to be the horizontal and vertical distances between 2 neighbored points. The center of the hint has to be the position of any point ( it doesn't matter which one ). Limiting the resolution of the image might significantly improve the performance and heavily reduce the amount of memory when rendering a QImage from the raster data. The default implementation returns an empty rectangle (QRectF()), meaning, that the image will be rendered in target device ( f.e screen ) resolution. \param area In most implementations the resolution of the data doesn't depend on the requested area. \return Bounding rectangle of a pixel \sa render(), renderImage() */ QRectF QwtPlotRasterItem::pixelHint( const QRectF &area ) const { Q_UNUSED( area ); return QRectF(); } /*! \brief Draw the raster data \param painter Painter \param xMap X-Scale Map \param yMap Y-Scale Map \param canvasRect Contents rectangle of the plot canvas */ void QwtPlotRasterItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { if ( canvasRect.isEmpty() || d_data->alpha == 0 ) return; const bool doCache = qwtUseCache( d_data->cache.policy, painter ); const QwtInterval xInterval = interval( Qt::XAxis ); const QwtInterval yInterval = interval( Qt::YAxis ); /* Scaling an image always results in a loss of precision/quality. So we always render the image in paint device resolution. */ QwtScaleMap xxMap, yyMap; qwtTransformMaps( painter->transform(), xMap, yMap, xxMap, yyMap ); QRectF paintRect = painter->transform().mapRect( canvasRect ); QRectF area = QwtScaleMap::invTransform( xxMap, yyMap, paintRect ); const QRectF br = boundingRect(); if ( br.isValid() && !br.contains( area ) ) { area &= br; if ( !area.isValid() ) return; paintRect = QwtScaleMap::transform( xxMap, yyMap, area ); } QRectF imageRect; QImage image; QRectF pixelRect = pixelHint(area); if ( !pixelRect.isEmpty() ) { // pixel in target device resolution const double dx = qAbs( xxMap.invTransform( 1 ) - xxMap.invTransform( 0 ) ); const double dy = qAbs( yyMap.invTransform( 1 ) - yyMap.invTransform( 0 ) ); if ( dx > pixelRect.width() && dy > pixelRect.height() ) { /* When the resolution of the data pixels is higher than the resolution of the target device we render in target device resolution. */ pixelRect = QRectF(); } } if ( pixelRect.isEmpty() ) { if ( QwtPainter::roundingAlignment( painter ) ) { // we want to have maps, where the boundaries of // the aligned paint rectangle exactly match the area paintRect = qwtAlignRect(paintRect); qwtAdjustMaps(xxMap, yyMap, area, paintRect); } // When we have no information about position and size of // data pixels we render in resolution of the paint device. image = compose(xxMap, yyMap, area, paintRect, paintRect.size().toSize(), doCache); if ( image.isNull() ) return; // Remove pixels at the boundaries, when explicitly // excluded in the intervals imageRect = qwtStripRect(paintRect, area, xxMap, yyMap, xInterval, yInterval); if ( imageRect != paintRect ) { const QRect r( qRound( imageRect.x() - paintRect.x()), qRound( imageRect.y() - paintRect.y() ), qRound( imageRect.width() ), qRound( imageRect.height() ) ); image = image.copy(r); } } else { if ( QwtPainter::roundingAlignment( painter ) ) paintRect = qwtAlignRect(paintRect); // align the area to the data pixels QRectF imageArea = qwtExpandToPixels(area, pixelRect); if ( imageArea.right() == xInterval.maxValue() && !( xInterval.borderFlags() & QwtInterval::ExcludeMaximum ) ) { imageArea.adjust(0, 0, pixelRect.width(), 0); } if ( imageArea.bottom() == yInterval.maxValue() && !( yInterval.borderFlags() & QwtInterval::ExcludeMaximum ) ) { imageArea.adjust(0, 0, 0, pixelRect.height() ); } QSize imageSize; imageSize.setWidth( qRound( imageArea.width() / pixelRect.width() ) ); imageSize.setHeight( qRound( imageArea.height() / pixelRect.height() ) ); image = compose(xxMap, yyMap, imageArea, paintRect, imageSize, doCache ); if ( image.isNull() ) return; imageRect = qwtStripRect(paintRect, area, xxMap, yyMap, xInterval, yInterval); if ( ( image.width() > 1 || image.height() > 1 ) && testPaintAttribute( PaintInDeviceResolution ) ) { // Because of rounding errors the pixels // need to be expanded manually to rectangles of // different sizes image = qwtExpandImage(image, xxMap, yyMap, imageArea, area, paintRect, xInterval, yInterval ); } } painter->save(); painter->setWorldTransform( QTransform() ); QwtPainter::drawImage( painter, imageRect, image ); painter->restore(); } /*! \return Bounding interval for an axis This method is intended to be reimplemented by derived classes. The default implementation returns an invalid interval. \param axis X, Y, or Z axis */ QwtInterval QwtPlotRasterItem::interval(Qt::Axis axis) const { Q_UNUSED( axis ); return QwtInterval(); } /*! \return Bounding rectangle of the data \sa QwtPlotRasterItem::interval() */ QRectF QwtPlotRasterItem::boundingRect() const { const QwtInterval intervalX = interval( Qt::XAxis ); const QwtInterval intervalY = interval( Qt::YAxis ); if ( !intervalX.isValid() && !intervalY.isValid() ) return QRectF(); // no bounding rect QRectF r; if ( intervalX.isValid() ) { r.setLeft( intervalX.minValue() ); r.setRight( intervalX.maxValue() ); } else { r.setLeft(-0.5 * FLT_MAX); r.setWidth(FLT_MAX); } if ( intervalY.isValid() ) { r.setTop( intervalY.minValue() ); r.setBottom( intervalY.maxValue() ); } else { r.setTop(-0.5 * FLT_MAX); r.setHeight(FLT_MAX); } return r.normalized(); } QImage QwtPlotRasterItem::compose( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &imageArea, const QRectF &paintRect, const QSize &imageSize, bool doCache) const { QImage image; if ( imageArea.isEmpty() || paintRect.isEmpty() || imageSize.isEmpty() ) return image; if ( doCache ) { if ( !d_data->cache.image.isNull() && d_data->cache.area == imageArea && d_data->cache.size == paintRect.size() ) { image = d_data->cache.image; } } if ( image.isNull() ) { double dx = 0.0; if ( paintRect.toRect().width() > imageSize.width() ) dx = imageArea.width() / imageSize.width(); const QwtScaleMap xxMap = imageMap(Qt::Horizontal, xMap, imageArea, imageSize, dx); double dy = 0.0; if ( paintRect.toRect().height() > imageSize.height() ) dy = imageArea.height() / imageSize.height(); const QwtScaleMap yyMap = imageMap(Qt::Vertical, yMap, imageArea, imageSize, dy); image = renderImage( xxMap, yyMap, imageArea, imageSize ); if ( doCache ) { d_data->cache.area = imageArea; d_data->cache.size = paintRect.size(); d_data->cache.image = image; } } if ( d_data->alpha >= 0 && d_data->alpha < 255 ) { QImage alphaImage( image.size(), QImage::Format_ARGB32 ); #if QT_VERSION >= 0x040400 && !defined(QT_NO_QFUTURE) uint numThreads = renderThreadCount(); if ( numThreads <= 0 ) numThreads = QThread::idealThreadCount(); if ( numThreads <= 0 ) numThreads = 1; const int numRows = image.height() / numThreads; QList< QFuture > futures; for ( uint i = 0; i < numThreads; i++ ) { QRect tile( 0, i * numRows, image.width(), numRows ); if ( i == numThreads - 1 ) { tile.setHeight( image.height() - i * numRows ); qwtToRgba( &image, &alphaImage, tile, d_data->alpha ); } else { futures += QtConcurrent::run( &qwtToRgba, &image, &alphaImage, tile, d_data->alpha ); } } for ( int i = 0; i < futures.size(); i++ ) futures[i].waitForFinished(); #else const QRect tile( 0, 0, image.width(), image.height() ); qwtToRgba( &image, &alphaImage, tile, d_data->alpha ); #endif image = alphaImage; } return image; } /*! \brief Calculate a scale map for painting to an image \param orientation Orientation, Qt::Horizontal means a X axis \param map Scale map for rendering the plot item \param area Area to be painted on the image \param imageSize Image size \param pixelSize Width/Height of a data pixel \return Calculated scale map */ QwtScaleMap QwtPlotRasterItem::imageMap( Qt::Orientation orientation, const QwtScaleMap &map, const QRectF &area, const QSize &imageSize, double pixelSize) const { double p1, p2, s1, s2; if ( orientation == Qt::Horizontal ) { p1 = 0.0; p2 = imageSize.width(); s1 = area.left(); s2 = area.right(); } else { p1 = 0.0; p2 = imageSize.height(); s1 = area.top(); s2 = area.bottom(); } if ( pixelSize > 0.0 ) { double off = 0.5 * pixelSize; if ( map.isInverting() ) off = -off; s1 += off; s2 += off; } else { p2--; } if ( map.isInverting() && ( s1 < s2 ) ) qSwap( s1, s2 ); QwtScaleMap newMap = map; newMap.setPaintInterval( p1, p2 ); newMap.setScaleInterval( s1, s2 ); return newMap; } linssid-2.7/qwt-lib/src/qwt_painter_command.h000644 001750 001750 00000007340 12151666701 022250 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PAINTER_COMMAND_H #define QWT_PAINTER_COMMAND_H #include "qwt_global.h" #include #include #include #include class QPainterPath; /*! QwtPainterCommand represents the attributes of a paint operation how it is used between QPainter and QPaintDevice It is used by QwtGraphic to record and replay paint operations \sa QwtGraphic::commands() */ class QWT_EXPORT QwtPainterCommand { public: //! Type of the paint command enum Type { //! Invalid command Invalid = -1, //! Draw a QPainterPath Path, //! Draw a QPixmap Pixmap, //! Draw a QImage Image, //! QPainter state change State }; //! Attributes how to paint a QPixmap struct PixmapData { QRectF rect; QPixmap pixmap; QRectF subRect; }; //! Attributes how to paint a QImage struct ImageData { QRectF rect; QImage image; QRectF subRect; Qt::ImageConversionFlags flags; }; //! Attributes of a state change struct StateData { QPaintEngine::DirtyFlags flags; QPen pen; QBrush brush; QPointF brushOrigin; QBrush backgroundBrush; Qt::BGMode backgroundMode; QFont font; QMatrix matrix; QTransform transform; Qt::ClipOperation clipOperation; QRegion clipRegion; QPainterPath clipPath; bool isClipEnabled; QPainter::RenderHints renderHints; QPainter::CompositionMode compositionMode; qreal opacity; }; QwtPainterCommand(); QwtPainterCommand(const QwtPainterCommand &); QwtPainterCommand( const QPainterPath & ); QwtPainterCommand( const QRectF &rect, const QPixmap &, const QRectF& subRect ); QwtPainterCommand( const QRectF &rect, const QImage &, const QRectF& subRect, Qt::ImageConversionFlags ); QwtPainterCommand( const QPaintEngineState & ); ~QwtPainterCommand(); QwtPainterCommand &operator=(const QwtPainterCommand & ); Type type() const; QPainterPath *path(); const QPainterPath *path() const; PixmapData* pixmapData(); const PixmapData* pixmapData() const; ImageData* imageData(); const ImageData* imageData() const; StateData* stateData(); const StateData* stateData() const; private: void copy( const QwtPainterCommand & ); void reset(); Type d_type; union { QPainterPath *d_path; PixmapData *d_pixmapData; ImageData *d_imageData; StateData *d_stateData; }; }; //! \return Type of the command inline QwtPainterCommand::Type QwtPainterCommand::type() const { return d_type; } //! \return Painter path to be painted inline const QPainterPath *QwtPainterCommand::path() const { return d_path; } //! \return Attributes how to paint a QPixmap inline const QwtPainterCommand::PixmapData* QwtPainterCommand::pixmapData() const { return d_pixmapData; } //! \return Attributes how to paint a QImage inline const QwtPainterCommand::ImageData * QwtPainterCommand::imageData() const { return d_imageData; } //! \return Attributes of a state change inline const QwtPainterCommand::StateData * QwtPainterCommand::stateData() const { return d_stateData; } #endif linssid-2.7/qwt-lib/src/qwt_plot_rescaler.cpp000644 001750 001750 00000035761 12151666703 022313 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_rescaler.h" #include "qwt_plot.h" #include "qwt_scale_div.h" #include "qwt_interval.h" #include "qwt_plot_canvas.h" #include #include class QwtPlotRescaler::AxisData { public: AxisData(): aspectRatio( 1.0 ), expandingDirection( QwtPlotRescaler::ExpandUp ) { } double aspectRatio; QwtInterval intervalHint; QwtPlotRescaler::ExpandingDirection expandingDirection; mutable QwtScaleDiv scaleDiv; }; class QwtPlotRescaler::PrivateData { public: PrivateData(): referenceAxis( QwtPlot::xBottom ), rescalePolicy( QwtPlotRescaler::Expanding ), isEnabled( false ), inReplot( 0 ) { } int referenceAxis; RescalePolicy rescalePolicy; QwtPlotRescaler::AxisData axisData[QwtPlot::axisCnt]; bool isEnabled; mutable int inReplot; }; /*! Constructor \param canvas Canvas \param referenceAxis Reference axis, see RescalePolicy \param policy Rescale policy \sa setRescalePolicy(), setReferenceAxis() */ QwtPlotRescaler::QwtPlotRescaler( QWidget *canvas, int referenceAxis, RescalePolicy policy ): QObject( canvas ) { d_data = new PrivateData; d_data->referenceAxis = referenceAxis; d_data->rescalePolicy = policy; setEnabled( true ); } //! Destructor QwtPlotRescaler::~QwtPlotRescaler() { delete d_data; } /*! \brief En/disable the rescaler When enabled is true an event filter is installed for the canvas, otherwise the event filter is removed. \param on true or false \sa isEnabled(), eventFilter() */ void QwtPlotRescaler::setEnabled( bool on ) { if ( d_data->isEnabled != on ) { d_data->isEnabled = on; QWidget *w = canvas(); if ( w ) { if ( d_data->isEnabled ) w->installEventFilter( this ); else w->removeEventFilter( this ); } } } /*! \return true when enabled, false otherwise \sa setEnabled, eventFilter() */ bool QwtPlotRescaler::isEnabled() const { return d_data->isEnabled; } /*! Change the rescale policy \param policy Rescale policy \sa rescalePolicy() */ void QwtPlotRescaler::setRescalePolicy( RescalePolicy policy ) { d_data->rescalePolicy = policy; } /*! \return Rescale policy \sa setRescalePolicy() */ QwtPlotRescaler::RescalePolicy QwtPlotRescaler::rescalePolicy() const { return d_data->rescalePolicy; } /*! Set the reference axis ( see RescalePolicy ) \param axis Axis index ( QwtPlot::Axis ) \sa referenceAxis() */ void QwtPlotRescaler::setReferenceAxis( int axis ) { d_data->referenceAxis = axis; } /*! \return Reference axis ( see RescalePolicy ) \sa setReferenceAxis() */ int QwtPlotRescaler::referenceAxis() const { return d_data->referenceAxis; } /*! Set the direction in which all axis should be expanded \param direction Direction \sa expandingDirection() */ void QwtPlotRescaler::setExpandingDirection( ExpandingDirection direction ) { for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) setExpandingDirection( axis, direction ); } /*! Set the direction in which an axis should be expanded \param axis Axis index ( see QwtPlot::AxisId ) \param direction Direction \sa expandingDirection() */ void QwtPlotRescaler::setExpandingDirection( int axis, ExpandingDirection direction ) { if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->axisData[axis].expandingDirection = direction; } /*! \return Direction in which an axis should be expanded \param axis Axis index ( see QwtPlot::AxisId ) \sa setExpandingDirection() */ QwtPlotRescaler::ExpandingDirection QwtPlotRescaler::expandingDirection( int axis ) const { if ( axis >= 0 && axis < QwtPlot::axisCnt ) return d_data->axisData[axis].expandingDirection; return ExpandBoth; } /*! Set the aspect ratio between the scale of the reference axis and the other scales. The default ratio is 1.0 \param ratio Aspect ratio \sa aspectRatio() */ void QwtPlotRescaler::setAspectRatio( double ratio ) { for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) setAspectRatio( axis, ratio ); } /*! Set the aspect ratio between the scale of the reference axis and another scale. The default ratio is 1.0 \param axis Axis index ( see QwtPlot::AxisId ) \param ratio Aspect ratio \sa aspectRatio() */ void QwtPlotRescaler::setAspectRatio( int axis, double ratio ) { if ( ratio < 0.0 ) ratio = 0.0; if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->axisData[axis].aspectRatio = ratio; } /*! \return Aspect ratio between an axis and the reference axis. \param axis Axis index ( see QwtPlot::AxisId ) \sa setAspectRatio() */ double QwtPlotRescaler::aspectRatio( int axis ) const { if ( axis >= 0 && axis < QwtPlot::axisCnt ) return d_data->axisData[axis].aspectRatio; return 0.0; } /*! Set an interval hint for an axis In Fitting mode, the hint is used as minimal interval that always needs to be displayed. \param axis Axis, see QwtPlot::Axis \param interval Axis \sa intervalHint(), RescalePolicy */ void QwtPlotRescaler::setIntervalHint( int axis, const QwtInterval &interval ) { if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->axisData[axis].intervalHint = interval; } /*! \param axis Axis, see QwtPlot::Axis \return Interval hint \sa setIntervalHint(), RescalePolicy */ QwtInterval QwtPlotRescaler::intervalHint( int axis ) const { if ( axis >= 0 && axis < QwtPlot::axisCnt ) return d_data->axisData[axis].intervalHint; return QwtInterval(); } //! \return plot canvas QWidget *QwtPlotRescaler::canvas() { return qobject_cast( parent() ); } //! \return plot canvas const QWidget *QwtPlotRescaler::canvas() const { return qobject_cast( parent() ); } //! \return plot widget QwtPlot *QwtPlotRescaler::plot() { QWidget *w = canvas(); if ( w ) w = w->parentWidget(); return qobject_cast( w ); } //! \return plot widget const QwtPlot *QwtPlotRescaler::plot() const { const QWidget *w = canvas(); if ( w ) w = w->parentWidget(); return qobject_cast( w ); } //! Event filter for the plot canvas bool QwtPlotRescaler::eventFilter( QObject *object, QEvent *event ) { if ( object && object == canvas() ) { switch ( event->type() ) { case QEvent::Resize: { canvasResizeEvent( static_cast( event ) ); break; } case QEvent::PolishRequest: { rescale(); break; } default:; } } return false; } /*! Event handler for resize events of the plot canvas \param event Resize event \sa rescale() */ void QwtPlotRescaler::canvasResizeEvent( QResizeEvent* event ) { int left, top, right, bottom; canvas()->getContentsMargins( &left, &top, &right, &bottom ); const QSize marginSize( left + right, top + bottom ); const QSize newSize = event->size() - marginSize; const QSize oldSize = event->oldSize() - marginSize; rescale( oldSize, newSize ); } //! Adjust the plot axes scales void QwtPlotRescaler::rescale() const { const QSize size = canvas()->contentsRect().size(); rescale( size, size ); } /*! Adjust the plot axes scales \param oldSize Previous size of the canvas \param newSize New size of the canvas */ void QwtPlotRescaler::rescale( const QSize &oldSize, const QSize &newSize ) const { if ( newSize.isEmpty() ) return; QwtInterval intervals[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) intervals[axis] = interval( axis ); const int refAxis = referenceAxis(); intervals[refAxis] = expandScale( refAxis, oldSize, newSize ); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( aspectRatio( axis ) > 0.0 && axis != refAxis ) intervals[axis] = syncScale( axis, intervals[refAxis], newSize ); } updateScales( intervals ); } /*! Calculate the new scale interval of a plot axis \param axis Axis index ( see QwtPlot::AxisId ) \param oldSize Previous size of the canvas \param newSize New size of the canvas \return Calculated new interval for the axis */ QwtInterval QwtPlotRescaler::expandScale( int axis, const QSize &oldSize, const QSize &newSize ) const { const QwtInterval oldInterval = interval( axis ); QwtInterval expanded = oldInterval; switch ( rescalePolicy() ) { case Fixed: { break; // do nothing } case Expanding: { if ( !oldSize.isEmpty() ) { double width = oldInterval.width(); if ( orientation( axis ) == Qt::Horizontal ) width *= double( newSize.width() ) / oldSize.width(); else width *= double( newSize.height() ) / oldSize.height(); expanded = expandInterval( oldInterval, width, expandingDirection( axis ) ); } break; } case Fitting: { double dist = 0.0; for ( int ax = 0; ax < QwtPlot::axisCnt; ax++ ) { const double d = pixelDist( ax, newSize ); if ( d > dist ) dist = d; } if ( dist > 0.0 ) { double width; if ( orientation( axis ) == Qt::Horizontal ) width = newSize.width() * dist; else width = newSize.height() * dist; expanded = expandInterval( intervalHint( axis ), width, expandingDirection( axis ) ); } break; } } return expanded; } /*! Synchronize an axis scale according to the scale of the reference axis \param axis Axis index ( see QwtPlot::AxisId ) \param reference Interval of the reference axis \param size Size of the canvas \return New interval for axis */ QwtInterval QwtPlotRescaler::syncScale( int axis, const QwtInterval& reference, const QSize &size ) const { double dist; if ( orientation( referenceAxis() ) == Qt::Horizontal ) dist = reference.width() / size.width(); else dist = reference.width() / size.height(); if ( orientation( axis ) == Qt::Horizontal ) dist *= size.width(); else dist *= size.height(); dist /= aspectRatio( axis ); QwtInterval intv; if ( rescalePolicy() == Fitting ) intv = intervalHint( axis ); else intv = interval( axis ); intv = expandInterval( intv, dist, expandingDirection( axis ) ); return intv; } /*! \return Orientation of an axis \param axis Axis index ( see QwtPlot::AxisId ) */ Qt::Orientation QwtPlotRescaler::orientation( int axis ) const { if ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) return Qt::Vertical; return Qt::Horizontal; } /*! \param axis Axis index ( see QwtPlot::AxisId ) \return Normalized interval of an axis */ QwtInterval QwtPlotRescaler::interval( int axis ) const { if ( axis < 0 || axis >= QwtPlot::axisCnt ) return QwtInterval(); return plot()->axisScaleDiv( axis ).interval().normalized(); } /*! Expand the interval \param interval Interval to be expanded \param width Distance to be added to the interval \param direction Direction of the expand operation \return Expanded interval */ QwtInterval QwtPlotRescaler::expandInterval( const QwtInterval &interval, double width, ExpandingDirection direction ) const { QwtInterval expanded = interval; switch ( direction ) { case ExpandUp: expanded.setMinValue( interval.minValue() ); expanded.setMaxValue( interval.minValue() + width ); break; case ExpandDown: expanded.setMaxValue( interval.maxValue() ); expanded.setMinValue( interval.maxValue() - width ); break; case ExpandBoth: default: expanded.setMinValue( interval.minValue() + interval.width() / 2.0 - width / 2.0 ); expanded.setMaxValue( expanded.minValue() + width ); } return expanded; } double QwtPlotRescaler::pixelDist( int axis, const QSize &size ) const { const QwtInterval intv = intervalHint( axis ); double dist = 0.0; if ( !intv.isNull() ) { if ( axis == referenceAxis() ) dist = intv.width(); else { const double r = aspectRatio( axis ); if ( r > 0.0 ) dist = intv.width() * r; } } if ( dist > 0.0 ) { if ( orientation( axis ) == Qt::Horizontal ) dist /= size.width(); else dist /= size.height(); } return dist; } /*! Update the axes scales \param intervals Scale intervals */ void QwtPlotRescaler::updateScales( QwtInterval intervals[QwtPlot::axisCnt] ) const { if ( d_data->inReplot >= 5 ) { return; } QwtPlot *plt = const_cast( plot() ); const bool doReplot = plt->autoReplot(); plt->setAutoReplot( false ); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( axis == referenceAxis() || aspectRatio( axis ) > 0.0 ) { double v1 = intervals[axis].minValue(); double v2 = intervals[axis].maxValue(); if ( !plt->axisScaleDiv( axis ).isIncreasing() ) qSwap( v1, v2 ); if ( d_data->inReplot >= 1 ) d_data->axisData[axis].scaleDiv = plt->axisScaleDiv( axis ); if ( d_data->inReplot >= 2 ) { QList ticks[QwtScaleDiv::NTickTypes]; for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) ticks[i] = d_data->axisData[axis].scaleDiv.ticks( i ); plt->setAxisScaleDiv( axis, QwtScaleDiv( v1, v2, ticks ) ); } else { plt->setAxisScale( axis, v1, v2 ); } } } QwtPlotCanvas *canvas = qobject_cast( plt->canvas() ); bool immediatePaint = false; if ( canvas ) { immediatePaint = canvas->testPaintAttribute( QwtPlotCanvas::ImmediatePaint ); canvas->setPaintAttribute( QwtPlotCanvas::ImmediatePaint, false ); } plt->setAutoReplot( doReplot ); d_data->inReplot++; plt->replot(); d_data->inReplot--; if ( canvas && immediatePaint ) { canvas->setPaintAttribute( QwtPlotCanvas::ImmediatePaint, true ); } } linssid-2.7/qwt-lib/src/qwt_thermo.h000644 001750 001750 00000011137 12151666701 020405 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_THERMO_H #define QWT_THERMO_H #include "qwt_global.h" #include "qwt_abstract_scale.h" #include "qwt_interval.h" class QwtScaleDraw; class QwtColorMap; /*! \brief The Thermometer Widget QwtThermo is a widget which displays a value in an interval. It supports: - a horizontal or vertical layout; - a range; - a scale; - an alarm level. \image html sysinfo.png The fill colors might be calculated from an optional color map If no color map has been assigned QwtThermo uses the following colors/brushes from the widget palette: - QPalette::Base Background of the pipe - QPalette::ButtonText Fill brush below the alarm level - QPalette::Highlight Fill brush for the values above the alarm level - QPalette::WindowText For the axis of the scale - QPalette::Text For the labels of the scale */ class QWT_EXPORT QwtThermo: public QwtAbstractScale { Q_OBJECT Q_ENUMS( ScalePosition ) Q_ENUMS( OriginMode ) Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation ) Q_PROPERTY( ScalePosition scalePosition READ scalePosition WRITE setScalePosition ) Q_PROPERTY( OriginMode originMode READ originMode WRITE setOriginMode ) Q_PROPERTY( bool alarmEnabled READ alarmEnabled WRITE setAlarmEnabled ) Q_PROPERTY( double alarmLevel READ alarmLevel WRITE setAlarmLevel ) Q_PROPERTY( double origin READ origin WRITE setOrigin ) Q_PROPERTY( int spacing READ spacing WRITE setSpacing ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( int pipeWidth READ pipeWidth WRITE setPipeWidth ) Q_PROPERTY( double value READ value WRITE setValue ) public: /*! Position of the scale \sa setScalePosition(), setOrientation() */ enum ScalePosition { //! The slider has no scale NoScale, //! The scale is right of a vertical or below of a horizontal slider LeadingScale, //! The scale is left of a vertical or above of a horizontal slider TrailingScale }; /*! Origin mode. This property specifies where the beginning of the liquid is placed. \sa setOriginMode(), setOrigin() */ enum OriginMode { //! The origin is the minimum of the scale OriginMinimum, //! The origin is the maximum of the scale OriginMaximum, //! The origin is specified using the origin() property OriginCustom }; explicit QwtThermo( QWidget *parent = NULL ); virtual ~QwtThermo(); void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; void setScalePosition( ScalePosition ); ScalePosition scalePosition() const; void setSpacing( int ); int spacing() const; void setBorderWidth( int w ); int borderWidth() const; void setOriginMode( OriginMode ); OriginMode originMode() const; void setOrigin( double ); double origin() const; void setFillBrush( const QBrush &b ); QBrush fillBrush() const; void setAlarmBrush( const QBrush &b ); QBrush alarmBrush() const; void setAlarmLevel( double v ); double alarmLevel() const; void setAlarmEnabled( bool tf ); bool alarmEnabled() const; void setColorMap( QwtColorMap * ); QwtColorMap *colorMap(); const QwtColorMap *colorMap() const; void setPipeWidth( int w ); int pipeWidth() const; void setRangeFlags( QwtInterval::BorderFlags ); QwtInterval::BorderFlags rangeFlags() const; double value() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; public Q_SLOTS: virtual void setValue( double val ); protected: virtual void drawLiquid( QPainter *, const QRect & ) const; virtual void scaleChange(); virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); virtual void changeEvent( QEvent * ); QwtScaleDraw *scaleDraw(); QRect pipeRect() const; QRect fillRect( const QRect & ) const; QRect alarmRect( const QRect & ) const; private: void layoutThermo( bool ); class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_abstract_barchart.cpp000644 001750 001750 00000022032 12151666703 024147 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_abstract_barchart.h" #include "qwt_scale_map.h" static inline double qwtTransformWidth( const QwtScaleMap &map, double value, double width ) { const double w2 = 0.5 * width; const double v1 = map.transform( value - w2 ); const double v2 = map.transform( value + w2 ); return qAbs( v2 - v1 ); } class QwtPlotAbstractBarChart::PrivateData { public: PrivateData(): layoutPolicy( QwtPlotAbstractBarChart::AutoAdjustSamples ), layoutHint( 0.5 ), spacing( 10 ), margin( 5 ), baseline( 0.0 ) { } QwtPlotAbstractBarChart::LayoutPolicy layoutPolicy; double layoutHint; int spacing; int margin; double baseline; }; /*! Constructor \param title Title of the chart */ QwtPlotAbstractBarChart::QwtPlotAbstractBarChart( const QwtText &title ): QwtPlotSeriesItem( title ) { d_data = new PrivateData; setItemAttribute( QwtPlotItem::Legend, true ); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Margins, true ); setZ( 19.0 ); } //! Destructor QwtPlotAbstractBarChart::~QwtPlotAbstractBarChart() { delete d_data; } /*! The combination of layoutPolicy() and layoutHint() define how the width of the bars is calculated \param policy Layout policy \sa layoutPolicy(), layoutHint() */ void QwtPlotAbstractBarChart::setLayoutPolicy( LayoutPolicy policy ) { if ( policy != d_data->layoutPolicy ) { d_data->layoutPolicy = policy; itemChanged(); } } /*! The combination of layoutPolicy() and layoutHint() define how the width of the bars is calculated \return Layout policy of the chart item \sa setLayoutPolicy(), layoutHint() */ QwtPlotAbstractBarChart::LayoutPolicy QwtPlotAbstractBarChart::layoutPolicy() const { return d_data->layoutPolicy; } /*! The combination of layoutPolicy() and layoutHint() define how the width of the bars is calculated \param hint Layout hint \sa LayoutPolicy, layoutPolicy(), layoutHint() */ void QwtPlotAbstractBarChart::setLayoutHint( double hint ) { hint = qMax( 0.0, hint ); if ( hint != d_data->layoutHint ) { d_data->layoutHint = hint; itemChanged(); } } /*! The combination of layoutPolicy() and layoutHint() define how the width of the bars is calculated \return Layout policy of the chart item \sa LayoutPolicy, setLayoutHint(), layoutPolicy() */ double QwtPlotAbstractBarChart::layoutHint() const { return d_data->layoutHint; } /*! \brief Set the spacing The spacing is the distance between 2 samples ( bars for QwtPlotBarChart or a group of bars for QwtPlotMultiBarChart ) in paint device coordinates. \sa spacing() */ void QwtPlotAbstractBarChart::setSpacing( int spacing ) { spacing = qMax( spacing, 0 ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; itemChanged(); } } /*! \return Spacing between 2 samples ( bars or groups of bars ) \sa setSpacing(), margin() */ int QwtPlotAbstractBarChart::spacing() const { return d_data->spacing; } /*! \brief Set the margin The margin is the distance between the outmost bars and the contentsRect() of the canvas. The default setting is 5 pixels. \param margin Margin \sa spacing(), margin() */ void QwtPlotAbstractBarChart::setMargin( int margin ) { margin = qMax( margin, 0 ); if ( margin != d_data->margin ) { d_data->margin = margin; itemChanged(); } } /*! \return Margin between the outmost bars and the contentsRect() of the canvas. \sa setMargin(), spacing() */ int QwtPlotAbstractBarChart::margin() const { return d_data->margin; } /*! \brief Set the baseline The baseline is the origin for the chart. Each bar is painted from the baseline in the direction of the sample value. In case of a horizontal orientation() the baseline is interpreted as x - otherwise as y - value. The default value for the baseline is 0. \param value Value for the baseline \sa baseline(), QwtPlotSeriesItem::orientation() */ void QwtPlotAbstractBarChart::setBaseline( double value ) { if ( value != d_data->baseline ) { d_data->baseline = value; itemChanged(); } } /*! \return Value for the origin of the bar chart \sa setBaseline(), QwtPlotSeriesItem::orientation() */ double QwtPlotAbstractBarChart::baseline() const { return d_data->baseline; } /*! Calculate the width for a sample in paint device coordinates \param map Scale map for the corresponding scale \param canvasSize Size of the canvas in paint device coordinates \param boundingSize Bounding size of the chart in plot coordinates ( used in AutoAdjustSamples mode ) \param value Value of the sample \return Sample width \sa layoutPolicy(), layoutHint() */ double QwtPlotAbstractBarChart::sampleWidth( const QwtScaleMap &map, double canvasSize, double boundingSize, double value ) const { double width; switch( d_data->layoutPolicy ) { case ScaleSamplesToAxes: { width = qwtTransformWidth( map, value, d_data->layoutHint ); break; } case ScaleSampleToCanvas: { width = canvasSize * d_data->layoutHint; break; } case FixedSampleSize: { width = d_data->layoutHint; break; } case AutoAdjustSamples: default: { const size_t numSamples = dataSize(); double w = 1.0; if ( numSamples > 1 ) { w = qAbs( boundingSize / ( numSamples - 1 ) ); } width = qwtTransformWidth( map, value, w ); width -= d_data->spacing; } } return width; } /*! \brief Calculate a hint for the canvas margin Bar charts need to reserve some space for displaying the bars for the first and the last sample. The hint is calculated from the layoutHint() depending on the layoutPolicy(). The margins are in target device coordinates ( pixels on screen ) \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas in painter coordinates \param left Returns the left margin \param top Returns the top margin \param right Returns the right margin \param bottom Returns the bottom margin \return Margin \sa layoutPolicy(), layoutHint(), QwtPlotItem::Margins QwtPlot::getCanvasMarginsHint(), QwtPlot::updateCanvasMargins() */ void QwtPlotAbstractBarChart::getCanvasMarginHint( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, double &left, double &top, double &right, double &bottom ) const { double hint = -1.0; switch( layoutPolicy() ) { case ScaleSampleToCanvas: { if ( orientation() == Qt::Vertical ) hint = 0.5 * canvasRect.width() * d_data->layoutHint; else hint = 0.5 * canvasRect.height() * d_data->layoutHint; break; } case FixedSampleSize: { hint = 0.5 * d_data->layoutHint; break; } case AutoAdjustSamples: case ScaleSamplesToAxes: default: { const size_t numSamples = dataSize(); if ( numSamples <= 0 ) break; // doesn't work for nonlinear scales const QRectF br = dataRect(); double spacing = 0.0; double sampleWidthS = 1.0; if ( layoutPolicy() == ScaleSamplesToAxes ) { sampleWidthS = qMax( d_data->layoutHint, 0.0 ); } else { spacing = d_data->spacing; if ( numSamples > 1 ) { sampleWidthS = qAbs( br.width() / ( numSamples - 1 ) ); } } double ds, w; if ( orientation() == Qt::Vertical ) { ds = qAbs( xMap.sDist() ); w = canvasRect.width(); } else { ds = qAbs( yMap.sDist() ); w = canvasRect.height(); } const double sampleWidthP = ( w - spacing * ds ) * sampleWidthS / ( ds + sampleWidthS ); hint = 0.5 * sampleWidthP; hint += qMax( d_data->margin, 0 ); } } if ( orientation() == Qt::Vertical ) { left = right = hint; top = bottom = -1.0; // no hint } else { left = right = -1.0; // no hint top = bottom = hint; } } linssid-2.7/qwt-lib/src/qwt_wheel.h000644 001750 001750 00000011412 12151666701 020207 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_WHEEL_H #define QWT_WHEEL_H #include "qwt_global.h" #include /*! \brief The Wheel Widget The wheel widget can be used to change values over a very large range in very small steps. Using the setMass() member, it can be configured as a flying wheel. The default range of the wheel is [0.0, 100.0] \sa The radio example. */ class QWT_EXPORT QwtWheel: public QWidget { Q_OBJECT Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation ) Q_PROPERTY( double value READ value WRITE setValue ) Q_PROPERTY( double minimum READ minimum WRITE setMinimum ) Q_PROPERTY( double maximum READ maximum WRITE setMaximum ) Q_PROPERTY( double singleStep READ singleStep WRITE setSingleStep ) Q_PROPERTY( int pageStepCount READ pageStepCount WRITE setPageStepCount ) Q_PROPERTY( bool stepAlignment READ stepAlignment WRITE setStepAlignment ) Q_PROPERTY( bool tracking READ isTracking WRITE setTracking ) Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping ) Q_PROPERTY( bool inverted READ isInverted WRITE setInverted ) Q_PROPERTY( double mass READ mass WRITE setMass ) Q_PROPERTY( int updateInterval READ updateInterval WRITE setUpdateInterval ) Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle ) Q_PROPERTY( double viewAngle READ viewAngle WRITE setViewAngle ) Q_PROPERTY( int tickCount READ tickCount WRITE setTickCount ) Q_PROPERTY( int wheelWidth READ wheelWidth WRITE setWheelWidth ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( int wheelBorderWidth READ wheelBorderWidth WRITE setWheelBorderWidth ) public: explicit QwtWheel( QWidget *parent = NULL ); virtual ~QwtWheel(); double value() const; void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; double totalAngle() const; double viewAngle() const; void setTickCount( int ); int tickCount() const; void setWheelWidth( int ); int wheelWidth() const; void setWheelBorderWidth( int ); int wheelBorderWidth() const; void setBorderWidth( int ); int borderWidth() const; void setInverted( bool tf ); bool isInverted() const; void setWrapping( bool tf ); bool wrapping() const; void setSingleStep( double ); double singleStep() const; void setPageStepCount( int ); int pageStepCount() const; void setStepAlignment( bool on ); bool stepAlignment() const; void setRange( double vmin, double vmax ); void setMinimum( double min ); double minimum() const; void setMaximum( double max ); double maximum() const; void setUpdateInterval( int ); int updateInterval() const; void setTracking( bool enable ); bool isTracking() const; double mass() const; public Q_SLOTS: void setValue( double ); void setTotalAngle ( double ); void setViewAngle( double ); void setMass( double ); Q_SIGNALS: /*! \brief Notify a change of value. When tracking is enabled this signal will be emitted every time the value changes. \param value new value \sa setTracking() */ void valueChanged( double value ); /*! This signal is emitted when the user presses the the wheel with the mouse */ void wheelPressed(); /*! This signal is emitted when the user releases the mouse */ void wheelReleased(); /*! This signal is emitted when the user moves the wheel with the mouse. \param value new value */ void wheelMoved( double value ); protected: virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void mouseMoveEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void wheelEvent( QWheelEvent * ); virtual void timerEvent( QTimerEvent * ); void stopFlying(); QRect wheelRect() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void drawTicks( QPainter *, const QRectF & ); virtual void drawWheelBackground( QPainter *, const QRectF & ); virtual double valueAt( const QPoint & ) const; private: double alignedValue( double ) const; double boundedValue( double ) const; class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_legend_label.cpp000644 001750 001750 00000021642 12151666703 022043 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend_label.h" #include "qwt_legend_data.h" #include "qwt_math.h" #include "qwt_painter.h" #include "qwt_symbol.h" #include "qwt_graphic.h" #include #include #include #include #include #include #include static const int ButtonFrame = 2; static const int Margin = 2; static QSize buttonShift( const QwtLegendLabel *w ) { QStyleOption option; option.init( w ); const int ph = w->style()->pixelMetric( QStyle::PM_ButtonShiftHorizontal, &option, w ); const int pv = w->style()->pixelMetric( QStyle::PM_ButtonShiftVertical, &option, w ); return QSize( ph, pv ); } class QwtLegendLabel::PrivateData { public: PrivateData(): itemMode( QwtLegendData::ReadOnly ), isDown( false ), spacing( Margin ) { } QwtLegendData::Mode itemMode; QwtLegendData legendData; bool isDown; QPixmap icon; int spacing; }; /*! Set the attributes of the legend label \param legendData Attributes of the label \sa data() */ void QwtLegendLabel::setData( const QwtLegendData &legendData ) { d_data->legendData = legendData; const bool doUpdate = updatesEnabled(); setUpdatesEnabled( false ); setText( legendData.title() ); setIcon( legendData.icon().toPixmap() ); if ( legendData.hasRole( QwtLegendData::ModeRole ) ) setItemMode( legendData.mode() ); if ( doUpdate ) { setUpdatesEnabled( true ); update(); } } /*! \return Attributes of the label \sa setData(), QwtPlotItem::legendData() */ const QwtLegendData &QwtLegendLabel::data() const { return d_data->legendData; } /*! \param parent Parent widget */ QwtLegendLabel::QwtLegendLabel( QWidget *parent ): QwtTextLabel( parent ) { d_data = new PrivateData; setMargin( Margin ); setIndent( Margin ); } //! Destructor QwtLegendLabel::~QwtLegendLabel() { delete d_data; d_data = NULL; } /*! Set the text to the legend item \param text Text label \sa QwtTextLabel::text() */ void QwtLegendLabel::setText( const QwtText &text ) { const int flags = Qt::AlignLeft | Qt::AlignVCenter | Qt::TextExpandTabs | Qt::TextWordWrap; QwtText txt = text; txt.setRenderFlags( flags ); QwtTextLabel::setText( txt ); } /*! Set the item mode The default is QwtLegendData::ReadOnly \param mode Item mode \sa itemMode() */ void QwtLegendLabel::setItemMode( QwtLegendData::Mode mode ) { if ( mode != d_data->itemMode ) { d_data->itemMode = mode; d_data->isDown = false; setFocusPolicy( ( mode != QwtLegendData::ReadOnly ) ? Qt::TabFocus : Qt::NoFocus ); setMargin( ButtonFrame + Margin ); updateGeometry(); } } /*! \return Item mode \sa setItemMode() */ QwtLegendData::Mode QwtLegendLabel::itemMode() const { return d_data->itemMode; } /*! Assign the icon \param icon Pixmap representing a plot item \sa icon(), QwtPlotItem::legendIcon() */ void QwtLegendLabel::setIcon( const QPixmap &icon ) { d_data->icon = icon; int indent = margin() + d_data->spacing; if ( icon.width() > 0 ) indent += icon.width() + d_data->spacing; setIndent( indent ); } /*! \return Pixmap representing a plot item \sa setIcon() */ QPixmap QwtLegendLabel::icon() const { return d_data->icon; } /*! \brief Change the spacing between icon and text \param spacing Spacing \sa spacing(), QwtTextLabel::margin() */ void QwtLegendLabel::setSpacing( int spacing ) { spacing = qMax( spacing, 0 ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; int indent = margin() + d_data->spacing; if ( d_data->icon.width() > 0 ) indent += d_data->icon.width() + d_data->spacing; setIndent( indent ); } } /*! \return Spacing between icon and text \sa setSpacing(), QwtTextLabel::margin() */ int QwtLegendLabel::spacing() const { return d_data->spacing; } /*! Check/Uncheck a the item \param on check/uncheck \sa setItemMode() */ void QwtLegendLabel::setChecked( bool on ) { if ( d_data->itemMode == QwtLegendData::Checkable ) { const bool isBlocked = signalsBlocked(); blockSignals( true ); setDown( on ); blockSignals( isBlocked ); } } //! Return true, if the item is checked bool QwtLegendLabel::isChecked() const { return d_data->itemMode == QwtLegendData::Checkable && isDown(); } //! Set the item being down void QwtLegendLabel::setDown( bool down ) { if ( down == d_data->isDown ) return; d_data->isDown = down; update(); if ( d_data->itemMode == QwtLegendData::Clickable ) { if ( d_data->isDown ) Q_EMIT pressed(); else { Q_EMIT released(); Q_EMIT clicked(); } } if ( d_data->itemMode == QwtLegendData::Checkable ) Q_EMIT checked( d_data->isDown ); } //! Return true, if the item is down bool QwtLegendLabel::isDown() const { return d_data->isDown; } //! Return a size hint QSize QwtLegendLabel::sizeHint() const { QSize sz = QwtTextLabel::sizeHint(); sz.setHeight( qMax( sz.height(), d_data->icon.height() + 4 ) ); if ( d_data->itemMode != QwtLegendData::ReadOnly ) { sz += buttonShift( this ); sz = sz.expandedTo( QApplication::globalStrut() ); } return sz; } //! Paint event void QwtLegendLabel::paintEvent( QPaintEvent *e ) { const QRect cr = contentsRect(); QPainter painter( this ); painter.setClipRegion( e->region() ); if ( d_data->isDown ) { qDrawWinButton( &painter, 0, 0, width(), height(), palette(), true ); } painter.save(); if ( d_data->isDown ) { const QSize shiftSize = buttonShift( this ); painter.translate( shiftSize.width(), shiftSize.height() ); } painter.setClipRect( cr ); drawContents( &painter ); if ( !d_data->icon.isNull() ) { QRect iconRect = cr; iconRect.setX( iconRect.x() + margin() ); if ( d_data->itemMode != QwtLegendData::ReadOnly ) iconRect.setX( iconRect.x() + ButtonFrame ); iconRect.setSize( d_data->icon.size() ); iconRect.moveCenter( QPoint( iconRect.center().x(), cr.center().y() ) ); painter.drawPixmap( iconRect, d_data->icon ); } painter.restore(); } //! Handle mouse press events void QwtLegendLabel::mousePressEvent( QMouseEvent *e ) { if ( e->button() == Qt::LeftButton ) { switch ( d_data->itemMode ) { case QwtLegendData::Clickable: { setDown( true ); return; } case QwtLegendData::Checkable: { setDown( !isDown() ); return; } default:; } } QwtTextLabel::mousePressEvent( e ); } //! Handle mouse release events void QwtLegendLabel::mouseReleaseEvent( QMouseEvent *e ) { if ( e->button() == Qt::LeftButton ) { switch ( d_data->itemMode ) { case QwtLegendData::Clickable: { setDown( false ); return; } case QwtLegendData::Checkable: { return; // do nothing, but accept } default:; } } QwtTextLabel::mouseReleaseEvent( e ); } //! Handle key press events void QwtLegendLabel::keyPressEvent( QKeyEvent *e ) { if ( e->key() == Qt::Key_Space ) { switch ( d_data->itemMode ) { case QwtLegendData::Clickable: { if ( !e->isAutoRepeat() ) setDown( true ); return; } case QwtLegendData::Checkable: { if ( !e->isAutoRepeat() ) setDown( !isDown() ); return; } default:; } } QwtTextLabel::keyPressEvent( e ); } //! Handle key release events void QwtLegendLabel::keyReleaseEvent( QKeyEvent *e ) { if ( e->key() == Qt::Key_Space ) { switch ( d_data->itemMode ) { case QwtLegendData::Clickable: { if ( !e->isAutoRepeat() ) setDown( false ); return; } case QwtLegendData::Checkable: { return; // do nothing, but accept } default:; } } QwtTextLabel::keyReleaseEvent( e ); } linssid-2.7/linssid-app/prefsDialog.ui000664 001750 001750 00000007617 12355414341 020725 0ustar00warrenwarren000000 000000 prefsDialog 0 0 334 186 Preferences Plot Min db -100 -60 10 -100 Show plot grid lines true Plot Max db -50 0 10 -20 linssid48.png Qt::AlignCenter Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok <html><head/><body><p>Log data to file &quot;~/LinSSID.datalog&quot;</p></body></html> <html><head/><body><p>Log data to file &quot;~/LinSSID.datalog&quot;</p></body></html> Log Data buttonBox accepted() prefsDialog accept() 248 254 157 274 buttonBox rejected() prefsDialog reject() 316 260 286 274 linssid-2.7/qwt-lib/src/qwt_text_label.cpp000644 001750 001750 00000015343 12151666703 021572 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text_label.h" #include "qwt_text.h" #include "qwt_painter.h" #include #include #include class QwtTextLabel::PrivateData { public: PrivateData(): indent( 4 ), margin( 0 ) { } int indent; int margin; QwtText text; }; /*! Constructs an empty label. \param parent Parent widget */ QwtTextLabel::QwtTextLabel( QWidget *parent ): QFrame( parent ) { init(); } /*! Constructs a label that displays the text, text \param parent Parent widget \param text Text */ QwtTextLabel::QwtTextLabel( const QwtText &text, QWidget *parent ): QFrame( parent ) { init(); d_data->text = text; } //! Destructor QwtTextLabel::~QwtTextLabel() { delete d_data; } void QwtTextLabel::init() { d_data = new PrivateData(); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); } /*! Interface for the designer plugin - does the same as setText() \sa plainText() */ void QwtTextLabel::setPlainText( const QString &text ) { setText( QwtText( text ) ); } /*! Interface for the designer plugin \return Text as plain text \sa setPlainText(), text() */ QString QwtTextLabel::plainText() const { return d_data->text.text(); } /*! Change the label's text, keeping all other QwtText attributes \param text New text \param textFormat Format of text \sa QwtText */ void QwtTextLabel::setText( const QString &text, QwtText::TextFormat textFormat ) { d_data->text.setText( text, textFormat ); update(); updateGeometry(); } /*! Change the label's text \param text New text */ void QwtTextLabel::setText( const QwtText &text ) { d_data->text = text; update(); updateGeometry(); } //! Return the text const QwtText &QwtTextLabel::text() const { return d_data->text; } //! Clear the text and all QwtText attributes void QwtTextLabel::clear() { d_data->text = QwtText(); update(); updateGeometry(); } //! Return label's text indent in pixels int QwtTextLabel::indent() const { return d_data->indent; } /*! Set label's text indent in pixels \param indent Indentation in pixels */ void QwtTextLabel::setIndent( int indent ) { if ( indent < 0 ) indent = 0; d_data->indent = indent; update(); updateGeometry(); } //! Return label's text indent in pixels int QwtTextLabel::margin() const { return d_data->margin; } /*! Set label's margin in pixels \param margin Margin in pixels */ void QwtTextLabel::setMargin( int margin ) { d_data->margin = margin; update(); updateGeometry(); } //! Return label's margin in pixels QSize QwtTextLabel::sizeHint() const { return minimumSizeHint(); } //! Return a minimum size hint QSize QwtTextLabel::minimumSizeHint() const { QSizeF sz = d_data->text.textSize( font() ); int mw = 2 * ( frameWidth() + d_data->margin ); int mh = mw; int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); if ( indent > 0 ) { const int align = d_data->text.renderFlags(); if ( align & Qt::AlignLeft || align & Qt::AlignRight ) mw += d_data->indent; else if ( align & Qt::AlignTop || align & Qt::AlignBottom ) mh += d_data->indent; } sz += QSizeF( mw, mh ); return QSize( qCeil( sz.width() ), qCeil( sz.height() ) ); } /*! \param width Width \return Preferred height for this widget, given the width. */ int QwtTextLabel::heightForWidth( int width ) const { const int renderFlags = d_data->text.renderFlags(); int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); width -= 2 * frameWidth(); if ( renderFlags & Qt::AlignLeft || renderFlags & Qt::AlignRight ) width -= indent; int height = qCeil( d_data->text.heightForWidth( width, font() ) ); if ( ( renderFlags & Qt::AlignTop ) || ( renderFlags & Qt::AlignBottom ) ) height += indent; height += 2 * frameWidth(); return height; } /*! Qt paint event \param event Paint event */ void QwtTextLabel::paintEvent( QPaintEvent *event ) { QPainter painter( this ); if ( !contentsRect().contains( event->rect() ) ) { painter.save(); painter.setClipRegion( event->region() & frameRect() ); drawFrame( &painter ); painter.restore(); } painter.setClipRegion( event->region() & contentsRect() ); drawContents( &painter ); } //! Redraw the text and focus indicator void QwtTextLabel::drawContents( QPainter *painter ) { const QRect r = textRect(); if ( r.isEmpty() ) return; painter->setFont( font() ); painter->setPen( palette().color( QPalette::Active, QPalette::Text ) ); drawText( painter, QRectF( r ) ); if ( hasFocus() ) { const int m = 2; QRect focusRect = contentsRect().adjusted( m, m, -m + 1, -m + 1); QwtPainter::drawFocusRect( painter, this, focusRect ); } } //! Redraw the text void QwtTextLabel::drawText( QPainter *painter, const QRectF &textRect ) { d_data->text.draw( painter, textRect ); } /*! Calculate geometry for the text in widget coordinates \return Geometry for the text */ QRect QwtTextLabel::textRect() const { QRect r = contentsRect(); if ( !r.isEmpty() && d_data->margin > 0 ) { r.setRect( r.x() + d_data->margin, r.y() + d_data->margin, r.width() - 2 * d_data->margin, r.height() - 2 * d_data->margin ); } if ( !r.isEmpty() ) { int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); if ( indent > 0 ) { const int renderFlags = d_data->text.renderFlags(); if ( renderFlags & Qt::AlignLeft ) r.setX( r.x() + indent ); else if ( renderFlags & Qt::AlignRight ) r.setWidth( r.width() - indent ); else if ( renderFlags & Qt::AlignTop ) r.setY( r.y() + indent ); else if ( renderFlags & Qt::AlignBottom ) r.setHeight( r.height() - indent ); } } return r; } int QwtTextLabel::defaultIndent() const { if ( frameWidth() <= 0 ) return 0; QFont fnt; if ( d_data->text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) fnt = d_data->text.font(); else fnt = font(); return QFontMetrics( fnt ).width( 'x' ) / 2; } linssid-2.7/qwt-lib/src/qwt_matrix_raster_data.h000644 001750 001750 00000003733 12151666701 022767 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_MATRIX_RASTER_DATA_H #define QWT_MATRIX_RASTER_DATA_H 1 #include "qwt_global.h" #include "qwt_raster_data.h" #include /*! \brief A class representing a matrix of values as raster data QwtMatrixRasterData implements an interface for a matrix of equidistant values, that can be used by a QwtPlotRasterItem. It implements a couple of resampling algorithms, to provide values for positions, that or not on the value matrix. */ class QWT_EXPORT QwtMatrixRasterData: public QwtRasterData { public: /*! \brief Resampling algorithm The default setting is NearestNeighbour; */ enum ResampleMode { /*! Return the value from the matrix, that is nearest to the the requested position. */ NearestNeighbour, /*! Interpolate the value from the distances and values of the 4 surrounding values in the matrix, */ BilinearInterpolation }; QwtMatrixRasterData(); virtual ~QwtMatrixRasterData(); void setResampleMode(ResampleMode mode); ResampleMode resampleMode() const; virtual void setInterval( Qt::Axis, const QwtInterval & ); void setValueMatrix( const QVector &values, int numColumns ); const QVector valueMatrix() const; void setValue( int row, int col, double value ); int numColumns() const; int numRows() const; virtual QRectF pixelHint( const QRectF & ) const; virtual double value( double x, double y ) const; private: void update(); class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_intervalcurve.cpp000644 001750 001750 00000036203 12151666703 023374 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_intervalcurve.h" #include "qwt_interval_symbol.h" #include "qwt_scale_map.h" #include "qwt_clipper.h" #include "qwt_painter.h" #include #include static inline bool qwtIsHSampleInside( const QwtIntervalSample &sample, double xMin, double xMax, double yMin, double yMax ) { const double y = sample.value; const double x1 = sample.interval.minValue(); const double x2 = sample.interval.maxValue(); const bool isOffScreen = ( y < yMin ) || ( y > yMax ) || ( x1 < xMin && x2 < xMin ) || ( x1 > xMax && x2 > xMax ); return !isOffScreen; } static inline bool qwtIsVSampleInside( const QwtIntervalSample &sample, double xMin, double xMax, double yMin, double yMax ) { const double x = sample.value; const double y1 = sample.interval.minValue(); const double y2 = sample.interval.maxValue(); const bool isOffScreen = ( x < xMin ) || ( x > xMax ) || ( y1 < yMin && y2 < yMin ) || ( y1 > yMax && y2 > yMax ); return !isOffScreen; } class QwtPlotIntervalCurve::PrivateData { public: PrivateData(): style( QwtPlotIntervalCurve::Tube ), symbol( NULL ), pen( Qt::black ), brush( Qt::white ) { paintAttributes = QwtPlotIntervalCurve::ClipPolygons; paintAttributes |= QwtPlotIntervalCurve::ClipSymbol; pen.setCapStyle( Qt::FlatCap ); } ~PrivateData() { delete symbol; } QwtPlotIntervalCurve::CurveStyle style; const QwtIntervalSymbol *symbol; QPen pen; QBrush brush; QwtPlotIntervalCurve::PaintAttributes paintAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotIntervalCurve::QwtPlotIntervalCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotIntervalCurve::QwtPlotIntervalCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotIntervalCurve::~QwtPlotIntervalCurve() { delete d_data; } //! Initialize internal members void QwtPlotIntervalCurve::init() { setItemAttribute( QwtPlotItem::Legend, true ); setItemAttribute( QwtPlotItem::AutoScale, true ); d_data = new PrivateData; setData( new QwtIntervalSeriesData() ); setZ( 19.0 ); } //! \return QwtPlotItem::Rtti_PlotIntervalCurve int QwtPlotIntervalCurve::rtti() const { return QwtPlotIntervalCurve::Rtti_PlotIntervalCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off \sa testPaintAttribute() */ void QwtPlotIntervalCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa PaintAttribute, setPaintAttribute() */ bool QwtPlotIntervalCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Initialize data with an array of samples. \param samples Vector of samples */ void QwtPlotIntervalCurve::setSamples( const QVector &samples ) { setData( new QwtIntervalSeriesData( samples ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotIntervalCurve::setSamples( QwtSeriesData *data ) { setData( data ); } /*! Set the curve's drawing style \param style Curve style \sa CurveStyle, style() */ void QwtPlotIntervalCurve::setStyle( CurveStyle style ) { if ( style != d_data->style ) { d_data->style = style; legendChanged(); itemChanged(); } } /*! \return Style of the curve \sa setStyle() */ QwtPlotIntervalCurve::CurveStyle QwtPlotIntervalCurve::style() const { return d_data->style; } /*! Assign a symbol. \param symbol Symbol \sa symbol() */ void QwtPlotIntervalCurve::setSymbol( const QwtIntervalSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; legendChanged(); itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtIntervalSymbol *QwtPlotIntervalCurve::symbol() const { return d_data->symbol; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotIntervalCurve::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! \brief Assign a pen \param pen New pen \sa pen(), brush() */ void QwtPlotIntervalCurve::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; legendChanged(); itemChanged(); } } /*! \return Pen used to draw the lines \sa setPen(), brush() */ const QPen& QwtPlotIntervalCurve::pen() const { return d_data->pen; } /*! Assign a brush. The brush is used to fill the area in Tube style(). \param brush Brush \sa brush(), pen(), setStyle(), CurveStyle */ void QwtPlotIntervalCurve::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; legendChanged(); itemChanged(); } } /*! \return Brush used to fill the area in Tube style() \sa setBrush(), setStyle(), CurveStyle */ const QBrush& QwtPlotIntervalCurve::brush() const { return d_data->brush; } /*! \return Bounding rectangle of all samples. For an empty series the rectangle is invalid. */ QRectF QwtPlotIntervalCurve::boundingRect() const { QRectF rect = QwtPlotSeriesItem::boundingRect(); if ( rect.isValid() && orientation() == Qt::Vertical ) rect.setRect( rect.y(), rect.x(), rect.height(), rect.width() ); return rect; } /*! Draw a subset of the samples \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the series will be painted to its last sample. \sa drawTube(), drawSymbols() */ void QwtPlotIntervalCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( to < 0 ) to = dataSize() - 1; if ( from < 0 ) from = 0; if ( from > to ) return; switch ( d_data->style ) { case Tube: drawTube( painter, xMap, yMap, canvasRect, from, to ); break; case NoCurve: default: break; } if ( d_data->symbol && ( d_data->symbol->style() != QwtIntervalSymbol::NoSymbol ) ) { drawSymbols( painter, *d_data->symbol, xMap, yMap, canvasRect, from, to ); } } /*! Draw a tube Builds 2 curves from the upper and lower limits of the intervals and draws them with the pen(). The area between the curves is filled with the brush(). \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the series will be painted to its last sample. \sa drawSeries(), drawSymbols() */ void QwtPlotIntervalCurve::drawTube( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); painter->save(); const size_t size = to - from + 1; QPolygonF polygon( 2 * size ); QPointF *points = polygon.data(); for ( uint i = 0; i < size; i++ ) { QPointF &minValue = points[i]; QPointF &maxValue = points[2 * size - 1 - i]; const QwtIntervalSample intervalSample = sample( from + i ); if ( orientation() == Qt::Vertical ) { double x = xMap.transform( intervalSample.value ); double y1 = yMap.transform( intervalSample.interval.minValue() ); double y2 = yMap.transform( intervalSample.interval.maxValue() ); if ( doAlign ) { x = qRound( x ); y1 = qRound( y1 ); y2 = qRound( y2 ); } minValue.rx() = x; minValue.ry() = y1; maxValue.rx() = x; maxValue.ry() = y2; } else { double y = yMap.transform( intervalSample.value ); double x1 = xMap.transform( intervalSample.interval.minValue() ); double x2 = xMap.transform( intervalSample.interval.maxValue() ); if ( doAlign ) { y = qRound( y ); x1 = qRound( x1 ); x2 = qRound( x2 ); } minValue.rx() = x1; minValue.ry() = y; maxValue.rx() = x2; maxValue.ry() = y; } } if ( d_data->brush.style() != Qt::NoBrush ) { painter->setPen( QPen( Qt::NoPen ) ); painter->setBrush( d_data->brush ); if ( d_data->paintAttributes & ClipPolygons ) { const qreal m = 1.0; const QPolygonF p = QwtClipper::clipPolygonF( canvasRect.adjusted( -m, -m, m, m ), polygon, true ); QwtPainter::drawPolygon( painter, p ); } else { QwtPainter::drawPolygon( painter, polygon ); } } if ( d_data->pen.style() != Qt::NoPen ) { painter->setPen( d_data->pen ); painter->setBrush( Qt::NoBrush ); if ( d_data->paintAttributes & ClipPolygons ) { qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF() ); const QRectF clipRect = canvasRect.adjusted( -pw, -pw, pw, pw ); QPolygonF p; p.resize( size ); ::memcpy( p.data(), points, size * sizeof( QPointF ) ); p = QwtClipper::clipPolygonF( clipRect, p ); QwtPainter::drawPolyline( painter, p ); p.resize( size ); ::memcpy( p.data(), points + size, size * sizeof( QPointF ) ); p = QwtClipper::clipPolygonF( clipRect, p ); QwtPainter::drawPolyline( painter, p ); } else { QwtPainter::drawPolyline( painter, points, size ); QwtPainter::drawPolyline( painter, points + size, size ); } } painter->restore(); } /*! Draw symbols for a subset of the samples \param painter Painter \param symbol Interval symbol \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted \sa setSymbol(), drawSeries(), drawTube() */ void QwtPlotIntervalCurve::drawSymbols( QPainter *painter, const QwtIntervalSymbol &symbol, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { painter->save(); QPen pen = symbol.pen(); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const QRectF tr = QwtScaleMap::invTransform( xMap, yMap, canvasRect ); const double xMin = tr.left(); const double xMax = tr.right(); const double yMin = tr.top(); const double yMax = tr.bottom(); const bool doClip = d_data->paintAttributes & ClipSymbol; for ( int i = from; i <= to; i++ ) { const QwtIntervalSample s = sample( i ); if ( orientation() == Qt::Vertical ) { if ( !doClip || qwtIsVSampleInside( s, xMin, xMax, yMin, yMax ) ) { const double x = xMap.transform( s.value ); const double y1 = yMap.transform( s.interval.minValue() ); const double y2 = yMap.transform( s.interval.maxValue() ); symbol.draw( painter, orientation(), QPointF( x, y1 ), QPointF( x, y2 ) ); } } else { if ( !doClip || qwtIsHSampleInside( s, xMin, xMax, yMin, yMax ) ) { const double y = yMap.transform( s.value ); const double x1 = xMap.transform( s.interval.minValue() ); const double x2 = xMap.transform( s.interval.maxValue() ); symbol.draw( painter, orientation(), QPointF( x1, y ), QPointF( x2, y ) ); } } } painter->restore(); } /*! \return Icon for the legend In case of Tube style() the icon is a plain rectangle filled with the brush(). If a symbol is assigned it is scaled to size. \param index Index of the legend entry ( ignored as there is only one ) \param size Icon size \sa QwtPlotItem::setLegendIconSize(), QwtPlotItem::legendData() */ QwtGraphic QwtPlotIntervalCurve::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); if ( size.isEmpty() ) return QwtGraphic(); QwtGraphic icon; icon.setDefaultSize( size ); icon.setRenderHint( QwtGraphic::RenderPensUnscaled, true ); QPainter painter( &icon ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); if ( d_data->style == Tube ) { QRectF r( 0, 0, size.width(), size.height() ); painter.fillRect( r, d_data->brush ); } if ( d_data->symbol && ( d_data->symbol->style() != QwtIntervalSymbol::NoSymbol ) ) { QPen pen = d_data->symbol->pen(); pen.setWidthF( pen.widthF() ); pen.setCapStyle( Qt::FlatCap ); painter.setPen( pen ); painter.setBrush( d_data->symbol->brush() ); if ( orientation() == Qt::Vertical ) { const double x = 0.5 * size.width(); d_data->symbol->draw( &painter, orientation(), QPointF( x, 0 ), QPointF( x, size.height() - 1.0 ) ); } else { const double y = 0.5 * size.height(); d_data->symbol->draw( &painter, orientation(), QPointF( 0.0, y ), QPointF( size.width() - 1.0, y ) ); } } return icon; } linssid-2.7/qwt-lib/src/qwt_plot_magnifier.cpp000644 001750 001750 00000006324 12151666703 022445 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_scale_div.h" #include "qwt_plot_magnifier.h" #include class QwtPlotMagnifier::PrivateData { public: PrivateData() { for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) isAxisEnabled[axis] = true; } bool isAxisEnabled[QwtPlot::axisCnt]; }; /*! Constructor \param canvas Plot canvas to be magnified */ QwtPlotMagnifier::QwtPlotMagnifier( QWidget *canvas ): QwtMagnifier( canvas ) { d_data = new PrivateData(); } //! Destructor QwtPlotMagnifier::~QwtPlotMagnifier() { delete d_data; } /*! \brief En/Disable an axis Only Axes that are enabled will be zoomed. All other axes will remain unchanged. \param axis Axis, see QwtPlot::Axis \param on On/Off \sa isAxisEnabled() */ void QwtPlotMagnifier::setAxisEnabled( int axis, bool on ) { if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->isAxisEnabled[axis] = on; } /*! Test if an axis is enabled \param axis Axis, see QwtPlot::Axis \return True, if the axis is enabled \sa setAxisEnabled() */ bool QwtPlotMagnifier::isAxisEnabled( int axis ) const { if ( axis >= 0 && axis < QwtPlot::axisCnt ) return d_data->isAxisEnabled[axis]; return true; } //! Return observed plot canvas QWidget *QwtPlotMagnifier::canvas() { return parentWidget(); } //! Return Observed plot canvas const QWidget *QwtPlotMagnifier::canvas() const { return parentWidget(); } //! Return plot widget, containing the observed plot canvas QwtPlot *QwtPlotMagnifier::plot() { QWidget *w = canvas(); if ( w ) w = w->parentWidget(); return qobject_cast( w ); } //! Return plot widget, containing the observed plot canvas const QwtPlot *QwtPlotMagnifier::plot() const { const QWidget *w = canvas(); if ( w ) w = w->parentWidget(); return qobject_cast( w ); } /*! Zoom in/out the axes scales \param factor A value < 1.0 zooms in, a value > 1.0 zooms out. */ void QwtPlotMagnifier::rescale( double factor ) { QwtPlot* plt = plot(); if ( plt == NULL ) return; factor = qAbs( factor ); if ( factor == 1.0 || factor == 0.0 ) return; bool doReplot = false; const bool autoReplot = plt->autoReplot(); plt->setAutoReplot( false ); for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { const QwtScaleDiv &scaleDiv = plt->axisScaleDiv( axisId ); if ( isAxisEnabled( axisId ) ) { const double center = scaleDiv.lowerBound() + scaleDiv.range() / 2; const double width_2 = scaleDiv.range() / 2 * factor; plt->setAxisScale( axisId, center - width_2, center + width_2 ); doReplot = true; } } plt->setAutoReplot( autoReplot ); if ( doReplot ) plt->replot(); } linssid-2.7/linssid-app/passBox.ui000664 001750 001750 00000003442 12355414341 020075 0ustar00warrenwarren000000 000000 passBox 0 0 400 101 Password required for iwlist scan TextLabel QLineEdit::Password Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok passBtnBox accepted() passBox accept() 248 254 157 274 passBtnBox rejected() passBox reject() 316 260 286 274 linssid-2.7/qwt-lib/src/qwt_scale_draw.cpp000644 001750 001750 00000054132 12151666703 021552 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_draw.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #if QT_VERSION < 0x040601 #define qFastSin(x) qSin(x) #define qFastCos(x) qCos(x) #endif class QwtScaleDraw::PrivateData { public: PrivateData(): len( 0 ), alignment( QwtScaleDraw::BottomScale ), labelAlignment( 0 ), labelRotation( 0.0 ) { } QPointF pos; double len; Alignment alignment; Qt::Alignment labelAlignment; double labelRotation; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The position is at (0, 0) with a length of 100. The orientation is QwtAbstractScaleDraw::Bottom. */ QwtScaleDraw::QwtScaleDraw() { d_data = new QwtScaleDraw::PrivateData; setLength( 100 ); } //! Destructor QwtScaleDraw::~QwtScaleDraw() { delete d_data; } /*! Return alignment of the scale \sa setAlignment() \return Alignment of the scale */ QwtScaleDraw::Alignment QwtScaleDraw::alignment() const { return d_data->alignment; } /*! Set the alignment of the scale \param align Alignment of the scale The default alignment is QwtScaleDraw::BottomScale \sa alignment() */ void QwtScaleDraw::setAlignment( Alignment align ) { d_data->alignment = align; } /*! Return the orientation TopScale, BottomScale are horizontal (Qt::Horizontal) scales, LeftScale, RightScale are vertical (Qt::Vertical) scales. \return Orientation of the scale \sa alignment() */ Qt::Orientation QwtScaleDraw::orientation() const { switch ( d_data->alignment ) { case TopScale: case BottomScale: return Qt::Horizontal; case LeftScale: case RightScale: default: return Qt::Vertical; } } /*! \brief Determine the minimum border distance This member function returns the minimum space needed to draw the mark labels at the scale's endpoints. \param font Font \param start Start border distance \param end End border distance */ void QwtScaleDraw::getBorderDistHint( const QFont &font, int &start, int &end ) const { start = 0; end = 0; if ( !hasComponent( QwtAbstractScaleDraw::Labels ) ) return; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); if ( ticks.count() == 0 ) return; // Find the ticks, that are mapped to the borders. // minTick is the tick, that is mapped to the top/left-most position // in widget coordinates. double minTick = ticks[0]; double minPos = scaleMap().transform( minTick ); double maxTick = minTick; double maxPos = minPos; for ( int i = 1; i < ticks.count(); i++ ) { const double tickPos = scaleMap().transform( ticks[i] ); if ( tickPos < minPos ) { minTick = ticks[i]; minPos = tickPos; } if ( tickPos > scaleMap().transform( maxTick ) ) { maxTick = ticks[i]; maxPos = tickPos; } } double e = 0.0; double s = 0.0; if ( orientation() == Qt::Vertical ) { s = -labelRect( font, minTick ).top(); s -= qAbs( minPos - qRound( scaleMap().p2() ) ); e = labelRect( font, maxTick ).bottom(); e -= qAbs( maxPos - scaleMap().p1() ); } else { s = -labelRect( font, minTick ).left(); s -= qAbs( minPos - scaleMap().p1() ); e = labelRect( font, maxTick ).right(); e -= qAbs( maxPos - scaleMap().p2() ); } if ( s < 0.0 ) s = 0.0; if ( e < 0.0 ) e = 0.0; start = qCeil( s ); end = qCeil( e ); } /*! Determine the minimum distance between two labels, that is necessary that the texts don't overlap. \param font Font \return The maximum width of a label \sa getBorderDistHint() */ int QwtScaleDraw::minLabelDist( const QFont &font ) const { if ( !hasComponent( QwtAbstractScaleDraw::Labels ) ) return 0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); if ( ticks.isEmpty() ) return 0; const QFontMetrics fm( font ); const bool vertical = ( orientation() == Qt::Vertical ); QRectF bRect1; QRectF bRect2 = labelRect( font, ticks[0] ); if ( vertical ) { bRect2.setRect( -bRect2.bottom(), 0.0, bRect2.height(), bRect2.width() ); } double maxDist = 0.0; for ( int i = 1; i < ticks.count(); i++ ) { bRect1 = bRect2; bRect2 = labelRect( font, ticks[i] ); if ( vertical ) { bRect2.setRect( -bRect2.bottom(), 0.0, bRect2.height(), bRect2.width() ); } double dist = fm.leading(); // space between the labels if ( bRect1.right() > 0 ) dist += bRect1.right(); if ( bRect2.left() < 0 ) dist += -bRect2.left(); if ( dist > maxDist ) maxDist = dist; } double angle = qwtRadians( labelRotation() ); if ( vertical ) angle += M_PI / 2; const double sinA = qFastSin( angle ); // qreal -> double if ( qFuzzyCompare( sinA + 1.0, 1.0 ) ) return qCeil( maxDist ); const int fmHeight = fm.ascent() - 2; // The distance we need until there is // the height of the label font. This height is needed // for the neighbored label. double labelDist = fmHeight / qFastSin( angle ) * qFastCos( angle ); if ( labelDist < 0 ) labelDist = -labelDist; // For text orientations close to the scale orientation if ( labelDist > maxDist ) labelDist = maxDist; // For text orientations close to the opposite of the // scale orientation if ( labelDist < fmHeight ) labelDist = fmHeight; return qCeil( labelDist ); } /*! Calculate the width/height that is needed for a vertical/horizontal scale. The extent is calculated from the pen width of the backbone, the major tick length, the spacing and the maximum width/height of the labels. \param font Font used for painting the labels \return Extent \sa minLength() */ double QwtScaleDraw::extent( const QFont &font ) const { double d = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { if ( orientation() == Qt::Vertical ) d = maxLabelWidth( font ); else d = maxLabelHeight( font ); if ( d > 0 ) d += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += maxTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // pen width can be zero d += pw; } d = qMax( d, minimumExtent() ); return d; } /*! Calculate the minimum length that is needed to draw the scale \param font Font used for painting the labels \return Minimum length that is needed to draw the scale \sa extent() */ int QwtScaleDraw::minLength( const QFont &font ) const { int startDist, endDist; getBorderDistHint( font, startDist, endDist ); const QwtScaleDiv &sd = scaleDiv(); const uint minorCount = sd.ticks( QwtScaleDiv::MinorTick ).count() + sd.ticks( QwtScaleDiv::MediumTick ).count(); const uint majorCount = sd.ticks( QwtScaleDiv::MajorTick ).count(); int lengthForLabels = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) lengthForLabels = minLabelDist( font ) * majorCount; int lengthForTicks = 0; if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero lengthForTicks = qCeil( ( majorCount + minorCount ) * ( pw + 1.0 ) ); } return startDist + endDist + qMax( lengthForLabels, lengthForTicks ); } /*! Find the position, where to paint a label The position has a distance that depends on the length of the ticks in direction of the alignment(). \param value Value \return Position, where to paint a label */ QPointF QwtScaleDraw::labelPosition( double value ) const { const double tval = scaleMap().transform( value ); double dist = spacing(); if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) dist += qMax( 1, penWidth() ); if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) dist += tickLength( QwtScaleDiv::MajorTick ); double px = 0; double py = 0; switch ( alignment() ) { case RightScale: { px = d_data->pos.x() + dist; py = tval; break; } case LeftScale: { px = d_data->pos.x() - dist; py = tval; break; } case BottomScale: { px = tval; py = d_data->pos.y() + dist; break; } case TopScale: { px = tval; py = d_data->pos.y() - dist; break; } } return QPointF( px, py ); } /*! Draw a tick \param painter Painter \param value Value of the tick \param len Length of the tick \sa drawBackbone(), drawLabel() */ void QwtScaleDraw::drawTick( QPainter *painter, double value, double len ) const { if ( len <= 0 ) return; const bool roundingAlignment = QwtPainter::roundingAlignment( painter ); QPointF pos = d_data->pos; double tval = scaleMap().transform( value ); if ( roundingAlignment ) tval = qRound( tval ); const int pw = penWidth(); int a = 0; if ( pw > 1 && roundingAlignment ) a = 1; switch ( alignment() ) { case LeftScale: { double x1 = pos.x() + a; double x2 = pos.x() + a - pw - len; if ( roundingAlignment ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QwtPainter::drawLine( painter, x1, tval, x2, tval ); break; } case RightScale: { double x1 = pos.x(); double x2 = pos.x() + pw + len; if ( roundingAlignment ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QwtPainter::drawLine( painter, x1, tval, x2, tval ); break; } case BottomScale: { double y1 = pos.y(); double y2 = pos.y() + pw + len; if ( roundingAlignment ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QwtPainter::drawLine( painter, tval, y1, tval, y2 ); break; } case TopScale: { double y1 = pos.y() + a; double y2 = pos.y() - pw - len + a; if ( roundingAlignment ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QwtPainter::drawLine( painter, tval, y1, tval, y2 ); break; } } } /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ void QwtScaleDraw::drawBackbone( QPainter *painter ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); const QPointF &pos = d_data->pos; const double len = d_data->len; const int pw = qMax( penWidth(), 1 ); // pos indicates a border not the center of the backbone line // so we need to shift its position depending on the pen width // and the alignment of the scale double off; if ( doAlign ) { if ( alignment() == LeftScale || alignment() == TopScale ) off = ( pw - 1 ) / 2; else off = pw / 2; } else { off = 0.5 * penWidth(); } switch ( alignment() ) { case LeftScale: { double x = pos.x() - off; if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len ); break; } case RightScale: { double x = pos.x() + off; if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len ); break; } case TopScale: { double y = pos.y() - off; if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y ); break; } case BottomScale: { double y = pos.y() + off; if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y ); break; } } } /*! \brief Move the position of the scale The meaning of the parameter pos depends on the alignment:
QwtScaleDraw::LeftScale
The origin is the topmost point of the backbone. The backbone is a vertical line. Scale marks and labels are drawn at the left of the backbone.
QwtScaleDraw::RightScale
The origin is the topmost point of the backbone. The backbone is a vertical line. Scale marks and labels are drawn at the right of the backbone.
QwtScaleDraw::TopScale
The origin is the leftmost point of the backbone. The backbone is a horizontal line. Scale marks and labels are drawn above the backbone.
QwtScaleDraw::BottomScale
The origin is the leftmost point of the backbone. The backbone is a horizontal line Scale marks and labels are drawn below the backbone.
\param pos Origin of the scale \sa pos(), setLength() */ void QwtScaleDraw::move( const QPointF &pos ) { d_data->pos = pos; updateMap(); } /*! \return Origin of the scale \sa move(), length() */ QPointF QwtScaleDraw::pos() const { return d_data->pos; } /*! Set the length of the backbone. The length doesn't include the space needed for overlapping labels. \param length Length of the backbone \sa move(), minLabelDist() */ void QwtScaleDraw::setLength( double length ) { #if 1 if ( length >= 0 && length < 10 ) length = 10; // why should we accept negative lengths ??? if ( length < 0 && length > -10 ) length = -10; #else length = qMax( length, 10 ); #endif d_data->len = length; updateMap(); } /*! \return the length of the backbone \sa setLength(), pos() */ double QwtScaleDraw::length() const { return d_data->len; } /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone(), boundingLabelRect() */ void QwtScaleDraw::drawLabel( QPainter *painter, double value ) const { QwtText lbl = tickLabel( painter->font(), value ); if ( lbl.isEmpty() ) return; QPointF pos = labelPosition( value ); QSizeF labelSize = lbl.textSize( painter->font() ); const QTransform transform = labelTransformation( pos, labelSize ); painter->save(); painter->setWorldTransform( transform, true ); lbl.draw ( painter, QRect( QPoint( 0, 0 ), labelSize.toSize() ) ); painter->restore(); } /*! \brief Find the bounding rectangle for the label. The coordinates of the rectangle are absolute ( calculated from pos() ). in direction of the tick. \param font Font used for painting \param value Value \return Bounding rectangle \sa labelRect() */ QRect QwtScaleDraw::boundingLabelRect( const QFont &font, double value ) const { QwtText lbl = tickLabel( font, value ); if ( lbl.isEmpty() ) return QRect(); const QPointF pos = labelPosition( value ); QSizeF labelSize = lbl.textSize( font ); const QTransform transform = labelTransformation( pos, labelSize ); return transform.mapRect( QRect( QPoint( 0, 0 ), labelSize.toSize() ) ); } /*! Calculate the transformation that is needed to paint a label depending on its alignment and rotation. \param pos Position where to paint the label \param size Size of the label \return Transformation matrix \sa setLabelAlignment(), setLabelRotation() */ QTransform QwtScaleDraw::labelTransformation( const QPointF &pos, const QSizeF &size ) const { QTransform transform; transform.translate( pos.x(), pos.y() ); transform.rotate( labelRotation() ); int flags = labelAlignment(); if ( flags == 0 ) { switch ( alignment() ) { case RightScale: { if ( flags == 0 ) flags = Qt::AlignRight | Qt::AlignVCenter; break; } case LeftScale: { if ( flags == 0 ) flags = Qt::AlignLeft | Qt::AlignVCenter; break; } case BottomScale: { if ( flags == 0 ) flags = Qt::AlignHCenter | Qt::AlignBottom; break; } case TopScale: { if ( flags == 0 ) flags = Qt::AlignHCenter | Qt::AlignTop; break; } } } double x, y; if ( flags & Qt::AlignLeft ) x = -size.width(); else if ( flags & Qt::AlignRight ) x = 0.0; else // Qt::AlignHCenter x = -( 0.5 * size.width() ); if ( flags & Qt::AlignTop ) y = -size.height(); else if ( flags & Qt::AlignBottom ) y = 0; else // Qt::AlignVCenter y = -( 0.5 * size.height() ); transform.translate( x, y ); return transform; } /*! Find the bounding rectangle for the label. The coordinates of the rectangle are relative to spacing + tick length from the backbone in direction of the tick. \param font Font used for painting \param value Value \return Bounding rectangle that is needed to draw a label */ QRectF QwtScaleDraw::labelRect( const QFont &font, double value ) const { QwtText lbl = tickLabel( font, value ); if ( lbl.isEmpty() ) return QRectF( 0.0, 0.0, 0.0, 0.0 ); const QPointF pos = labelPosition( value ); const QSizeF labelSize = lbl.textSize( font ); const QTransform transform = labelTransformation( pos, labelSize ); QRectF br = transform.mapRect( QRectF( QPointF( 0, 0 ), labelSize ) ); br.translate( -pos.x(), -pos.y() ); return br; } /*! Calculate the size that is needed to draw a label \param font Label font \param value Value \return Size that is needed to draw a label */ QSizeF QwtScaleDraw::labelSize( const QFont &font, double value ) const { return labelRect( font, value ).size(); } /*! Rotate all labels. When changing the rotation, it might be necessary to adjust the label flags too. Finding a useful combination is often the result of try and error. \param rotation Angle in degrees. When changing the label rotation, the label flags often needs to be adjusted too. \sa setLabelAlignment(), labelRotation(), labelAlignment(). */ void QwtScaleDraw::setLabelRotation( double rotation ) { d_data->labelRotation = rotation; } /*! \return the label rotation \sa setLabelRotation(), labelAlignment() */ double QwtScaleDraw::labelRotation() const { return d_data->labelRotation; } /*! \brief Change the label flags Labels are aligned to the point tick length + spacing away from the backbone. The alignment is relative to the orientation of the label text. In case of an flags of 0 the label will be aligned depending on the orientation of the scale: QwtScaleDraw::TopScale: Qt::AlignHCenter | Qt::AlignTop\n QwtScaleDraw::BottomScale: Qt::AlignHCenter | Qt::AlignBottom\n QwtScaleDraw::LeftScale: Qt::AlignLeft | Qt::AlignVCenter\n QwtScaleDraw::RightScale: Qt::AlignRight | Qt::AlignVCenter\n Changing the alignment is often necessary for rotated labels. \param alignment Or'd Qt::AlignmentFlags see \sa setLabelRotation(), labelRotation(), labelAlignment() \warning The various alignments might be confusing. The alignment of the label is not the alignment of the scale and is not the alignment of the flags ( QwtText::flags() ) returned from QwtAbstractScaleDraw::label(). */ void QwtScaleDraw::setLabelAlignment( Qt::Alignment alignment ) { d_data->labelAlignment = alignment; } /*! \return the label flags \sa setLabelAlignment(), labelRotation() */ Qt::Alignment QwtScaleDraw::labelAlignment() const { return d_data->labelAlignment; } /*! \param font Font \return the maximum width of a label */ int QwtScaleDraw::maxLabelWidth( const QFont &font ) const { double maxWidth = 0.0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.count(); i++ ) { const double v = ticks[i]; if ( scaleDiv().contains( v ) ) { const double w = labelSize( font, ticks[i] ).width(); if ( w > maxWidth ) maxWidth = w; } } return qCeil( maxWidth ); } /*! \param font Font \return the maximum height of a label */ int QwtScaleDraw::maxLabelHeight( const QFont &font ) const { double maxHeight = 0.0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.count(); i++ ) { const double v = ticks[i]; if ( scaleDiv().contains( v ) ) { const double h = labelSize( font, ticks[i] ).height(); if ( h > maxHeight ) maxHeight = h; } } return qCeil( maxHeight ); } void QwtScaleDraw::updateMap() { const QPointF pos = d_data->pos; double len = d_data->len; QwtScaleMap &sm = scaleMap(); if ( orientation() == Qt::Vertical ) sm.setPaintInterval( pos.y() + len, pos.y() ); else sm.setPaintInterval( pos.x(), pos.x() + len ); } linssid-2.7/qwt-lib/src/qwt_samples.h000644 001750 001750 00000011540 12151666701 020551 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SAMPLES_H #define QWT_SAMPLES_H 1 #include "qwt_global.h" #include "qwt_interval.h" #include #include //! \brief A sample of the types (x1-x2, y) or (x, y1-y2) class QWT_EXPORT QwtIntervalSample { public: QwtIntervalSample(); QwtIntervalSample( double, const QwtInterval & ); QwtIntervalSample( double value, double min, double max ); bool operator==( const QwtIntervalSample & ) const; bool operator!=( const QwtIntervalSample & ) const; //! Value double value; //! Interval QwtInterval interval; }; /*! Constructor The value is set to 0.0, the interval is invalid */ inline QwtIntervalSample::QwtIntervalSample(): value( 0.0 ) { } //! Constructor inline QwtIntervalSample::QwtIntervalSample( double v, const QwtInterval &intv ): value( v ), interval( intv ) { } //! Constructor inline QwtIntervalSample::QwtIntervalSample( double v, double min, double max ): value( v ), interval( min, max ) { } //! Compare operator inline bool QwtIntervalSample::operator==( const QwtIntervalSample &other ) const { return value == other.value && interval == other.interval; } //! Compare operator inline bool QwtIntervalSample::operator!=( const QwtIntervalSample &other ) const { return !( *this == other ); } //! \brief A sample of the types (x1...xn, y) or (x, y1..yn) class QWT_EXPORT QwtSetSample { public: QwtSetSample(); QwtSetSample( double, const QVector & = QVector() ); bool operator==( const QwtSetSample &other ) const; bool operator!=( const QwtSetSample &other ) const; double added() const; //! value double value; //! Vector of values associated to value QVector set; }; /*! Constructor The value is set to 0.0 */ inline QwtSetSample::QwtSetSample(): value( 0.0 ) { } /*! Constructor \param v Value \param s Set of values */ inline QwtSetSample::QwtSetSample( double v, const QVector< double > &s ): value( v ), set( s ) { } //! Compare operator inline bool QwtSetSample::operator==( const QwtSetSample &other ) const { return value == other.value && set == other.set; } //! Compare operator inline bool QwtSetSample::operator!=( const QwtSetSample &other ) const { return !( *this == other ); } //! \return All values of the set added inline double QwtSetSample::added() const { double y = 0.0; for ( int i = 0; i < set.size(); i++ ) y += set[i]; return y; } /*! \brief Open-High-Low-Close sample used in financial charts In financial charts the movement of a price in a time interval is often represented by the opening/closing prices and the lowest/highest prices in this interval. \sa QwtTradingChartData */ class QWT_EXPORT QwtOHLCSample { public: QwtOHLCSample( double time = 0.0, double open = 0.0, double high = 0.0, double low = 0.0, double close = 0.0 ); QwtInterval boundingInterval() const; bool isValid() const; /*! Time of the sample, usually a number representing a specific interval - like a day. */ double time; //! Opening price double open; //! Highest price double high; //! Lowest price double low; //! Closing price double close; }; /*! Constructor \param t Time value \param o Open value \param h High value \param l Low value \param c Close value */ inline QwtOHLCSample::QwtOHLCSample( double t, double o, double h, double l, double c ): time( t ), open( o ), high( h ), low( l ), close( c ) { } /*! \brief Check if a sample is valid A sample is valid, when all of the following checks are true: - low <= high - low <= open <= high - low <= close <= high \return True, when the sample is valid */ inline bool QwtOHLCSample::isValid() const { return ( low <= high ) && ( open >= low ) && ( open <= high ) && ( close >= low ) && ( close <= high ); } /*! \brief Calculate the bounding interval of the OHLC values For valid samples the limits of this interval are always low/high. \return Bounding interval \sa isValid() */ inline QwtInterval QwtOHLCSample::boundingInterval() const { double minY = open; minY = qMin( minY, high ); minY = qMin( minY, low ); minY = qMin( minY, close ); double maxY = open; maxY = qMax( maxY, high ); maxY = qMax( maxY, low ); maxY = qMax( maxY, close ); return QwtInterval( minY, maxY ); } #endif linssid-2.7/qwt-lib/src/qwt_abstract_scale.h000644 001750 001750 00000005533 12151666701 022064 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SCALE_H #define QWT_ABSTRACT_SCALE_H #include "qwt_global.h" #include class QwtScaleEngine; class QwtAbstractScaleDraw; class QwtScaleDiv; class QwtScaleMap; class QwtInterval; /*! \brief An abstract base class for widgets having a scale The scale of an QwtAbstractScale is determined by a QwtScaleDiv definition, that contains the boundaries and the ticks of the scale. The scale is painted using a QwtScaleDraw object. The scale division might be assigned explicitly - but usually it is calculated from the boundaries using a QwtScaleEngine. The scale engine also decides the type of transformation of the scale ( linear, logarithmic ... ). */ class QWT_EXPORT QwtAbstractScale: public QWidget { Q_OBJECT Q_PROPERTY( double lowerBound READ lowerBound WRITE setLowerBound ) Q_PROPERTY( double upperBound READ upperBound WRITE setUpperBound ) Q_PROPERTY( int scaleMaxMajor READ scaleMaxMajor WRITE setScaleMaxMajor ) Q_PROPERTY( int scaleMaxMinor READ scaleMaxMinor WRITE setScaleMaxMinor ) Q_PROPERTY( double scaleStepSize READ scaleStepSize WRITE setScaleStepSize ) public: QwtAbstractScale( QWidget *parent = NULL ); virtual ~QwtAbstractScale(); void setScale( double lowerBound, double upperBound ); void setScale( const QwtInterval & ); void setScale( const QwtScaleDiv & ); const QwtScaleDiv& scaleDiv() const; void setLowerBound( double value ); double lowerBound() const; void setUpperBound( double value ); double upperBound() const; void setScaleStepSize( double stepSize ); double scaleStepSize() const; void setScaleMaxMajor( int ticks ); int scaleMaxMinor() const; void setScaleMaxMinor( int ticks ); int scaleMaxMajor() const; void setScaleEngine( QwtScaleEngine * ); const QwtScaleEngine *scaleEngine() const; QwtScaleEngine *scaleEngine(); int transform( double ) const; double invTransform( int ) const; bool isInverted() const; double minimum() const; double maximum() const; const QwtScaleMap &scaleMap() const; protected: void rescale( double lowerBound, double upperBound, double stepSize ); void setAbstractScaleDraw( QwtAbstractScaleDraw * ); const QwtAbstractScaleDraw *abstractScaleDraw() const; QwtAbstractScaleDraw *abstractScaleDraw(); virtual void scaleChange(); private: void updateScaleDraw(); class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/linssid-app/Custom.h000664 001750 001750 00000002131 12366766335 017553 0ustar00warrenwarren000000 000000 /* * File: CustomEvents.h * Author: warren * * Created on November 4, 2012, 3:49 PM */ #ifndef CUSTOM_H #define CUSTOM_H #define LINSSIDVERSION "2.7" #define LINSSIDPREFSVER "2.3" #define LINSSIDDATALOGVER "2.3" #define DATAWANTED QEvent::User + 1 #define DATAREADY QEvent::User + 2 #define NUMBER_OF_COLORS 13 #define MAX_SAMPLES 100 #define TIME_PLOT_SCALE 100 #define MAX_TABLE_COLS 19 // as of version 2.3 #define VENDOR_FILE_NAME "/usr/share/linssid/oui.datb" #define PREFS_FILE_NAME ".linssid.prefs" #define LOG_DATA_FILE_NAME "LinSSID.datalog" enum wlPrivacy { none, WEP, WPA2 }; enum wlCipher { unknown, TKIP, AES }; enum passStatus { GOOD, BAD, CANCELLED, NOTNEEDED }; enum wlDriver { IOCTL, NL80211 }; // The colTitle enum must be in the same order as both the headerTitle array // and the tableHeader variable of the Qwt table enum colTitle { PLOT, SSID, MAC, CHANNEL, MODE, SECURITY, PRIVACY, CIPHER, FREQUENCY, QUALITY, SIGNAL, NOISE, MINSIGNAL, MAXSIGNAL, MBPS, FIRST_SEEN, LAST_SEEN, VENDOR, PROTOCOL, TYPE // TYPE not yet impl }; #endif /* CUSTOM_H */ linssid-2.7/qwt-lib/src/qwt_plot_textlabel.h000644 001750 001750 00000003435 12151666701 022133 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_TEXT_LABEL_H #define QWT_PLOT_TEXT_LABEL_H 1 #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_text.h" /*! \brief A plot item, which displays a text label QwtPlotTextLabel displays a text label aligned to the plot canvas. In opposite to QwtPlotMarker the position of the label is unrelated to plot coordinates. As drawing a text is an expensive operation the label is cached in a pixmap to speed up replots. \par Example The following code shows how to add a title. \verbatim QwtText title( "Plot Title" ); title.setRenderFlags( Qt::AlignHCenter | Qt::AlignTop ); QFont font; font.setBold( true ); title.setFont( font ); QwtPlotTextLabel *titleItem = new QwtPlotTextLabel(); titleItem->setText( title ); titleItem->attach( this ); \endverbatim \sa QwtPlotMarker */ class QWT_EXPORT QwtPlotTextLabel: public QwtPlotItem { public: QwtPlotTextLabel(); virtual ~QwtPlotTextLabel(); virtual int rtti() const; void setText( const QwtText & ); QwtText text() const; void setMargin( int margin ); int margin() const; virtual QRectF textRect( const QRectF &, const QSizeF & ) const; protected: virtual void draw( QPainter *, const QwtScaleMap &, const QwtScaleMap &, const QRectF &) const; void invalidateCache(); private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_date_scale_draw.cpp000644 001750 001750 00000015174 12151666703 022552 0ustar00warrenwarren000000 000000 #include "qwt_date_scale_draw.h" class QwtDateScaleDraw::PrivateData { public: PrivateData( Qt::TimeSpec spec ): timeSpec( spec ), utcOffset( 0 ), week0Type( QwtDate::FirstThursday ) { dateFormats[ QwtDate::Millisecond ] = "hh:mm:ss:zzz\nddd dd MMM yyyy"; dateFormats[ QwtDate::Second ] = "hh:mm:ss\nddd dd MMM yyyy"; dateFormats[ QwtDate::Minute ] = "hh:mm\nddd dd MMM yyyy"; dateFormats[ QwtDate::Hour ] = "hh:mm\nddd dd MMM yyyy"; dateFormats[ QwtDate::Day ] = "ddd dd MMM yyyy"; dateFormats[ QwtDate::Week ] = "Www yyyy"; dateFormats[ QwtDate::Month ] = "MMM yyyy"; dateFormats[ QwtDate::Year ] = "yyyy"; } Qt::TimeSpec timeSpec; int utcOffset; QwtDate::Week0Type week0Type; QString dateFormats[ QwtDate::Year + 1 ]; }; /*! \brief Constructor The default setting is to display tick labels for the given time specification. The first week of a year is defined like for QwtDate::FirstThursday. \param timeSpec Time specification \sa setTimeSpec(), setWeek0Type() */ QwtDateScaleDraw::QwtDateScaleDraw( Qt::TimeSpec timeSpec ) { d_data = new PrivateData( timeSpec ); } //! Destructor QwtDateScaleDraw::~QwtDateScaleDraw() { delete d_data; } /*! Set the time specification used for the tick labels \param timeSpec Time specification \sa timeSpec(), setUtcOffset(), toDateTime() */ void QwtDateScaleDraw::setTimeSpec( Qt::TimeSpec timeSpec ) { d_data->timeSpec = timeSpec; } /*! \return Time specification used for the tick labels \sa setTimeSpec(), utcOffset(), toDateTime() */ Qt::TimeSpec QwtDateScaleDraw::timeSpec() const { return d_data->timeSpec; } /*! Set the offset in seconds from Coordinated Universal Time \param seconds Offset in seconds \note The offset has no effect beside for the time specification Qt::OffsetFromUTC. \sa QDate::utcOffset(), setTimeSpec(), toDateTime() */ void QwtDateScaleDraw::setUtcOffset( int seconds ) { d_data->utcOffset = seconds; } /*! \return Offset in seconds from Coordinated Universal Time \note The offset has no effect beside for the time specification Qt::OffsetFromUTC. \sa QDate::setUtcOffset(), setTimeSpec(), toDateTime() */ int QwtDateScaleDraw::utcOffset() const { return d_data->utcOffset; } /*! Sets how to identify the first week of a year. \param week0Type Mode how to identify the first week of a year \sa week0Type(). \note week0Type has no effect beside for intervals classified as QwtDate::Week. */ void QwtDateScaleDraw::setWeek0Type( QwtDate::Week0Type week0Type ) { d_data->week0Type = week0Type; } /*! \return Setting how to identify the first week of a year. \sa setWeek0Type() */ QwtDate::Week0Type QwtDateScaleDraw::week0Type() const { return d_data->week0Type; } /*! Set the default format string for an datetime interval type \param intervalType Interval type \param format Default format string \sa dateFormat(), dateFormatOfDate(), QwtDate::toString() */ void QwtDateScaleDraw::setDateFormat( QwtDate::IntervalType intervalType, const QString &format ) { if ( intervalType >= QwtDate::Millisecond && intervalType <= QwtDate::Year ) { d_data->dateFormats[ intervalType ] = format; } } /*! \param intervalType Interval type \return Default format string for an datetime interval type \sa setDateFormat(), dateFormatOfDate() */ QString QwtDateScaleDraw::dateFormat( QwtDate::IntervalType intervalType ) const { if ( intervalType >= QwtDate::Millisecond && intervalType <= QwtDate::Year ) { return d_data->dateFormats[ intervalType ]; } return QString::null; } /*! Format string for the representation of a datetime dateFormatOfDate() is intended to be overloaded for situations, where formats are individual for specific datetime values. The default setting ignores dateTime and return the default format for the interval type. \param dateTime Datetime value \param intervalType Interval type \return Format string \sa setDateFormat(), QwtDate::toString() */ QString QwtDateScaleDraw::dateFormatOfDate( const QDateTime &dateTime, QwtDate::IntervalType intervalType ) const { Q_UNUSED( dateTime ) if ( intervalType >= QwtDate::Millisecond && intervalType <= QwtDate::Year ) { return d_data->dateFormats[ intervalType ]; } return d_data->dateFormats[ QwtDate::Second ]; } /*! \brief Convert a value into its representing label The value is converted to a datetime value using toDateTime() and converted to a plain text using QwtDate::toString(). \param value Value \return Label string. \sa dateFormatOfDate() */ QwtText QwtDateScaleDraw::label( double value ) const { const QDateTime dt = toDateTime( value ); const QString fmt = dateFormatOfDate( dt, intervalType( scaleDiv() ) ); return QwtDate::toString( dt, fmt, d_data->week0Type ); } /*! Find the less detailed datetime unit, where no rounding errors happen. \param scaleDiv Scale division \return Interval type \sa dateFormatOfDate() */ QwtDate::IntervalType QwtDateScaleDraw::intervalType( const QwtScaleDiv &scaleDiv ) const { int intvType = QwtDate::Year; bool alignedToWeeks = true; const QList ticks = scaleDiv.ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.size(); i++ ) { const QDateTime dt = toDateTime( ticks[i] ); for ( int j = QwtDate::Second; j <= intvType; j++ ) { const QDateTime dt0 = QwtDate::floor( dt, static_cast( j ) ); if ( dt0 != dt ) { if ( j == QwtDate::Week ) { alignedToWeeks = false; } else { intvType = j - 1; break; } } } if ( intvType == QwtDate::Millisecond ) break; } if ( intvType == QwtDate::Week && !alignedToWeeks ) intvType = QwtDate::Day; return static_cast( intvType ); } /*! Translate a double value into a QDateTime object. \return QDateTime object initialized with timeSpec() and utcOffset(). \sa timeSpec(), utcOffset(), QwtDate::toDateTime() */ QDateTime QwtDateScaleDraw::toDateTime( double value ) const { QDateTime dt = QwtDate::toDateTime( value, d_data->timeSpec ); if ( d_data->timeSpec == Qt::OffsetFromUTC ) { dt = dt.addSecs( d_data->utcOffset ); dt.setUtcOffset( d_data->utcOffset ); } return dt; } linssid-2.7/qwt-lib/src/qwt_text_label.h000644 001750 001750 00000003466 12151666701 021240 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_LABEL_H #define QWT_TEXT_LABEL_H #include "qwt_global.h" #include "qwt_text.h" #include class QString; class QPaintEvent; class QPainter; /*! \brief A Widget which displays a QwtText */ class QWT_EXPORT QwtTextLabel : public QFrame { Q_OBJECT Q_PROPERTY( int indent READ indent WRITE setIndent ) Q_PROPERTY( int margin READ margin WRITE setMargin ) Q_PROPERTY( QString plainText READ plainText WRITE setPlainText ) public: explicit QwtTextLabel( QWidget *parent = NULL ); explicit QwtTextLabel( const QwtText &, QWidget *parent = NULL ); virtual ~QwtTextLabel(); void setPlainText( const QString & ); QString plainText() const; public Q_SLOTS: void setText( const QString &, QwtText::TextFormat textFormat = QwtText::AutoText ); virtual void setText( const QwtText & ); void clear(); public: const QwtText &text() const; int indent() const; void setIndent( int ); int margin() const; void setMargin( int ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual int heightForWidth( int ) const; QRect textRect() const; virtual void drawText( QPainter *, const QRectF & ); protected: virtual void paintEvent( QPaintEvent *e ); virtual void drawContents( QPainter * ); private: void init(); int defaultIndent() const; class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/textengines/mathml/qwt_mathml_text_engine.h000644 001750 001750 00000003120 12151666702 026004 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ // vim: expandtab #ifndef QWT_MATHML_TEXT_ENGINE_H #define QWT_MATHML_TEXT_ENGINE_H 1 #include "qwt_text_engine.h" /*! \brief Text Engine for the MathML renderer of the Qt solutions package. To enable MathML support the following code needs to be added to the application: \verbatim #include QwtText::setTextEngine(QwtText::MathMLText, new QwtMathMLTextEngine()); \endverbatim \sa QwtTextEngine, QwtText::setTextEngine \warning Unfortunately the MathML renderer doesn't support rotating of texts. */ class QWT_EXPORT QwtMathMLTextEngine: public QwtTextEngine { public: QwtMathMLTextEngine(); virtual ~QwtMathMLTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_barchart.h000644 001750 001750 00000006746 12151666702 021746 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_BAR_CHART_H #define QWT_PLOT_BAR_CHART_H #include "qwt_global.h" #include "qwt_plot_abstract_barchart.h" #include "qwt_series_data.h" class QwtColumnRect; class QwtColumnSymbol; /*! \brief QwtPlotBarChart displays a series of a values as bars. Each bar might be customized individually by implementing a specialSymbol(). Otherwise it is rendered using a default symbol. Depending on its orientation() the bars are displayed horizontally or vertically. The bars cover the interval between the baseline() and the value. By activating the LegendBarTitles mode each sample will have its own entry on the legend. The most common use case of a bar chart is to display a list of y coordinates, where the x coordinate is simply the index in the list. But for other situations ( f.e. when values are related to dates ) it is also possible to set x coordinates explicitly. \sa QwtPlotMultiBarChart, QwtPlotHistogram, QwtPlotCurve::Sticks, QwtPlotSeriesItem::orientation(), QwtPlotAbstractBarChart::baseline() */ class QWT_EXPORT QwtPlotBarChart: public QwtPlotAbstractBarChart, public QwtSeriesStore { public: /*! \brief Legend modes. The default setting is QwtPlotBarChart::LegendChartTitle. \sa setLegendMode(), legendMode() */ enum LegendMode { /*! One entry on the legend showing the default symbol and the title() of the chart \sa QwtPlotItem::title() */ LegendChartTitle, /*! One entry for each value showing the individual symbol of the corresponding bar and the bar title. \sa specialSymbol(), barTitle() */ LegendBarTitles }; explicit QwtPlotBarChart( const QString &title = QString::null ); explicit QwtPlotBarChart( const QwtText &title ); virtual ~QwtPlotBarChart(); virtual int rtti() const; void setSamples( const QVector & ); void setSamples( const QVector & ); void setSamples( QwtSeriesData *series ); void setSymbol( QwtColumnSymbol * ); const QwtColumnSymbol *symbol() const; void setLegendMode( LegendMode ); LegendMode legendMode() const; virtual void drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QwtColumnSymbol *specialSymbol( int sampleIndex, const QPointF& ) const; virtual QwtText barTitle( int sampleIndex ) const; protected: virtual void drawSample( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, const QwtInterval &boundingInterval, int index, const QPointF& sample ) const; virtual void drawBar( QPainter *, int sampleIndex, const QPointF& point, const QwtColumnRect & ) const; QList legendData() const; QwtGraphic legendIcon( int index, const QSizeF & ) const; private: void init(); class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_series_store.h000644 001750 001750 00000011320 12151666702 021610 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SERIES_STORE_H #define QWT_SERIES_STORE_H #include "qwt_global.h" #include "qwt_series_data.h" /*! \brief Bridge between QwtSeriesStore and QwtPlotSeriesItem QwtAbstractSeriesStore is an abstract interface only to make it possible to isolate the template based methods ( QwtSeriesStore ) from the regular methods ( QwtPlotSeriesItem ) to make it possible to derive from QwtPlotSeriesItem without any hassle with templates. */ class QwtAbstractSeriesStore { protected: //! Destructor virtual ~QwtAbstractSeriesStore() {} //! dataChanged() indicates, that the series has been changed. virtual void dataChanged() = 0; /*! Set a the "rectangle of interest" for the stored series \sa QwtSeriesData::setRectOfInterest() */ virtual void setRectOfInterest( const QRectF & ) = 0; //! \return Bounding rectangle of the stored series virtual QRectF dataRect() const = 0; //! \return Number of samples virtual size_t dataSize() const = 0; }; /*! \brief Class storing a QwtSeriesData object QwtSeriesStore and QwtPlotSeriesItem are intended as base classes for all plot items iterating over a series of samples. Both classes share a virtual base class ( QwtAbstractSeriesStore ) to bridge between them. QwtSeriesStore offers the template based part for the plot item API, so that QwtPlotSeriesItem can be derived without any hassle with templates. */ template class QwtSeriesStore: public virtual QwtAbstractSeriesStore { public: /*! \brief Constructor The store contains no series */ explicit QwtSeriesStore(); //! Destructor ~QwtSeriesStore(); /*! Assign a series of samples \param series Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void setData( QwtSeriesData *series ); //! \return the the series data QwtSeriesData *data(); //! \return the the series data const QwtSeriesData *data() const; /*! \param index Index \return Sample at position index */ T sample( int index ) const; /*! \return Number of samples of the series \sa setData(), QwtSeriesData::size() */ virtual size_t dataSize() const; /*! \return Bounding rectangle of the series or an invalid rectangle, when no series is stored \sa QwtSeriesData::boundingRect() */ virtual QRectF dataRect() const; /*! Set a the "rect of interest" for the series \param rect Rectangle of interest \sa QwtSeriesData::setRectOfInterest() */ virtual void setRectOfInterest( const QRectF &rect ); /*! Replace a series without deleting the previous one \param series New series \return Previously assigned series */ QwtSeriesData *swapData( QwtSeriesData *series ); private: QwtSeriesData *d_series; }; template QwtSeriesStore::QwtSeriesStore(): d_series( NULL ) { } template QwtSeriesStore::~QwtSeriesStore() { delete d_series; } template inline QwtSeriesData *QwtSeriesStore::data() { return d_series; } template inline const QwtSeriesData *QwtSeriesStore::data() const { return d_series; } template inline T QwtSeriesStore::sample( int index ) const { return d_series ? d_series->sample( index ) : T(); } template void QwtSeriesStore::setData( QwtSeriesData *series ) { if ( d_series != series ) { delete d_series; d_series = series; dataChanged(); } } template size_t QwtSeriesStore::dataSize() const { if ( d_series == NULL ) return 0; return d_series->size(); } template QRectF QwtSeriesStore::dataRect() const { if ( d_series == NULL ) return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid return d_series->boundingRect(); } template void QwtSeriesStore::setRectOfInterest( const QRectF &rect ) { if ( d_series ) d_series->setRectOfInterest( rect ); } template QwtSeriesData* QwtSeriesStore::swapData( QwtSeriesData *series ) { QwtSeriesData * swappedSeries = d_series; d_series = series; return swappedSeries; } #endif linssid-2.7/debian/changelog000664 001750 001750 00000010261 12367024464 016773 0ustar00warrenwarren000000 000000 linssid (2.7-1) trusty; urgency=low * Hopefully fix occassional hangs in some configs where program hangs if scanning while interface connected to attach point * Update vendor data file -- Warren Severin Fri, 01 Aug 2014 17:00:00 -0700 linssid (2.6-1) trusty; urgency=low * Fix bug in interface detection commands to system * Static link to libboost_regex.a for those installing .deb on old distros * Update vendor data file -- Warren Severin Mon, 14 Jul 2014 10:00:00 -0700 linssid (2.5-1) trusty; urgency=low * Fixes an issue with the way that the zsh shell interprets commands. -- Warren Severin Mon, 07 Jul 2014 20:00:00 -0700 linssid (2.4-1) trusty; urgency=low * Code same as 2.3-1 and 2.3-2. Still in a tussle with Launchpad to get a i386 build. -- Warren Severin Mon, 07 Jul 2014 10:00:00 -0700 linssid (2.3-2) trusty; urgency=low * Fixed issue in build process that caused failure to build in chroot i386 environment. -- Warren Severin Sun, 06 Jul 2014 08:00:00 -0700 linssid (2.3-1) trusty; urgency=low * Fixed issue with RTL8187SE card and driver not providing frequency resulting in LinSSID crash or hang. * Renamed the column that displays WEP, WPA2, etc., to "Privacy". * Added column for Protocol {a,b,g,n}. (Note that many drivers do not report protocol.) * Modified data logging format to reflect as above * Added buttons for immediate clear or set of plotting of all visible attach points * Improved response to Plot column check boxes * Cleaned up a few minor bugs * Updated vendor database -- Warren Severin Sat, 05 Jul 2014 16:00:00 -0700 linssid (2.2-1) trusty; urgency=low * Now built with QT5 * Add a small status message to the top panel * A couple of invisible bug fixes * Updated vendor database -- Warren Severin Mon, 09 Jun 2014 11:01:13 -0700 linssid (2.1-1) precise; urgency=low * Fixes some interfaces not being discovered when 'up' but not 'connected' * Updated vendor database -- Warren Severin Sat, 22 Jun 2013 15:15:00 -0700 linssid (2.0-1) precise; urgency=low * Fix, hopefully, for the non-discovery of some wireless interfaces. * Updated vendor database -- Warren Severin Thu, 02 May 2013 13:49:00 -0700 linssid (1.9-1) precise; urgency=low * Features - Data logging to ~/LinSSID.datalog - Anti-aliased plots - Updated vendor database -- Warren Severin Fri, 01 Feb 2013 17:47:36 -0700 linssid (1.8a-1) precise; urgency=low * Additional fix to password handling -- Warren Severin Mon, 07 Jan 2013 08:41:36 -0700 linssid (1.8-1) precise; urgency=low * Stability improvement build - Improved odd character handling in password verification - Improved initialization of default values on intial install or upgrade - Improved wireless port discovery -- Warren Severin Sun, 06 Jan 2013 19:54:42 -0700 linssid (1.7-1) precise; urgency=low * Adds horizontal grid lines to plots * Adds plot scaling * Adds a minimal prefs dialog to adjust the above -- Warren Severin Sat, 05 Jan 2013 14:33:20 -0700 linssid (1.6-1) precise; urgency=low * Stability enhancements. Fixes for driver misbehavior. Some cosmetic changes. * - Workaround for drivers that report a MAC more than once per scan * - Fix code to deal with drivers that refuse to scan when asked * Centers most text in cells -- Warren Severin Tue, 01 Jan 2013 20:12:18 -0700 linssid (1.5-1) precise; urgency=low * Saves window layout between sessions -- Warren Severin Mon, 31 Dec 2012 15:17:45 -0700 linssid (1.4-1) precise; urgency=low * Impose minimum wait of 0.5 seconds between scans * Improve concurrency of scanning and screen updates * Update OUI vendor data -- Warren Severin Thu, 27 Dec 2012 09:19:49 -0700 linssid (1.3-1) precise; urgency=low * Initial release -- Warren Severin Tue, 25 Dec 2012 15:16:40 -0700 linssid-2.7/qwt-lib/src/qwt_null_paintdevice.cpp000644 001750 001750 00000032017 12151666703 022771 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_null_paintdevice.h" #include #include class QwtNullPaintDevice::PrivateData { public: PrivateData(): mode( QwtNullPaintDevice::NormalMode ) { } QwtNullPaintDevice::Mode mode; }; class QwtNullPaintDevice::PaintEngine: public QPaintEngine { public: PaintEngine(); virtual bool begin( QPaintDevice * ); virtual bool end(); virtual Type type () const; virtual void updateState(const QPaintEngineState &); virtual void drawRects(const QRect *, int ); virtual void drawRects(const QRectF *, int ); virtual void drawLines(const QLine *, int ); virtual void drawLines(const QLineF *, int ); virtual void drawEllipse(const QRectF &); virtual void drawEllipse(const QRect &); virtual void drawPath(const QPainterPath &); virtual void drawPoints(const QPointF *, int ); virtual void drawPoints(const QPoint *, int ); virtual void drawPolygon(const QPointF *, int , PolygonDrawMode ); virtual void drawPolygon(const QPoint *, int , PolygonDrawMode ); virtual void drawPixmap(const QRectF &, const QPixmap &, const QRectF &); virtual void drawTextItem(const QPointF &, const QTextItem &); virtual void drawTiledPixmap(const QRectF &, const QPixmap &, const QPointF &s); virtual void drawImage(const QRectF &, const QImage &, const QRectF &, Qt::ImageConversionFlags ); private: QwtNullPaintDevice *nullDevice(); }; QwtNullPaintDevice::PaintEngine::PaintEngine(): QPaintEngine( QPaintEngine::AllFeatures ) { } bool QwtNullPaintDevice::PaintEngine::begin( QPaintDevice * ) { setActive( true ); return true; } bool QwtNullPaintDevice::PaintEngine::end() { setActive( false ); return true; } QPaintEngine::Type QwtNullPaintDevice::PaintEngine::type() const { return QPaintEngine::User; } void QwtNullPaintDevice::PaintEngine::drawRects( const QRect *rects, int rectCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawRects( rects, rectCount ); return; } device->drawRects( rects, rectCount ); } void QwtNullPaintDevice::PaintEngine::drawRects( const QRectF *rects, int rectCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawRects( rects, rectCount ); return; } device->drawRects( rects, rectCount ); } void QwtNullPaintDevice::PaintEngine::drawLines( const QLine *lines, int lineCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawLines( lines, lineCount ); return; } device->drawLines( lines, lineCount ); } void QwtNullPaintDevice::PaintEngine::drawLines( const QLineF *lines, int lineCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawLines( lines, lineCount ); return; } device->drawLines( lines, lineCount ); } void QwtNullPaintDevice::PaintEngine::drawEllipse( const QRectF &rect) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawEllipse( rect ); return; } device->drawEllipse( rect ); } void QwtNullPaintDevice::PaintEngine::drawEllipse( const QRect &rect) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawEllipse( rect ); return; } device->drawEllipse( rect ); } void QwtNullPaintDevice::PaintEngine::drawPath( const QPainterPath &path) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; device->drawPath( path ); } void QwtNullPaintDevice::PaintEngine::drawPoints( const QPointF *points, int pointCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawPoints( points, pointCount ); return; } device->drawPoints( points, pointCount ); } void QwtNullPaintDevice::PaintEngine::drawPoints( const QPoint *points, int pointCount) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawPoints( points, pointCount ); return; } device->drawPoints( points, pointCount ); } void QwtNullPaintDevice::PaintEngine::drawPolygon( const QPointF *points, int pointCount, PolygonDrawMode mode) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() == QwtNullPaintDevice::PathMode ) { QPainterPath path; if ( pointCount > 0 ) { path.moveTo( points[0] ); for ( int i = 1; i < pointCount; i++ ) path.lineTo( points[i] ); if ( mode != PolylineMode ) path.closeSubpath(); } device->drawPath( path ); return; } device->drawPolygon( points, pointCount, mode ); } void QwtNullPaintDevice::PaintEngine::drawPolygon( const QPoint *points, int pointCount, PolygonDrawMode mode) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() == QwtNullPaintDevice::PathMode ) { QPainterPath path; if ( pointCount > 0 ) { path.moveTo( points[0] ); for ( int i = 1; i < pointCount; i++ ) path.lineTo( points[i] ); if ( mode != PolylineMode ) path.closeSubpath(); } device->drawPath( path ); return; } device->drawPolygon( points, pointCount, mode ); } void QwtNullPaintDevice::PaintEngine::drawPixmap( const QRectF &rect, const QPixmap &pm, const QRectF &subRect ) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; device->drawPixmap( rect, pm, subRect ); } void QwtNullPaintDevice::PaintEngine::drawTextItem( const QPointF &pos, const QTextItem &textItem) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawTextItem( pos, textItem ); return; } device->drawTextItem( pos, textItem ); } void QwtNullPaintDevice::PaintEngine::drawTiledPixmap( const QRectF &rect, const QPixmap &pixmap, const QPointF &subRect) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; if ( device->mode() != QwtNullPaintDevice::NormalMode ) { QPaintEngine::drawTiledPixmap( rect, pixmap, subRect ); return; } device->drawTiledPixmap( rect, pixmap, subRect ); } void QwtNullPaintDevice::PaintEngine::drawImage( const QRectF &rect, const QImage &image, const QRectF &subRect, Qt::ImageConversionFlags flags) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; device->drawImage( rect, image, subRect, flags ); } void QwtNullPaintDevice::PaintEngine::updateState( const QPaintEngineState &state) { QwtNullPaintDevice *device = nullDevice(); if ( device == NULL ) return; device->updateState( state ); } inline QwtNullPaintDevice *QwtNullPaintDevice::PaintEngine::nullDevice() { if ( !isActive() ) return NULL; return static_cast( paintDevice() ); } //! Constructor QwtNullPaintDevice::QwtNullPaintDevice(): d_engine( NULL ) { d_data = new PrivateData; } //! Destructor QwtNullPaintDevice::~QwtNullPaintDevice() { delete d_engine; delete d_data; } /*! Set the render mode \param mode New mode \sa mode() */ void QwtNullPaintDevice::setMode( Mode mode ) { d_data->mode = mode; } /*! \return Render mode \sa setMode() */ QwtNullPaintDevice::Mode QwtNullPaintDevice::mode() const { return d_data->mode; } //! See QPaintDevice::paintEngine() QPaintEngine *QwtNullPaintDevice::paintEngine() const { if ( d_engine == NULL ) { QwtNullPaintDevice *that = const_cast< QwtNullPaintDevice * >( this ); that->d_engine = new PaintEngine(); } return d_engine; } /*! See QPaintDevice::metric() \param deviceMetric Type of metric \return Metric information for the given paint device metric. \sa sizeMetrics() */ int QwtNullPaintDevice::metric( PaintDeviceMetric deviceMetric ) const { int value; switch ( deviceMetric ) { case PdmWidth: { value = sizeMetrics().width(); break; } case PdmHeight: { value = sizeMetrics().height(); break; } case PdmNumColors: { value = 0xffffffff; break; } case PdmDepth: { value = 32; break; } case PdmPhysicalDpiX: case PdmPhysicalDpiY: case PdmDpiY: case PdmDpiX: { value = 72; break; } case PdmWidthMM: { value = qRound( metric( PdmWidth ) * 25.4 / metric( PdmDpiX ) ); break; } case PdmHeightMM: { value = qRound( metric( PdmHeight ) * 25.4 / metric( PdmDpiY ) ); break; } default: value = 0; } return value; } //! See QPaintEngine::drawRects() void QwtNullPaintDevice::drawRects( const QRect *rects, int rectCount) { Q_UNUSED(rects); Q_UNUSED(rectCount); } //! See QPaintEngine::drawRects() void QwtNullPaintDevice::drawRects( const QRectF *rects, int rectCount) { Q_UNUSED(rects); Q_UNUSED(rectCount); } //! See QPaintEngine::drawLines() void QwtNullPaintDevice::drawLines( const QLine *lines, int lineCount) { Q_UNUSED(lines); Q_UNUSED(lineCount); } //! See QPaintEngine::drawLines() void QwtNullPaintDevice::drawLines( const QLineF *lines, int lineCount) { Q_UNUSED(lines); Q_UNUSED(lineCount); } //! See QPaintEngine::drawEllipse() void QwtNullPaintDevice::drawEllipse( const QRectF &rect ) { Q_UNUSED(rect); } //! See QPaintEngine::drawEllipse() void QwtNullPaintDevice::drawEllipse( const QRect &rect ) { Q_UNUSED(rect); } //! See QPaintEngine::drawPath() void QwtNullPaintDevice::drawPath( const QPainterPath &path ) { Q_UNUSED(path); } //! See QPaintEngine::drawPoints() void QwtNullPaintDevice::drawPoints( const QPointF *points, int pointCount) { Q_UNUSED(points); Q_UNUSED(pointCount); } //! See QPaintEngine::drawPoints() void QwtNullPaintDevice::drawPoints( const QPoint *points, int pointCount) { Q_UNUSED(points); Q_UNUSED(pointCount); } //! See QPaintEngine::drawPolygon() void QwtNullPaintDevice::drawPolygon( const QPointF *points, int pointCount, QPaintEngine::PolygonDrawMode mode) { Q_UNUSED(points); Q_UNUSED(pointCount); Q_UNUSED(mode); } //! See QPaintEngine::drawPolygon() void QwtNullPaintDevice::drawPolygon( const QPoint *points, int pointCount, QPaintEngine::PolygonDrawMode mode) { Q_UNUSED(points); Q_UNUSED(pointCount); Q_UNUSED(mode); } //! See QPaintEngine::drawPixmap() void QwtNullPaintDevice::drawPixmap( const QRectF &rect, const QPixmap &pm, const QRectF &subRect ) { Q_UNUSED(rect); Q_UNUSED(pm); Q_UNUSED(subRect); } //! See QPaintEngine::drawTextItem() void QwtNullPaintDevice::drawTextItem( const QPointF &pos, const QTextItem &textItem) { Q_UNUSED(pos); Q_UNUSED(textItem); } //! See QPaintEngine::drawTiledPixmap() void QwtNullPaintDevice::drawTiledPixmap( const QRectF &rect, const QPixmap &pixmap, const QPointF &subRect) { Q_UNUSED(rect); Q_UNUSED(pixmap); Q_UNUSED(subRect); } //! See QPaintEngine::drawImage() void QwtNullPaintDevice::drawImage( const QRectF &rect, const QImage &image, const QRectF &subRect, Qt::ImageConversionFlags flags) { Q_UNUSED(rect); Q_UNUSED(image); Q_UNUSED(subRect); Q_UNUSED(flags); } //! See QPaintEngine::updateState() void QwtNullPaintDevice::updateState( const QPaintEngineState &state ) { Q_UNUSED(state); } linssid-2.7/linssid-app/linssid-pause.png000644 001750 001750 00000002171 12355414341 021401 0ustar00warrenwarren000000 000000 PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx}Oh\Ud&3ɤd`R n:ͪ ,.#S•VE7P]! )08ҙLf&pGr>o|{@}' rN>#+^'HN  Ӝ.⁄ 9 %i2fZKX.TSZlPB!PTg^Ѡܲ;FcኯthpA )a_Ya"9uwj}Š(9]qBWJ6MFD#cl W}Uy\(%#8!^إC[ ~f%Yv?jANj-WgXB\ w O(Q[-6(GgH?f5;Rq^>L@:-h1IEH 2UPsn1F>lxgSyV_OK׳`v<Х{,!ğHK%O0;9 nqy O!-Iz:qY"ߥŎM6 #!+(RӉ0MyxtM ;F'`D)LQG$0*ŕEIFcun2N4: DDEl@70;-V cS I 0d@ncKyDn? /l%aqɮ=Sj 9 zǼUSVp))HȈ #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #define qExp(x) ::exp(x) #endif static inline double qwtLog( double base, double value ) { return log( value ) / log( base ); } static inline QwtInterval qwtLogInterval( double base, const QwtInterval &interval ) { return QwtInterval( qwtLog( base, interval.minValue() ), qwtLog( base, interval.maxValue() ) ); } static inline QwtInterval qwtPowInterval( double base, const QwtInterval &interval ) { return QwtInterval( qPow( base, interval.minValue() ), qPow( base, interval.maxValue() ) ); } #if 1 // this version often doesn't find the best ticks: f.e for 15: 5, 10 static double qwtStepSize( double intervalSize, int maxSteps, uint base ) { const double minStep = QwtScaleArithmetic::divideInterval( intervalSize, maxSteps, base ); if ( minStep != 0.0 ) { // # ticks per interval const int numTicks = qCeil( qAbs( intervalSize / minStep ) ) - 1; // Do the minor steps fit into the interval? if ( qwtFuzzyCompare( ( numTicks + 1 ) * qAbs( minStep ), qAbs( intervalSize ), intervalSize ) > 0 ) { // The minor steps doesn't fit into the interval return 0.5 * intervalSize; } } return minStep; } #else static double qwtStepSize( double intervalSize, int maxSteps, uint base ) { if ( maxSteps <= 0 ) return 0.0; if ( maxSteps > 2 ) { for ( int numSteps = maxSteps; numSteps > 1; numSteps-- ) { const double stepSize = intervalSize / numSteps; const double p = ::floor( ::log( stepSize ) / ::log( base ) ); const double fraction = qPow( base, p ); for ( uint n = base; n > 1; n /= 2 ) { if ( qFuzzyCompare( stepSize, n * fraction ) ) return stepSize; if ( n == 3 && ( base % 2 ) == 0 ) { if ( qFuzzyCompare( stepSize, 2 * fraction ) ) return stepSize; } } } } return intervalSize * 0.5; } #endif static const double _eps = 1.0e-6; /*! Ceil a value, relative to an interval \param value Value to be ceiled \param intervalSize Interval size \return Rounded value \sa floorEps() */ double QwtScaleArithmetic::ceilEps( double value, double intervalSize ) { const double eps = _eps * intervalSize; value = ( value - eps ) / intervalSize; return ::ceil( value ) * intervalSize; } /*! Floor a value, relative to an interval \param value Value to be floored \param intervalSize Interval size \return Rounded value \sa floorEps() */ double QwtScaleArithmetic::floorEps( double value, double intervalSize ) { const double eps = _eps * intervalSize; value = ( value + eps ) / intervalSize; return ::floor( value ) * intervalSize; } /*! \brief Divide an interval into steps \f$stepSize = (intervalSize - intervalSize * 10e^{-6}) / numSteps\f$ \param intervalSize Interval size \param numSteps Number of steps \return Step size */ double QwtScaleArithmetic::divideEps( double intervalSize, double numSteps ) { if ( numSteps == 0.0 || intervalSize == 0.0 ) return 0.0; return ( intervalSize - ( _eps * intervalSize ) ) / numSteps; } /*! Calculate a step size for a given interval \param intervalSize Interval size \param numSteps Number of steps \param base Base for the division ( usually 10 ) \return Calculated step size */ double QwtScaleArithmetic::divideInterval( double intervalSize, int numSteps, uint base ) { if ( numSteps <= 0 ) return 0.0; const double v = QwtScaleArithmetic::divideEps( intervalSize, numSteps ); if ( v == 0.0 ) return 0.0; const double lx = qwtLog( base, qFabs( v ) ); const double p = ::floor( lx ); const double fraction = qPow( base, lx - p ); uint n = base; while ( ( n > 1 ) && ( fraction <= n / 2 ) ) n /= 2; double stepSize = n * qPow( base, p ); if ( v < 0 ) stepSize = -stepSize; return stepSize; } class QwtScaleEngine::PrivateData { public: PrivateData(): attributes( QwtScaleEngine::NoAttribute ), lowerMargin( 0.0 ), upperMargin( 0.0 ), referenceValue( 0.0 ), base( 10 ), transform( NULL ) { } ~PrivateData() { delete transform; } QwtScaleEngine::Attributes attributes; double lowerMargin; double upperMargin; double referenceValue; uint base; QwtTransform* transform; }; /*! Constructor \param base Base of the scale engine \sa setBase() */ QwtScaleEngine::QwtScaleEngine( uint base ) { d_data = new PrivateData; setBase( base ); } //! Destructor QwtScaleEngine::~QwtScaleEngine () { delete d_data; } /*! Assign a transformation \param transform Transformation The transformation object is used as factory for clones that are returned by transformation() The scale engine takes ownership of the transformation. \sa QwtTransform::copy(), transformation() */ void QwtScaleEngine::setTransformation( QwtTransform *transform ) { if ( transform != d_data->transform ) { delete d_data->transform; d_data->transform = transform; } } /*! Create and return a clone of the transformation of the engine. When the engine has no special transformation NULL is returned, indicating no transformation. \return A clone of the transfomation \sa setTransformation() */ QwtTransform *QwtScaleEngine::transformation() const { QwtTransform *transform = NULL; if ( d_data->transform ) transform = d_data->transform->copy(); return transform; } /*! \return the margin at the lower end of the scale The default margin is 0. \sa setMargins() */ double QwtScaleEngine::lowerMargin() const { return d_data->lowerMargin; } /*! \return the margin at the upper end of the scale The default margin is 0. \sa setMargins() */ double QwtScaleEngine::upperMargin() const { return d_data->upperMargin; } /*! \brief Specify margins at the scale's endpoints \param lower minimum distance between the scale's lower boundary and the smallest enclosed value \param upper minimum distance between the scale's upper boundary and the greatest enclosed value Margins can be used to leave a minimum amount of space between the enclosed intervals and the boundaries of the scale. \warning \li QwtLogScaleEngine measures the margins in decades. \sa upperMargin(), lowerMargin() */ void QwtScaleEngine::setMargins( double lower, double upper ) { d_data->lowerMargin = qMax( lower, 0.0 ); d_data->upperMargin = qMax( upper, 0.0 ); } /*! Calculate a step size for an interval size \param intervalSize Interval size \param numSteps Number of steps \return Step size */ double QwtScaleEngine::divideInterval( double intervalSize, int numSteps ) const { return QwtScaleArithmetic::divideInterval( intervalSize, numSteps, d_data->base ); } /*! Check if an interval "contains" a value \param interval Interval \param value Value \return True, when the value is inside the interval */ bool QwtScaleEngine::contains( const QwtInterval &interval, double value ) const { if ( !interval.isValid() ) return false; if ( qwtFuzzyCompare( value, interval.minValue(), interval.width() ) < 0 ) return false; if ( qwtFuzzyCompare( value, interval.maxValue(), interval.width() ) > 0 ) return false; return true; } /*! Remove ticks from a list, that are not inside an interval \param ticks Tick list \param interval Interval \return Stripped tick list */ QList QwtScaleEngine::strip( const QList& ticks, const QwtInterval &interval ) const { if ( !interval.isValid() || ticks.count() == 0 ) return QList(); if ( contains( interval, ticks.first() ) && contains( interval, ticks.last() ) ) { return ticks; } QList strippedTicks; for ( int i = 0; i < ticks.count(); i++ ) { if ( contains( interval, ticks[i] ) ) strippedTicks += ticks[i]; } return strippedTicks; } /*! \brief Build an interval around a value In case of v == 0.0 the interval is [-0.5, 0.5], otherwide it is [0.5 * v, 1.5 * v] \param value Initial value \return Calculated interval */ QwtInterval QwtScaleEngine::buildInterval( double value ) const { const double delta = ( value == 0.0 ) ? 0.5 : qAbs( 0.5 * value ); if ( DBL_MAX - delta < value ) return QwtInterval( DBL_MAX - delta, DBL_MAX ); if ( -DBL_MAX + delta > value ) return QwtInterval( -DBL_MAX, -DBL_MAX + delta ); return QwtInterval( value - delta, value + delta ); } /*! Change a scale attribute \param attribute Attribute to change \param on On/Off \sa Attribute, testAttribute() */ void QwtScaleEngine::setAttribute( Attribute attribute, bool on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; } /*! \return True, if attribute is enabled. \param attribute Attribute to be tested \sa Attribute, setAttribute() */ bool QwtScaleEngine::testAttribute( Attribute attribute ) const { return ( d_data->attributes & attribute ); } /*! Change the scale attribute \param attributes Set scale attributes \sa Attribute, attributes() */ void QwtScaleEngine::setAttributes( Attributes attributes ) { d_data->attributes = attributes; } /*! \return Scale attributes \sa Attribute, setAttributes(), testAttribute() */ QwtScaleEngine::Attributes QwtScaleEngine::attributes() const { return d_data->attributes; } /*! \brief Specify a reference point \param r new reference value The reference point is needed if options IncludeReference or Symmetric are active. Its default value is 0.0. \sa Attribute */ void QwtScaleEngine::setReference( double r ) { d_data->referenceValue = r; } /*! \return the reference value \sa setReference(), setAttribute() */ double QwtScaleEngine::reference() const { return d_data->referenceValue; } /*! Set the base of the scale engine While a base of 10 is what 99.9% of all applications need certain scales might need a different base: f.e 2 The default setting is 10 \param base Base of the engine \sa base() */ void QwtScaleEngine::setBase( uint base ) { d_data->base = qMax( base, 2U ); } /*! \return base Base of the scale engine \sa setBase() */ uint QwtScaleEngine::base() const { return d_data->base; } /*! Constructor \param base Base of the scale engine \sa setBase() */ QwtLinearScaleEngine::QwtLinearScaleEngine( uint base ): QwtScaleEngine( base ) { } //! Destructor QwtLinearScaleEngine::~QwtLinearScaleEngine() { } /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa setAttribute() */ void QwtLinearScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { QwtInterval interval( x1, x2 ); interval = interval.normalized(); interval.setMinValue( interval.minValue() - lowerMargin() ); interval.setMaxValue( interval.maxValue() + upperMargin() ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) interval = interval.symmetrize( reference() ); if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( reference() ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); stepSize = QwtScaleArithmetic::divideInterval( interval.width(), qMax( maxNumSteps, 1 ), base() ); if ( !testAttribute( QwtScaleEngine::Floating ) ) interval = align( interval, stepSize ); x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division for an interval \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the engine calculates one. \return Calculated scale division */ QwtScaleDiv QwtLinearScaleEngine::divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); if ( interval.width() <= 0 ) return QwtScaleDiv(); stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajorSteps < 1 ) maxMajorSteps = 1; stepSize = QwtScaleArithmetic::divideInterval( interval.width(), maxMajorSteps, base() ); } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinorSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } /*! \brief Calculate ticks for an interval \param interval Interval \param stepSize Step size \param maxMinorSteps Maximum number of minor steps \param ticks Arrays to be filled with the calculated ticks \sa buildMajorTicks(), buildMinorTicks */ void QwtLinearScaleEngine::buildTicks( const QwtInterval& interval, double stepSize, int maxMinorSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const { const QwtInterval boundingInterval = align( interval, stepSize ); ticks[QwtScaleDiv::MajorTick] = buildMajorTicks( boundingInterval, stepSize ); if ( maxMinorSteps > 0 ) { buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinorSteps, stepSize, ticks[QwtScaleDiv::MinorTick], ticks[QwtScaleDiv::MediumTick] ); } for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) { ticks[i] = strip( ticks[i], interval ); // ticks very close to 0.0 are // explicitely set to 0.0 for ( int j = 0; j < ticks[i].count(); j++ ) { if ( qwtFuzzyCompare( ticks[i][j], 0.0, stepSize ) == 0 ) ticks[i][j] = 0.0; } } } /*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList QwtLinearScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { int numTicks = qRound( interval.width() / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; QList ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks - 1; i++ ) ticks += interval.minValue() + i * stepSize; ticks += interval.maxValue(); return ticks; } /*! \brief Calculate minor/medium ticks for major ticks \param majorTicks Major ticks \param maxMinorSteps Maximum number of minor steps \param stepSize Step size \param minorTicks Array to be filled with the calculated minor ticks \param mediumTicks Array to be filled with the calculated medium ticks */ void QwtLinearScaleEngine::buildMinorTicks( const QList& majorTicks, int maxMinorSteps, double stepSize, QList &minorTicks, QList &mediumTicks ) const { double minStep = qwtStepSize( stepSize, maxMinorSteps, base() ); if ( minStep == 0.0 ) return; // # ticks per interval const int numTicks = qCeil( qAbs( stepSize / minStep ) ) - 1; int medIndex = -1; if ( numTicks % 2 ) medIndex = numTicks / 2; // calculate minor ticks for ( int i = 0; i < majorTicks.count(); i++ ) { double val = majorTicks[i]; for ( int k = 0; k < numTicks; k++ ) { val += minStep; double alignedValue = val; if ( qwtFuzzyCompare( val, 0.0, stepSize ) == 0 ) alignedValue = 0.0; if ( k == medIndex ) mediumTicks += alignedValue; else minorTicks += alignedValue; } } } /*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLinearScaleEngine::align( const QwtInterval &interval, double stepSize ) const { double x1 = interval.minValue(); double x2 = interval.maxValue(); if ( -DBL_MAX + stepSize <= x1 ) { const double x = QwtScaleArithmetic::floorEps( x1, stepSize ); if ( qwtFuzzyCompare( x1, x, stepSize ) != 0 ) x1 = x; } if ( DBL_MAX - stepSize >= x2 ) { const double x = QwtScaleArithmetic::ceilEps( x2, stepSize ); if ( qwtFuzzyCompare( x2, x, stepSize ) != 0 ) x2 = x; } return QwtInterval( x1, x2 ); } /*! Constructor \param base Base of the scale engine \sa setBase() */ QwtLogScaleEngine::QwtLogScaleEngine( uint base ): QwtScaleEngine( base ) { setTransformation( new QwtLogTransform() ); } //! Destructor QwtLogScaleEngine::~QwtLogScaleEngine() { } /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa QwtScaleEngine::setAttribute() */ void QwtLogScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { if ( x1 > x2 ) qSwap( x1, x2 ); const double logBase = base(); QwtInterval interval( x1 / qPow( logBase, lowerMargin() ), x2 * qPow( logBase, upperMargin() ) ); if ( interval.maxValue() / interval.minValue() < logBase ) { // scale width is less than one step -> try to build a linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); linearScaler.autoScale( maxNumSteps, x1, x2, stepSize ); QwtInterval linearInterval = QwtInterval( x1, x2 ).normalized(); linearInterval = linearInterval.limited( LOG_MIN, LOG_MAX ); if ( linearInterval.maxValue() / linearInterval.minValue() < logBase ) { // the aligned scale is still less than one step if ( stepSize < 0.0 ) stepSize = -qwtLog( logBase, qAbs( stepSize ) ); else stepSize = qwtLog( logBase, stepSize ); return; } } double logRef = 1.0; if ( reference() > LOG_MIN / 2 ) logRef = qMin( reference(), LOG_MAX / 2 ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) { const double delta = qMax( interval.maxValue() / logRef, logRef / interval.minValue() ); interval.setInterval( logRef / delta, logRef * delta ); } if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( logRef ); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); stepSize = divideInterval( qwtLogInterval( logBase, interval ).width(), qMax( maxNumSteps, 1 ) ); if ( stepSize < 1.0 ) stepSize = 1.0; if ( !testAttribute( QwtScaleEngine::Floating ) ) interval = align( interval, stepSize ); x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division for an interval \param x1 First interval limit \param x2 Second interval limit \param maxMajorSteps Maximum for the number of major steps \param maxMinorSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the engine calculates one. \return Calculated scale division */ QwtScaleDiv QwtLogScaleEngine::divideScale( double x1, double x2, int maxMajorSteps, int maxMinorSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() <= 0 ) return QwtScaleDiv(); const double logBase = base(); if ( interval.maxValue() / interval.minValue() < logBase ) { // scale width is less than one decade -> build linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); if ( stepSize != 0.0 ) { if ( stepSize < 0.0 ) stepSize = -qPow( logBase, -stepSize ); else stepSize = qPow( logBase, stepSize ); } return linearScaler.divideScale( x1, x2, maxMajorSteps, maxMinorSteps, stepSize ); } stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajorSteps < 1 ) maxMajorSteps = 1; stepSize = divideInterval( qwtLogInterval( logBase, interval ).width(), maxMajorSteps ); if ( stepSize < 1.0 ) stepSize = 1.0; // major step must be >= 1 decade } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinorSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } /*! \brief Calculate ticks for an interval \param interval Interval \param maxMinorSteps Maximum number of minor steps \param stepSize Step size \param ticks Arrays to be filled with the calculated ticks \sa buildMajorTicks(), buildMinorTicks */ void QwtLogScaleEngine::buildTicks( const QwtInterval& interval, double stepSize, int maxMinorSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const { const QwtInterval boundingInterval = align( interval, stepSize ); ticks[QwtScaleDiv::MajorTick] = buildMajorTicks( boundingInterval, stepSize ); if ( maxMinorSteps > 0 ) { buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinorSteps, stepSize, ticks[QwtScaleDiv::MinorTick], ticks[QwtScaleDiv::MediumTick] ); } for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) ticks[i] = strip( ticks[i], interval ); } /*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList QwtLogScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { double width = qwtLogInterval( base(), interval ).width(); int numTicks = qRound( width / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; const double lxmin = ::log( interval.minValue() ); const double lxmax = ::log( interval.maxValue() ); const double lstep = ( lxmax - lxmin ) / double( numTicks - 1 ); QList ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks - 1; i++ ) ticks += qExp( lxmin + double( i ) * lstep ); ticks += interval.maxValue(); return ticks; } /*! \brief Calculate minor/medium ticks for major ticks \param majorTicks Major ticks \param maxMinorSteps Maximum number of minor steps \param stepSize Step size \param minorTicks Array to be filled with the calculated minor ticks \param mediumTicks Array to be filled with the calculated medium ticks */ void QwtLogScaleEngine::buildMinorTicks( const QList &majorTicks, int maxMinorSteps, double stepSize, QList &minorTicks, QList &mediumTicks ) const { const double logBase = base(); if ( stepSize < 1.1 ) // major step width is one base { double minStep = divideInterval( stepSize, maxMinorSteps + 1 ); if ( minStep == 0.0 ) return; const int numSteps = qRound( stepSize / minStep ); int mediumTickIndex = -1; if ( ( numSteps > 2 ) && ( numSteps % 2 == 0 ) ) mediumTickIndex = numSteps / 2; for ( int i = 0; i < majorTicks.count() - 1; i++ ) { const double v = majorTicks[i]; const double s = logBase / numSteps; if ( s >= 1.0 ) { for ( int j = 2; j < numSteps; j++ ) { minorTicks += v * j * s; } } else { for ( int j = 1; j < numSteps; j++ ) { const double tick = v + j * v * ( logBase - 1 ) / numSteps; if ( j == mediumTickIndex ) mediumTicks += tick; else minorTicks += tick; } } } } else { double minStep = divideInterval( stepSize, maxMinorSteps ); if ( minStep == 0.0 ) return; if ( minStep < 1.0 ) minStep = 1.0; // # subticks per interval int numTicks = qRound( stepSize / minStep ) - 1; // Do the minor steps fit into the interval? if ( qwtFuzzyCompare( ( numTicks + 1 ) * minStep, stepSize, stepSize ) > 0 ) { numTicks = 0; } if ( numTicks < 1 ) return; int mediumTickIndex = -1; if ( ( numTicks > 2 ) && ( numTicks % 2 ) ) mediumTickIndex = numTicks / 2; // substep factor = base^substeps const qreal minFactor = qMax( qPow( logBase, minStep ), qreal( logBase ) ); for ( int i = 0; i < majorTicks.count(); i++ ) { double tick = majorTicks[i]; for ( int j = 0; j < numTicks; j++ ) { tick *= minFactor; if ( j == mediumTickIndex ) mediumTicks += tick; else minorTicks += tick; } } } } /*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLogScaleEngine::align( const QwtInterval &interval, double stepSize ) const { const QwtInterval intv = qwtLogInterval( base(), interval ); double x1 = QwtScaleArithmetic::floorEps( intv.minValue(), stepSize ); if ( qwtFuzzyCompare( interval.minValue(), x1, stepSize ) == 0 ) x1 = interval.minValue(); double x2 = QwtScaleArithmetic::ceilEps( intv.maxValue(), stepSize ); if ( qwtFuzzyCompare( interval.maxValue(), x2, stepSize ) == 0 ) x2 = interval.maxValue(); return qwtPowInterval( base(), QwtInterval( x1, x2 ) ); } linssid-2.7/qwt-lib/src/qwt.h000644 001750 001750 00000000777 12151666701 017037 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_H #define QWT_H #include "qwt_global.h" /*! Some constants for use within Qwt. */ namespace Qwt { }; #endif linssid-2.7/qwt-lib/textengines/mathml/qwt_mathml_text_engine.cpp000644 001750 001750 00000006366 12151666703 026357 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ // vim: expandtab #include #include #include "qwt_mathml_text_engine.h" #include "qwt_mml_document.h" //! Constructor QwtMathMLTextEngine::QwtMathMLTextEngine() { } //! Destructor QwtMathMLTextEngine::~QwtMathMLTextEngine() { } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ double QwtMathMLTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double ) const { return textSize( font, flags, text ).height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \return Caluclated size */ QSizeF QwtMathMLTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { Q_UNUSED( flags ); static QString t; static QSize sz; if ( text != t ) { QwtMathMLDocument doc; doc.setContent( text ); doc.setBaseFontPointSize( font.pointSize() ); sz = doc.size(); t = text; } return sz; } /*! Return margins around the texts \param left Return 0 \param right Return 0 \param top Return 0 \param bottom Return 0 */ void QwtMathMLTextEngine::textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = bottom = 0; } /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered */ void QwtMathMLTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtMathMLDocument doc; doc.setContent( text ); doc.setBaseFontPointSize( painter->font().pointSize() ); const QSizeF docSize = doc.size(); QPointF pos = rect.topLeft(); if ( rect.width() > docSize.width() ) { if ( flags & Qt::AlignRight ) pos.setX( rect.right() - docSize.width() ); if ( flags & Qt::AlignHCenter ) pos.setX( rect.center().x() - docSize.width() / 2 ); } if ( rect.height() > docSize.height() ) { if ( flags & Qt::AlignBottom ) pos.setY( rect.bottom() - docSize.height() ); if ( flags & Qt::AlignVCenter ) pos.setY( rect.center().y() - docSize.height() / 2 ); } doc.paint( painter, pos.toPoint() ); } /*! Test if a string can be rendered by QwtMathMLTextEngine \param text Text to be tested \return true, if text begins with "". */ bool QwtMathMLTextEngine::mightRender( const QString &text ) const { return text.trimmed().startsWith( " #include #include #include static void qwtUpdateLegendIconSize( QwtPlotCurve *curve ) { if ( curve->symbol() && curve->testLegendAttribute( QwtPlotCurve::LegendShowSymbol ) ) { QSize sz = curve->symbol()->boundingRect().size(); sz += QSize( 2, 2 ); // margin if ( curve->testLegendAttribute( QwtPlotCurve::LegendShowLine ) ) { // Avoid, that the line is completely covered by the symbol int w = qCeil( 1.5 * sz.width() ); if ( w % 2 ) w++; sz.setWidth( qMax( 8, w ) ); } curve->setLegendIconSize( sz ); } } static int qwtVerifyRange( int size, int &i1, int &i2 ) { if ( size < 1 ) return 0; i1 = qBound( 0, i1, size - 1 ); i2 = qBound( 0, i2, size - 1 ); if ( i1 > i2 ) qSwap( i1, i2 ); return ( i2 - i1 + 1 ); } class QwtPlotCurve::PrivateData { public: PrivateData(): style( QwtPlotCurve::Lines ), baseline( 0.0 ), symbol( NULL ), attributes( 0 ), paintAttributes( QwtPlotCurve::ClipPolygons | QwtPlotCurve::FilterPoints ), legendAttributes( 0 ) { pen = QPen( Qt::black ); curveFitter = new QwtSplineCurveFitter; } ~PrivateData() { delete symbol; delete curveFitter; } QwtPlotCurve::CurveStyle style; double baseline; const QwtSymbol *symbol; QwtCurveFitter *curveFitter; QPen pen; QBrush brush; QwtPlotCurve::CurveAttributes attributes; QwtPlotCurve::PaintAttributes paintAttributes; QwtPlotCurve::LegendAttributes legendAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotCurve::QwtPlotCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotCurve::QwtPlotCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotCurve::~QwtPlotCurve() { delete d_data; } //! Initialize internal members void QwtPlotCurve::init() { setItemAttribute( QwtPlotItem::Legend ); setItemAttribute( QwtPlotItem::AutoScale ); d_data = new PrivateData; setData( new QwtPointSeriesData() ); setZ( 20.0 ); } //! \return QwtPlotItem::Rtti_PlotCurve int QwtPlotCurve::rtti() const { return QwtPlotItem::Rtti_PlotCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off \sa testPaintAttribute() */ void QwtPlotCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa setPaintAttribute() */ bool QwtPlotCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Specify an attribute how to draw the legend icon \param attribute Attribute \param on On/Off /sa testLegendAttribute(). legendIcon() */ void QwtPlotCurve::setLegendAttribute( LegendAttribute attribute, bool on ) { if ( on != testLegendAttribute( attribute ) ) { if ( on ) d_data->legendAttributes |= attribute; else d_data->legendAttributes &= ~attribute; qwtUpdateLegendIconSize( this ); legendChanged(); } } /*! \return True, when attribute is enabled \sa setLegendAttribute() */ bool QwtPlotCurve::testLegendAttribute( LegendAttribute attribute ) const { return ( d_data->legendAttributes & attribute ); } /*! Set the curve's drawing style \param style Curve style \sa style() */ void QwtPlotCurve::setStyle( CurveStyle style ) { if ( style != d_data->style ) { d_data->style = style; legendChanged(); itemChanged(); } } /*! \return Style of the curve \sa setStyle() */ QwtPlotCurve::CurveStyle QwtPlotCurve::style() const { return d_data->style; } /*! \brief Assign a symbol The curve will take the ownership of the symbol, hence the previously set symbol will be delete by setting a new one. If \p symbol is \c NULL no symbol will be drawn. \param symbol Symbol \sa symbol() */ void QwtPlotCurve::setSymbol( QwtSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; qwtUpdateLegendIconSize( this ); legendChanged(); itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtSymbol *QwtPlotCurve::symbol() const { return d_data->symbol; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotCurve::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen \param pen New pen \sa pen(), brush() */ void QwtPlotCurve::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; legendChanged(); itemChanged(); } } /*! \return Pen used to draw the lines \sa setPen(), brush() */ const QPen& QwtPlotCurve::pen() const { return d_data->pen; } /*! \brief Assign a brush. In case of brush.style() != QBrush::NoBrush and style() != QwtPlotCurve::Sticks the area between the curve and the baseline will be filled. In case !brush.color().isValid() the area will be filled by pen.color(). The fill algorithm simply connects the first and the last curve point to the baseline. So the curve data has to be sorted (ascending or descending). \param brush New brush \sa brush(), setBaseline(), baseline() */ void QwtPlotCurve::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; legendChanged(); itemChanged(); } } /*! \return Brush used to fill the area between lines and the baseline \sa setBrush(), setBaseline(), baseline() */ const QBrush& QwtPlotCurve::brush() const { return d_data->brush; } /*! Draw an interval of the curve \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. \sa drawCurve(), drawSymbols(), */ void QwtPlotCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const size_t numSamples = dataSize(); if ( !painter || numSamples <= 0 ) return; if ( to < 0 ) to = numSamples - 1; if ( qwtVerifyRange( numSamples, from, to ) > 0 ) { painter->save(); painter->setPen( d_data->pen ); /* Qt 4.0.0 is slow when drawing lines, but it's even slower when the painter has a brush. So we don't set the brush before we really need it. */ drawCurve( painter, d_data->style, xMap, yMap, canvasRect, from, to ); painter->restore(); if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { painter->save(); drawSymbols( painter, *d_data->symbol, xMap, yMap, canvasRect, from, to ); painter->restore(); } } } /*! \brief Draw the line part (without symbols) of a curve interval. \param painter Painter \param style curve style, see QwtPlotCurve::CurveStyle \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawDots(), drawLines(), drawSteps(), drawSticks() */ void QwtPlotCurve::drawCurve( QPainter *painter, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { switch ( style ) { case Lines: if ( testCurveAttribute( Fitted ) ) { // we always need the complete // curve for fitting from = 0; to = dataSize() - 1; } drawLines( painter, xMap, yMap, canvasRect, from, to ); break; case Sticks: drawSticks( painter, xMap, yMap, canvasRect, from, to ); break; case Steps: drawSteps( painter, xMap, yMap, canvasRect, from, to ); break; case Dots: drawDots( painter, xMap, yMap, canvasRect, from, to ); break; case NoCurve: default: break; } } /*! \brief Draw lines If the CurveAttribute Fitted is enabled a QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa setCurveAttribute(), setCurveFitter(), draw(), drawLines(), drawDots(), drawSteps(), drawSticks() */ void QwtPlotCurve::drawLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( from > to ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); const bool doFit = ( d_data->attributes & Fitted ) && d_data->curveFitter; const bool doFill = ( d_data->brush.style() != Qt::NoBrush ) && ( d_data->brush.color().alpha() > 0 ); QRectF clipRect; if ( d_data->paintAttributes & ClipPolygons ) { qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF()); clipRect = canvasRect.adjusted(-pw, -pw, pw, pw); } bool doIntegers = false; #if QT_VERSION < 0x040800 // For Qt <= 4.7 the raster paint engine is significantly faster // for rendering QPolygon than for QPolygonF. So let's // see if we can use it. if ( painter->paintEngine()->type() == QPaintEngine::Raster ) { // In case of filling or fitting performance doesn't count // because both operations are much more expensive // then drawing the polyline itself if ( !doFit && !doFill ) doIntegers = true; } #endif const bool noDuplicates = d_data->paintAttributes & FilterPoints; QwtPointMapper mapper; mapper.setFlag( QwtPointMapper::RoundPoints, doAlign ); mapper.setFlag( QwtPointMapper::WeedOutPoints, noDuplicates ); mapper.setBoundingRect( canvasRect ); if ( doIntegers ) { const QPolygon polyline = mapper.toPolygon( xMap, yMap, data(), from, to ); if ( d_data->paintAttributes & ClipPolygons ) { const QPolygon clipped = QwtClipper::clipPolygon( clipRect.toAlignedRect(), polyline, false ); QwtPainter::drawPolyline( painter, clipped ); } else { QwtPainter::drawPolyline( painter, polyline ); } } else { QPolygonF polyline = mapper.toPolygonF( xMap, yMap, data(), from, to ); if ( doFit ) polyline = d_data->curveFitter->fitCurve( polyline ); if ( d_data->paintAttributes & ClipPolygons ) { const QPolygonF clipped = QwtClipper::clipPolygonF( clipRect, polyline, false ); QwtPainter::drawPolyline( painter, clipped ); } else { QwtPainter::drawPolyline( painter, polyline ); } if ( doFill ) { fillCurve( painter, xMap, yMap, canvasRect, polyline ); } } } /*! Draw sticks \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawDots(), drawLines(), drawSteps() */ void QwtPlotCurve::drawSticks( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &, int from, int to ) const { painter->save(); painter->setRenderHint( QPainter::Antialiasing, false ); const bool doAlign = QwtPainter::roundingAlignment( painter ); double x0 = xMap.transform( d_data->baseline ); double y0 = yMap.transform( d_data->baseline ); if ( doAlign ) { x0 = qRound( x0 ); y0 = qRound( y0 ); } const Qt::Orientation o = orientation(); const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( o == Qt::Horizontal ) QwtPainter::drawLine( painter, x0, yi, xi, yi ); else QwtPainter::drawLine( painter, xi, y0, xi, yi ); } painter->restore(); } /*! Draw dots \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawSticks(), drawLines(), drawSteps() */ void QwtPlotCurve::drawDots( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const QColor color = painter->pen().color(); if ( painter->pen().style() == Qt::NoPen || color.alpha() == 0 ) { return; } const bool doFill = ( d_data->brush.style() != Qt::NoBrush ) && ( d_data->brush.color().alpha() > 0 ); const bool doAlign = QwtPainter::roundingAlignment( painter ); QwtPointMapper mapper; mapper.setBoundingRect( canvasRect ); mapper.setFlag( QwtPointMapper::RoundPoints, doAlign ); if ( d_data->paintAttributes & FilterPoints ) { if ( ( color.alpha() == 255 ) && !( painter->renderHints() & QPainter::Antialiasing ) ) { mapper.setFlag( QwtPointMapper::WeedOutPoints, true ); } } if ( doFill ) { mapper.setFlag( QwtPointMapper::WeedOutPoints, false ); QPolygonF points = mapper.toPointsF( xMap, yMap, data(), from, to ); QwtPainter::drawPoints( painter, points ); fillCurve( painter, xMap, yMap, canvasRect, points ); } else if ( d_data->paintAttributes & ImageBuffer ) { const QImage image = mapper.toImage( xMap, yMap, data(), from, to, d_data->pen, painter->testRenderHint( QPainter::Antialiasing ), renderThreadCount() ); painter->drawImage( canvasRect.toAlignedRect(), image ); } else if ( d_data->paintAttributes & MinimizeMemory ) { const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } QwtPainter::drawPoint( painter, QPointF( xi, yi ) ); } } else { if ( doAlign ) { const QPolygon points = mapper.toPoints( xMap, yMap, data(), from, to ); QwtPainter::drawPoints( painter, points ); } else { const QPolygonF points = mapper.toPointsF( xMap, yMap, data(), from, to ); QwtPainter::drawPoints( painter, points ); } } } /*! Draw step function The direction of the steps depends on Inverted attribute. \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa CurveAttribute, setCurveAttribute(), draw(), drawCurve(), drawDots(), drawLines(), drawSticks() */ void QwtPlotCurve::drawSteps( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); QPolygonF polygon( 2 * ( to - from ) + 1 ); QPointF *points = polygon.data(); bool inverted = orientation() == Qt::Vertical; if ( d_data->attributes & Inverted ) inverted = !inverted; const QwtSeriesData *series = data(); int i, ip; for ( i = from, ip = 0; i <= to; i++, ip += 2 ) { const QPointF sample = series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( ip > 0 ) { const QPointF &p0 = points[ip - 2]; QPointF &p = points[ip - 1]; if ( inverted ) { p.rx() = p0.x(); p.ry() = yi; } else { p.rx() = xi; p.ry() = p0.y(); } } points[ip].rx() = xi; points[ip].ry() = yi; } if ( d_data->paintAttributes & ClipPolygons ) { const QPolygonF clipped = QwtClipper::clipPolygonF( canvasRect, polygon, false ); QwtPainter::drawPolyline( painter, clipped ); } else { QwtPainter::drawPolyline( painter, polygon ); } if ( d_data->brush.style() != Qt::NoBrush ) fillCurve( painter, xMap, yMap, canvasRect, polygon ); } /*! Specify an attribute for drawing the curve \param attribute Curve attribute \param on On/Off /sa testCurveAttribute(), setCurveFitter() */ void QwtPlotCurve::setCurveAttribute( CurveAttribute attribute, bool on ) { if ( bool( d_data->attributes & attribute ) == on ) return; if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; itemChanged(); } /*! \return true, if attribute is enabled \sa setCurveAttribute() */ bool QwtPlotCurve::testCurveAttribute( CurveAttribute attribute ) const { return d_data->attributes & attribute; } /*! Assign a curve fitter The curve fitter "smooths" the curve points, when the Fitted CurveAttribute is set. setCurveFitter(NULL) also disables curve fitting. The curve fitter operates on the translated points ( = widget coordinates) to be functional for logarithmic scales. Obviously this is less performant for fitting algorithms, that reduce the number of points. For situations, where curve fitting is used to improve the performance of painting huge series of points it might be better to execute the fitter on the curve points once and to cache the result in the QwtSeriesData object. \param curveFitter() Curve fitter \sa Fitted */ void QwtPlotCurve::setCurveFitter( QwtCurveFitter *curveFitter ) { delete d_data->curveFitter; d_data->curveFitter = curveFitter; itemChanged(); } /*! Get the curve fitter. If curve fitting is disabled NULL is returned. \return Curve fitter \sa setCurveFitter(), Fitted */ QwtCurveFitter *QwtPlotCurve::curveFitter() const { return d_data->curveFitter; } /*! Fill the area between the curve and the baseline with the curve brush \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param polygon Polygon - will be modified ! \sa setBrush(), setBaseline(), setStyle() */ void QwtPlotCurve::fillCurve( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, QPolygonF &polygon ) const { if ( d_data->brush.style() == Qt::NoBrush ) return; closePolyline( painter, xMap, yMap, polygon ); if ( polygon.count() <= 2 ) // a line can't be filled return; QBrush brush = d_data->brush; if ( !brush.color().isValid() ) brush.setColor( d_data->pen.color() ); if ( d_data->paintAttributes & ClipPolygons ) polygon = QwtClipper::clipPolygonF( canvasRect, polygon, true ); painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( brush ); QwtPainter::drawPolygon( painter, polygon ); painter->restore(); } /*! \brief Complete a polygon to be a closed polygon including the area between the original polygon and the baseline. \param painter Painter \param xMap X map \param yMap Y map \param polygon Polygon to be completed */ void QwtPlotCurve::closePolyline( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, QPolygonF &polygon ) const { if ( polygon.size() < 2 ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); double baseline = d_data->baseline; if ( orientation() == Qt::Vertical ) { if ( yMap.transformation() ) baseline = yMap.transformation()->bounded( baseline ); double refY = yMap.transform( baseline ); if ( doAlign ) refY = qRound( refY ); polygon += QPointF( polygon.last().x(), refY ); polygon += QPointF( polygon.first().x(), refY ); } else { if ( xMap.transformation() ) baseline = xMap.transformation()->bounded( baseline ); double refX = xMap.transform( baseline ); if ( doAlign ) refX = qRound( refX ); polygon += QPointF( refX, polygon.last().y() ); polygon += QPointF( refX, polygon.first().y() ); } } /*! Draw symbols \param painter Painter \param symbol Curve symbol \param xMap x map \param yMap y map \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted \sa setSymbol(), drawSeries(), drawCurve() */ void QwtPlotCurve::drawSymbols( QPainter *painter, const QwtSymbol &symbol, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { QwtPointMapper mapper; mapper.setFlag( QwtPointMapper::RoundPoints, QwtPainter::roundingAlignment( painter ) ); mapper.setFlag( QwtPointMapper::WeedOutPoints, testPaintAttribute( QwtPlotCurve::FilterPoints ) ); mapper.setBoundingRect( canvasRect ); const int chunkSize = 500; for ( int i = from; i <= to; i += chunkSize ) { const int n = qMin( chunkSize, to - i + 1 ); const QPolygonF points = mapper.toPointsF( xMap, yMap, data(), i, i + n - 1 ); if ( points.size() > 0 ) symbol.drawSymbols( painter, points ); } } /*! \brief Set the value of the baseline The baseline is needed for filling the curve with a brush or the Sticks drawing style. The interpretation of the baseline depends on the orientation(). With Qt::Horizontal, the baseline is interpreted as a horizontal line at y = baseline(), with Qt::Vertical, it is interpreted as a vertical line at x = baseline(). The default value is 0.0. \param value Value of the baseline \sa baseline(), setBrush(), setStyle(), QwtPlotAbstractSeriesItem::orientation() */ void QwtPlotCurve::setBaseline( double value ) { if ( d_data->baseline != value ) { d_data->baseline = value; itemChanged(); } } /*! \return Value of the baseline \sa setBaseline() */ double QwtPlotCurve::baseline() const { return d_data->baseline; } /*! Find the closest curve point for a specific position \param pos Position, where to look for the closest curve point \param dist If dist != NULL, closestPoint() returns the distance between the position and the closest curve point \return Index of the closest curve point, or -1 if none can be found ( f.e when the curve has no points ) \note closestPoint() implements a dumb algorithm, that iterates over all points */ int QwtPlotCurve::closestPoint( const QPoint &pos, double *dist ) const { const size_t numSamples = dataSize(); if ( plot() == NULL || numSamples <= 0 ) return -1; const QwtSeriesData *series = data(); const QwtScaleMap xMap = plot()->canvasMap( xAxis() ); const QwtScaleMap yMap = plot()->canvasMap( yAxis() ); int index = -1; double dmin = 1.0e10; for ( uint i = 0; i < numSamples; i++ ) { const QPointF sample = series->sample( i ); const double cx = xMap.transform( sample.x() ) - pos.x(); const double cy = yMap.transform( sample.y() ) - pos.y(); const double f = qwtSqr( cx ) + qwtSqr( cy ); if ( f < dmin ) { index = i; dmin = f; } } if ( dist ) *dist = qSqrt( dmin ); return index; } /*! \return Icon representing the curve on the legend \param index Index of the legend entry ( ignored as there is only one ) \param size Icon size \sa QwtPlotItem::setLegendIconSize(), QwtPlotItem::legendData() */ QwtGraphic QwtPlotCurve::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); if ( size.isEmpty() ) return QwtGraphic(); QwtGraphic graphic; graphic.setDefaultSize( size ); graphic.setRenderHint( QwtGraphic::RenderPensUnscaled, true ); QPainter painter( &graphic ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); if ( d_data->legendAttributes == 0 || d_data->legendAttributes & QwtPlotCurve::LegendShowBrush ) { QBrush brush = d_data->brush; if ( brush.style() == Qt::NoBrush && d_data->legendAttributes == 0 ) { if ( style() != QwtPlotCurve::NoCurve ) { brush = QBrush( pen().color() ); } else if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { brush = QBrush( d_data->symbol->pen().color() ); } } if ( brush.style() != Qt::NoBrush ) { QRectF r( 0, 0, size.width(), size.height() ); painter.fillRect( r, brush ); } } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowLine ) { if ( pen() != Qt::NoPen ) { QPen pn = pen(); pn.setCapStyle( Qt::FlatCap ); painter.setPen( pn ); const double y = 0.5 * size.height(); QwtPainter::drawLine( &painter, 0.0, y, size.width(), y ); } } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowSymbol ) { if ( d_data->symbol ) { QRectF r( 0, 0, size.width(), size.height() ); d_data->symbol->drawSymbol( &painter, r ); } } return graphic; } /*! Initialize data with an array of points. \param samples Vector of points \note QVector is implicitly shared \note QPolygonF is derived from QVector */ void QwtPlotCurve::setSamples( const QVector &samples ) { setData( new QwtPointSeriesData( samples ) ); } /*! Assign a series of points setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotCurve::setSamples( QwtSeriesData *data ) { setData( data ); } #ifndef QWT_NO_COMPAT /*! \brief Initialize the data by pointing to memory blocks which are not managed by QwtPlotCurve. setRawSamples is provided for efficiency. It is important to keep the pointers during the lifetime of the underlying QwtCPointerData class. \param xData pointer to x data \param yData pointer to y data \param size size of x and y \sa QwtCPointerData */ void QwtPlotCurve::setRawSamples( const double *xData, const double *yData, int size ) { setData( new QwtCPointerData( xData, yData, size ) ); } /*! Set data by copying x- and y-values from specified memory blocks. Contrary to setRawSamples(), this function makes a 'deep copy' of the data. \param xData pointer to x values \param yData pointer to y values \param size size of xData and yData \sa QwtPointArrayData */ void QwtPlotCurve::setSamples( const double *xData, const double *yData, int size ) { setData( new QwtPointArrayData( xData, yData, size ) ); } /*! \brief Initialize data with x- and y-arrays (explicitly shared) \param xData x data \param yData y data \sa QwtPointArrayData */ void QwtPlotCurve::setSamples( const QVector &xData, const QVector &yData ) { setData( new QwtPointArrayData( xData, yData ) ); } #endif // !QWT_NO_COMPAT ��������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_scaleitem.h��������������������������������������������������������000644 �001750 �001750 �00000005062 12151666701 022113� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_SCALE_ITEM_H #define QWT_PLOT_SCALE_ITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_scale_draw.h" class QPalette; /*! \brief A class which draws a scale inside the plot canvas QwtPlotScaleItem can be used to draw an axis inside the plot canvas. It might by synchronized to one of the axis of the plot, but can also display its own ticks and labels. It is allowed to synchronize the scale item with a disabled axis. In plots with vertical and horizontal scale items, it might be necessary to remove ticks at the intersections, by overloading updateScaleDiv(). The scale might be at a specific position (f.e 0.0) or it might be aligned to a canvas border. \par Example The following example shows how to replace the left axis, by a scale item at the x position 0.0. \verbatim QwtPlotScaleItem *scaleItem = new QwtPlotScaleItem(QwtScaleDraw::RightScale, 0.0); scaleItem->setFont(plot->axisWidget(QwtPlot::yLeft)->font()); scaleItem->attach(plot); plot->enableAxis(QwtPlot::yLeft, false); \endverbatim */ class QWT_EXPORT QwtPlotScaleItem: public QwtPlotItem { public: explicit QwtPlotScaleItem( QwtScaleDraw::Alignment = QwtScaleDraw::BottomScale, const double pos = 0.0 ); virtual ~QwtPlotScaleItem(); virtual int rtti() const; void setScaleDiv( const QwtScaleDiv& ); const QwtScaleDiv& scaleDiv() const; void setScaleDivFromAxis( bool on ); bool isScaleDivFromAxis() const; void setPalette( const QPalette & ); QPalette palette() const; void setFont( const QFont& ); QFont font() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; QwtScaleDraw *scaleDraw(); void setPosition( double pos ); double position() const; void setBorderDistance( int numPixels ); int borderDistance() const; void setAlignment( QwtScaleDraw::Alignment ); virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) const; virtual void updateScaleDiv( const QwtScaleDiv &, const QwtScaleDiv & ); private: class PrivateData; PrivateData *d_data; }; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/linssid-app/MainForm.ui�����������������������������������������������������������������000664 �001750 �001750 �00000052004 12361000756 020162� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ mainForm 0 0 759 561 0 0 LinSSID 0 0 0 0 500 75 QFrame::StyledPanel QFrame::Sunken 100 27 Select a wireless interface if you have more than one 100 20 Interface Qt::AlignCenter 52 20 Run Qt::AlignCenter 0 0 52 40 52 40 Start or stop run mode ../../../../usr/share/linssid/linssid-start.png ../../../../usr/share/linssid/linssid-pause.png../../../../usr/share/linssid/linssid-start.png 32 32 true false 0 0 120 20 120 20 Time between scans so your wireless interface can do something else 5 1 2 Qt::Horizontal 100 0 0 - nap time - 5 Qt::AlignCenter 0 0 Paused true 0 0 Status Select or deselect all visible APs Plot Qt::AlignCenter true 45 0 45 16777215 Select all visible APs all true 45 0 45 16777215 Deselect all visible APs none 0 0 Qt::Vertical true 0 0 0 150 true 0 0 0 150 1 0 0 Signal strength over time Time Graph 0 100 Signal strength by channel 2.4 GHz Channels 0 0 0 100 0 0 Signal strength by channel 5 GHz Channels 0 0 759 23 File View Help Export to NS1 false Exit true true true SSID true true Channel true true MAC true false Mode true false Security true true Privacy true true Cipher true Frequency true false Quality true true Signal true Noise true true Vendor true true true First true true true Last true true false Type false About true Mbps true Min Signal true Max Signal true First Seen true Last Seen false Plot false Preferences... true true Protocol QwtPlot QFrame
qwt_plot.h
1
actionExit triggered() mainForm close() -1 -1 287 317
����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_painter.h���������������������������������������������������������������000644 �001750 �001750 �00000013764 12151666702 020562� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PAINTER_H #define QWT_PAINTER_H #include "qwt_global.h" #include #include #include #include #include class QPainter; class QBrush; class QColor; class QWidget; class QPolygonF; class QRectF; class QImage; class QPixmap; class QwtScaleMap; class QwtColorMap; class QwtInterval; class QTextDocument; class QPainterPath; /*! \brief A collection of QPainter workarounds */ class QWT_EXPORT QwtPainter { public: static void setPolylineSplitting( bool ); static bool polylineSplitting(); static void setRoundingAlignment( bool ); static bool roundingAlignment(); static bool roundingAlignment(QPainter *); static void drawText( QPainter *, double x, double y, const QString & ); static void drawText( QPainter *, const QPointF &, const QString & ); static void drawText( QPainter *, double x, double y, double w, double h, int flags, const QString & ); static void drawText( QPainter *, const QRectF &, int flags, const QString & ); #ifndef QT_NO_RICHTEXT static void drawSimpleRichText( QPainter *, const QRectF &, int flags, const QTextDocument & ); #endif static void drawRect( QPainter *, double x, double y, double w, double h ); static void drawRect( QPainter *, const QRectF &rect ); static void fillRect( QPainter *, const QRectF &, const QBrush & ); static void drawEllipse( QPainter *, const QRectF & ); static void drawPie( QPainter *, const QRectF & r, int a, int alen ); static void drawLine( QPainter *, double x1, double y1, double x2, double y2 ); static void drawLine( QPainter *, const QPointF &p1, const QPointF &p2 ); static void drawLine( QPainter *, const QLineF & ); static void drawPolygon( QPainter *, const QPolygonF & ); static void drawPolyline( QPainter *, const QPolygonF & ); static void drawPolyline( QPainter *, const QPointF *, int pointCount ); static void drawPolygon( QPainter *, const QPolygon & ); static void drawPolyline( QPainter *, const QPolygon & ); static void drawPolyline( QPainter *, const QPoint *, int pointCount ); static void drawPoint( QPainter *, const QPoint & ); static void drawPoints( QPainter *, const QPolygon & ); static void drawPoints( QPainter *, const QPoint *, int pointCount ); static void drawPoint( QPainter *, double x, double y ); static void drawPoint( QPainter *, const QPointF & ); static void drawPoints( QPainter *, const QPolygonF & ); static void drawPoints( QPainter *, const QPointF *, int pointCount ); static void drawPath( QPainter *, const QPainterPath & ); static void drawImage( QPainter *, const QRectF &, const QImage & ); static void drawPixmap( QPainter *, const QRectF &, const QPixmap & ); static void drawRoundFrame( QPainter *, const QRectF &, const QPalette &, int lineWidth, int frameStyle ); static void drawRoundedFrame( QPainter *, const QRectF &, double xRadius, double yRadius, const QPalette &, int lineWidth, int frameStyle ); static void drawFrame( QPainter *, const QRectF &rect, const QPalette &palette, QPalette::ColorRole foregroundRole, int lineWidth, int midLineWidth, int frameStyle ); static void drawFocusRect( QPainter *, const QWidget * ); static void drawFocusRect( QPainter *, const QWidget *, const QRect & ); static void drawColorBar( QPainter *painter, const QwtColorMap &, const QwtInterval &, const QwtScaleMap &, Qt::Orientation, const QRectF & ); static bool isAligning( QPainter *painter ); static bool isX11GraphicsSystem(); static void fillPixmap( const QWidget *, QPixmap &, const QPoint &offset = QPoint() ); static void drawBackgound( QPainter *painter, const QRectF &rect, const QWidget *widget ); static QPixmap backingStore( QWidget *, const QSize & ); private: static bool d_polylineSplitting; static bool d_roundingAlignment; }; //! Wrapper for QPainter::drawPoint() inline void QwtPainter::drawPoint( QPainter *painter, double x, double y ) { QwtPainter::drawPoint( painter, QPointF( x, y ) ); } //! Wrapper for QPainter::drawPoints() inline void QwtPainter::drawPoints( QPainter *painter, const QPolygon &polygon ) { drawPoints( painter, polygon.data(), polygon.size() ); } //! Wrapper for QPainter::drawPoints() inline void QwtPainter::drawPoints( QPainter *painter, const QPolygonF &polygon ) { drawPoints( painter, polygon.data(), polygon.size() ); } //! Wrapper for QPainter::drawLine() inline void QwtPainter::drawLine( QPainter *painter, double x1, double y1, double x2, double y2 ) { QwtPainter::drawLine( painter, QPointF( x1, y1 ), QPointF( x2, y2 ) ); } //! Wrapper for QPainter::drawLine() inline void QwtPainter::drawLine( QPainter *painter, const QLineF &line ) { QwtPainter::drawLine( painter, line.p1(), line.p2() ); } /*! \return True, when line splitting for the raster paint engine is enabled. \sa setPolylineSplitting() */ inline bool QwtPainter::polylineSplitting() { return d_polylineSplitting; } /*! Check whether coordinates should be rounded, before they are painted to a paint engine that rounds to integer values. For other paint engines ( PDF, SVG ), this flag has no effect. \return True, when rounding is enabled \sa setRoundingAlignment(), isAligning() */ inline bool QwtPainter::roundingAlignment() { return d_roundingAlignment; } /*! \return roundingAlignment() && isAligning(painter); \param painter Painter */ inline bool QwtPainter::roundingAlignment(QPainter *painter) { return d_roundingAlignment && isAligning(painter); } #endif ������������linssid-2.7/qwt-lib/src/qwt_abstract_scale.cpp������������������������������������������������������000644 �001750 �001750 �00000024304 12151666703 022416� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_scale.h" #include "qwt_scale_engine.h" #include "qwt_scale_draw.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_interval.h" class QwtAbstractScale::PrivateData { public: PrivateData(): maxMajor( 5 ), maxMinor( 3 ), stepSize( 0.0 ) { scaleEngine = new QwtLinearScaleEngine(); scaleDraw = new QwtScaleDraw(); } ~PrivateData() { delete scaleEngine; delete scaleDraw; } QwtScaleEngine *scaleEngine; QwtAbstractScaleDraw *scaleDraw; int maxMajor; int maxMinor; double stepSize; }; /*! Constructor \param parent Parent widget Creates a default QwtScaleDraw and a QwtLinearScaleEngine. The initial scale boundaries are set to [ 0.0, 100.0 ] The scaleStepSize() is initialized to 0.0, scaleMaxMajor() to 5 and scaleMaxMajor to 3. */ QwtAbstractScale::QwtAbstractScale( QWidget *parent ): QWidget( parent ) { d_data = new PrivateData; rescale( 0.0, 100.0, d_data->stepSize ); } //! Destructor QwtAbstractScale::~QwtAbstractScale() { delete d_data; } /*! Set the lower bound of the scale \param value Lower bound \sa lowerBound(), setScale(), setUpperBound() \note For inverted scales the lower bound is greater than the upper bound */ void QwtAbstractScale::setLowerBound( double value ) { setScale( value, upperBound() ); } /*! \return Lower bound of the scale \sa setLowerBound(), setScale(), upperBound() */ double QwtAbstractScale::lowerBound() const { return d_data->scaleDraw->scaleDiv().lowerBound(); } /*! Set the upper bound of the scale \param value Upper bound \sa upperBound(), setScale(), setLowerBound() \note For inverted scales the lower bound is greater than the upper bound */ void QwtAbstractScale::setUpperBound( double value ) { setScale( lowerBound(), value ); } /*! \return Upper bound of the scale \sa setUpperBound(), setScale(), lowerBound() */ double QwtAbstractScale::upperBound() const { return d_data->scaleDraw->scaleDiv().upperBound(); } /*! \brief Specify a scale. Define a scale by an interval The ticks are calculated using scaleMaxMinor(), scaleMaxMajor() and scaleStepSize(). \param lowerBound lower limit of the scale interval \param upperBound upper limit of the scale interval \note For inverted scales the lower bound is greater than the upper bound */ void QwtAbstractScale::setScale( double lowerBound, double upperBound ) { rescale( lowerBound, upperBound, d_data->stepSize ); } /*! \brief Specify a scale. Define a scale by an interval The ticks are calculated using scaleMaxMinor(), scaleMaxMajor() and scaleStepSize(). \param interval Interval */ void QwtAbstractScale::setScale( const QwtInterval &interval ) { setScale( interval.minValue(), interval.maxValue() ); } /*! \brief Specify a scale. scaleMaxMinor(), scaleMaxMajor() and scaleStepSize() and have no effect. \param scaleDiv Scale division \sa setAutoScale() */ void QwtAbstractScale::setScale( const QwtScaleDiv &scaleDiv ) { if ( scaleDiv != d_data->scaleDraw->scaleDiv() ) { #if 1 if ( d_data->scaleEngine ) { d_data->scaleDraw->setTransformation( d_data->scaleEngine->transformation() ); } #endif d_data->scaleDraw->setScaleDiv( scaleDiv ); scaleChange(); } } /*! \brief Set the maximum number of major tick intervals. The scale's major ticks are calculated automatically such that the number of major intervals does not exceed ticks. The default value is 5. \param ticks Maximal number of major ticks. \sa scaleMaxMajor(), setScaleMaxMinor(), setScaleStepSize(), QwtScaleEngine::divideInterval() */ void QwtAbstractScale::setScaleMaxMajor( int ticks ) { if ( ticks != d_data->maxMajor ) { d_data->maxMajor = ticks; updateScaleDraw(); } } /*! \return Maximal number of major tick intervals \sa setScaleMaxMajor(), scaleMaxMinor() */ int QwtAbstractScale::scaleMaxMajor() const { return d_data->maxMajor; } /*! \brief Set the maximum number of minor tick intervals The scale's minor ticks are calculated automatically such that the number of minor intervals does not exceed ticks. The default value is 3. \param ticks Maximal number of minor ticks. \sa scaleMaxMajor(), setScaleMaxMinor(), setScaleStepSize(), QwtScaleEngine::divideInterval() */ void QwtAbstractScale::setScaleMaxMinor( int ticks ) { if ( ticks != d_data->maxMinor ) { d_data->maxMinor = ticks; updateScaleDraw(); } } /*! \return Maximal number of minor tick intervals \sa setScaleMaxMinor(), scaleMaxMajor() */ int QwtAbstractScale::scaleMaxMinor() const { return d_data->maxMinor; } /*! \brief Set the step size used for calculating a scale division The step size is hint for calculating the intervals for the major ticks of the scale. A value of 0.0 is interpreted as no hint. \param stepSize Hint for the step size of the scale \sa scaleStepSize(), QwtScaleEngine::divideScale() \note Position and distance between the major ticks also depends on scaleMaxMajor(). */ void QwtAbstractScale::setScaleStepSize( double stepSize ) { if ( stepSize != d_data->stepSize ) { d_data->stepSize = stepSize; updateScaleDraw(); } } /*! \return Hint for the step size of the scale \sa setScaleStepSize(), QwtScaleEngine::divideScale() */ double QwtAbstractScale::scaleStepSize() const { return d_data->stepSize; } /*! \brief Set a scale draw scaleDraw has to be created with new and will be deleted in the destructor or the next call of setAbstractScaleDraw(). \sa abstractScaleDraw() */ void QwtAbstractScale::setAbstractScaleDraw( QwtAbstractScaleDraw *scaleDraw ) { if ( scaleDraw == NULL || scaleDraw == d_data->scaleDraw ) return; if ( d_data->scaleDraw != NULL ) scaleDraw->setScaleDiv( d_data->scaleDraw->scaleDiv() ); delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; } /*! \return Scale draw \sa setAbstractScaleDraw() */ QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() { return d_data->scaleDraw; } /*! \return Scale draw \sa setAbstractScaleDraw() */ const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const { return d_data->scaleDraw; } /*! \brief Set a scale engine The scale engine is responsible for calculating the scale division and provides a transformation between scale and widget coordinates. scaleEngine has to be created with new and will be deleted in the destructor or the next call of setScaleEngine. */ void QwtAbstractScale::setScaleEngine( QwtScaleEngine *scaleEngine ) { if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine ) { delete d_data->scaleEngine; d_data->scaleEngine = scaleEngine; } } /*! \return Scale engine \sa setScaleEngine() */ const QwtScaleEngine *QwtAbstractScale::scaleEngine() const { return d_data->scaleEngine; } /*! \return Scale engine \sa setScaleEngine() */ QwtScaleEngine *QwtAbstractScale::scaleEngine() { return d_data->scaleEngine; } /*! \return Scale boundaries and positions of the ticks The scale division might have been assigned explicitly or calculated implicitly by rescale(). */ const QwtScaleDiv &QwtAbstractScale::scaleDiv() const { return d_data->scaleDraw->scaleDiv(); } /*! \return Map to translate between scale and widget coordinates */ const QwtScaleMap &QwtAbstractScale::scaleMap() const { return d_data->scaleDraw->scaleMap(); } /*! Translate a scale value into a widget coordinate \param value Scale value \return Corresponding widget coordinate for value \sa scaleMap(), invTransform() */ int QwtAbstractScale::transform( double value ) const { return qRound( d_data->scaleDraw->scaleMap().transform( value ) ); } /*! Translate a widget coordinate into a scale value \param value Widget coordinate \return Corresponding scale coordinate for value \sa scaleMap(), transform() */ double QwtAbstractScale::invTransform( int value ) const { return d_data->scaleDraw->scaleMap().invTransform( value ); } /*! \return True, when the scale is increasing in opposite direction to the widget coordinates */ bool QwtAbstractScale::isInverted() const { return d_data->scaleDraw->scaleMap().isInverting(); } /*! \return The boundary with the smaller value \sa maximum(), lowerBound(), upperBound() */ double QwtAbstractScale::minimum() const { return qMin( d_data->scaleDraw->scaleDiv().lowerBound(), d_data->scaleDraw->scaleDiv().upperBound() ); } /*! \return The boundary with the larger value \sa minimum(), lowerBound(), upperBound() */ double QwtAbstractScale::maximum() const { return qMax( d_data->scaleDraw->scaleDiv().lowerBound(), d_data->scaleDraw->scaleDiv().upperBound() ); } //! Notify changed scale void QwtAbstractScale::scaleChange() { } /*! Recalculate the scale division and update the scale. \param lowerBound Lower limit of the scale interval \param upperBound Upper limit of the scale interval \param stepSize Major step size \sa scaleChange() */ void QwtAbstractScale::rescale( double lowerBound, double upperBound, double stepSize ) { const QwtScaleDiv scaleDiv = d_data->scaleEngine->divideScale( lowerBound, upperBound, d_data->maxMajor, d_data->maxMinor, stepSize ); if ( scaleDiv != d_data->scaleDraw->scaleDiv() ) { #if 1 d_data->scaleDraw->setTransformation( d_data->scaleEngine->transformation() ); #endif d_data->scaleDraw->setScaleDiv( scaleDiv ); scaleChange(); } } void QwtAbstractScale::updateScaleDraw() { rescale( d_data->scaleDraw->scaleDiv().lowerBound(), d_data->scaleDraw->scaleDiv().upperBound(), d_data->stepSize ); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_math.cpp����������������������������������������������������������������000644 �001750 �001750 �00000003144 12151666703 020374� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_math.h" /*! \brief Find the smallest value in an array \param array Pointer to an array \param size Array size */ double qwtGetMin( const double *array, int size ) { if ( size <= 0 ) return 0.0; double rv = array[0]; for ( int i = 1; i < size; i++ ) rv = qMin( rv, array[i] ); return rv; } /*! \brief Find the largest value in an array \param array Pointer to an array \param size Array size */ double qwtGetMax( const double *array, int size ) { if ( size <= 0 ) return 0.0; double rv = array[0]; for ( int i = 1; i < size; i++ ) rv = qMax( rv, array[i] ); return rv; } /*! \brief Normalize an angle to be int the range [0.0, 2 * PI[ \param radians Angle in radians \return Normalized angle in radians */ double qwtNormalizeRadians( double radians ) { double a = ::fmod( radians, 2.0 * M_PI ); if ( a < 0.0 ) a += 2.0 * M_PI; return a; } /*! \brief Normalize an angle to be int the range [0.0, 360.0[ \param radians Angle in degrees \return Normalized angle in degrees */ double qwtNormalizeDegrees( double degrees ) { double a = ::fmod( degrees, 360.0 ); if ( a < 0.0 ) a += 360.0; return a; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_event_pattern.cpp�������������������������������������������������������000644 �001750 �001750 �00000015122 12151666703 022320� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_event_pattern.h" #include /*! Constructor \sa MousePatternCode, KeyPatternCode */ QwtEventPattern::QwtEventPattern(): d_mousePattern( MousePatternCount ), d_keyPattern( KeyPatternCount ) { initKeyPattern(); initMousePattern( 3 ); } //! Destructor QwtEventPattern::~QwtEventPattern() { } /*! Set default mouse patterns, depending on the number of mouse buttons \param numButtons Number of mouse buttons ( <= 3 ) \sa MousePatternCode */ void QwtEventPattern::initMousePattern( int numButtons ) { d_mousePattern.resize( MousePatternCount ); switch ( numButtons ) { case 1: { setMousePattern( MouseSelect1, Qt::LeftButton ); setMousePattern( MouseSelect2, Qt::LeftButton, Qt::ControlModifier ); setMousePattern( MouseSelect3, Qt::LeftButton, Qt::AltModifier ); break; } case 2: { setMousePattern( MouseSelect1, Qt::LeftButton ); setMousePattern( MouseSelect2, Qt::RightButton ); setMousePattern( MouseSelect3, Qt::LeftButton, Qt::AltModifier ); break; } default: { setMousePattern( MouseSelect1, Qt::LeftButton ); setMousePattern( MouseSelect2, Qt::RightButton ); setMousePattern( MouseSelect3, Qt::MidButton ); } } setMousePattern( MouseSelect4, d_mousePattern[MouseSelect1].button, d_mousePattern[MouseSelect1].modifiers | Qt::ShiftModifier ); setMousePattern( MouseSelect5, d_mousePattern[MouseSelect2].button, d_mousePattern[MouseSelect2].modifiers | Qt::ShiftModifier ); setMousePattern( MouseSelect6, d_mousePattern[MouseSelect3].button, d_mousePattern[MouseSelect3].modifiers | Qt::ShiftModifier ); } /*! Set default mouse patterns. \sa KeyPatternCode */ void QwtEventPattern::initKeyPattern() { d_keyPattern.resize( KeyPatternCount ); setKeyPattern( KeySelect1, Qt::Key_Return ); setKeyPattern( KeySelect2, Qt::Key_Space ); setKeyPattern( KeyAbort, Qt::Key_Escape ); setKeyPattern( KeyLeft, Qt::Key_Left ); setKeyPattern( KeyRight, Qt::Key_Right ); setKeyPattern( KeyUp, Qt::Key_Up ); setKeyPattern( KeyDown, Qt::Key_Down ); setKeyPattern( KeyRedo, Qt::Key_Plus ); setKeyPattern( KeyUndo, Qt::Key_Minus ); setKeyPattern( KeyHome, Qt::Key_Escape ); } /*! Change one mouse pattern \param pattern Index of the pattern \param button Button \param modifiers Keyboard modifiers \sa QMouseEvent */ void QwtEventPattern::setMousePattern( MousePatternCode pattern, Qt::MouseButton button, Qt::KeyboardModifiers modifiers ) { if ( pattern >= 0 && pattern < MousePatternCount ) { d_mousePattern[ pattern ].button = button; d_mousePattern[ pattern ].modifiers = modifiers; } } /*! Change one key pattern \param pattern Index of the pattern \param key Key \param modifiers Keyboard modifiers \sa QKeyEvent */ void QwtEventPattern::setKeyPattern( KeyPatternCode pattern, int key, Qt::KeyboardModifiers modifiers ) { if ( pattern >= 0 && pattern < KeyPatternCount ) { d_keyPattern[ pattern ].key = key; d_keyPattern[ pattern ].modifiers = modifiers; } } //! Change the mouse event patterns void QwtEventPattern::setMousePattern( const QVector &pattern ) { d_mousePattern = pattern; } //! Change the key event patterns void QwtEventPattern::setKeyPattern( const QVector &pattern ) { d_keyPattern = pattern; } //! \return Mouse pattern const QVector & QwtEventPattern::mousePattern() const { return d_mousePattern; } //! \return Key pattern const QVector & QwtEventPattern::keyPattern() const { return d_keyPattern; } //! \return Mouse pattern QVector &QwtEventPattern::mousePattern() { return d_mousePattern; } //! \return Key pattern QVector &QwtEventPattern::keyPattern() { return d_keyPattern; } /*! \brief Compare a mouse event with an event pattern. A mouse event matches the pattern when both have the same button value and in the state value the same key flags(Qt::KeyButtonMask) are set. \param code Index of the event pattern \param event Mouse event \return true if matches \sa keyMatch() */ bool QwtEventPattern::mouseMatch( MousePatternCode code, const QMouseEvent *event ) const { if ( code >= 0 && code < MousePatternCount ) return mouseMatch( d_mousePattern[ code ], event ); return false; } /*! \brief Compare a mouse event with an event pattern. A mouse event matches the pattern when both have the same button value and in the state value the same key flags(Qt::KeyButtonMask) are set. \param pattern Mouse event pattern \param event Mouse event \return true if matches \sa keyMatch() */ bool QwtEventPattern::mouseMatch( const MousePattern &pattern, const QMouseEvent *event ) const { if ( event == NULL ) return false; const MousePattern mousePattern( event->button(), event->modifiers() ); return mousePattern == pattern; } /*! \brief Compare a key event with an event pattern. A key event matches the pattern when both have the same key value and in the state value the same key flags (Qt::KeyButtonMask) are set. \param code Index of the event pattern \param event Key event \return true if matches \sa mouseMatch() */ bool QwtEventPattern::keyMatch( KeyPatternCode code, const QKeyEvent *event ) const { if ( code >= 0 && code < KeyPatternCount ) return keyMatch( d_keyPattern[ code ], event ); return false; } /*! \brief Compare a key event with an event pattern. A key event matches the pattern when both have the same key value and in the state value the same key flags (Qt::KeyButtonMask) are set. \param pattern Key event pattern \param event Key event \return true if matches \sa mouseMatch() */ bool QwtEventPattern::keyMatch( const KeyPattern &pattern, const QKeyEvent *event ) const { if ( event == NULL ) return false; const KeyPattern keyPattern( event->key(), event->modifiers() ); return keyPattern == pattern; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/qwtconfig.pri�������������������������������������������������������������������000644 �001750 �001750 �00000014756 12345211153 017773� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ QWT_VER_MAJ = 6 QWT_VER_MIN = 1 QWT_VER_PAT = 0 QWT_VERSION = $${QWT_VER_MAJ}.$${QWT_VER_MIN}.$${QWT_VER_PAT} ###################################################################### # Install paths ###################################################################### QWT_INSTALL_PREFIX = $$[QT_INSTALL_PREFIX] unix { QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION } win32 { QWT_INSTALL_PREFIX = C:/Qwt-$$QWT_VERSION } QWT_INSTALL_DOCS = $${QWT_INSTALL_PREFIX}/doc QWT_INSTALL_HEADERS = $${QWT_INSTALL_PREFIX}/include QWT_INSTALL_LIBS = $${QWT_INSTALL_PREFIX}/lib ###################################################################### # Designer plugin # creator/designer load designer plugins from certain default # directories ( f.e the path below QT_INSTALL_PREFIX ) and the # directories listed in the QT_PLUGIN_PATH environment variable. # When using the path below QWT_INSTALL_PREFIX you need to # add $${QWT_INSTALL_PREFIX}/plugins to QT_PLUGIN_PATH in the # runtime environment of designer/creator. ###################################################################### QWT_INSTALL_PLUGINS = $${QWT_INSTALL_PREFIX}/plugins/designer # linux distributors often organize the Qt installation # their way and QT_INSTALL_PREFIX doesn't offer a good # path. Also QT_INSTALL_PREFIX is only one of the default # search paths of the designer - not the Qt creator #QWT_INSTALL_PLUGINS = $$[QT_INSTALL_PREFIX]/plugins/designer ###################################################################### # Features # When building a Qwt application with qmake you might want to load # the compiler/linker flags, that are required to build a Qwt application # from qwt.prf. Therefore all you need to do is to add "CONFIG += qwt" # to your project file and take care, that qwt.prf can be found by qmake. # ( see http://doc.trolltech.com/4.7/qmake-advanced-usage.html#adding-new-configuration-features ) # I recommend not to install the Qwt features together with the # Qt features, because you will have to reinstall the Qwt features, # with every Qt upgrade. ###################################################################### QWT_INSTALL_FEATURES = $${QWT_INSTALL_PREFIX}/features # QWT_INSTALL_FEATURES = $$[QT_INSTALL_PREFIX]/features ###################################################################### # Build the static/shared libraries. # If QwtDll is enabled, a shared library is built, otherwise # it will be a static library. ###################################################################### # QWT_CONFIG += QwtDll ###################################################################### # QwtPlot enables all classes, that are needed to use the QwtPlot # widget. ###################################################################### QWT_CONFIG += QwtPlot ###################################################################### # QwtWidgets enables all classes, that are needed to use the all other # widgets (sliders, dials, ...), beside QwtPlot. ###################################################################### QWT_CONFIG += QwtWidgets ###################################################################### # If you want to display svg images on the plot canvas, or # export a plot to a SVG document ###################################################################### QWT_CONFIG += QwtSvg ###################################################################### # If you want to use a OpenGL plot canvas ###################################################################### QWT_CONFIG += QwtOpenGL ###################################################################### # You can use the MathML renderer of the Qt solutions package to # enable MathML support in Qwt. Because of license implications # the ( modified ) code of the MML Widget solution is included and # linked together with the QwtMathMLTextEngine into an own library. # To use it you will have to add "CONFIG += qwtmathml" # to your qmake project file. ###################################################################### #QWT_CONFIG += QwtMathML ###################################################################### # If you want to build the Qwt designer plugin, # enable the line below. # Otherwise you have to build it from the designer directory. ###################################################################### #QWT_CONFIG += QwtDesigner ###################################################################### # Compile all Qwt classes into the designer plugin instead # of linking it against the shared Qwt library. Has no effect # when QwtDesigner or QwtDll are not both enabled. # # On systems where rpath is supported ( all Unixoids ) the # location of the installed Qwt library is compiled into the plugin, # but on Windows it might be easier to have a self contained # plugin to avoid any hassle with configuring the runtime # environment of the designer/creator. ###################################################################### win32 { QWT_CONFIG += QwtDesignerSelfContained } ###################################################################### # If you want to auto build the examples, enable the line below # Otherwise you have to build them from the examples directory. ###################################################################### #QWT_CONFIG += QwtExamples ###################################################################### # The playground is primarily intended for the Qwt development # to explore and test new features. Nevertheless you might find # ideas or code snippets that help for application development # If you want to auto build the applications in playground, enable # the line below. # Otherwise you have to build them from the playground directory. ###################################################################### #QWT_CONFIG += QwtPlayground ###################################################################### # When Qt has been built as framework qmake wants # to link frameworks instead of regular libs ###################################################################### macx:!static:CONFIG(qt_framework, qt_framework|qt_no_framework) { QWT_CONFIG += QwtFramework } ������������������linssid-2.7/qwt-lib/src/qwt_transform.h�������������������������������������������������������������000644 �001750 �001750 �00000006667 12151666701 021136� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TRANSFORM_H #define QWT_TRANSFORM_H #include "qwt_global.h" /*! \brief A transformation between coordinate systems QwtTransform manipulates values, when being mapped between the scale and the paint device coordinate system. A transformation consists of 2 methods: - transform - invTransform where one is is the inverse function of the other. When p1, p2 are the boundaries of the paint device coordinates and s1, s2 the boundaries of the scale, QwtScaleMap uses the following calculations: - p = p1 + ( p2 - p1 ) * ( T( s ) - T( s1 ) / ( T( s2 ) - T( s1 ) ); - s = invT ( T( s1 ) + ( T( s2 ) - T( s1 ) ) * ( p - p1 ) / ( p2 - p1 ) ); */ class QWT_EXPORT QwtTransform { public: QwtTransform(); virtual ~QwtTransform(); /*! Modify value to be a valid value for the transformation. The default implementation does nothing. */ virtual double bounded( double value ) const; /*! Transformation function \param value Value \return Modified value \sa invTransform() */ virtual double transform( double value ) const = 0; /*! Inverse transformation function \param value Value \return Modified value \sa transform() */ virtual double invTransform( double value ) const = 0; //! Virtualized copy operation virtual QwtTransform *copy() const = 0; }; /*! \brief Null transformation QwtNullTransform returns the values unmodified. */ class QWT_EXPORT QwtNullTransform: public QwtTransform { public: QwtNullTransform(); virtual ~QwtNullTransform(); virtual double transform( double value ) const; virtual double invTransform( double value ) const; virtual QwtTransform *copy() const; }; /*! \brief Logarithmic transformation QwtLogTransform modifies the values using log() and exp(). \note In the calculations of QwtScaleMap the base of the log function has no effect on the mapping. So QwtLogTransform can be used for log2(), log10() or any other logarithmic scale. */ class QWT_EXPORT QwtLogTransform: public QwtTransform { public: QwtLogTransform(); virtual ~QwtLogTransform(); virtual double transform( double value ) const; virtual double invTransform( double value ) const; virtual double bounded( double value ) const; virtual QwtTransform *copy() const; QT_STATIC_CONST double LogMin; QT_STATIC_CONST double LogMax; }; /*! \brief A transformation using pow() QwtPowerTransform preserves the sign of a value. F.e. a transformation with a factor of 2 transforms a value of -3 to -9 and v.v. Thus QwtPowerTransform can be used for scales including negative values. */ class QWT_EXPORT QwtPowerTransform: public QwtTransform { public: QwtPowerTransform( double exponent ); virtual ~QwtPowerTransform(); virtual double transform( double value ) const; virtual double invTransform( double value ) const; virtual QwtTransform *copy() const; private: const double d_exponent; }; #endif �������������������������������������������������������������������������linssid-2.7/linssid-app/INSTALL.txt�����������������������������������������������������������������000664 �001750 �001750 �00000002351 12366755470 020001� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Building and installing LinSSID To build from source you will need the proper development environment. At minimum you will need: * build-essential * libboost-regex-dev * qt5-default * qt5-make * libqt5svg5-dev * libqt5opengl5-dev * qtchooser (if you already have qt4 and you want a dual development environment) LinSSID uses qwt 6.1, and normally one would also install that package. However, qwt 6.1 is at this time not widely available in the distribution repos. So, I have included the sources for qwt 6.1 along with the sources for LinSSID. The common build for LinSSID will first build qwt 6.1, and then build LinSSID and link LinSSID to the necessary parts of qwt 6.1. This method is ugly but it works. To build: (1) Unpack the source archive. (2) Open a terminal window and cd to the top level of the unpacked archive where you see the file linssid.pro (3) Type: qmake make sudo make install That should have compiled QWT LinSSID, linked all, and installed LinSSID and a few of its ancillary files in the expected places in most Debian/Ubuntu and related distributions. If you're building for a different family of distributions you may need to modify the linssid-app/linssid-app.pro file to change some of the install destinations. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_picker_machine.cpp������������������������������������������������������000644 �001750 �001750 �00000032001 12151666703 022376� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_picker_machine.h" #include "qwt_event_pattern.h" #include //! Constructor QwtPickerMachine::QwtPickerMachine( SelectionType type ): d_selectionType( type ), d_state( 0 ) { } //! Destructor QwtPickerMachine::~QwtPickerMachine() { } //! Return the selection type QwtPickerMachine::SelectionType QwtPickerMachine::selectionType() const { return d_selectionType; } //! Return the current state int QwtPickerMachine::state() const { return d_state; } //! Change the current state void QwtPickerMachine::setState( int state ) { d_state = state; } //! Set the current state to 0. void QwtPickerMachine::reset() { setState( 0 ); } //! Constructor QwtPickerTrackerMachine::QwtPickerTrackerMachine(): QwtPickerMachine( NoSelection ) { } //! Transition QList QwtPickerTrackerMachine::transition( const QwtEventPattern &, const QEvent *e ) { QList cmdList; switch ( e->type() ) { case QEvent::Enter: case QEvent::MouseMove: { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; setState( 1 ); } else { cmdList += Move; } break; } case QEvent::Leave: { cmdList += Remove; cmdList += End; setState( 0 ); } default: break; } return cmdList; } //! Constructor QwtPickerClickPointMachine::QwtPickerClickPointMachine(): QwtPickerMachine( PointSelection ) { } //! Transition QList QwtPickerClickPointMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { cmdList += Begin; cmdList += Append; cmdList += End; } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { cmdList += Begin; cmdList += Append; cmdList += End; } break; } default: break; } return cmdList; } //! Constructor QwtPickerDragPointMachine::QwtPickerDragPointMachine(): QwtPickerMachine( PointSelection ) { } //! Transition QList QwtPickerDragPointMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; setState( 1 ); } } break; } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::MouseButtonRelease: { if ( state() != 0 ) { cmdList += End; setState( 0 ); } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; setState( 1 ); } else { cmdList += End; setState( 0 ); } } break; } default: break; } return cmdList; } //! Constructor QwtPickerClickRectMachine::QwtPickerClickRectMachine(): QwtPickerMachine( RectSelection ) { } //! Transition QList QwtPickerClickRectMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { switch ( state() ) { case 0: { cmdList += Begin; cmdList += Append; setState( 1 ); break; } case 1: { // Uh, strange we missed the MouseButtonRelease break; } default: { cmdList += End; setState( 0 ); } } } } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::MouseButtonRelease: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 1 ) { cmdList += Append; setState( 2 ); } } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; setState( 1 ); } else { if ( state() == 1 ) { cmdList += Append; setState( 2 ); } else if ( state() == 2 ) { cmdList += End; setState( 0 ); } } } break; } default: break; } return cmdList; } //! Constructor QwtPickerDragRectMachine::QwtPickerDragRectMachine(): QwtPickerMachine( RectSelection ) { } //! Transition QList QwtPickerDragRectMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 2 ); } } break; } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::MouseButtonRelease: { if ( state() == 2 ) { cmdList += End; setState( 0 ); } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 2 ); } else { cmdList += End; setState( 0 ); } } break; } default: break; } return cmdList; } //! Constructor QwtPickerPolygonMachine::QwtPickerPolygonMachine(): QwtPickerMachine( PolygonSelection ) { } //! Transition QList QwtPickerPolygonMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch ( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 1 ); } else { cmdList += Append; } } if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect2, static_cast( event ) ) ) { if ( state() == 1 ) { cmdList += End; setState( 0 ); } } break; } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 1 ); } else { cmdList += Append; } } else if ( eventPattern.keyMatch( QwtEventPattern::KeySelect2, static_cast ( event ) ) ) { if ( state() == 1 ) { cmdList += End; setState( 0 ); } } break; } default: break; } return cmdList; } //! Constructor QwtPickerDragLineMachine::QwtPickerDragLineMachine(): QwtPickerMachine( PolygonSelection ) { } //! Transition QList QwtPickerDragLineMachine::transition( const QwtEventPattern &eventPattern, const QEvent *event ) { QList cmdList; switch( event->type() ) { case QEvent::MouseButtonPress: { if ( eventPattern.mouseMatch( QwtEventPattern::MouseSelect1, static_cast( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 1 ); } } break; } case QEvent::KeyPress: { if ( eventPattern.keyMatch( QwtEventPattern::KeySelect1, static_cast ( event ) ) ) { if ( state() == 0 ) { cmdList += Begin; cmdList += Append; cmdList += Append; setState( 1 ); } else { cmdList += End; setState( 0 ); } } break; } case QEvent::MouseMove: case QEvent::Wheel: { if ( state() != 0 ) cmdList += Move; break; } case QEvent::MouseButtonRelease: { if ( state() != 0 ) { cmdList += End; setState( 0 ); } } default: break; } return cmdList; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_layout.cpp���������������������������������������������������������000644 �001750 �001750 �00000125615 12151666703 022026� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_layout.h" #include "qwt_text.h" #include "qwt_text_label.h" #include "qwt_scale_widget.h" #include "qwt_abstract_legend.h" #include #include class QwtPlotLayout::LayoutData { public: void init( const QwtPlot *, const QRectF &rect ); struct t_legendData { int frameWidth; int hScrollExtent; int vScrollExtent; QSize hint; } legend; struct t_titleData { QwtText text; int frameWidth; } title; struct t_footerData { QwtText text; int frameWidth; } footer; struct t_scaleData { bool isEnabled; const QwtScaleWidget *scaleWidget; QFont scaleFont; int start; int end; int baseLineOffset; double tickOffset; int dimWithoutTitle; } scale[QwtPlot::axisCnt]; struct t_canvasData { int contentsMargins[ QwtPlot::axisCnt ]; } canvas; }; /* Extract all layout relevant data from the plot components */ void QwtPlotLayout::LayoutData::init( const QwtPlot *plot, const QRectF &rect ) { // legend if ( plot->legend() ) { legend.frameWidth = plot->legend()->frameWidth(); legend.hScrollExtent = plot->legend()->scrollExtent( Qt::Horizontal ); legend.vScrollExtent = plot->legend()->scrollExtent( Qt::Vertical ); const QSize hint = plot->legend()->sizeHint(); int w = qMin( hint.width(), qFloor( rect.width() ) ); int h = plot->legend()->heightForWidth( w ); if ( h <= 0 ) h = hint.height(); if ( h > rect.height() ) w += legend.hScrollExtent; legend.hint = QSize( w, h ); } // title title.frameWidth = 0; title.text = QwtText(); if ( plot->titleLabel() ) { const QwtTextLabel *label = plot->titleLabel(); title.text = label->text(); if ( !( title.text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) ) title.text.setFont( label->font() ); title.frameWidth = plot->titleLabel()->frameWidth(); } // footer footer.frameWidth = 0; footer.text = QwtText(); if ( plot->footerLabel() ) { const QwtTextLabel *label = plot->footerLabel(); footer.text = label->text(); if ( !( footer.text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) ) footer.text.setFont( label->font() ); footer.frameWidth = plot->footerLabel()->frameWidth(); } // scales for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( plot->axisEnabled( axis ) ) { const QwtScaleWidget *scaleWidget = plot->axisWidget( axis ); scale[axis].isEnabled = true; scale[axis].scaleWidget = scaleWidget; scale[axis].scaleFont = scaleWidget->font(); scale[axis].start = scaleWidget->startBorderDist(); scale[axis].end = scaleWidget->endBorderDist(); scale[axis].baseLineOffset = scaleWidget->margin(); scale[axis].tickOffset = scaleWidget->margin(); if ( scaleWidget->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) ) { scale[axis].tickOffset += scaleWidget->scaleDraw()->maxTickLength(); } scale[axis].dimWithoutTitle = scaleWidget->dimForLength( QWIDGETSIZE_MAX, scale[axis].scaleFont ); if ( !scaleWidget->title().isEmpty() ) { scale[axis].dimWithoutTitle -= scaleWidget->titleHeightForWidth( QWIDGETSIZE_MAX ); } } else { scale[axis].isEnabled = false; scale[axis].start = 0; scale[axis].end = 0; scale[axis].baseLineOffset = 0; scale[axis].tickOffset = 0.0; scale[axis].dimWithoutTitle = 0; } } // canvas plot->canvas()->getContentsMargins( &canvas.contentsMargins[ QwtPlot::yLeft ], &canvas.contentsMargins[ QwtPlot::xTop ], &canvas.contentsMargins[ QwtPlot::yRight ], &canvas.contentsMargins[ QwtPlot::xBottom ] ); } class QwtPlotLayout::PrivateData { public: PrivateData(): spacing( 5 ) { } QRectF titleRect; QRectF footerRect; QRectF legendRect; QRectF scaleRect[QwtPlot::axisCnt]; QRectF canvasRect; QwtPlotLayout::LayoutData layoutData; QwtPlot::LegendPosition legendPos; double legendRatio; unsigned int spacing; unsigned int canvasMargin[QwtPlot::axisCnt]; bool alignCanvasToScales[QwtPlot::axisCnt]; }; /*! \brief Constructor */ QwtPlotLayout::QwtPlotLayout() { d_data = new PrivateData; setLegendPosition( QwtPlot::BottomLegend ); setCanvasMargin( 4 ); setAlignCanvasToScales( false ); invalidate(); } //! Destructor QwtPlotLayout::~QwtPlotLayout() { delete d_data; } /*! Change a margin of the canvas. The margin is the space above/below the scale ticks. A negative margin will be set to -1, excluding the borders of the scales. \param margin New margin \param axis One of QwtPlot::Axis. Specifies where the position of the margin. -1 means margin at all borders. \sa canvasMargin() \warning The margin will have no effect when alignCanvasToScale() is true */ void QwtPlotLayout::setCanvasMargin( int margin, int axis ) { if ( margin < -1 ) margin = -1; if ( axis == -1 ) { for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->canvasMargin[axis] = margin; } else if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->canvasMargin[axis] = margin; } /*! \param axisId Axis index \return Margin around the scale tick borders \sa setCanvasMargin() */ int QwtPlotLayout::canvasMargin( int axisId ) const { if ( axisId < 0 || axisId >= QwtPlot::axisCnt ) return 0; return d_data->canvasMargin[axisId]; } /*! \brief Set the align-canvas-to-axis-scales flag for all axes \param on True/False \sa setAlignCanvasToScale(), alignCanvasToScale() */ void QwtPlotLayout::setAlignCanvasToScales( bool on ) { for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->alignCanvasToScales[axis] = on; } /*! Change the align-canvas-to-axis-scales setting. The canvas may: - extend beyond the axis scale ends to maximize its size, - align with the axis scale ends to control its size. The axisId parameter is somehow confusing as it identifies a border of the plot and not the axes, that are aligned. F.e when QwtPlot::yLeft is set, the left end of the the x-axes ( QwtPlot::xTop, QwtPlot::xBottom ) is aligned. \param axisId Axis index \param on New align-canvas-to-axis-scales setting \sa setCanvasMargin(), alignCanvasToScale(), setAlignCanvasToScales() \warning In case of on == true canvasMargin() will have no effect */ void QwtPlotLayout::setAlignCanvasToScale( int axisId, bool on ) { if ( axisId >= 0 && axisId < QwtPlot::axisCnt ) d_data->alignCanvasToScales[axisId] = on; } /*! Return the align-canvas-to-axis-scales setting. The canvas may: - extend beyond the axis scale ends to maximize its size - align with the axis scale ends to control its size. \param axisId Axis index \return align-canvas-to-axis-scales setting \sa setAlignCanvasToScale(), setAlignCanvasToScale(), setCanvasMargin() */ bool QwtPlotLayout::alignCanvasToScale( int axisId ) const { if ( axisId < 0 || axisId >= QwtPlot::axisCnt ) return false; return d_data->alignCanvasToScales[ axisId ]; } /*! Change the spacing of the plot. The spacing is the distance between the plot components. \param spacing New spacing \sa setCanvasMargin(), spacing() */ void QwtPlotLayout::setSpacing( int spacing ) { d_data->spacing = qMax( 0, spacing ); } /*! \return Spacing \sa margin(), setSpacing() */ int QwtPlotLayout::spacing() const { return d_data->spacing; } /*! \brief Specify the position of the legend \param pos The legend's position. \param ratio Ratio between legend and the bounding rectangle of title, footer, canvas and axes. The legend will be shrunk if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. \sa QwtPlot::setLegendPosition() */ void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos, double ratio ) { if ( ratio > 1.0 ) ratio = 1.0; switch ( pos ) { case QwtPlot::TopLegend: case QwtPlot::BottomLegend: if ( ratio <= 0.0 ) ratio = 0.33; d_data->legendRatio = ratio; d_data->legendPos = pos; break; case QwtPlot::LeftLegend: case QwtPlot::RightLegend: if ( ratio <= 0.0 ) ratio = 0.5; d_data->legendRatio = ratio; d_data->legendPos = pos; break; default: break; } } /*! \brief Specify the position of the legend \param pos The legend's position. Valid values are \c QwtPlot::LeftLegend, \c QwtPlot::RightLegend, \c QwtPlot::TopLegend, \c QwtPlot::BottomLegend. \sa QwtPlot::setLegendPosition() */ void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos ) { setLegendPosition( pos, 0.0 ); } /*! \return Position of the legend \sa setLegendPosition(), QwtPlot::setLegendPosition(), QwtPlot::legendPosition() */ QwtPlot::LegendPosition QwtPlotLayout::legendPosition() const { return d_data->legendPos; } /*! Specify the relative size of the legend in the plot \param ratio Ratio between legend and the bounding rectangle of title, footer, canvas and axes. The legend will be shrunk if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. */ void QwtPlotLayout::setLegendRatio( double ratio ) { setLegendPosition( legendPosition(), ratio ); } /*! \return The relative size of the legend in the plot. \sa setLegendPosition() */ double QwtPlotLayout::legendRatio() const { return d_data->legendRatio; } /*! \brief Set the geometry for the title This method is intended to be used from derived layouts overloading activate() \sa titleRect(), activate() */ void QwtPlotLayout::setTitleRect( const QRectF &rect ) { d_data->titleRect = rect; } /*! \return Geometry for the title \sa activate(), invalidate() */ QRectF QwtPlotLayout::titleRect() const { return d_data->titleRect; } /*! \brief Set the geometry for the footer This method is intended to be used from derived layouts overloading activate() \sa footerRect(), activate() */ void QwtPlotLayout::setFooterRect( const QRectF &rect ) { d_data->footerRect = rect; } /*! \return Geometry for the footer \sa activate(), invalidate() */ QRectF QwtPlotLayout::footerRect() const { return d_data->footerRect; } /*! \brief Set the geometry for the legend This method is intended to be used from derived layouts overloading activate() \param rect Rectangle for the legend \sa legendRect(), activate() */ void QwtPlotLayout::setLegendRect( const QRectF &rect ) { d_data->legendRect = rect; } /*! \return Geometry for the legend \sa activate(), invalidate() */ QRectF QwtPlotLayout::legendRect() const { return d_data->legendRect; } /*! \brief Set the geometry for an axis This method is intended to be used from derived layouts overloading activate() \param axis Axis index \param rect Rectangle for the scale \sa scaleRect(), activate() */ void QwtPlotLayout::setScaleRect( int axis, const QRectF &rect ) { if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->scaleRect[axis] = rect; } /*! \param axis Axis index \return Geometry for the scale \sa activate(), invalidate() */ QRectF QwtPlotLayout::scaleRect( int axis ) const { if ( axis < 0 || axis >= QwtPlot::axisCnt ) { static QRectF dummyRect; return dummyRect; } return d_data->scaleRect[axis]; } /*! \brief Set the geometry for the canvas This method is intended to be used from derived layouts overloading activate() \sa canvasRect(), activate() */ void QwtPlotLayout::setCanvasRect( const QRectF &rect ) { d_data->canvasRect = rect; } /*! \return Geometry for the canvas \sa activate(), invalidate() */ QRectF QwtPlotLayout::canvasRect() const { return d_data->canvasRect; } /*! Invalidate the geometry of all components. \sa activate() */ void QwtPlotLayout::invalidate() { d_data->titleRect = d_data->footerRect = d_data->legendRect = d_data->canvasRect = QRect(); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->scaleRect[axis] = QRect(); } /*! \return Minimum size hint \param plot Plot widget \sa QwtPlot::minimumSizeHint() */ QSize QwtPlotLayout::minimumSizeHint( const QwtPlot *plot ) const { class ScaleData { public: ScaleData() { w = h = minLeft = minRight = tickOffset = 0; } int w; int h; int minLeft; int minRight; int tickOffset; } scaleData[QwtPlot::axisCnt]; int canvasBorder[QwtPlot::axisCnt]; int fw; plot->canvas()->getContentsMargins( &fw, NULL, NULL, NULL ); int axis; for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( plot->axisEnabled( axis ) ) { const QwtScaleWidget *scl = plot->axisWidget( axis ); ScaleData &sd = scaleData[axis]; const QSize hint = scl->minimumSizeHint(); sd.w = hint.width(); sd.h = hint.height(); scl->getBorderDistHint( sd.minLeft, sd.minRight ); sd.tickOffset = scl->margin(); if ( scl->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) ) sd.tickOffset += qCeil( scl->scaleDraw()->maxTickLength() ); } canvasBorder[axis] = fw + d_data->canvasMargin[axis] + 1; } for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) { ScaleData &sd = scaleData[axis]; if ( sd.w && ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) ) { if ( ( sd.minLeft > canvasBorder[QwtPlot::yLeft] ) && scaleData[QwtPlot::yLeft].w ) { int shiftLeft = sd.minLeft - canvasBorder[QwtPlot::yLeft]; if ( shiftLeft > scaleData[QwtPlot::yLeft].w ) shiftLeft = scaleData[QwtPlot::yLeft].w; sd.w -= shiftLeft; } if ( ( sd.minRight > canvasBorder[QwtPlot::yRight] ) && scaleData[QwtPlot::yRight].w ) { int shiftRight = sd.minRight - canvasBorder[QwtPlot::yRight]; if ( shiftRight > scaleData[QwtPlot::yRight].w ) shiftRight = scaleData[QwtPlot::yRight].w; sd.w -= shiftRight; } } if ( sd.h && ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) ) { if ( ( sd.minLeft > canvasBorder[QwtPlot::xBottom] ) && scaleData[QwtPlot::xBottom].h ) { int shiftBottom = sd.minLeft - canvasBorder[QwtPlot::xBottom]; if ( shiftBottom > scaleData[QwtPlot::xBottom].tickOffset ) shiftBottom = scaleData[QwtPlot::xBottom].tickOffset; sd.h -= shiftBottom; } if ( ( sd.minLeft > canvasBorder[QwtPlot::xTop] ) && scaleData[QwtPlot::xTop].h ) { int shiftTop = sd.minRight - canvasBorder[QwtPlot::xTop]; if ( shiftTop > scaleData[QwtPlot::xTop].tickOffset ) shiftTop = scaleData[QwtPlot::xTop].tickOffset; sd.h -= shiftTop; } } } const QWidget *canvas = plot->canvas(); int left, top, right, bottom; canvas->getContentsMargins( &left, &top, &right, &bottom ); const QSize minCanvasSize = canvas->minimumSize(); int w = scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; int cw = qMax( scaleData[QwtPlot::xBottom].w, scaleData[QwtPlot::xTop].w ) + left + 1 + right + 1; w += qMax( cw, minCanvasSize.width() ); int h = scaleData[QwtPlot::xBottom].h + scaleData[QwtPlot::xTop].h; int ch = qMax( scaleData[QwtPlot::yLeft].h, scaleData[QwtPlot::yRight].h ) + top + 1 + bottom + 1; h += qMax( ch, minCanvasSize.height() ); const QwtTextLabel *labels[2]; labels[0] = plot->titleLabel(); labels[1] = plot->footerLabel(); for ( int i = 0; i < 2; i++ ) { const QwtTextLabel *label = labels[i]; if ( label && !label->text().isEmpty() ) { // If only QwtPlot::yLeft or QwtPlot::yRight is showing, // we center on the plot canvas. const bool centerOnCanvas = !( plot->axisEnabled( QwtPlot::yLeft ) && plot->axisEnabled( QwtPlot::yRight ) ); int labelW = w; if ( centerOnCanvas ) { labelW -= scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; } int labelH = label->heightForWidth( labelW ); if ( labelH > labelW ) // Compensate for a long title { w = labelW = labelH; if ( centerOnCanvas ) { w += scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; } labelH = label->heightForWidth( labelW ); } h += labelH + d_data->spacing; } } // Compute the legend contribution const QwtAbstractLegend *legend = plot->legend(); if ( legend && !legend->isEmpty() ) { if ( d_data->legendPos == QwtPlot::LeftLegend || d_data->legendPos == QwtPlot::RightLegend ) { int legendW = legend->sizeHint().width(); int legendH = legend->heightForWidth( legendW ); if ( legend->frameWidth() > 0 ) w += d_data->spacing; if ( legendH > h ) legendW += legend->scrollExtent( Qt::Horizontal ); if ( d_data->legendRatio < 1.0 ) legendW = qMin( legendW, int( w / ( 1.0 - d_data->legendRatio ) ) ); w += legendW + d_data->spacing; } else // QwtPlot::Top, QwtPlot::Bottom { int legendW = qMin( legend->sizeHint().width(), w ); int legendH = legend->heightForWidth( legendW ); if ( legend->frameWidth() > 0 ) h += d_data->spacing; if ( d_data->legendRatio < 1.0 ) legendH = qMin( legendH, int( h / ( 1.0 - d_data->legendRatio ) ) ); h += legendH + d_data->spacing; } } return QSize( w, h ); } /*! Find the geometry for the legend \param options Options how to layout the legend \param rect Rectangle where to place the legend \return Geometry for the legend \sa Options */ QRectF QwtPlotLayout::layoutLegend( Options options, const QRectF &rect ) const { const QSize hint( d_data->layoutData.legend.hint ); int dim; if ( d_data->legendPos == QwtPlot::LeftLegend || d_data->legendPos == QwtPlot::RightLegend ) { // We don't allow vertical legends to take more than // half of the available space. dim = qMin( hint.width(), int( rect.width() * d_data->legendRatio ) ); if ( !( options & IgnoreScrollbars ) ) { if ( hint.height() > rect.height() ) { // The legend will need additional // space for the vertical scrollbar. dim += d_data->layoutData.legend.hScrollExtent; } } } else { dim = qMin( hint.height(), int( rect.height() * d_data->legendRatio ) ); dim = qMax( dim, d_data->layoutData.legend.vScrollExtent ); } QRectF legendRect = rect; switch ( d_data->legendPos ) { case QwtPlot::LeftLegend: legendRect.setWidth( dim ); break; case QwtPlot::RightLegend: legendRect.setX( rect.right() - dim ); legendRect.setWidth( dim ); break; case QwtPlot::TopLegend: legendRect.setHeight( dim ); break; case QwtPlot::BottomLegend: legendRect.setY( rect.bottom() - dim ); legendRect.setHeight( dim ); break; } return legendRect; } /*! Align the legend to the canvas \param canvasRect Geometry of the canvas \param legendRect Maximum geometry for the legend \return Geometry for the aligned legend */ QRectF QwtPlotLayout::alignLegend( const QRectF &canvasRect, const QRectF &legendRect ) const { QRectF alignedRect = legendRect; if ( d_data->legendPos == QwtPlot::BottomLegend || d_data->legendPos == QwtPlot::TopLegend ) { if ( d_data->layoutData.legend.hint.width() < canvasRect.width() ) { alignedRect.setX( canvasRect.x() ); alignedRect.setWidth( canvasRect.width() ); } } else { if ( d_data->layoutData.legend.hint.height() < canvasRect.height() ) { alignedRect.setY( canvasRect.y() ); alignedRect.setHeight( canvasRect.height() ); } } return alignedRect; } /*! Expand all line breaks in text labels, and calculate the height of their widgets in orientation of the text. \param options Options how to layout the legend \param rect Bounding rectangle for title, footer, axes and canvas. \param dimTitle Expanded height of the title widget \param dimFooter Expanded height of the footer widget \param dimAxis Expanded heights of the axis in axis orientation. \sa Options */ void QwtPlotLayout::expandLineBreaks( Options options, const QRectF &rect, int &dimTitle, int &dimFooter, int dimAxis[QwtPlot::axisCnt] ) const { dimTitle = dimFooter = 0; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) dimAxis[axis] = 0; int backboneOffset[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { backboneOffset[axis] = 0; if ( !( options & IgnoreFrames ) ) backboneOffset[axis] += d_data->layoutData.canvas.contentsMargins[ axis ]; if ( !d_data->alignCanvasToScales[axis] ) backboneOffset[axis] += d_data->canvasMargin[axis]; } bool done = false; while ( !done ) { done = true; // the size for the 4 axis depend on each other. Expanding // the height of a horizontal axis will shrink the height // for the vertical axis, shrinking the height of a vertical // axis will result in a line break what will expand the // width and results in shrinking the width of a horizontal // axis what might result in a line break of a horizontal // axis ... . So we loop as long until no size changes. if ( !( ( options & IgnoreTitle ) || d_data->layoutData.title.text.isEmpty() ) ) { double w = rect.width(); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // center to the canvas w -= dimAxis[QwtPlot::yLeft] + dimAxis[QwtPlot::yRight]; } int d = qCeil( d_data->layoutData.title.text.heightForWidth( w ) ); if ( !( options & IgnoreFrames ) ) d += 2 * d_data->layoutData.title.frameWidth; if ( d > dimTitle ) { dimTitle = d; done = false; } } if ( !( ( options & IgnoreFooter ) || d_data->layoutData.footer.text.isEmpty() ) ) { double w = rect.width(); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // center to the canvas w -= dimAxis[QwtPlot::yLeft] + dimAxis[QwtPlot::yRight]; } int d = qCeil( d_data->layoutData.footer.text.heightForWidth( w ) ); if ( !( options & IgnoreFrames ) ) d += 2 * d_data->layoutData.footer.frameWidth; if ( d > dimFooter ) { dimFooter = d; done = false; } } for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { const struct LayoutData::t_scaleData &scaleData = d_data->layoutData.scale[axis]; if ( scaleData.isEnabled ) { double length; if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom ) { length = rect.width() - dimAxis[QwtPlot::yLeft] - dimAxis[QwtPlot::yRight]; length -= scaleData.start + scaleData.end; if ( dimAxis[QwtPlot::yRight] > 0 ) length -= 1; length += qMin( dimAxis[QwtPlot::yLeft], scaleData.start - backboneOffset[QwtPlot::yLeft] ); length += qMin( dimAxis[QwtPlot::yRight], scaleData.end - backboneOffset[QwtPlot::yRight] ); } else // QwtPlot::yLeft, QwtPlot::yRight { length = rect.height() - dimAxis[QwtPlot::xTop] - dimAxis[QwtPlot::xBottom]; length -= scaleData.start + scaleData.end; length -= 1; if ( dimAxis[QwtPlot::xBottom] <= 0 ) length -= 1; if ( dimAxis[QwtPlot::xTop] <= 0 ) length -= 1; if ( dimAxis[QwtPlot::xBottom] > 0 ) { length += qMin( d_data->layoutData.scale[QwtPlot::xBottom].tickOffset, double( scaleData.start - backboneOffset[QwtPlot::xBottom] ) ); } if ( dimAxis[QwtPlot::xTop] > 0 ) { length += qMin( d_data->layoutData.scale[QwtPlot::xTop].tickOffset, double( scaleData.end - backboneOffset[QwtPlot::xTop] ) ); } if ( dimTitle > 0 ) length -= dimTitle + d_data->spacing; } int d = scaleData.dimWithoutTitle; if ( !scaleData.scaleWidget->title().isEmpty() ) { d += scaleData.scaleWidget->titleHeightForWidth( qFloor( length ) ); } if ( d > dimAxis[axis] ) { dimAxis[axis] = d; done = false; } } } } } /*! Align the ticks of the axis to the canvas borders using the empty corners. \param options Layout options \param canvasRect Geometry of the canvas ( IN/OUT ) \param scaleRect Geometries of the scales ( IN/OUT ) \sa Options */ void QwtPlotLayout::alignScales( Options options, QRectF &canvasRect, QRectF scaleRect[QwtPlot::axisCnt] ) const { int backboneOffset[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { backboneOffset[axis] = 0; if ( !d_data->alignCanvasToScales[axis] ) { backboneOffset[axis] += d_data->canvasMargin[axis]; } if ( !( options & IgnoreFrames ) ) { backboneOffset[axis] += d_data->layoutData.canvas.contentsMargins[axis]; } } for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( !scaleRect[axis].isValid() ) continue; const int startDist = d_data->layoutData.scale[axis].start; const int endDist = d_data->layoutData.scale[axis].end; QRectF &axisRect = scaleRect[axis]; if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom ) { const QRectF &leftScaleRect = scaleRect[QwtPlot::yLeft]; const int leftOffset = backboneOffset[QwtPlot::yLeft] - startDist; if ( leftScaleRect.isValid() ) { const double dx = leftOffset + leftScaleRect.width(); if ( d_data->alignCanvasToScales[QwtPlot::yLeft] && dx < 0.0 ) { /* The axis needs more space than the width of the left scale. */ const double cLeft = canvasRect.left(); // qreal -> double canvasRect.setLeft( qMax( cLeft, axisRect.left() - dx ) ); } else { const double minLeft = leftScaleRect.left(); const double left = axisRect.left() + leftOffset; axisRect.setLeft( qMax( left, minLeft ) ); } } else { if ( d_data->alignCanvasToScales[QwtPlot::yLeft] && leftOffset < 0 ) { canvasRect.setLeft( qMax( canvasRect.left(), axisRect.left() - leftOffset ) ); } else { if ( leftOffset > 0 ) axisRect.setLeft( axisRect.left() + leftOffset ); } } const QRectF &rightScaleRect = scaleRect[QwtPlot::yRight]; const int rightOffset = backboneOffset[QwtPlot::yRight] - endDist + 1; if ( rightScaleRect.isValid() ) { const double dx = rightOffset + rightScaleRect.width(); if ( d_data->alignCanvasToScales[QwtPlot::yRight] && dx < 0 ) { /* The axis needs more space than the width of the right scale. */ const double cRight = canvasRect.right(); // qreal -> double canvasRect.setRight( qMin( cRight, axisRect.right() + dx ) ); } const double maxRight = rightScaleRect.right(); const double right = axisRect.right() - rightOffset; axisRect.setRight( qMin( right, maxRight ) ); } else { if ( d_data->alignCanvasToScales[QwtPlot::yRight] && rightOffset < 0 ) { canvasRect.setRight( qMin( canvasRect.right(), axisRect.right() + rightOffset ) ); } else { if ( rightOffset > 0 ) axisRect.setRight( axisRect.right() - rightOffset ); } } } else // QwtPlot::yLeft, QwtPlot::yRight { const QRectF &bottomScaleRect = scaleRect[QwtPlot::xBottom]; const int bottomOffset = backboneOffset[QwtPlot::xBottom] - endDist + 1; if ( bottomScaleRect.isValid() ) { const double dy = bottomOffset + bottomScaleRect.height(); if ( d_data->alignCanvasToScales[QwtPlot::xBottom] && dy < 0 ) { /* The axis needs more space than the height of the bottom scale. */ const double cBottom = canvasRect.bottom(); // qreal -> double canvasRect.setBottom( qMin( cBottom, axisRect.bottom() + dy ) ); } else { const double maxBottom = bottomScaleRect.top() + d_data->layoutData.scale[QwtPlot::xBottom].tickOffset; const double bottom = axisRect.bottom() - bottomOffset; axisRect.setBottom( qMin( bottom, maxBottom ) ); } } else { if ( d_data->alignCanvasToScales[QwtPlot::xBottom] && bottomOffset < 0 ) { canvasRect.setBottom( qMin( canvasRect.bottom(), axisRect.bottom() + bottomOffset ) ); } else { if ( bottomOffset > 0 ) axisRect.setBottom( axisRect.bottom() - bottomOffset ); } } const QRectF &topScaleRect = scaleRect[QwtPlot::xTop]; const int topOffset = backboneOffset[QwtPlot::xTop] - startDist; if ( topScaleRect.isValid() ) { const double dy = topOffset + topScaleRect.height(); if ( d_data->alignCanvasToScales[QwtPlot::xTop] && dy < 0 ) { /* The axis needs more space than the height of the top scale. */ const double cTop = canvasRect.top(); // qreal -> double canvasRect.setTop( qMax( cTop, axisRect.top() - dy ) ); } else { const double minTop = topScaleRect.bottom() - d_data->layoutData.scale[QwtPlot::xTop].tickOffset; const double top = axisRect.top() + topOffset; axisRect.setTop( qMax( top, minTop ) ); } } else { if ( d_data->alignCanvasToScales[QwtPlot::xTop] && topOffset < 0 ) { canvasRect.setTop( qMax( canvasRect.top(), axisRect.top() - topOffset ) ); } else { if ( topOffset > 0 ) axisRect.setTop( axisRect.top() + topOffset ); } } } } /* The canvas has been aligned to the scale with largest border distances. Now we have to realign the other scale. */ for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { QRectF &sRect = scaleRect[axis]; if ( !sRect.isValid() ) continue; if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { if ( d_data->alignCanvasToScales[QwtPlot::yLeft] ) { double y = canvasRect.left() - d_data->layoutData.scale[axis].start; if ( !( options & IgnoreFrames ) ) y += d_data->layoutData.canvas.contentsMargins[ QwtPlot::yLeft ]; sRect.setLeft( y ); } if ( d_data->alignCanvasToScales[QwtPlot::yRight] ) { double y = canvasRect.right() - 1 + d_data->layoutData.scale[axis].end; if ( !( options & IgnoreFrames ) ) y -= d_data->layoutData.canvas.contentsMargins[ QwtPlot::yRight ]; sRect.setRight( y ); } if ( d_data->alignCanvasToScales[ axis ] ) { if ( axis == QwtPlot::xTop ) sRect.setBottom( canvasRect.top() ); else sRect.setTop( canvasRect.bottom() ); } } else { if ( d_data->alignCanvasToScales[QwtPlot::xTop] ) { double x = canvasRect.top() - d_data->layoutData.scale[axis].start; if ( !( options & IgnoreFrames ) ) x += d_data->layoutData.canvas.contentsMargins[ QwtPlot::xTop ]; sRect.setTop( x ); } if ( d_data->alignCanvasToScales[QwtPlot::xBottom] ) { double x = canvasRect.bottom() - 1 + d_data->layoutData.scale[axis].end; if ( !( options & IgnoreFrames ) ) x -= d_data->layoutData.canvas.contentsMargins[ QwtPlot::xBottom ]; sRect.setBottom( x ); } if ( d_data->alignCanvasToScales[ axis ] ) { if ( axis == QwtPlot::yLeft ) sRect.setRight( canvasRect.left() ); else sRect.setLeft( canvasRect.right() ); } } } } /*! \brief Recalculate the geometry of all components. \param plot Plot to be layout \param plotRect Rectangle where to place the components \param options Layout options \sa invalidate(), titleRect(), footerRect() legendRect(), scaleRect(), canvasRect() */ void QwtPlotLayout::activate( const QwtPlot *plot, const QRectF &plotRect, Options options ) { invalidate(); QRectF rect( plotRect ); // undistributed rest of the plot rect // We extract all layout relevant parameters from the widgets, // and save them to d_data->layoutData. d_data->layoutData.init( plot, rect ); if ( !( options & IgnoreLegend ) && plot->legend() && !plot->legend()->isEmpty() ) { d_data->legendRect = layoutLegend( options, rect ); // subtract d_data->legendRect from rect const QRegion region( rect.toRect() ); rect = region.subtracted( d_data->legendRect.toRect() ).boundingRect(); switch ( d_data->legendPos ) { case QwtPlot::LeftLegend: rect.setLeft( rect.left() + d_data->spacing ); break; case QwtPlot::RightLegend: rect.setRight( rect.right() - d_data->spacing ); break; case QwtPlot::TopLegend: rect.setTop( rect.top() + d_data->spacing ); break; case QwtPlot::BottomLegend: rect.setBottom( rect.bottom() - d_data->spacing ); break; } } /* +---+-----------+---+ | Title | +---+-----------+---+ | | Axis | | +---+-----------+---+ | A | | A | | x | Canvas | x | | i | | i | | s | | s | +---+-----------+---+ | | Axis | | +---+-----------+---+ | Footer | +---+-----------+---+ */ // title, footer and axes include text labels. The height of each // label depends on its line breaks, that depend on the width // for the label. A line break in a horizontal text will reduce // the available width for vertical texts and vice versa. // expandLineBreaks finds the height/width for title, footer and axes // including all line breaks. int dimTitle, dimFooter, dimAxes[QwtPlot::axisCnt]; expandLineBreaks( options, rect, dimTitle, dimFooter, dimAxes ); if ( dimTitle > 0 ) { d_data->titleRect.setRect( rect.left(), rect.top(), rect.width(), dimTitle ); rect.setTop( d_data->titleRect.bottom() + d_data->spacing ); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // if only one of the y axes is missing we align // the title centered to the canvas d_data->titleRect.setX( rect.left() + dimAxes[QwtPlot::yLeft] ); d_data->titleRect.setWidth( rect.width() - dimAxes[QwtPlot::yLeft] - dimAxes[QwtPlot::yRight] ); } } if ( dimFooter > 0 ) { d_data->footerRect.setRect( rect.left(), rect.bottom() - dimFooter, rect.width(), dimFooter ); rect.setBottom( d_data->footerRect.top() - d_data->spacing ); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // if only one of the y axes is missing we align // the footer centered to the canvas d_data->footerRect.setX( rect.left() + dimAxes[QwtPlot::yLeft] ); d_data->footerRect.setWidth( rect.width() - dimAxes[QwtPlot::yLeft] - dimAxes[QwtPlot::yRight] ); } } d_data->canvasRect.setRect( rect.x() + dimAxes[QwtPlot::yLeft], rect.y() + dimAxes[QwtPlot::xTop], rect.width() - dimAxes[QwtPlot::yRight] - dimAxes[QwtPlot::yLeft], rect.height() - dimAxes[QwtPlot::xBottom] - dimAxes[QwtPlot::xTop] ); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { // set the rects for the axes if ( dimAxes[axis] ) { int dim = dimAxes[axis]; QRectF &scaleRect = d_data->scaleRect[axis]; scaleRect = d_data->canvasRect; switch ( axis ) { case QwtPlot::yLeft: scaleRect.setX( d_data->canvasRect.left() - dim ); scaleRect.setWidth( dim ); break; case QwtPlot::yRight: scaleRect.setX( d_data->canvasRect.right() ); scaleRect.setWidth( dim ); break; case QwtPlot::xBottom: scaleRect.setY( d_data->canvasRect.bottom() ); scaleRect.setHeight( dim ); break; case QwtPlot::xTop: scaleRect.setY( d_data->canvasRect.top() - dim ); scaleRect.setHeight( dim ); break; } scaleRect = scaleRect.normalized(); } } // +---+-----------+---+ // | <- Axis -> | // +-^-+-----------+-^-+ // | | | | | | // | | | | // | A | | A | // | x | Canvas | x | // | i | | i | // | s | | s | // | | | | // | | | | | | // +-V-+-----------+-V-+ // | <- Axis -> | // +---+-----------+---+ // The ticks of the axes - not the labels above - should // be aligned to the canvas. So we try to use the empty // corners to extend the axes, so that the label texts // left/right of the min/max ticks are moved into them. alignScales( options, d_data->canvasRect, d_data->scaleRect ); if ( !d_data->legendRect.isEmpty() ) { // We prefer to align the legend to the canvas - not to // the complete plot - if possible. d_data->legendRect = alignLegend( d_data->canvasRect, d_data->legendRect ); } } �������������������������������������������������������������������������������������������������������������������linssid-2.7/debian/control��������������������������������������������������������������������������000664 �001750 �001750 �00000001616 12361004707 016520� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Source: linssid Section: devel Priority: optional Maintainer: Warren Severin Build-Depends: debhelper (>= 8.0.0), qt5-qmake, qt5-default, qtchooser, cdbs, libboost-regex-dev, libqt5svg5-dev, libqt5opengl5-dev Standards-Version: 3.9.4 Homepage: http://sourceforge.net/projects/linssid Package: linssid Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, wireless-tools, iw Recommends: sudo Description: Graphical wireless scanner . LinSSID displays locally receivable 802.11 wireless attach points and ad hoc networks. A table is displayed with various parameters such as MAC address, channel, and signal strength. Graphs are also displayed with signal strength by channel and signal strength over time. LinSSID is graphically and functionally similar to Inssider (Microsoft™ Windows®). It is written entirely in C++ using boost, QT5, and the Qwt package (>= 6.1). ������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/moc/������������������������������������������������������������������������000775 �001750 �001750 �00000000000 12356106220 016610� 5����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_glcanvas.cpp�������������������������������������������������������000644 �001750 �001750 �00000016725 12151666703 022310� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_glcanvas.h" #include "qwt_plot.h" #include #include #include #include #include #include "qwt_painter.h" static QWidget *qwtBGWidget( QWidget *widget ) { QWidget *w = widget; for ( ; w->parentWidget() != NULL; w = w->parentWidget() ) { if ( w->autoFillBackground() || w->testAttribute( Qt::WA_StyledBackground ) ) { return w; } } return w; } static void qwtUpdateContentsRect( QwtPlotGLCanvas *canvas ) { const int fw = canvas->frameWidth(); canvas->setContentsMargins( fw, fw, fw, fw ); } class QwtPlotGLCanvas::PrivateData { public: PrivateData(): frameStyle( QFrame::Panel | QFrame::Sunken), lineWidth( 2 ), midLineWidth( 0 ) { } int frameStyle; int lineWidth; int midLineWidth; }; /*! \brief Constructor \param plot Parent plot widget \sa QwtPlot::setCanvas() */ QwtPlotGLCanvas::QwtPlotGLCanvas( QwtPlot *plot ): QGLWidget( plot ) { d_data = new PrivateData; #ifndef QT_NO_CURSOR setCursor( Qt::CrossCursor ); #endif setAutoFillBackground( true ); qwtUpdateContentsRect( this ); } //! Destructor QwtPlotGLCanvas::~QwtPlotGLCanvas() { delete d_data; } /*! Set the frame style \param style The bitwise OR between a shape and a shadow. \sa frameStyle(), QFrame::setFrameStyle(), setFrameShadow(), setFrameShape() */ void QwtPlotGLCanvas::setFrameStyle( int style ) { if ( style != d_data->frameStyle ) { d_data->frameStyle = style; qwtUpdateContentsRect( this ); update(); } } /*! \return The bitwise OR between a frameShape() and a frameShadow() \sa setFrameStyle(), QFrame::frameStyle() */ int QwtPlotGLCanvas::frameStyle() const { return d_data->frameStyle; } /*! Set the frame shadow \param shadow Frame shadow \sa frameShadow(), setFrameShape(), QFrame::setFrameShadow() */ void QwtPlotGLCanvas::setFrameShadow( Shadow shadow ) { setFrameStyle(( d_data->frameStyle & QFrame::Shape_Mask ) | shadow ); } /*! \return Frame shadow \sa setFrameShadow(), QFrame::setFrameShadow() */ QwtPlotGLCanvas::Shadow QwtPlotGLCanvas::frameShadow() const { return (Shadow) ( d_data->frameStyle & QFrame::Shadow_Mask ); } /*! Set the frame shape \param shape Frame shape \sa frameShape(), setFrameShadow(), QFrame::frameShape() */ void QwtPlotGLCanvas::setFrameShape( Shape shape ) { setFrameStyle( ( d_data->frameStyle & QFrame::Shadow_Mask ) | shape ); } /*! \return Frame shape \sa setFrameShape(), QFrame::frameShape() */ QwtPlotGLCanvas::Shape QwtPlotGLCanvas::frameShape() const { return (Shape) ( d_data->frameStyle & QFrame::Shape_Mask ); } /*! Set the frame line width The default line width is 2 pixels. \param width Line width of the frame \sa lineWidth(), setMidLineWidth() */ void QwtPlotGLCanvas::setLineWidth( int width ) { width = qMax( width, 0 ); if ( width != d_data->lineWidth ) { d_data->lineWidth = qMax( width, 0 ); qwtUpdateContentsRect( this ); update(); } } /*! \return Line width of the frame \sa setLineWidth(), midLineWidth() */ int QwtPlotGLCanvas::lineWidth() const { return d_data->lineWidth; } /*! Set the frame mid line width The default midline width is 0 pixels. \param width Midline width of the frame \sa midLineWidth(), setLineWidth() */ void QwtPlotGLCanvas::setMidLineWidth( int width ) { width = qMax( width, 0 ); if ( width != d_data->midLineWidth ) { d_data->midLineWidth = width; qwtUpdateContentsRect( this ); update(); } } /*! \return Midline width of the frame \sa setMidLineWidth(), lineWidth() */ int QwtPlotGLCanvas::midLineWidth() const { return d_data->midLineWidth; } /*! \return Frame width depending on the style, line width and midline width. */ int QwtPlotGLCanvas::frameWidth() const { return ( frameStyle() != NoFrame ) ? d_data->lineWidth : 0; } /*! Paint event \param event Paint event \sa QwtPlot::drawCanvas() */ void QwtPlotGLCanvas::paintEvent( QPaintEvent *event ) { Q_UNUSED( event ); QPainter painter( this ); drawBackground( &painter ); drawItems( &painter ); if ( !testAttribute( Qt::WA_StyledBackground ) ) { if ( frameWidth() > 0 ) drawBorder( &painter ); } } /*! Qt event handler for QEvent::PolishRequest and QEvent::StyleChange \param event Qt Event \return See QGLWidget::event() */ bool QwtPlotGLCanvas::event( QEvent *event ) { const bool ok = QGLWidget::event( event ); if ( event->type() == QEvent::PolishRequest || event->type() == QEvent::StyleChange ) { // assuming, that we always have a styled background // when we have a style sheet setAttribute( Qt::WA_StyledBackground, testAttribute( Qt::WA_StyleSheet ) ); } return ok; } /*! Draw the plot items \param painter Painter \sa QwtPlot::drawCanvas() */ void QwtPlotGLCanvas::drawItems( QPainter *painter ) { painter->save(); painter->setClipRect( contentsRect(), Qt::IntersectClip ); QwtPlot *plot = qobject_cast< QwtPlot *>( parent() ); if ( plot ) plot->drawCanvas( painter ); painter->restore(); } /*! Draw the background of the canvas \param painter Painter */ void QwtPlotGLCanvas::drawBackground( QPainter *painter ) { painter->save(); QWidget *w = qwtBGWidget( this ); const QPoint off = mapTo( w, QPoint() ); painter->translate( -off ); const QRect fillRect = rect().translated( off ); if ( w->testAttribute( Qt::WA_StyledBackground ) ) { painter->setClipRect( fillRect ); QStyleOption opt; opt.initFrom( w ); w->style()->drawPrimitive( QStyle::PE_Widget, &opt, painter, w); } else { painter->fillRect( fillRect, w->palette().brush( w->backgroundRole() ) ); } painter->restore(); } /*! Draw the border of the canvas \param painter Painter */ void QwtPlotGLCanvas::drawBorder( QPainter *painter ) { const int fw = frameWidth(); if ( fw <= 0 ) return; if ( frameShadow() == QwtPlotGLCanvas::Plain ) { qDrawPlainRect( painter, frameRect(), palette().shadow().color(), lineWidth() ); } else { if ( frameShape() == QwtPlotGLCanvas::Box ) { qDrawShadeRect( painter, frameRect(), palette(), frameShadow() == Sunken, lineWidth(), midLineWidth() ); } else { qDrawShadePanel( painter, frameRect(), palette(), frameShadow() == Sunken, lineWidth() ); } } } //! Calls repaint() void QwtPlotGLCanvas::replot() { repaint(); } /*! \return Empty path */ QPainterPath QwtPlotGLCanvas::borderPath( const QRect &rect ) const { Q_UNUSED( rect ); return QPainterPath(); } //! \return The rectangle where the frame is drawn in. QRect QwtPlotGLCanvas::frameRect() const { const int fw = frameWidth(); return contentsRect().adjusted( -fw, -fw, fw, fw ); } �������������������������������������������linssid-2.7/qwt-lib/src/qwt_dial.cpp����������������������������������������������������������������000644 �001750 �001750 �00000045773 12151666703 020372� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dial.h" #include "qwt_dial_needle.h" #include "qwt_math.h" #include "qwt_scale_engine.h" #include "qwt_scale_map.h" #include "qwt_round_scale_draw.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #include #include static inline double qwtAngleDist( double a1, double a2 ) { double dist = qAbs( a2 - a1 ); if ( dist > 360.0 ) dist -= 360.0; return dist; } static inline bool qwtIsOnArc( double angle, double min, double max ) { if ( min < max ) { return ( angle >= min ) && ( angle <= max ); } else { return ( angle >= min ) || ( angle <= max ); } } static inline double qwtBoundedAngle( double min, double angle, double max ) { double from = qwtNormalizeDegrees( min ); double to = qwtNormalizeDegrees( max ); double a; if ( qwtIsOnArc( angle, from, to ) ) { a = angle; if ( a < min ) a += 360.0; } else { if ( qwtAngleDist( angle, from ) < qwtAngleDist( angle, to ) ) { a = min; } else { a = max; } } return a; } class QwtDial::PrivateData { public: PrivateData(): frameShadow( Sunken ), lineWidth( 0 ), mode( RotateNeedle ), origin( 90.0 ), minScaleArc( 0.0 ), maxScaleArc( 0.0 ), needle( NULL ), arcOffset( 0.0 ), mouseOffset( 0.0 ) { } ~PrivateData() { delete needle; } Shadow frameShadow; int lineWidth; QwtDial::Mode mode; double origin; double minScaleArc; double maxScaleArc; double scalePenWidth; QwtDialNeedle *needle; double arcOffset; double mouseOffset; QPixmap pixmapCache; }; /*! \brief Constructor \param parent Parent widget Create a dial widget with no needle. The scale is initialized to [ 0.0, 360.0 ] and 360 steps ( QwtAbstractSlider::setTotalSteps() ). The origin of the scale is at 90°, The value is set to 0.0. The default mode is QwtDial::RotateNeedle. */ QwtDial::QwtDial( QWidget* parent ): QwtAbstractSlider( parent ) { d_data = new PrivateData; setFocusPolicy( Qt::TabFocus ); QPalette p = palette(); for ( int i = 0; i < QPalette::NColorGroups; i++ ) { const QPalette::ColorGroup colorGroup = static_cast( i ); // Base: background color of the circle inside the frame. // WindowText: background color of the circle inside the scale p.setColor( colorGroup, QPalette::WindowText, p.color( colorGroup, QPalette::Base ) ); } setPalette( p ); QwtRoundScaleDraw* scaleDraw = new QwtRoundScaleDraw(); scaleDraw->setRadius( 0 ); setScaleDraw( scaleDraw ); setScaleArc( 0.0, 360.0 ); // scale as a full circle setScaleMaxMajor( 10 ); setScaleMaxMinor( 5 ); setValue( 0.0 ); } //! Destructor QwtDial::~QwtDial() { delete d_data; } /*! Sets the frame shadow value from the frame style. \param shadow Frame shadow \sa setLineWidth(), QFrame::setFrameShadow() */ void QwtDial::setFrameShadow( Shadow shadow ) { if ( shadow != d_data->frameShadow ) { invalidateCache(); d_data->frameShadow = shadow; if ( lineWidth() > 0 ) update(); } } /*! \return Frame shadow /sa setFrameShadow(), lineWidth(), QFrame::frameShadow() */ QwtDial::Shadow QwtDial::frameShadow() const { return d_data->frameShadow; } /*! Sets the line width of the frame \param lineWidth Line width \sa setFrameShadow() */ void QwtDial::setLineWidth( int lineWidth ) { if ( lineWidth < 0 ) lineWidth = 0; if ( d_data->lineWidth != lineWidth ) { invalidateCache(); d_data->lineWidth = lineWidth; update(); } } /*! \return Line width of the frame \sa setLineWidth(), frameShadow(), lineWidth() */ int QwtDial::lineWidth() const { return d_data->lineWidth; } /*! \return bounding rectangle of the circle inside the frame \sa setLineWidth(), scaleInnerRect(), boundingRect() */ QRect QwtDial::innerRect() const { const int lw = lineWidth(); return boundingRect().adjusted( lw, lw, -lw, -lw ); } /*! \return bounding rectangle of the dial including the frame \sa setLineWidth(), scaleInnerRect(), innerRect() */ QRect QwtDial::boundingRect() const { const QRect cr = contentsRect(); const double dim = qMin( cr.width(), cr.height() ); QRect inner( 0, 0, dim, dim ); inner.moveCenter( cr.center() ); return inner; } /*! \return rectangle inside the scale \sa setLineWidth(), boundingRect(), innerRect() */ QRect QwtDial::scaleInnerRect() const { QRect rect = innerRect(); const QwtAbstractScaleDraw *sd = scaleDraw(); if ( sd ) { int scaleDist = qCeil( sd->extent( font() ) ); scaleDist++; // margin rect.adjust( scaleDist, scaleDist, -scaleDist, -scaleDist ); } return rect; } /*! \brief Change the mode of the dial. \param mode New mode In case of QwtDial::RotateNeedle the needle is rotating, in case of QwtDial::RotateScale, the needle points to origin() and the scale is rotating. The default mode is QwtDial::RotateNeedle. \sa mode(), setValue(), setOrigin() */ void QwtDial::setMode( Mode mode ) { if ( mode != d_data->mode ) { invalidateCache(); d_data->mode = mode; sliderChange(); } } /*! \return Mode of the dial. \sa setMode(), origin(), setScaleArc(), value() */ QwtDial::Mode QwtDial::mode() const { return d_data->mode; } /*! Invalidate the internal caches used to speed up repainting */ void QwtDial::invalidateCache() { d_data->pixmapCache = QPixmap(); } /*! Paint the dial \param event Paint event */ void QwtDial::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); if ( d_data->mode == QwtDial::RotateScale ) { painter.save(); painter.setRenderHint( QPainter::Antialiasing, true ); drawContents( &painter ); painter.restore(); } const QRect r = contentsRect(); if ( r.size() != d_data->pixmapCache.size() ) { d_data->pixmapCache = QwtPainter::backingStore( this, r.size() ); d_data->pixmapCache.fill( Qt::transparent ); QPainter p( &d_data->pixmapCache ); p.setRenderHint( QPainter::Antialiasing, true ); p.translate( -r.topLeft() ); if ( d_data->mode != QwtDial::RotateScale ) drawContents( &p ); if ( lineWidth() > 0 ) drawFrame( &p ); if ( d_data->mode != QwtDial::RotateNeedle ) drawNeedle( &p ); } painter.drawPixmap( r.topLeft(), d_data->pixmapCache ); if ( d_data->mode == QwtDial::RotateNeedle ) drawNeedle( &painter ); if ( hasFocus() ) drawFocusIndicator( &painter ); } /*! Draw the focus indicator \param painter Painter */ void QwtDial::drawFocusIndicator( QPainter *painter ) const { QwtPainter::drawFocusRect( painter, this, boundingRect() ); } /*! Draw the frame around the dial \param painter Painter \sa lineWidth(), frameShadow() */ void QwtDial::drawFrame( QPainter *painter ) { QwtPainter::drawRoundFrame( painter, boundingRect(), palette(), lineWidth(), d_data->frameShadow ); } /*! \brief Draw the contents inside the frame QPalette::Window is the background color outside of the frame. QPalette::Base is the background color inside the frame. QPalette::WindowText is the background color inside the scale. \param painter Painter \sa boundingRect(), innerRect(), scaleInnerRect(), QWidget::setPalette() */ void QwtDial::drawContents( QPainter *painter ) const { if ( testAttribute( Qt::WA_NoSystemBackground ) || palette().brush( QPalette::Base ) != palette().brush( QPalette::Window ) ) { const QRectF br = boundingRect(); painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::Base ) ); painter->drawEllipse( br ); painter->restore(); } const QRectF insideScaleRect = scaleInnerRect(); if ( palette().brush( QPalette::WindowText ) != palette().brush( QPalette::Base ) ) { painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::WindowText ) ); painter->drawEllipse( insideScaleRect ); painter->restore(); } const QPointF center = insideScaleRect.center(); const double radius = 0.5 * insideScaleRect.width(); painter->save(); drawScale( painter, center, radius ); painter->restore(); painter->save(); drawScaleContents( painter, center, radius ); painter->restore(); } /*! Draw the needle \param painter Painter \param center Center of the dial \param radius Length for the needle \param direction Direction of the needle in degrees, counter clockwise \param colorGroup ColorGroup */ void QwtDial::drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double direction, QPalette::ColorGroup colorGroup ) const { if ( d_data->needle ) { direction = 360.0 - direction; // counter clockwise d_data->needle->draw( painter, center, radius, direction, colorGroup ); } } void QwtDial::drawNeedle( QPainter *painter ) const { if ( !isValid() ) return; QPalette::ColorGroup colorGroup; if ( isEnabled() ) colorGroup = hasFocus() ? QPalette::Active : QPalette::Inactive; else colorGroup = QPalette::Disabled; const QRectF sr = scaleInnerRect(); painter->save(); painter->setRenderHint( QPainter::Antialiasing, true ); drawNeedle( painter, sr.center(), 0.5 * sr.width(), transform( value() ) + 270.0, colorGroup ); painter->restore(); } /*! Draw the scale \param painter Painter \param center Center of the dial \param radius Radius of the scale */ void QwtDial::drawScale( QPainter *painter, const QPointF ¢er, double radius ) const { QwtRoundScaleDraw *sd = const_cast( scaleDraw() ); if ( sd == NULL ) return; sd->setRadius( radius ); sd->moveCenter( center ); QPalette pal = palette(); const QColor textColor = pal.color( QPalette::Text ); pal.setColor( QPalette::WindowText, textColor ); // ticks, backbone painter->setFont( font() ); painter->setPen( QPen( textColor, sd->penWidth() ) ); painter->setBrush( Qt::red ); sd->draw( painter, pal ); } /*! Draw the contents inside the scale Paints nothing. \param painter Painter \param center Center of the contents circle \param radius Radius of the contents circle */ void QwtDial::drawScaleContents( QPainter *painter, const QPointF ¢er, double radius ) const { Q_UNUSED(painter); Q_UNUSED(center); Q_UNUSED(radius); } /*! Set a needle for the dial \param needle Needle \warning The needle will be deleted, when a different needle is set or in ~QwtDial() */ void QwtDial::setNeedle( QwtDialNeedle *needle ) { if ( needle != d_data->needle ) { if ( d_data->needle ) delete d_data->needle; d_data->needle = needle; update(); } } /*! \return needle \sa setNeedle() */ const QwtDialNeedle *QwtDial::needle() const { return d_data->needle; } /*! \return needle \sa setNeedle() */ QwtDialNeedle *QwtDial::needle() { return d_data->needle; } //! \return the scale draw QwtRoundScaleDraw *QwtDial::scaleDraw() { return static_cast( abstractScaleDraw() ); } //! \return the scale draw const QwtRoundScaleDraw *QwtDial::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! Set an individual scale draw The motivation for setting a scale draw is often to overload QwtRoundScaleDraw::label() to return individual tick labels. \param scaleDraw Scale draw \warning The previous scale draw is deleted */ void QwtDial::setScaleDraw( QwtRoundScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); sliderChange(); } /*! Change the arc of the scale \param minArc Lower limit \param maxArc Upper limit \sa minScaleArc(), maxScaleArc() */ void QwtDial::setScaleArc( double minArc, double maxArc ) { if ( minArc != 360.0 && minArc != -360.0 ) minArc = ::fmod( minArc, 360.0 ); if ( maxArc != 360.0 && maxArc != -360.0 ) maxArc = ::fmod( maxArc, 360.0 ); double minScaleArc = qMin( minArc, maxArc ); double maxScaleArc = qMax( minArc, maxArc ); if ( maxScaleArc - minScaleArc > 360.0 ) maxScaleArc = minScaleArc + 360.0; if ( ( minScaleArc != d_data->minScaleArc ) || ( maxScaleArc != d_data->maxScaleArc ) ) { d_data->minScaleArc = minScaleArc; d_data->maxScaleArc = maxScaleArc; invalidateCache(); sliderChange(); } } /*! Set the lower limit for the scale arc \param min Lower limit of the scale arc \sa setScaleArc(), setMaxScaleArc() */ void QwtDial::setMinScaleArc( double min ) { setScaleArc( min, d_data->maxScaleArc ); } /*! \return Lower limit of the scale arc \sa setScaleArc() */ double QwtDial::minScaleArc() const { return d_data->minScaleArc; } /*! Set the upper limit for the scale arc \param max Upper limit of the scale arc \sa setScaleArc(), setMinScaleArc() */ void QwtDial::setMaxScaleArc( double max ) { setScaleArc( d_data->minScaleArc, max ); } /*! \return Upper limit of the scale arc \sa setScaleArc() */ double QwtDial::maxScaleArc() const { return d_data->maxScaleArc; } /*! \brief Change the origin The origin is the angle where scale and needle is relative to. \param origin New origin \sa origin() */ void QwtDial::setOrigin( double origin ) { invalidateCache(); d_data->origin = origin; sliderChange(); } /*! The origin is the angle where scale and needle is relative to. \return Origin of the dial \sa setOrigin() */ double QwtDial::origin() const { return d_data->origin; } /*! \return Size hint \sa minimumSizeHint() */ QSize QwtDial::sizeHint() const { int sh = 0; if ( scaleDraw() ) sh = qCeil( scaleDraw()->extent( font() ) ); const int d = 6 * sh + 2 * lineWidth(); QSize hint( d, d ); if ( !isReadOnly() ) hint = hint.expandedTo( QApplication::globalStrut() ); return hint; } /*! \return Minimum size hint \sa sizeHint() */ QSize QwtDial::minimumSizeHint() const { int sh = 0; if ( scaleDraw() ) sh = qCeil( scaleDraw()->extent( font() ) ); const int d = 3 * sh + 2 * lineWidth(); return QSize( d, d ); } /*! \brief Determine what to do when the user presses a mouse button. \param pos Mouse position \retval True, when the inner circle contains pos \sa scrolledTo() */ bool QwtDial::isScrollPosition( const QPoint &pos ) const { const QRegion region( innerRect(), QRegion::Ellipse ); if ( region.contains( pos ) && ( pos != innerRect().center() ) ) { double angle = QLineF( rect().center(), pos ).angle(); if ( d_data->mode == QwtDial::RotateScale ) angle = 360.0 - angle; double valueAngle = qwtNormalizeDegrees( 90.0 - transform( value() ) ); d_data->mouseOffset = qwtNormalizeDegrees( angle - valueAngle ); d_data->arcOffset = scaleMap().p1(); return true; } return false; } /*! \brief Determine the value for a new position of the slider handle. \param pos Mouse position \return Value for the mouse position \sa isScrollPosition() */ double QwtDial::scrolledTo( const QPoint &pos ) const { double angle = QLineF( rect().center(), pos ).angle(); if ( d_data->mode == QwtDial::RotateScale ) { angle += scaleMap().p1() - d_data->arcOffset; angle = 360.0 - angle; } angle = qwtNormalizeDegrees( angle - d_data->mouseOffset ); angle = qwtNormalizeDegrees( 90.0 - angle ); if ( scaleMap().pDist() >= 360.0 ) { if ( angle < scaleMap().p1() ) angle += 360.0; if ( !wrapping() ) { double boundedAngle = angle; const double arc = angle - transform( value() ); if ( qAbs( arc ) > 180.0 ) { boundedAngle = ( arc > 0 ) ? scaleMap().p1() : scaleMap().p2(); } d_data->mouseOffset += ( boundedAngle - angle ); angle = boundedAngle; } } else { const double boundedAngle = qwtBoundedAngle( scaleMap().p1(), angle, scaleMap().p2() ); if ( !wrapping() ) d_data->mouseOffset += ( boundedAngle - angle ); angle = boundedAngle; } return invTransform( angle ); } /*! Change Event handler \param event Change event Invalidates internal paint caches if necessary */ void QwtDial::changeEvent( QEvent *event ) { switch( event->type() ) { case QEvent::EnabledChange: case QEvent::FontChange: case QEvent::StyleChange: case QEvent::PaletteChange: case QEvent::LanguageChange: case QEvent::LocaleChange: { invalidateCache(); break; } default: break; } QwtAbstractSlider::changeEvent( event ); } /*! Wheel Event handler \param event Wheel event */ void QwtDial::wheelEvent( QWheelEvent *event ) { const QRegion region( innerRect(), QRegion::Ellipse ); if ( region.contains( event->pos() ) ) QwtAbstractSlider::wheelEvent( event ); } void QwtDial::setAngleRange( double angle, double span ) { QwtRoundScaleDraw *sd = const_cast( scaleDraw() ); if ( sd ) { angle = qwtNormalizeDegrees( angle - 270.0 ); sd->setAngleRange( angle, angle + span ); } } /*! Invalidate the internal caches and call QwtAbstractSlider::scaleChange() */ void QwtDial::scaleChange() { invalidateCache(); QwtAbstractSlider::scaleChange(); } void QwtDial::sliderChange() { setAngleRange( d_data->origin + d_data->minScaleArc, d_data->maxScaleArc - d_data->minScaleArc ); if ( mode() == RotateScale ) { const double arc = transform( value() ) - scaleMap().p1(); setAngleRange( d_data->origin - arc, d_data->maxScaleArc - d_data->minScaleArc ); } QwtAbstractSlider::sliderChange(); } �����linssid-2.7/qwt-lib/src/qwt_clipper.cpp�������������������������������������������������������������000644 �001750 �001750 �00000031010 12151666703 021072� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_clipper.h" #include "qwt_point_polar.h" #include #include #include #if QT_VERSION < 0x040601 #define qAtan(x) ::atan(x) #endif namespace QwtClip { // some templates used for inlining template class LeftEdge; template class RightEdge; template class TopEdge; template class BottomEdge; template class PointBuffer; } template class QwtClip::LeftEdge { public: inline LeftEdge( Value x1, Value, Value, Value ): d_x1( x1 ) { } inline bool isInside( const Point &p ) const { return p.x() >= d_x1; } inline Point intersection( const Point &p1, const Point &p2 ) const { double dy = ( p1.y() - p2.y() ) / double( p1.x() - p2.x() ); return Point( d_x1, static_cast< Value >( p2.y() + ( d_x1 - p2.x() ) * dy ) ); } private: const Value d_x1; }; template class QwtClip::RightEdge { public: inline RightEdge( Value, Value x2, Value, Value ): d_x2( x2 ) { } inline bool isInside( const Point &p ) const { return p.x() <= d_x2; } inline Point intersection( const Point &p1, const Point &p2 ) const { double dy = ( p1.y() - p2.y() ) / double( p1.x() - p2.x() ); return Point( d_x2, static_cast( p2.y() + ( d_x2 - p2.x() ) * dy ) ); } private: const Value d_x2; }; template class QwtClip::TopEdge { public: inline TopEdge( Value, Value, Value y1, Value ): d_y1( y1 ) { } inline bool isInside( const Point &p ) const { return p.y() >= d_y1; } inline Point intersection( const Point &p1, const Point &p2 ) const { double dx = ( p1.x() - p2.x() ) / double( p1.y() - p2.y() ); return Point( static_cast( p2.x() + ( d_y1 - p2.y() ) * dx ), d_y1 ); } private: const Value d_y1; }; template class QwtClip::BottomEdge { public: inline BottomEdge( Value, Value, Value, Value y2 ): d_y2( y2 ) { } inline bool isInside( const Point &p ) const { return p.y() <= d_y2; } inline Point intersection( const Point &p1, const Point &p2 ) const { double dx = ( p1.x() - p2.x() ) / double( p1.y() - p2.y() ); return Point( static_cast( p2.x() + ( d_y2 - p2.y() ) * dx ), d_y2 ); } private: const Value d_y2; }; template class QwtClip::PointBuffer { public: PointBuffer( int capacity = 0 ): m_capacity( 0 ), m_size( 0 ), m_buffer( NULL ) { if ( capacity > 0 ) reserve( capacity ); } ~PointBuffer() { if ( m_buffer ) ::free( m_buffer ); } inline void setPoints( int numPoints, const Point *points ) { reserve( numPoints ); m_size = numPoints; ::memcpy( m_buffer, points, m_size * sizeof( Point ) ); } inline void reset() { m_size = 0; } inline int size() const { return m_size; } inline Point *data() const { return m_buffer; } inline Point &operator[]( int i ) { return m_buffer[i]; } inline const Point &operator[]( int i ) const { return m_buffer[i]; } inline void add( const Point &point ) { if ( m_capacity <= m_size ) reserve( m_size + 1 ); m_buffer[m_size++] = point; } private: inline void reserve( int size ) { if ( m_capacity == 0 ) m_capacity = 1; while ( m_capacity < size ) m_capacity *= 2; m_buffer = static_cast( ::realloc( m_buffer, m_capacity * sizeof( Point ) ) ); } int m_capacity; int m_size; Point *m_buffer; }; using namespace QwtClip; template class QwtPolygonClipper { public: QwtPolygonClipper( const Rect &clipRect ): d_clipRect( clipRect ) { } Polygon clipPolygon( const Polygon &polygon, bool closePolygon ) const { #if 0 if ( d_clipRect.contains( polygon.boundingRect() ) ) return polygon; #endif PointBuffer points1; PointBuffer points2( qMin( 256, polygon.size() ) ); points1.setPoints( polygon.size(), polygon.data() ); clipEdge< LeftEdge >( closePolygon, points1, points2 ); clipEdge< RightEdge >( closePolygon, points2, points1 ); clipEdge< TopEdge >( closePolygon, points1, points2 ); clipEdge< BottomEdge >( closePolygon, points2, points1 ); Polygon p; p.resize( points1.size() ); ::memcpy( p.data(), points1.data(), points1.size() * sizeof( Point ) ); return p; } private: template inline void clipEdge( bool closePolygon, PointBuffer &points, PointBuffer &clippedPoints ) const { clippedPoints.reset(); if ( points.size() < 2 ) { if ( points.size() == 1 ) clippedPoints.add( points[0] ); return; } const Edge edge( d_clipRect.x(), d_clipRect.x() + d_clipRect.width(), d_clipRect.y(), d_clipRect.y() + d_clipRect.height() ); int lastPos, start; if ( closePolygon ) { start = 0; lastPos = points.size() - 1; } else { start = 1; lastPos = 0; if ( edge.isInside( points[0] ) ) clippedPoints.add( points[0] ); } const uint nPoints = points.size(); for ( uint i = start; i < nPoints; i++ ) { const Point &p1 = points[i]; const Point &p2 = points[lastPos]; if ( edge.isInside( p1 ) ) { if ( edge.isInside( p2 ) ) { clippedPoints.add( p1 ); } else { clippedPoints.add( edge.intersection( p1, p2 ) ); clippedPoints.add( p1 ); } } else { if ( edge.isInside( p2 ) ) { clippedPoints.add( edge.intersection( p1, p2 ) ); } } lastPos = i; } } const Rect d_clipRect; }; class QwtCircleClipper { public: QwtCircleClipper( const QRectF &r ); QVector clipCircle( const QPointF &, double radius ) const; private: enum Edge { Left, Top, Right, Bottom, NEdges }; QList cuttingPoints( Edge, const QPointF &pos, double radius ) const; double toAngle( const QPointF &, const QPointF & ) const; const QRectF d_rect; }; QwtCircleClipper::QwtCircleClipper( const QRectF &r ): d_rect( r ) { } QVector QwtCircleClipper::clipCircle( const QPointF &pos, double radius ) const { QList points; for ( int edge = 0; edge < NEdges; edge++ ) points += cuttingPoints( static_cast(edge), pos, radius ); QVector intv; if ( points.size() <= 0 ) { QRectF cRect( 0, 0, 2 * radius, 2 * radius ); cRect.moveCenter( pos ); if ( d_rect.contains( cRect ) ) intv += QwtInterval( 0.0, 2 * M_PI ); } else { QList angles; for ( int i = 0; i < points.size(); i++ ) angles += toAngle( pos, points[i] ); qSort( angles ); const int in = d_rect.contains( qwtPolar2Pos( pos, radius, angles[0] + ( angles[1] - angles[0] ) / 2 ) ); if ( in ) { for ( int i = 0; i < angles.size() - 1; i += 2 ) intv += QwtInterval( angles[i], angles[i+1] ); } else { for ( int i = 1; i < angles.size() - 1; i += 2 ) intv += QwtInterval( angles[i], angles[i+1] ); intv += QwtInterval( angles.last(), angles.first() ); } } return intv; } double QwtCircleClipper::toAngle( const QPointF &from, const QPointF &to ) const { if ( from.x() == to.x() ) return from.y() <= to.y() ? M_PI / 2.0 : 3 * M_PI / 2.0; const double m = qAbs( ( to.y() - from.y() ) / ( to.x() - from.x() ) ); double angle = qAtan( m ); if ( to.x() > from.x() ) { if ( to.y() > from.y() ) angle = 2 * M_PI - angle; } else { if ( to.y() > from.y() ) angle = M_PI + angle; else angle = M_PI - angle; } return angle; } QList QwtCircleClipper::cuttingPoints( Edge edge, const QPointF &pos, double radius ) const { QList points; if ( edge == Left || edge == Right ) { const double x = ( edge == Left ) ? d_rect.left() : d_rect.right(); if ( qAbs( pos.x() - x ) < radius ) { const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.x() - x ) ); const double m_y1 = pos.y() + off; if ( m_y1 >= d_rect.top() && m_y1 <= d_rect.bottom() ) points += QPointF( x, m_y1 ); const double m_y2 = pos.y() - off; if ( m_y2 >= d_rect.top() && m_y2 <= d_rect.bottom() ) points += QPointF( x, m_y2 ); } } else { const double y = ( edge == Top ) ? d_rect.top() : d_rect.bottom(); if ( qAbs( pos.y() - y ) < radius ) { const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.y() - y ) ); const double x1 = pos.x() + off; if ( x1 >= d_rect.left() && x1 <= d_rect.right() ) points += QPointF( x1, y ); const double m_x2 = pos.x() - off; if ( m_x2 >= d_rect.left() && m_x2 <= d_rect.right() ) points += QPointF( m_x2, y ); } } return points; } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \param closePolygon True, when the polygon is closed \return Clipped polygon */ QPolygon QwtClipper::clipPolygon( const QRectF &clipRect, const QPolygon &polygon, bool closePolygon ) { const int minX = qCeil( clipRect.left() ); const int maxX = qFloor( clipRect.right() ); const int minY = qCeil( clipRect.top() ); const int maxY = qFloor( clipRect.bottom() ); const QRect r( minX, minY, maxX - minX, maxY - minY ); QwtPolygonClipper clipper( r ); return clipper.clipPolygon( polygon, closePolygon ); } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \param closePolygon True, when the polygon is closed \return Clipped polygon */ QPolygon QwtClipper::clipPolygon( const QRect &clipRect, const QPolygon &polygon, bool closePolygon ) { QwtPolygonClipper clipper( clipRect ); return clipper.clipPolygon( polygon, closePolygon ); } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \param closePolygon True, when the polygon is closed \return Clipped polygon */ QPolygonF QwtClipper::clipPolygonF( const QRectF &clipRect, const QPolygonF &polygon, bool closePolygon ) { QwtPolygonClipper clipper( clipRect ); return clipper.clipPolygon( polygon, closePolygon ); } /*! Circle clipping clipCircle() divides a circle into intervals of angles representing arcs of the circle. When the circle is completely inside the clip rectangle an interval [0.0, 2 * M_PI] is returned. \param clipRect Clip rectangle \param center Center of the circle \param radius Radius of the circle \return Arcs of the circle */ QVector QwtClipper::clipCircle( const QRectF &clipRect, const QPointF ¢er, double radius ) { QwtCircleClipper clipper( clipRect ); return clipper.clipCircle( center, radius ); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/textengines/mathml/�������������������������������������������������������������000755 �001750 �001750 �00000000000 12345433134 021065� 5����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/src.pro���������������������������������������������������������������������000644 �001750 �001750 �00000002445 12345430444 017354� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ # qmake project file for building the qwt libraries QWT_ROOT = $${PWD}/.. include( $${QWT_ROOT}/qwtconfig.pri ) include( $${QWT_ROOT}/qwtbuild.pri ) include( $${QWT_ROOT}/qwtfunctions.pri ) TEMPLATE = lib TARGET = $$qwtLibraryTarget(qwt) DESTDIR = $${QWT_ROOT}/lib contains(QWT_CONFIG, QwtDll) { CONFIG += dll win32|symbian: DEFINES += QT_DLL QWT_DLL QWT_MAKEDLL } else { CONFIG += staticlib } contains(QWT_CONFIG, QwtFramework) { CONFIG += lib_bundle } include ( $${PWD}/src.pri ) # Install directives target.path = $${QWT_INSTALL_LIBS} # INSTALLS = target # linssid no install CONFIG(lib_bundle) { FRAMEWORK_HEADERS.version = Versions FRAMEWORK_HEADERS.files = $${HEADERS} FRAMEWORK_HEADERS.path = Headers QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS } else { headers.files = $${HEADERS} headers.path = $${QWT_INSTALL_HEADERS} # INSTALLS += headers # linssid no install } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_renderer.cpp�������������������������������������������������������000644 �001750 �001750 �00000067042 12151666703 022316� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_renderer.h" #include "qwt_plot.h" #include "qwt_painter.h" #include "qwt_plot_layout.h" #include "qwt_abstract_legend.h" #include "qwt_scale_widget.h" #include "qwt_scale_engine.h" #include "qwt_text.h" #include "qwt_text_label.h" #include "qwt_math.h" #include #include #include #include #include #include #include #include #include #include #ifndef QWT_NO_SVG #ifdef QT_SVG_LIB #include #endif #endif static QPainterPath qwtCanvasClip( const QWidget* canvas, const QRectF &canvasRect ) { // The clip region is calculated in integers // To avoid too much rounding errors better // calculate it in target device resolution int x1 = qCeil( canvasRect.left() ); int x2 = qFloor( canvasRect.right() ); int y1 = qCeil( canvasRect.top() ); int y2 = qFloor( canvasRect.bottom() ); const QRect r( x1, y1, x2 - x1 - 1, y2 - y1 - 1 ); QPainterPath clipPath; ( void ) QMetaObject::invokeMethod( const_cast< QWidget *>( canvas ), "borderPath", Qt::DirectConnection, Q_RETURN_ARG( QPainterPath, clipPath ), Q_ARG( QRect, r ) ); return clipPath; } class QwtPlotRenderer::PrivateData { public: PrivateData(): discardFlags( QwtPlotRenderer::DiscardNone ), layoutFlags( QwtPlotRenderer::DefaultLayout ) { } QwtPlotRenderer::DiscardFlags discardFlags; QwtPlotRenderer::LayoutFlags layoutFlags; }; /*! Constructor \param parent Parent object */ QwtPlotRenderer::QwtPlotRenderer( QObject *parent ): QObject( parent ) { d_data = new PrivateData; } //! Destructor QwtPlotRenderer::~QwtPlotRenderer() { delete d_data; } /*! Change a flag, indicating what to discard from rendering \param flag Flag to change \param on On/Off \sa DiscardFlag, testDiscardFlag(), setDiscardFlags(), discardFlags() */ void QwtPlotRenderer::setDiscardFlag( DiscardFlag flag, bool on ) { if ( on ) d_data->discardFlags |= flag; else d_data->discardFlags &= ~flag; } /*! \return True, if flag is enabled. \param flag Flag to be tested \sa DiscardFlag, setDiscardFlag(), setDiscardFlags(), discardFlags() */ bool QwtPlotRenderer::testDiscardFlag( DiscardFlag flag ) const { return d_data->discardFlags & flag; } /*! Set the flags, indicating what to discard from rendering \param flags Flags \sa DiscardFlag, setDiscardFlag(), testDiscardFlag(), discardFlags() */ void QwtPlotRenderer::setDiscardFlags( DiscardFlags flags ) { d_data->discardFlags = flags; } /*! \return Flags, indicating what to discard from rendering \sa DiscardFlag, setDiscardFlags(), setDiscardFlag(), testDiscardFlag() */ QwtPlotRenderer::DiscardFlags QwtPlotRenderer::discardFlags() const { return d_data->discardFlags; } /*! Change a layout flag \param flag Flag to change \param on On/Off \sa LayoutFlag, testLayoutFlag(), setLayoutFlags(), layoutFlags() */ void QwtPlotRenderer::setLayoutFlag( LayoutFlag flag, bool on ) { if ( on ) d_data->layoutFlags |= flag; else d_data->layoutFlags &= ~flag; } /*! \return True, if flag is enabled. \param flag Flag to be tested \sa LayoutFlag, setLayoutFlag(), setLayoutFlags(), layoutFlags() */ bool QwtPlotRenderer::testLayoutFlag( LayoutFlag flag ) const { return d_data->layoutFlags & flag; } /*! Set the layout flags \param flags Flags \sa LayoutFlag, setLayoutFlag(), testLayoutFlag(), layoutFlags() */ void QwtPlotRenderer::setLayoutFlags( LayoutFlags flags ) { d_data->layoutFlags = flags; } /*! \return Layout flags \sa LayoutFlag, setLayoutFlags(), setLayoutFlag(), testLayoutFlag() */ QwtPlotRenderer::LayoutFlags QwtPlotRenderer::layoutFlags() const { return d_data->layoutFlags; } /*! Render a plot to a file The format of the document will be auto-detected from the suffix of the file name. \param plot Plot widget \param fileName Path of the file, where the document will be stored \param sizeMM Size for the document in millimeters. \param resolution Resolution in dots per Inch (dpi) */ void QwtPlotRenderer::renderDocument( QwtPlot *plot, const QString &fileName, const QSizeF &sizeMM, int resolution ) { renderDocument( plot, fileName, QFileInfo( fileName ).suffix(), sizeMM, resolution ); } /*! Render a plot to a file Supported formats are: - pdf\n Portable Document Format PDF - ps\n Postcript - svg\n Scalable Vector Graphics SVG - all image formats supported by Qt\n see QImageWriter::supportedImageFormats() Scalable vector graphic formats like PDF or SVG are superior to raster graphics formats. \param plot Plot widget \param fileName Path of the file, where the document will be stored \param format Format for the document \param sizeMM Size for the document in millimeters. \param resolution Resolution in dots per Inch (dpi) \sa renderTo(), render(), QwtPainter::setRoundingAlignment() */ void QwtPlotRenderer::renderDocument( QwtPlot *plot, const QString &fileName, const QString &format, const QSizeF &sizeMM, int resolution ) { if ( plot == NULL || sizeMM.isEmpty() || resolution <= 0 ) return; QString title = plot->title().text(); if ( title.isEmpty() ) title = "Plot Document"; const double mmToInch = 1.0 / 25.4; const QSizeF size = sizeMM * mmToInch * resolution; const QRectF documentRect( 0.0, 0.0, size.width(), size.height() ); const QString fmt = format.toLower(); if ( fmt == "pdf" ) { #ifndef QT_NO_PRINTER QPrinter printer; printer.setColorMode( QPrinter::Color ); printer.setFullPage( true ); printer.setPaperSize( sizeMM, QPrinter::Millimeter ); printer.setDocName( title ); printer.setOutputFileName( fileName ); printer.setOutputFormat( QPrinter::PdfFormat ); printer.setResolution( resolution ); QPainter painter( &printer ); render( plot, &painter, documentRect ); #endif } else if ( fmt == "ps" ) { #if QT_VERSION < 0x050000 #ifndef QT_NO_PRINTER QPrinter printer; printer.setColorMode( QPrinter::Color ); printer.setFullPage( true ); printer.setPaperSize( sizeMM, QPrinter::Millimeter ); printer.setDocName( title ); printer.setOutputFileName( fileName ); printer.setOutputFormat( QPrinter::PostScriptFormat ); printer.setResolution( resolution ); QPainter painter( &printer ); render( plot, &painter, documentRect ); #endif #endif } else if ( fmt == "svg" ) { #ifndef QWT_NO_SVG #ifdef QT_SVG_LIB #if QT_VERSION >= 0x040500 QSvgGenerator generator; generator.setTitle( title ); generator.setFileName( fileName ); generator.setResolution( resolution ); generator.setViewBox( documentRect ); QPainter painter( &generator ); render( plot, &painter, documentRect ); #endif #endif #endif } else { if ( QImageWriter::supportedImageFormats().indexOf( format.toLatin1() ) >= 0 ) { const QRect imageRect = documentRect.toRect(); const int dotsPerMeter = qRound( resolution * mmToInch * 1000.0 ); QImage image( imageRect.size(), QImage::Format_ARGB32 ); image.setDotsPerMeterX( dotsPerMeter ); image.setDotsPerMeterY( dotsPerMeter ); image.fill( QColor( Qt::white ).rgb() ); QPainter painter( &image ); render( plot, &painter, imageRect ); painter.end(); image.save( fileName, format.toLatin1() ); } } } /*! \brief Render the plot to a \c QPaintDevice This function renders the contents of a QwtPlot instance to \c QPaintDevice object. The target rectangle is derived from its device metrics. \param plot Plot to be rendered \param paintDevice device to paint on, f.e a QImage \sa renderDocument(), render(), QwtPainter::setRoundingAlignment() */ void QwtPlotRenderer::renderTo( QwtPlot *plot, QPaintDevice &paintDevice ) const { int w = paintDevice.width(); int h = paintDevice.height(); QPainter p( &paintDevice ); render( plot, &p, QRectF( 0, 0, w, h ) ); } /*! \brief Render the plot to a QPrinter This function renders the contents of a QwtPlot instance to \c QPaintDevice object. The size is derived from the printer metrics. \param plot Plot to be rendered \param printer Printer to paint on \sa renderDocument(), render(), QwtPainter::setRoundingAlignment() */ #ifndef QT_NO_PRINTER void QwtPlotRenderer::renderTo( QwtPlot *plot, QPrinter &printer ) const { int w = printer.width(); int h = printer.height(); QRectF rect( 0, 0, w, h ); double aspect = rect.width() / rect.height(); if ( ( aspect < 1.0 ) ) rect.setHeight( aspect * rect.width() ); QPainter p( &printer ); render( plot, &p, rect ); } #endif #ifndef QWT_NO_SVG #ifdef QT_SVG_LIB #if QT_VERSION >= 0x040500 /*! \brief Render the plot to a QSvgGenerator If the generator has a view box, the plot will be rendered into it. If it has no viewBox but a valid size the target coordinates will be (0, 0, generator.width(), generator.height()). Otherwise the target rectangle will be QRectF(0, 0, 800, 600); \param plot Plot to be rendered \param generator SVG generator */ void QwtPlotRenderer::renderTo( QwtPlot *plot, QSvgGenerator &generator ) const { QRectF rect = generator.viewBoxF(); if ( rect.isEmpty() ) rect.setRect( 0, 0, generator.width(), generator.height() ); if ( rect.isEmpty() ) rect.setRect( 0, 0, 800, 600 ); // something QPainter p( &generator ); render( plot, &p, rect ); } #endif #endif #endif /*! Paint the contents of a QwtPlot instance into a given rectangle. \param plot Plot to be rendered \param painter Painter \param plotRect Bounding rectangle \sa renderDocument(), renderTo(), QwtPainter::setRoundingAlignment() */ void QwtPlotRenderer::render( QwtPlot *plot, QPainter *painter, const QRectF &plotRect ) const { if ( painter == 0 || !painter->isActive() || !plotRect.isValid() || plot->size().isNull() ) { return; } if ( !( d_data->discardFlags & DiscardBackground ) ) QwtPainter::drawBackgound( painter, plotRect, plot ); /* The layout engine uses the same methods as they are used by the Qt layout system. Therefore we need to calculate the layout in screen coordinates and paint with a scaled painter. */ QTransform transform; transform.scale( double( painter->device()->logicalDpiX() ) / plot->logicalDpiX(), double( painter->device()->logicalDpiY() ) / plot->logicalDpiY() ); QRectF layoutRect = transform.inverted().mapRect( plotRect ); if ( !( d_data->discardFlags & DiscardBackground ) ) { // subtract the contents margins int left, top, right, bottom; plot->getContentsMargins( &left, &top, &right, &bottom ); layoutRect.adjust( left, top, -right, -bottom ); } QwtPlotLayout *layout = plot->plotLayout(); int baseLineDists[QwtPlot::axisCnt]; int canvasMargins[QwtPlot::axisCnt]; for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { canvasMargins[ axisId ] = layout->canvasMargin( axisId ); if ( d_data->layoutFlags & FrameWithScales ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) { baseLineDists[axisId] = scaleWidget->margin(); scaleWidget->setMargin( 0 ); } if ( !plot->axisEnabled( axisId ) ) { int left = 0; int right = 0; int top = 0; int bottom = 0; // When we have a scale the frame is painted on // the position of the backbone - otherwise we // need to introduce a margin around the canvas switch( axisId ) { case QwtPlot::yLeft: layoutRect.adjust( 1, 0, 0, 0 ); break; case QwtPlot::yRight: layoutRect.adjust( 0, 0, -1, 0 ); break; case QwtPlot::xTop: layoutRect.adjust( 0, 1, 0, 0 ); break; case QwtPlot::xBottom: layoutRect.adjust( 0, 0, 0, -1 ); break; default: break; } layoutRect.adjust( left, top, right, bottom ); } } } // Calculate the layout for the document. QwtPlotLayout::Options layoutOptions = QwtPlotLayout::IgnoreScrollbars; if ( ( d_data->layoutFlags & FrameWithScales ) || ( d_data->discardFlags & DiscardCanvasFrame ) ) { layoutOptions |= QwtPlotLayout::IgnoreFrames; } if ( d_data->discardFlags & DiscardLegend ) layoutOptions |= QwtPlotLayout::IgnoreLegend; if ( d_data->discardFlags & DiscardTitle ) layoutOptions |= QwtPlotLayout::IgnoreTitle; if ( d_data->discardFlags & DiscardFooter ) layoutOptions |= QwtPlotLayout::IgnoreFooter; layout->activate( plot, layoutRect, layoutOptions ); // canvas QwtScaleMap maps[QwtPlot::axisCnt]; buildCanvasMaps( plot, layout->canvasRect(), maps ); if ( updateCanvasMargins( plot, layout->canvasRect(), maps ) ) { // recalculate maps and layout, when the margins // have been changed layout->activate( plot, layoutRect, layoutOptions ); buildCanvasMaps( plot, layout->canvasRect(), maps ); } // now start painting painter->save(); painter->setWorldTransform( transform, true ); renderCanvas( plot, painter, layout->canvasRect(), maps ); if ( !( d_data->discardFlags & DiscardTitle ) && ( !plot->titleLabel()->text().isEmpty() ) ) { renderTitle( plot, painter, layout->titleRect() ); } if ( !( d_data->discardFlags & DiscardFooter ) && ( !plot->footerLabel()->text().isEmpty() ) ) { renderFooter( plot, painter, layout->footerRect() ); } if ( !( d_data->discardFlags & DiscardLegend ) && plot->legend() && !plot->legend()->isEmpty() ) { renderLegend( plot, painter, layout->legendRect() ); } for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) { int baseDist = scaleWidget->margin(); int startDist, endDist; scaleWidget->getBorderDistHint( startDist, endDist ); renderScale( plot, painter, axisId, startDist, endDist, baseDist, layout->scaleRect( axisId ) ); } } painter->restore(); // restore all setting to their original attributes. for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { if ( d_data->layoutFlags & FrameWithScales ) { QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget ) scaleWidget->setMargin( baseLineDists[axisId] ); } layout->setCanvasMargin( canvasMargins[axisId] ); } layout->invalidate(); } /*! Render the title into a given rectangle. \param plot Plot widget \param painter Painter \param rect Bounding rectangle */ void QwtPlotRenderer::renderTitle( const QwtPlot *plot, QPainter *painter, const QRectF &rect ) const { painter->setFont( plot->titleLabel()->font() ); const QColor color = plot->titleLabel()->palette().color( QPalette::Active, QPalette::Text ); painter->setPen( color ); plot->titleLabel()->text().draw( painter, rect ); } /*! Render the footer into a given rectangle. \param plot Plot widget \param painter Painter \param rect Bounding rectangle */ void QwtPlotRenderer::renderFooter( const QwtPlot *plot, QPainter *painter, const QRectF &rect ) const { painter->setFont( plot->footerLabel()->font() ); const QColor color = plot->footerLabel()->palette().color( QPalette::Active, QPalette::Text ); painter->setPen( color ); plot->footerLabel()->text().draw( painter, rect ); } /*! Render the legend into a given rectangle. \param plot Plot widget \param painter Painter \param rect Bounding rectangle */ void QwtPlotRenderer::renderLegend( const QwtPlot *plot, QPainter *painter, const QRectF &rect ) const { if ( plot->legend() ) { bool fillBackground = !( d_data->discardFlags & DiscardBackground ); plot->legend()->renderLegend( painter, rect, fillBackground ); } } /*! \brief Paint a scale into a given rectangle. Paint the scale into a given rectangle. \param plot Plot widget \param painter Painter \param axisId Axis \param startDist Start border distance \param endDist End border distance \param baseDist Base distance \param rect Bounding rectangle */ void QwtPlotRenderer::renderScale( const QwtPlot *plot, QPainter *painter, int axisId, int startDist, int endDist, int baseDist, const QRectF &rect ) const { if ( !plot->axisEnabled( axisId ) ) return; const QwtScaleWidget *scaleWidget = plot->axisWidget( axisId ); if ( scaleWidget->isColorBarEnabled() && scaleWidget->colorBarWidth() > 0 ) { scaleWidget->drawColorBar( painter, scaleWidget->colorBarRect( rect ) ); baseDist += scaleWidget->colorBarWidth() + scaleWidget->spacing(); } painter->save(); QwtScaleDraw::Alignment align; double x, y, w; switch ( axisId ) { case QwtPlot::yLeft: { x = rect.right() - 1.0 - baseDist; y = rect.y() + startDist; w = rect.height() - startDist - endDist; align = QwtScaleDraw::LeftScale; break; } case QwtPlot::yRight: { x = rect.left() + baseDist; y = rect.y() + startDist; w = rect.height() - startDist - endDist; align = QwtScaleDraw::RightScale; break; } case QwtPlot::xTop: { x = rect.left() + startDist; y = rect.bottom() - 1.0 - baseDist; w = rect.width() - startDist - endDist; align = QwtScaleDraw::TopScale; break; } case QwtPlot::xBottom: { x = rect.left() + startDist; y = rect.top() + baseDist; w = rect.width() - startDist - endDist; align = QwtScaleDraw::BottomScale; break; } default: return; } scaleWidget->drawTitle( painter, align, rect ); painter->setFont( scaleWidget->font() ); QwtScaleDraw *sd = const_cast( scaleWidget->scaleDraw() ); const QPointF sdPos = sd->pos(); const double sdLength = sd->length(); sd->move( x, y ); sd->setLength( w ); QPalette palette = scaleWidget->palette(); palette.setCurrentColorGroup( QPalette::Active ); sd->draw( painter, palette ); // reset previous values sd->move( sdPos ); sd->setLength( sdLength ); painter->restore(); } /*! Render the canvas into a given rectangle. \param plot Plot widget \param painter Painter \param map Maps mapping between plot and paint device coordinates \param canvasRect Canvas rectangle */ void QwtPlotRenderer::renderCanvas( const QwtPlot *plot, QPainter *painter, const QRectF &canvasRect, const QwtScaleMap *map ) const { const QWidget *canvas = plot->canvas(); QRectF r = canvasRect.adjusted( 0.0, 0.0, -1.0, -1.0 ); if ( d_data->layoutFlags & FrameWithScales ) { painter->save(); r.adjust( -1.0, -1.0, 1.0, 1.0 ); painter->setPen( QPen( Qt::black ) ); if ( !( d_data->discardFlags & DiscardCanvasBackground ) ) { const QBrush bgBrush = canvas->palette().brush( plot->backgroundRole() ); painter->setBrush( bgBrush ); } QwtPainter::drawRect( painter, r ); painter->restore(); painter->save(); painter->setClipRect( canvasRect ); plot->drawItems( painter, canvasRect, map ); painter->restore(); } else if ( canvas->testAttribute( Qt::WA_StyledBackground ) ) { QPainterPath clipPath; painter->save(); if ( !( d_data->discardFlags & DiscardCanvasBackground ) ) { QwtPainter::drawBackgound( painter, r, canvas ); clipPath = qwtCanvasClip( canvas, canvasRect ); } painter->restore(); painter->save(); if ( clipPath.isEmpty() ) painter->setClipRect( canvasRect ); else painter->setClipPath( clipPath ); plot->drawItems( painter, canvasRect, map ); painter->restore(); } else { QPainterPath clipPath; int frameWidth = 0; if ( !( d_data->discardFlags & DiscardCanvasFrame ) ) { const QVariant fw = canvas->property( "frameWidth" ); if ( fw.type() == QVariant::Int ) frameWidth = fw.toInt(); clipPath = qwtCanvasClip( canvas, canvasRect ); } QRectF innerRect = canvasRect.adjusted( frameWidth, frameWidth, -frameWidth, -frameWidth ); painter->save(); if ( clipPath.isEmpty() ) { painter->setClipRect( innerRect ); } else { painter->setClipPath( clipPath ); } if ( !( d_data->discardFlags & DiscardCanvasBackground ) ) { QwtPainter::drawBackgound( painter, innerRect, canvas ); } plot->drawItems( painter, innerRect, map ); painter->restore(); if ( frameWidth > 0 ) { painter->save(); const int frameStyle = canvas->property( "frameShadow" ).toInt() | canvas->property( "frameShape" ).toInt(); const int frameWidth = canvas->property( "frameWidth" ).toInt(); const QVariant borderRadius = canvas->property( "borderRadius" ); if ( borderRadius.type() == QVariant::Double && borderRadius.toDouble() > 0.0 ) { const double r = borderRadius.toDouble(); QwtPainter::drawRoundedFrame( painter, canvasRect, r, r, canvas->palette(), frameWidth, frameStyle ); } else { const int midLineWidth = canvas->property( "midLineWidth" ).toInt(); QwtPainter::drawFrame( painter, canvasRect, canvas->palette(), canvas->foregroundRole(), frameWidth, midLineWidth, frameStyle ); } painter->restore(); } } } /*! Calculated the scale maps for rendering the canvas \param plot Plot widget \param canvasRect Target rectangle \param maps Scale maps to be calculated */ void QwtPlotRenderer::buildCanvasMaps( const QwtPlot *plot, const QRectF &canvasRect, QwtScaleMap maps[] ) const { for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { maps[axisId].setTransformation( plot->axisScaleEngine( axisId )->transformation() ); const QwtScaleDiv &scaleDiv = plot->axisScaleDiv( axisId ); maps[axisId].setScaleInterval( scaleDiv.lowerBound(), scaleDiv.upperBound() ); double from, to; if ( plot->axisEnabled( axisId ) ) { const int sDist = plot->axisWidget( axisId )->startBorderDist(); const int eDist = plot->axisWidget( axisId )->endBorderDist(); const QRectF scaleRect = plot->plotLayout()->scaleRect( axisId ); if ( axisId == QwtPlot::xTop || axisId == QwtPlot::xBottom ) { from = scaleRect.left() + sDist; to = scaleRect.right() - eDist; } else { from = scaleRect.bottom() - eDist; to = scaleRect.top() + sDist; } } else { int margin = 0; if ( !plot->plotLayout()->alignCanvasToScale( axisId ) ) margin = plot->plotLayout()->canvasMargin( axisId ); if ( axisId == QwtPlot::yLeft || axisId == QwtPlot::yRight ) { from = canvasRect.bottom() - margin; to = canvasRect.top() + margin; } else { from = canvasRect.left() + margin; to = canvasRect.right() - margin; } } maps[axisId].setPaintInterval( from, to ); } } bool QwtPlotRenderer::updateCanvasMargins( QwtPlot *plot, const QRectF &canvasRect, const QwtScaleMap maps[] ) const { double margins[QwtPlot::axisCnt]; plot->getCanvasMarginsHint( maps, canvasRect, margins[QwtPlot::yLeft], margins[QwtPlot::xTop], margins[QwtPlot::yRight], margins[QwtPlot::xBottom] ); bool marginsChanged = false; for ( int axisId = 0; axisId < QwtPlot::axisCnt; axisId++ ) { if ( margins[axisId] >= 0.0 ) { const int m = qCeil( margins[axisId] ); plot->plotLayout()->setCanvasMargin( m, axisId); marginsChanged = true; } } return marginsChanged; } /*! \brief Execute a file dialog and render the plot to the selected file \param plot Plot widget \param documentName Default document name \param sizeMM Size for the document in millimeters. \param resolution Resolution in dots per Inch (dpi) \return True, when exporting was successful \sa renderDocument() */ bool QwtPlotRenderer::exportTo( QwtPlot *plot, const QString &documentName, const QSizeF &sizeMM, int resolution ) { if ( plot == NULL ) return false; QString fileName = documentName; // What about translation #ifndef QT_NO_FILEDIALOG const QList imageFormats = QImageWriter::supportedImageFormats(); QStringList filter; #ifndef QT_NO_PRINTER filter += QString( "PDF " ) + tr( "Documents" ) + " (*.pdf)"; #endif #ifndef QWT_NO_SVG filter += QString( "SVG " ) + tr( "Documents" ) + " (*.svg)"; #endif #ifndef QT_NO_PRINTER filter += QString( "Postscript " ) + tr( "Documents" ) + " (*.ps)"; #endif if ( imageFormats.size() > 0 ) { QString imageFilter( tr( "Images" ) ); imageFilter += " ("; for ( int i = 0; i < imageFormats.size(); i++ ) { if ( i > 0 ) imageFilter += " "; imageFilter += "*."; imageFilter += imageFormats[i]; } imageFilter += ")"; filter += imageFilter; } fileName = QFileDialog::getSaveFileName( NULL, tr( "Export File Name" ), fileName, filter.join( ";;" ), NULL, QFileDialog::DontConfirmOverwrite ); #endif if ( fileName.isEmpty() ) return false; renderDocument( plot, fileName, sizeMM, resolution ); return true; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_null_paintdevice.h������������������������������������������������������000644 �001750 �001750 �00000006543 12151666702 022442� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_NULL_PAINT_DEVICE_H #define QWT_NULL_PAINT_DEVICE_H 1 #include "qwt_global.h" #include #include /*! \brief A null paint device doing nothing Sometimes important layout/rendering geometries are not available or changeable from the public Qt class interface. ( f.e hidden in the style implementation ). QwtNullPaintDevice can be used to manipulate or filter out this information by analyzing the stream of paint primitives. F.e. QwtNullPaintDevice is used by QwtPlotCanvas to identify styled backgrounds with rounded corners. */ class QWT_EXPORT QwtNullPaintDevice: public QPaintDevice { public: /*! \brief Render mode \sa setMode(), mode() */ enum Mode { /*! All vector graphic primitives are painted by the corresponding draw methods */ NormalMode, /*! Vector graphic primitives ( beside polygons ) are mapped to a QPainterPath and are painted by drawPath. In PathMode mode only a few draw methods are called: - drawPath() - drawPixmap() - drawImage() - drawPolygon() */ PolygonPathMode, /*! Vector graphic primitives are mapped to a QPainterPath and are painted by drawPath. In PathMode mode only a few draw methods are called: - drawPath() - drawPixmap() - drawImage() */ PathMode }; QwtNullPaintDevice(); virtual ~QwtNullPaintDevice(); void setMode( Mode ); Mode mode() const; virtual QPaintEngine *paintEngine() const; virtual int metric( PaintDeviceMetric metric ) const; virtual void drawRects(const QRect *, int ); virtual void drawRects(const QRectF *, int ); virtual void drawLines(const QLine *, int ); virtual void drawLines(const QLineF *, int ); virtual void drawEllipse(const QRectF &); virtual void drawEllipse(const QRect &); virtual void drawPath(const QPainterPath &); virtual void drawPoints(const QPointF *, int ); virtual void drawPoints(const QPoint *, int ); virtual void drawPolygon( const QPointF *, int , QPaintEngine::PolygonDrawMode ); virtual void drawPolygon( const QPoint *, int , QPaintEngine::PolygonDrawMode ); virtual void drawPixmap(const QRectF &, const QPixmap &, const QRectF &); virtual void drawTextItem(const QPointF &, const QTextItem &); virtual void drawTiledPixmap(const QRectF &, const QPixmap &, const QPointF &s); virtual void drawImage(const QRectF &, const QImage &, const QRectF &, Qt::ImageConversionFlags ); virtual void updateState( const QPaintEngineState &state ); protected: //! \return Size needed to implement metric() virtual QSize sizeMetrics() const = 0; private: class PaintEngine; PaintEngine *d_engine; class PrivateData; PrivateData *d_data; }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/src.pri���������������������������������������������������������������������000644 �001750 �001750 �00000014011 12151666703 017342� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ HEADERS += \ qwt.h \ qwt_abstract_scale_draw.h \ qwt_clipper.h \ qwt_color_map.h \ qwt_compat.h \ qwt_column_symbol.h \ qwt_date.h \ qwt_date_scale_draw.h \ qwt_date_scale_engine.h \ qwt_dyngrid_layout.h \ qwt_global.h \ qwt_graphic.h \ qwt_interval.h \ qwt_interval_symbol.h \ qwt_math.h \ qwt_magnifier.h \ qwt_null_paintdevice.h \ qwt_painter.h \ qwt_painter_command.h \ qwt_panner.h \ qwt_picker.h \ qwt_picker_machine.h \ qwt_pixel_matrix.h \ qwt_point_3d.h \ qwt_point_polar.h \ qwt_round_scale_draw.h \ qwt_scale_div.h \ qwt_scale_draw.h \ qwt_scale_engine.h \ qwt_scale_map.h \ qwt_spline.h \ qwt_symbol.h \ qwt_system_clock.h \ qwt_text_engine.h \ qwt_text_label.h \ qwt_text.h \ qwt_transform.h \ qwt_widget_overlay.h SOURCES += \ qwt_abstract_scale_draw.cpp \ qwt_clipper.cpp \ qwt_color_map.cpp \ qwt_column_symbol.cpp \ qwt_date.cpp \ qwt_date_scale_draw.cpp \ qwt_date_scale_engine.cpp \ qwt_dyngrid_layout.cpp \ qwt_event_pattern.cpp \ qwt_graphic.cpp \ qwt_interval.cpp \ qwt_interval_symbol.cpp \ qwt_math.cpp \ qwt_magnifier.cpp \ qwt_null_paintdevice.cpp \ qwt_painter.cpp \ qwt_painter_command.cpp \ qwt_panner.cpp \ qwt_picker.cpp \ qwt_picker_machine.cpp \ qwt_pixel_matrix.cpp \ qwt_point_3d.cpp \ qwt_point_polar.cpp \ qwt_round_scale_draw.cpp \ qwt_scale_div.cpp \ qwt_scale_draw.cpp \ qwt_scale_map.cpp \ qwt_spline.cpp \ qwt_scale_engine.cpp \ qwt_symbol.cpp \ qwt_system_clock.cpp \ qwt_text_engine.cpp \ qwt_text_label.cpp \ qwt_text.cpp \ qwt_transform.cpp \ qwt_widget_overlay.cpp contains(QWT_CONFIG, QwtPlot) { HEADERS += \ qwt_curve_fitter.h \ qwt_event_pattern.h \ qwt_abstract_legend.h \ qwt_legend.h \ qwt_legend_data.h \ qwt_legend_label.h \ qwt_plot.h \ qwt_plot_renderer.h \ qwt_plot_curve.h \ qwt_plot_dict.h \ qwt_plot_directpainter.h \ qwt_plot_grid.h \ qwt_plot_histogram.h \ qwt_plot_item.h \ qwt_plot_abstract_barchart.h \ qwt_plot_barchart.h \ qwt_plot_multi_barchart.h \ qwt_plot_intervalcurve.h \ qwt_plot_tradingcurve.h \ qwt_plot_layout.h \ qwt_plot_marker.h \ qwt_plot_zoneitem.h \ qwt_plot_textlabel.h \ qwt_plot_rasteritem.h \ qwt_plot_spectrogram.h \ qwt_plot_spectrocurve.h \ qwt_plot_scaleitem.h \ qwt_plot_legenditem.h \ qwt_plot_seriesitem.h \ qwt_plot_shapeitem.h \ qwt_plot_canvas.h \ qwt_plot_panner.h \ qwt_plot_picker.h \ qwt_plot_zoomer.h \ qwt_plot_magnifier.h \ qwt_plot_rescaler.h \ qwt_point_mapper.h \ qwt_raster_data.h \ qwt_matrix_raster_data.h \ qwt_sampling_thread.h \ qwt_samples.h \ qwt_series_data.h \ qwt_series_store.h \ qwt_point_data.h \ qwt_scale_widget.h SOURCES += \ qwt_curve_fitter.cpp \ qwt_abstract_legend.cpp \ qwt_legend.cpp \ qwt_legend_data.cpp \ qwt_legend_label.cpp \ qwt_plot.cpp \ qwt_plot_renderer.cpp \ qwt_plot_xml.cpp \ qwt_plot_axis.cpp \ qwt_plot_curve.cpp \ qwt_plot_dict.cpp \ qwt_plot_directpainter.cpp \ qwt_plot_grid.cpp \ qwt_plot_histogram.cpp \ qwt_plot_item.cpp \ qwt_plot_abstract_barchart.cpp \ qwt_plot_barchart.cpp \ qwt_plot_multi_barchart.cpp \ qwt_plot_intervalcurve.cpp \ qwt_plot_zoneitem.cpp \ qwt_plot_tradingcurve.cpp \ qwt_plot_spectrogram.cpp \ qwt_plot_spectrocurve.cpp \ qwt_plot_scaleitem.cpp \ qwt_plot_legenditem.cpp \ qwt_plot_seriesitem.cpp \ qwt_plot_shapeitem.cpp \ qwt_plot_marker.cpp \ qwt_plot_textlabel.cpp \ qwt_plot_layout.cpp \ qwt_plot_canvas.cpp \ qwt_plot_panner.cpp \ qwt_plot_rasteritem.cpp \ qwt_plot_picker.cpp \ qwt_plot_zoomer.cpp \ qwt_plot_magnifier.cpp \ qwt_plot_rescaler.cpp \ qwt_point_mapper.cpp \ qwt_raster_data.cpp \ qwt_matrix_raster_data.cpp \ qwt_sampling_thread.cpp \ qwt_series_data.cpp \ qwt_point_data.cpp \ qwt_scale_widget.cpp } greaterThan(QT_MAJOR_VERSION, 4) { QT += printsupport QT += concurrent } contains(QWT_CONFIG, QwtSvg) { QT += svg HEADERS += qwt_plot_svgitem.h SOURCES += qwt_plot_svgitem.cpp } else { DEFINES += QWT_NO_SVG } contains(QWT_CONFIG, QwtOpenGL) { QT += opengl HEADERS += qwt_plot_glcanvas.h SOURCES += qwt_plot_glcanvas.cpp } else { DEFINES += QWT_NO_OPENGL } contains(QWT_CONFIG, QwtWidgets) { HEADERS += \ qwt_abstract_slider.h \ qwt_abstract_scale.h \ qwt_arrow_button.h \ qwt_analog_clock.h \ qwt_compass.h \ qwt_compass_rose.h \ qwt_counter.h \ qwt_dial.h \ qwt_dial_needle.h \ qwt_knob.h \ qwt_slider.h \ qwt_thermo.h \ qwt_wheel.h SOURCES += \ qwt_abstract_slider.cpp \ qwt_abstract_scale.cpp \ qwt_arrow_button.cpp \ qwt_analog_clock.cpp \ qwt_compass.cpp \ qwt_compass_rose.cpp \ qwt_counter.cpp \ qwt_dial.cpp \ qwt_dial_needle.cpp \ qwt_knob.cpp \ qwt_slider.cpp \ qwt_thermo.cpp \ qwt_wheel.cpp } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_interval_symbol.cpp�����������������������������������������������������000644 �001750 �001750 �00000017547 12151666703 022670� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_interval_symbol.h" #include "qwt_painter.h" #include "qwt_math.h" #include #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #define qFastSin(x) qSin(x) #define qFastCos(x) qCos(x) #endif class QwtIntervalSymbol::PrivateData { public: PrivateData(): style( QwtIntervalSymbol::NoSymbol ), width( 6 ) { } bool operator==( const PrivateData &other ) const { return ( style == other.style ) && ( width == other.width ) && ( brush == other.brush ) && ( pen == other.pen ); } QwtIntervalSymbol::Style style; int width; QPen pen; QBrush brush; }; /*! Constructor \param style Style of the symbol \sa setStyle(), style(), Style */ QwtIntervalSymbol::QwtIntervalSymbol( Style style ) { d_data = new PrivateData(); d_data->style = style; } //! Copy constructor QwtIntervalSymbol::QwtIntervalSymbol( const QwtIntervalSymbol &other ) { d_data = new PrivateData(); *d_data = *other.d_data; } //! Destructor QwtIntervalSymbol::~QwtIntervalSymbol() { delete d_data; } //! \brief Assignment operator QwtIntervalSymbol &QwtIntervalSymbol::operator=( const QwtIntervalSymbol &other ) { *d_data = *other.d_data; return *this; } //! \brief Compare two symbols bool QwtIntervalSymbol::operator==( const QwtIntervalSymbol &other ) const { return *d_data == *other.d_data; } //! \brief Compare two symbols bool QwtIntervalSymbol::operator!=( const QwtIntervalSymbol &other ) const { return !( *d_data == *other.d_data ); } /*! Specify the symbol style \param style Style \sa style(), Style */ void QwtIntervalSymbol::setStyle( Style style ) { d_data->style = style; } /*! \return Current symbol style \sa setStyle() */ QwtIntervalSymbol::Style QwtIntervalSymbol::style() const { return d_data->style; } /*! Specify the width of the symbol It is used depending on the style. \param width Width \sa width(), setStyle() */ void QwtIntervalSymbol::setWidth( int width ) { d_data->width = width; } /*! \return Width of the symbol. \sa setWidth(), setStyle() */ int QwtIntervalSymbol::width() const { return d_data->width; } /*! \brief Assign a brush The brush is used for the Box style. \param brush Brush \sa brush() */ void QwtIntervalSymbol::setBrush( const QBrush &brush ) { d_data->brush = brush; } /*! \return Brush \sa setBrush() */ const QBrush& QwtIntervalSymbol::brush() const { return d_data->brush; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtIntervalSymbol::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen \param pen Pen \sa pen(), setBrush() */ void QwtIntervalSymbol::setPen( const QPen &pen ) { d_data->pen = pen; } /*! \return Pen \sa setPen(), brush() */ const QPen& QwtIntervalSymbol::pen() const { return d_data->pen; } /*! Draw a symbol depending on its style \param painter Painter \param orientation Orientation \param from Start point of the interval in target device coordinates \param to End point of the interval in target device coordinates \sa setStyle() */ void QwtIntervalSymbol::draw( QPainter *painter, Qt::Orientation orientation, const QPointF &from, const QPointF &to ) const { const qreal pw = qMax( painter->pen().widthF(), qreal( 1.0 ) ); QPointF p1 = from; QPointF p2 = to; if ( QwtPainter::roundingAlignment( painter ) ) { p1 = p1.toPoint(); p2 = p2.toPoint(); } switch ( d_data->style ) { case QwtIntervalSymbol::Bar: { QwtPainter::drawLine( painter, p1, p2 ); if ( d_data->width > pw ) { if ( ( orientation == Qt::Horizontal ) && ( p1.y() == p2.y() ) ) { const double sw = d_data->width; const double y = p1.y() - sw / 2; QwtPainter::drawLine( painter, p1.x(), y, p1.x(), y + sw ); QwtPainter::drawLine( painter, p2.x(), y, p2.x(), y + sw ); } else if ( ( orientation == Qt::Vertical ) && ( p1.x() == p2.x() ) ) { const double sw = d_data->width; const double x = p1.x() - sw / 2; QwtPainter::drawLine( painter, x, p1.y(), x + sw, p1.y() ); QwtPainter::drawLine( painter, x, p2.y(), x + sw, p2.y() ); } else { const double sw = d_data->width; const double dx = p2.x() - p1.x(); const double dy = p2.y() - p1.y(); const double angle = qAtan2( dy, dx ) + M_PI_2; double dw2 = sw / 2.0; const double cx = qFastCos( angle ) * dw2; const double sy = qFastSin( angle ) * dw2; QwtPainter::drawLine( painter, p1.x() - cx, p1.y() - sy, p1.x() + cx, p1.y() + sy ); QwtPainter::drawLine( painter, p2.x() - cx, p2.y() - sy, p2.x() + cx, p2.y() + sy ); } } break; } case QwtIntervalSymbol::Box: { if ( d_data->width <= pw ) { QwtPainter::drawLine( painter, p1, p2 ); } else { if ( ( orientation == Qt::Horizontal ) && ( p1.y() == p2.y() ) ) { const double sw = d_data->width; const double y = p1.y() - d_data->width / 2; QwtPainter::drawRect( painter, p1.x(), y, p2.x() - p1.x(), sw ); } else if ( ( orientation == Qt::Vertical ) && ( p1.x() == p2.x() ) ) { const double sw = d_data->width; const double x = p1.x() - d_data->width / 2; QwtPainter::drawRect( painter, x, p1.y(), sw, p2.y() - p1.y() ); } else { const double sw = d_data->width; const double dx = p2.x() - p1.x(); const double dy = p2.y() - p1.y(); const double angle = qAtan2( dy, dx ) + M_PI_2; double dw2 = sw / 2.0; const double cx = qFastCos( angle ) * dw2; const double sy = qFastSin( angle ) * dw2; QPolygonF polygon; polygon += QPointF( p1.x() - cx, p1.y() - sy ); polygon += QPointF( p1.x() + cx, p1.y() + sy ); polygon += QPointF( p2.x() + cx, p2.y() + sy ); polygon += QPointF( p2.x() - cx, p2.y() - sy ); QwtPainter::drawPolygon( painter, polygon ); } } break; } default:; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_analog_clock.cpp��������������������������������������������������������000644 �001750 �001750 �00000013322 12151666703 022056� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_analog_clock.h" #include "qwt_round_scale_draw.h" #include #include class QwtAnalogClockScaleDraw: public QwtRoundScaleDraw { public: QwtAnalogClockScaleDraw() { setSpacing( 8 ); enableComponent( QwtAbstractScaleDraw::Backbone, false ); setTickLength( QwtScaleDiv::MinorTick, 2 ); setTickLength( QwtScaleDiv::MediumTick, 4 ); setTickLength( QwtScaleDiv::MajorTick, 8 ); setPenWidth( 1 ); } virtual QwtText label( double value ) const { if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 60.0 * 60.0 * 12.0; return QLocale().toString( qRound( value / ( 60.0 * 60.0 ) ) ); } }; /*! Constructor \param parent Parent widget */ QwtAnalogClock::QwtAnalogClock( QWidget *parent ): QwtDial( parent ) { setWrapping( true ); setReadOnly( true ); setOrigin( 270.0 ); setScaleDraw( new QwtAnalogClockScaleDraw() ); setTotalSteps( 60 ); const int secondsPerHour = 60.0 * 60.0; QList majorTicks; QList minorTicks; for ( int i = 0; i < 12; i++ ) { majorTicks += i * secondsPerHour; for ( int j = 1; j < 5; j++ ) minorTicks += i * secondsPerHour + j * secondsPerHour / 5.0; } QwtScaleDiv scaleDiv; scaleDiv.setInterval( 0.0, 12.0 * secondsPerHour ); scaleDiv.setTicks( QwtScaleDiv::MajorTick, majorTicks ); scaleDiv.setTicks( QwtScaleDiv::MinorTick, minorTicks ); setScale( scaleDiv ); QColor knobColor = palette().color( QPalette::Active, QPalette::Text ); knobColor = knobColor.dark( 120 ); QColor handColor; int width; for ( int i = 0; i < NHands; i++ ) { if ( i == SecondHand ) { width = 2; handColor = knobColor.dark( 120 ); } else { width = 8; handColor = knobColor; } QwtDialSimpleNeedle *hand = new QwtDialSimpleNeedle( QwtDialSimpleNeedle::Arrow, true, handColor, knobColor ); hand->setWidth( width ); d_hand[i] = NULL; setHand( static_cast( i ), hand ); } } //! Destructor QwtAnalogClock::~QwtAnalogClock() { for ( int i = 0; i < NHands; i++ ) delete d_hand[i]; } /*! Nop method, use setHand() instead \sa setHand() */ void QwtAnalogClock::setNeedle( QwtDialNeedle * ) { // no op return; } /*! Set a clock hand \param hand Specifies the type of hand \param needle Hand \sa hand() */ void QwtAnalogClock::setHand( Hand hand, QwtDialNeedle *needle ) { if ( hand >= 0 && hand < NHands ) { delete d_hand[hand]; d_hand[hand] = needle; } } /*! \return Clock hand \param hd Specifies the type of hand \sa setHand() */ QwtDialNeedle *QwtAnalogClock::hand( Hand hd ) { if ( hd < 0 || hd >= NHands ) return NULL; return d_hand[hd]; } /*! \return Clock hand \param hd Specifies the type of hand \sa setHand() */ const QwtDialNeedle *QwtAnalogClock::hand( Hand hd ) const { return const_cast( this )->hand( hd ); } /*! \brief Set the current time */ void QwtAnalogClock::setCurrentTime() { setTime( QTime::currentTime() ); } /*! Set a time \param time Time to display */ void QwtAnalogClock::setTime( const QTime &time ) { if ( time.isValid() ) { setValue( ( time.hour() % 12 ) * 60.0 * 60.0 + time.minute() * 60.0 + time.second() ); } else setValid( false ); } /*! \brief Draw the needle A clock has no single needle but three hands instead. drawNeedle() translates value() into directions for the hands and calls drawHand(). \param painter Painter \param center Center of the clock \param radius Maximum length for the hands \param dir Dummy, not used. \param colorGroup ColorGroup \sa drawHand() */ void QwtAnalogClock::drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double dir, QPalette::ColorGroup colorGroup ) const { Q_UNUSED( dir ); if ( isValid() ) { const double hours = value() / ( 60.0 * 60.0 ); const double minutes = ( value() - qFloor(hours) * 60.0 * 60.0 ) / 60.0; const double seconds = value() - qFloor(hours) * 60.0 * 60.0 - qFloor(minutes) * 60.0; double angle[NHands]; angle[HourHand] = 360.0 * hours / 12.0; angle[MinuteHand] = 360.0 * minutes / 60.0; angle[SecondHand] = 360.0 * seconds / 60.0; for ( int hand = 0; hand < NHands; hand++ ) { const double d = 360.0 - angle[hand] - origin(); drawHand( painter, static_cast( hand ), center, radius, d, colorGroup ); } } } /*! Draw a clock hand \param painter Painter \param hd Specify the type of hand \param center Center of the clock \param radius Maximum length for the hands \param direction Direction of the hand in degrees, counter clockwise \param cg ColorGroup */ void QwtAnalogClock::drawHand( QPainter *painter, Hand hd, const QPointF ¢er, double radius, double direction, QPalette::ColorGroup cg ) const { const QwtDialNeedle *needle = hand( hd ); if ( needle ) { if ( hd == HourHand ) radius = qRound( 0.8 * radius ); needle->draw( painter, center, radius, direction, cg ); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_directpainter.h����������������������������������������������������000644 �001750 �001750 �00000006127 12151666701 023005� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_DIRECT_PAINTER_H #define QWT_PLOT_DIRECT_PAINTER_H #include "qwt_global.h" #include class QRegion; class QwtPlotSeriesItem; /*! \brief Painter object trying to paint incrementally Often applications want to display samples while they are collected. When there are too many samples complete replots will be expensive to be processed in a collection cycle. QwtPlotDirectPainter offers an API to paint subsets ( f.e all additions points ) without erasing/repainting the plot canvas. On certain environments it might be important to calculate a proper clip region before painting. F.e. for Qt Embedded only the clipped part of the backing store will be copied to a ( maybe unaccelerated ) frame buffer. \warning Incremental painting will only help when no replot is triggered by another operation ( like changing scales ) and nothing needs to be erased. */ class QWT_EXPORT QwtPlotDirectPainter: public QObject { public: /*! \brief Paint attributes \sa setAttribute(), testAttribute(), drawSeries() */ enum Attribute { /*! Initializing a QPainter is an expensive operation. When AtomicPainter is set each call of drawSeries() opens/closes a temporary QPainter. Otherwise QwtPlotDirectPainter tries to use the same QPainter as long as possible. */ AtomicPainter = 0x01, /*! When FullRepaint is set the plot canvas is explicitly repainted after the samples have been rendered. */ FullRepaint = 0x02, /*! When QwtPlotCanvas::BackingStore is enabled the painter has to paint to the backing store and the widget. In certain situations/environments it might be faster to paint to the backing store only and then copy the backing store to the canvas. This flag can also be useful for settings, where Qt fills the the clip region with the widget background. */ CopyBackingStore = 0x04 }; //! Paint attributes typedef QFlags Attributes; QwtPlotDirectPainter( QObject *parent = NULL ); virtual ~QwtPlotDirectPainter(); void setAttribute( Attribute, bool on ); bool testAttribute( Attribute ) const; void setClipping( bool ); bool hasClipping() const; void setClipRegion( const QRegion & ); QRegion clipRegion() const; void drawSeries( QwtPlotSeriesItem *, int from, int to ); void reset(); virtual bool eventFilter( QObject *, QEvent * ); private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotDirectPainter::Attributes ) #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_point_polar.cpp���������������������������������������������������������000644 �001750 �001750 �00000006122 12151666703 021770� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * QwtPolar Widget Library * Copyright (C) 2008 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_polar.h" #include "qwt_math.h" #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #endif /*! Convert and assign values from a point in Cartesian coordinates \param p Point in Cartesian coordinates \sa setPoint(), toPoint() */ QwtPointPolar::QwtPointPolar( const QPointF &p ) { d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) ); d_azimuth = qAtan2( p.y(), p.x() ); } /*! Convert and assign values from a point in Cartesian coordinates \param p Point in Cartesian coordinates */ void QwtPointPolar::setPoint( const QPointF &p ) { d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) ); d_azimuth = qAtan2( p.y(), p.x() ); } /*! Convert and return values in Cartesian coordinates \return Converted point in Cartesian coordinates \note Invalid or null points will be returned as QPointF(0.0, 0.0) \sa isValid(), isNull() */ QPointF QwtPointPolar::toPoint() const { if ( d_radius <= 0.0 ) return QPointF( 0.0, 0.0 ); const double x = d_radius * qCos( d_azimuth ); const double y = d_radius * qSin( d_azimuth ); return QPointF( x, y ); } /*! \brief Compare 2 points Two points are equal to each other if radius and azimuth-coordinates are the same. Points are not equal, when the azimuth differs, but other.azimuth() == azimuth() % (2 * PI). \return True if the point is equal to other; otherwise return false. \sa normalized() */ bool QwtPointPolar::operator==( const QwtPointPolar &other ) const { return d_radius == other.d_radius && d_azimuth == other.d_azimuth; } /*! Compare 2 points Two points are equal to each other if radius and azimuth-coordinates are the same. Points are not equal, when the azimuth differs, but other.azimuth() == azimuth() % (2 * PI). \return True if the point is not equal to other; otherwise return false. \sa normalized() */ bool QwtPointPolar::operator!=( const QwtPointPolar &other ) const { return d_radius != other.d_radius || d_azimuth != other.d_azimuth; } /*! Normalize radius and azimuth When the radius is < 0.0 it is set to 0.0. The azimuth is a value >= 0.0 and < 2 * M_PI. \return Normalized point */ QwtPointPolar QwtPointPolar::normalized() const { const double radius = qMax( d_radius, 0.0 ); double azimuth = d_azimuth; if ( azimuth < -2.0 * M_PI || azimuth >= 2 * M_PI ) azimuth = ::fmod( d_azimuth, 2 * M_PI ); if ( azimuth < 0.0 ) azimuth += 2 * M_PI; return QwtPointPolar( azimuth, radius ); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtPointPolar &point ) { debug.nospace() << "QwtPointPolar(" << point.azimuth() << "," << point.radius() << ")"; return debug.space(); } #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_arrow_button.h����������������������������������������������������������000644 �001750 �001750 �00000002621 12151666701 021632� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ARROW_BUTTON_H #define QWT_ARROW_BUTTON_H #include "qwt_global.h" #include /*! \brief Arrow Button A push button with one or more filled triangles on its front. An Arrow button can have 1 to 3 arrows in a row, pointing up, down, left or right. */ class QWT_EXPORT QwtArrowButton : public QPushButton { public: explicit QwtArrowButton ( int num, Qt::ArrowType, QWidget *parent = NULL ); virtual ~QwtArrowButton(); Qt::ArrowType arrowType() const; int num() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; protected: virtual void paintEvent( QPaintEvent *event ); virtual void drawButtonLabel( QPainter *p ); virtual void drawArrow( QPainter *, const QRect &, Qt::ArrowType ) const; virtual QRect labelRect() const; virtual QSize arrowSize( Qt::ArrowType, const QSize &boundingSize ) const; virtual void keyPressEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif ���������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_clipper.h���������������������������������������������������������������000644 �001750 �001750 �00000002051 12151666701 020540� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_CLIPPER_H #define QWT_CLIPPER_H #include "qwt_global.h" #include "qwt_interval.h" #include #include class QRect; class QRectF; /*! \brief Some clipping algorithms */ class QWT_EXPORT QwtClipper { public: static QPolygon clipPolygon( const QRect &, const QPolygon &, bool closePolygon = false ); static QPolygon clipPolygon( const QRectF &, const QPolygon &, bool closePolygon = false ); static QPolygonF clipPolygonF( const QRectF &, const QPolygonF &, bool closePolygon = false ); static QVector clipCircle( const QRectF &, const QPointF &, double radius ); }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/debian/���������������������������������������������������������������������������������000755 �001750 �001750 �00000000000 12367024516 015115� 5����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_sampling_thread.h�������������������������������������������������������000644 �001750 �001750 �00000002101 12151666701 022237� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef _QWT_SAMPLING_THREAD_H_ #define _QWT_SAMPLING_THREAD_H_ #include "qwt_global.h" #include /*! \brief A thread collecting samples at regular intervals. Continuous signals are converted into a discrete signal by collecting samples at regular intervals. A discrete signal can be displayed by a QwtPlotSeriesItem on a QwtPlot widget. QwtSamplingThread starts a thread calling periodically sample(), to collect and store ( or emit ) a single sample. \sa QwtPlotCurve, QwtPlotSeriesItem */ class QWT_EXPORT QwtSamplingThread: public QThread { Q_OBJECT public: virtual ~QwtSamplingThread(); double interval() const; double elapsed() const; public Q_SLOTS: void setInterval( double interval ); void stop(); protected: explicit QwtSamplingThread( QObject *parent = NULL ); virtual void run(); /*! Collect a sample \param elapsed Time since the thread was started in milliseconds */ virtual void sample( double elapsed ) = 0; private: class PrivateData; PrivateData *d_data; }; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_scaleitem.cpp������������������������������������������������������000644 �001750 �001750 �00000025511 12151666703 022451� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_scaleitem.h" #include "qwt_plot.h" #include "qwt_scale_map.h" #include "qwt_interval.h" #include #include class QwtPlotScaleItem::PrivateData { public: PrivateData(): position( 0.0 ), borderDistance( -1 ), scaleDivFromAxis( true ), scaleDraw( new QwtScaleDraw() ) { } ~PrivateData() { delete scaleDraw; } void updateBorders( const QRectF &, const QwtScaleMap &, const QwtScaleMap & ); QPalette palette; QFont font; double position; int borderDistance; bool scaleDivFromAxis; QwtScaleDraw *scaleDraw; QRectF canvasRectCache; }; void QwtPlotScaleItem::PrivateData::updateBorders( const QRectF &canvasRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap ) { QwtInterval interval; if ( scaleDraw->orientation() == Qt::Horizontal ) { interval.setMinValue( xMap.invTransform( canvasRect.left() ) ); interval.setMaxValue( xMap.invTransform( canvasRect.right() - 1 ) ); } else { interval.setMinValue( yMap.invTransform( canvasRect.bottom() - 1 ) ); interval.setMaxValue( yMap.invTransform( canvasRect.top() ) ); } QwtScaleDiv scaleDiv = scaleDraw->scaleDiv(); scaleDiv.setInterval( interval ); scaleDraw->setScaleDiv( scaleDiv ); } /*! \brief Constructor for scale item at the position pos. \param alignment In case of QwtScaleDraw::BottomScale or QwtScaleDraw::TopScale the scale item is corresponding to the xAxis(), otherwise it corresponds to the yAxis(). \param pos x or y position, depending on the corresponding axis. \sa setPosition(), setAlignment() */ QwtPlotScaleItem::QwtPlotScaleItem( QwtScaleDraw::Alignment alignment, const double pos ): QwtPlotItem( QwtText( "Scale" ) ) { d_data = new PrivateData; d_data->position = pos; d_data->scaleDraw->setAlignment( alignment ); setItemInterest( QwtPlotItem::ScaleInterest, true ); setZ( 11.0 ); } //! Destructor QwtPlotScaleItem::~QwtPlotScaleItem() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotScale int QwtPlotScaleItem::rtti() const { return QwtPlotItem::Rtti_PlotScale; } /*! \brief Assign a scale division When assigning a scaleDiv the scale division won't be synchronized with the corresponding axis anymore. \param scaleDiv Scale division \sa scaleDiv(), setScaleDivFromAxis(), isScaleDivFromAxis() */ void QwtPlotScaleItem::setScaleDiv( const QwtScaleDiv& scaleDiv ) { d_data->scaleDivFromAxis = false; d_data->scaleDraw->setScaleDiv( scaleDiv ); } //! \return Scale division const QwtScaleDiv& QwtPlotScaleItem::scaleDiv() const { return d_data->scaleDraw->scaleDiv(); } /*! Enable/Disable the synchronization of the scale division with the corresponding axis. \param on true/false \sa isScaleDivFromAxis() */ void QwtPlotScaleItem::setScaleDivFromAxis( bool on ) { if ( on != d_data->scaleDivFromAxis ) { d_data->scaleDivFromAxis = on; if ( on ) { const QwtPlot *plt = plot(); if ( plt ) { updateScaleDiv( plt->axisScaleDiv( xAxis() ), plt->axisScaleDiv( yAxis() ) ); itemChanged(); } } } } /*! \return True, if the synchronization of the scale division with the corresponding axis is enabled. \sa setScaleDiv(), setScaleDivFromAxis() */ bool QwtPlotScaleItem::isScaleDivFromAxis() const { return d_data->scaleDivFromAxis; } /*! Set the palette \sa QwtAbstractScaleDraw::draw(), palette() */ void QwtPlotScaleItem::setPalette( const QPalette &palette ) { if ( palette != d_data->palette ) { d_data->palette = palette; legendChanged(); itemChanged(); } } /*! \return palette \sa setPalette() */ QPalette QwtPlotScaleItem::palette() const { return d_data->palette; } /*! Change the tick label font \sa font() */ void QwtPlotScaleItem::setFont( const QFont &font ) { if ( font != d_data->font ) { d_data->font = font; itemChanged(); } } /*! \return tick label font \sa setFont() */ QFont QwtPlotScaleItem::font() const { return d_data->font; } /*! \brief Set a scale draw \param scaleDraw object responsible for drawing scales. The main use case for replacing the default QwtScaleDraw is to overload QwtAbstractScaleDraw::label, to replace or swallow tick labels. \sa scaleDraw() */ void QwtPlotScaleItem::setScaleDraw( QwtScaleDraw *scaleDraw ) { if ( scaleDraw == NULL ) return; if ( scaleDraw != d_data->scaleDraw ) delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; const QwtPlot *plt = plot(); if ( plt ) { updateScaleDiv( plt->axisScaleDiv( xAxis() ), plt->axisScaleDiv( yAxis() ) ); } itemChanged(); } /*! \return Scale draw \sa setScaleDraw() */ const QwtScaleDraw *QwtPlotScaleItem::scaleDraw() const { return d_data->scaleDraw; } /*! \return Scale draw \sa setScaleDraw() */ QwtScaleDraw *QwtPlotScaleItem::scaleDraw() { return d_data->scaleDraw; } /*! Change the position of the scale The position is interpreted as y value for horizontal axes and as x value for vertical axes. The border distance is set to -1. \param pos New position \sa position(), setAlignment() */ void QwtPlotScaleItem::setPosition( double pos ) { if ( d_data->position != pos ) { d_data->position = pos; d_data->borderDistance = -1; itemChanged(); } } /*! \return Position of the scale \sa setPosition(), setAlignment() */ double QwtPlotScaleItem::position() const { return d_data->position; } /*! \brief Align the scale to the canvas If distance is >= 0 the scale will be aligned to a border of the contents rectangle of the canvas. If alignment() is QwtScaleDraw::LeftScale, the scale will be aligned to the right border, if it is QwtScaleDraw::TopScale it will be aligned to the bottom (and vice versa), If distance is < 0 the scale will be at the position(). \param distance Number of pixels between the canvas border and the backbone of the scale. \sa setPosition(), borderDistance() */ void QwtPlotScaleItem::setBorderDistance( int distance ) { if ( distance < 0 ) distance = -1; if ( distance != d_data->borderDistance ) { d_data->borderDistance = distance; itemChanged(); } } /*! \return Distance from a canvas border \sa setBorderDistance(), setPosition() */ int QwtPlotScaleItem::borderDistance() const { return d_data->borderDistance; } /*! Change the alignment of the scale The alignment sets the orientation of the scale and the position of the ticks: - QwtScaleDraw::BottomScale: horizontal, ticks below - QwtScaleDraw::TopScale: horizontal, ticks above - QwtScaleDraw::LeftScale: vertical, ticks left - QwtScaleDraw::RightScale: vertical, ticks right For horizontal scales the position corresponds to QwtPlotItem::yAxis(), otherwise to QwtPlotItem::xAxis(). \sa scaleDraw(), QwtScaleDraw::alignment(), setPosition() */ void QwtPlotScaleItem::setAlignment( QwtScaleDraw::Alignment alignment ) { QwtScaleDraw *sd = d_data->scaleDraw; if ( sd->alignment() != alignment ) { sd->setAlignment( alignment ); itemChanged(); } } /*! \brief Draw the scale */ void QwtPlotScaleItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { if ( d_data->scaleDivFromAxis ) { if ( canvasRect != d_data->canvasRectCache ) { d_data->updateBorders( canvasRect, xMap, yMap ); d_data->canvasRectCache = canvasRect; } } QPen pen = painter->pen(); pen.setStyle( Qt::SolidLine ); painter->setPen( pen ); QwtScaleDraw *sd = d_data->scaleDraw; if ( sd->orientation() == Qt::Horizontal ) { double y; if ( d_data->borderDistance >= 0 ) { if ( sd->alignment() == QwtScaleDraw::BottomScale ) y = canvasRect.top() + d_data->borderDistance; else { y = canvasRect.bottom() - d_data->borderDistance; } } else { y = yMap.transform( d_data->position ); } if ( y < canvasRect.top() || y > canvasRect.bottom() ) return; sd->move( canvasRect.left(), y ); sd->setLength( canvasRect.width() - 1 ); QwtTransform *transform = NULL; if ( xMap.transformation() ) transform = xMap.transformation()->copy(); sd->setTransformation( transform ); } else // == Qt::Vertical { double x; if ( d_data->borderDistance >= 0 ) { if ( sd->alignment() == QwtScaleDraw::RightScale ) x = canvasRect.left() + d_data->borderDistance; else { x = canvasRect.right() - d_data->borderDistance; } } else { x = xMap.transform( d_data->position ); } if ( x < canvasRect.left() || x > canvasRect.right() ) return; sd->move( x, canvasRect.top() ); sd->setLength( canvasRect.height() - 1 ); QwtTransform *transform = NULL; if ( yMap.transformation() ) transform = yMap.transformation()->copy(); sd->setTransformation( transform ); } painter->setFont( d_data->font ); sd->draw( painter, d_data->palette ); } /*! \brief Update the item to changes of the axes scale division In case of isScaleDivFromAxis(), the scale draw is synchronized to the correspond axis. \param xScaleDiv Scale division of the x-axis \param yScaleDiv Scale division of the y-axis \sa QwtPlot::updateAxes() */ void QwtPlotScaleItem::updateScaleDiv( const QwtScaleDiv& xScaleDiv, const QwtScaleDiv& yScaleDiv ) { QwtScaleDraw *sd = d_data->scaleDraw; if ( d_data->scaleDivFromAxis && sd ) { sd->setScaleDiv( sd->orientation() == Qt::Horizontal ? xScaleDiv : yScaleDiv ); const QwtPlot *plt = plot(); if ( plt != NULL ) { d_data->updateBorders( plt->canvas()->contentsRect(), plt->canvasMap( xAxis() ), plt->canvasMap( yAxis() ) ); d_data->canvasRectCache = QRect(); } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/textengines/mathml/qtmmlwidget-license������������������������������������������000644 �001750 �001750 �00000004135 12151666676 025007� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������qwt_mml_document.h/qwt_mml_document.cpp have been stripped down from "MML Widget" package of the solutions package, that is distributed under the following licenses: ----------------------------------------------------------------- Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. Contact: Nokia Corporation (qt-info@nokia.com) Commercial Usage Licensees holding valid Qt Commercial licenses may use this file in accordance with the Qt Solutions Commercial License Agreement provided with the Software or, alternatively, in accordance with the terms contained in a written agreement between you and Nokia. GNU Lesser General Public License Usage Alternatively, this file may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation and appearing in the file LICENSE.LGPL included in the packaging of this file. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. In addition, as a special exception, Nokia gives you certain additional rights. These rights are described in the Nokia Qt LGPL Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this package. GNU General Public License Usage Alternatively, this file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE.GPL included in the packaging of this file. Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html. Please note Third Party Software included with Qt Solutions may impose additional restrictions and it is the user's responsibility to ensure that they have met the licensing requirements of the GPL, LGPL, or Qt Solutions Commercial license and the relevant license of the Third Party Software they are using. If you are unsure which license is appropriate for your use, please contact Nokia at qt-info@nokia.com. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/linssid-app/MainForm.h������������������������������������������������������������������000664 �001750 �001750 �00000006320 12356071435 020002� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * File: mainForm.h * Author: warren * * Created on October 25, 2012, 11:43 AM */ #ifndef _MAINFORM_H #define _MAINFORM_H #include #include #include #include #include #include #include #include #include #include "ui_MainForm.h" #include "prefsDialog.h" #include "passBox.h" #include "Custom.h" using namespace std; class Getter; // forward declare class MainForm : public QMainWindow { Q_OBJECT public: struct cellData; struct History; struct vendorStruct; struct sSort; struct sMaingeom; struct sMainsplit; struct sPlotprefs; struct sDefPref; MainForm(); virtual ~MainForm(); // void run(); void init(); void loadVendorDb(); string findVendor(string); void getUserID(); void addInterfaces(); void setInterface(int); int getNapTime(); void writePrefsFile(); void writePrefsBlock(string, sDefPref); void readPrefsFile(); string getCurrentInterface(); static const QEvent::Type DATA_READY_EVENT; class DataReadyEvent; int getReadyBlockNo(); void postDataReadyEvent(const int); void drawTable(); void setVisibleCols(); void fillTable(); class Chan24ScaleDraw; class Chan5ScaleDraw; void initColtoAction(); void initPlotGrids(); void drawChan24Plot(); void drawChan5Plot(); void drawTimePlot(); void fillPlots(); void initNewCell(string, int); void extractData(string, int &); void doLogData(); void writeLogDataHeader(string); inline void waste(int); static Getter* pGetter; // a pointer to the instance of the Getter that calls this MainForm static QThread* pGetterThread; // a pointer to the getter's thread static vector cellDataRay; static vendorStruct* vendor; static fstream logDataStream; static int maxTableIndex; static int numVendors; static int maxVendorRecL; static long runStartTime; static long blockSampleTime; static long now; static int logDataState; static bool firstScan; static wlPrivacy currentPrivacy; // attempt to keep the parsing of the datastream state-free failed. static string wlPrivacies[3]; static string wlCiphers[3]; static string chan24Freq[15]; static string chan50Freq[42][2]; static QColor qColorArray[NUMBER_OF_COLORS]; static QAction* colToQAction[MAX_TABLE_COLS]; static int columnWidth[MAX_TABLE_COLS]; static QwtPlotGrid* chan24Grid; static QwtPlotGrid* chan5Grid; static QwtPlotGrid* timeGrid; static prefsDialog* prefsDlg1; static sDefPref defPref; public slots: void doRun(); void doPlotAll(); void doPlotNone(); void doTableChanged(int,int); void reDrawTable(); void showAboutBox(); void showPrefsDlg(); void columnWidthSave(int, int, int); void updatePlotPrefs(int, int, bool); void logPrefChanged(int); protected: Ui::mainForm mainFormWidget; void customEvent(QEvent*); // This overrides QObject::customEvent() void closeEvent(QCloseEvent*); // Overides built-in closeEvent() void handleDataReadyEvent(const DataReadyEvent*); }; #endif /* _MAINFORM_H */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/linssid-app/MainForm.cpp����������������������������������������������������������������000664 �001750 �001750 �00000170114 12366766335 020353� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * File: mainForm.cpp * Author: warren * * Created on October 25, 2012, 11:43 AM */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Custom.h" #include "MainForm.h" #include "Getter.h" #include "AboutBox.h" #include "passBox.h" #include "prefsDialog.h" #include "ui_MainForm.h" extern int lastBlockRequested; extern int lastBlockReceived; extern qint64 startTime; extern string endBlockString; extern string pipeName; extern ofstream linssidLog; extern bool closing; extern string genPipeName(int); using namespace std; // define a few things // the cellData structure is replicated for each attach point (cell) found struct MainForm::cellData { string macAddr; string essid; string mode; // master, managed, etc. string security; // on or off wlPrivacy privacy; // none or WEP or WPA2 wlCipher cipher; // unknown or TKIP or AES int channel; string frequency; string protocol; // a,b,g,n int quality; // normalized: x/y * 100 int signal; // try to get dBm int minSignal; // lowest seen int maxSignal; // highest seen int noise; // try to get dBm int mbps; // try to get Mb/s string vendor; long firstSeen; long lastSeen; string netType; QColor color; QwtPlotCurve* pBandCurve; double xPlot[4]; double yPlot[4]; History* pHistory; QwtPlotCurve* pTimeCurve; QTableWidgetItem * pTableItem[MAX_TABLE_COLS]; int timesSeen; // believe it or not, some drivers report a MAC more than once per scan }; struct MainForm::History { // This structure is created to record the history of each cell. It's a ring buffer. // Sample buffers are TWICE the size needed so that we can efficiently give the // plotting package contiguous arrays of size MAX_SAMPLES. Each sample is entered // twice: at index 0<=i MainForm::cellDataRay; MainForm::vendorStruct* MainForm::vendor; fstream MainForm::logDataStream; int MainForm::maxTableIndex; // holds the highest index pointer into cellData int MainForm::numVendors; int MainForm::maxVendorRecL; long MainForm::runStartTime; long MainForm::now; // absolute time of the block int MainForm::logDataState; long MainForm::blockSampleTime; // time of the block relative to runStartTime bool MainForm::firstScan; // do we need to get sudo privileges? wlPrivacy MainForm::currentPrivacy; string MainForm::wlPrivacies[3] { "none", "WEP", "WPA2" }; string MainForm::wlCiphers[3] { "unknown", "TKIP", "AES" }; string MainForm::chan24Freq[15] { "0.000","2.412","2.417","2.422","2.427", "2.432","2.437","2.442","2.447","2.452", "2.457","2.462","2.467","2.472","2.484" }; string MainForm::chan50Freq[42][2] { {"7","5.035"},{"8","5.040"},{"9","5.045"}, {"11","5.055"},{"12","5.060"},{"16","5.080"}, {"34","5.170"},{"36","5.180"},{"38","5.190"}, {"40","5.200"},{"42","5.210"},{"44","5.220"}, {"46","5.230"},{"48","5.240"},{"52","5.260"}, {"56","5.280"},{"60","5.300"},{"64","5.320"}, {"100","5.500"},{"104","5.520"},{"108","5.540"}, {"112","5.560"},{"116","5.580"},{"120","5.600"}, {"124","5.620"},{"128","5.640"},{"132","5.660"}, {"136","5.680"},{"140","5.700"},{"149","5.745"}, {"153","5.765"},{"157","5.785"},{"161","5.805"}, {"165","5.825"},{"183","4.915"},{"184","4.920"}, {"185","4.925"},{"187","4.935"},{"188","4.940"}, {"189","4.945"},{"192","4.960"},{"196","4.980"} }; QColor MainForm::qColorArray[NUMBER_OF_COLORS] { Qt::red, Qt::green, Qt::blue, Qt::darkRed, Qt::darkGreen, Qt::darkBlue, Qt::cyan, Qt::magenta, Qt::gray, Qt::darkCyan, Qt::darkMagenta, Qt::darkYellow, Qt::darkGray }; QAction* MainForm::colToQAction[MAX_TABLE_COLS]; int MainForm::columnWidth[MAX_TABLE_COLS]; // since Qt doesn't see fit to remember for us... QwtPlotGrid* MainForm::chan24Grid; QwtPlotGrid* MainForm::chan5Grid; QwtPlotGrid* MainForm::timeGrid; prefsDialog* MainForm::prefsDlg1; MainForm::sDefPref MainForm::defPref = {// default prefs defined here /* version */ LINSSIDPREFSVER, /* colwidth */ {100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}, /* colvis */ {1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, /* visorder */ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}, /* sort */ { 18, 1}, /* maingeom */ {389, 83, 721, 542}, ///* mainsplit*/ {154, 223}, /* plottab */ 0, /* naptime */ 2, /* plotprefs*/ {-100, -20, 1}, /* logdata */ 0 }; MainForm::MainForm() { MainForm::mainFormWidget.setupUi(this); connect(MainForm::mainFormWidget.runBtn, SIGNAL(clicked()), this, SLOT(doRun())); connect(MainForm::mainFormWidget.allBtn, SIGNAL(clicked()), this, SLOT(doPlotAll())); connect(MainForm::mainFormWidget.noneBtn, SIGNAL(clicked()), this, SLOT(doPlotNone())); connect(MainForm::mainFormWidget.mainTableWidget, SIGNAL(cellChanged(int,int)), this,SLOT(doTableChanged(int,int))); connect(MainForm::mainFormWidget.actionSSID, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionMAC, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionChannel, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionMode, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionProtocol, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionSecurity, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionPrivacy, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionCipher, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionFrequency, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionQuality, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionSignal, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionNoise, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionMin_Signal, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionMax_Signal, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionMbps, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionFirst_Seen, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionLast_Seen, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionVendor, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionType, SIGNAL(changed()), this, SLOT(reDrawTable())); connect(MainForm::mainFormWidget.actionAbout, SIGNAL(triggered()), this, SLOT(showAboutBox())); connect(MainForm::mainFormWidget.actionPrefs, SIGNAL(triggered()), this, SLOT(showPrefsDlg())); connect(MainForm::mainFormWidget.mainTableWidget->horizontalHeader(), SIGNAL(sectionResized(int, int, int)), this, SLOT(columnWidthSave(int, int, int))); MainForm::cellDataRay.reserve(15); // expect about 15 cells to be found. More or less is OK. lastBlockRequested = 0; // these global variables should be made protected lastBlockReceived = 0; startTime = QDateTime::currentMSecsSinceEpoch(); MainForm::firstScan = true; } MainForm::~MainForm() { MainForm::pGetter->quit(); } void MainForm::init() { srand(time(NULL)); //initialize the random number generator seed MainForm::getUserID(); // will exit here if needed and can't get MainForm::addInterfaces(); // find the wifi interface names and add them to the comboBox MainForm::setInterface(0); // set the interface select arbitrarily to 0 MainForm::maxTableIndex = -1; MainForm::drawTable(); MainForm::initPlotGrids(); // must do before reading prefs, since prefs will modify MainForm::initColtoAction(); // init pointers to view menu items MainForm::readPrefsFile(); MainForm::drawTable(); // do it again after application of prefs MainForm::drawChan24Plot(); MainForm::drawChan5Plot(); MainForm::drawTimePlot(); MainForm::loadVendorDb(); // do last 'cause it takes some time } // saving as comments in case ever need it again... // reimplemented from QApplication so we can throw exceptions in slots //virtual bool notify(QObject * receiver, QEvent * event) { // try { // return QApplication::notify(receiver, event); // } catch (std::exception& e) { // qCritical() << "Exception thrown:" << e.what(); // linssidLog << "Exception caught by notify: " << e.what() << endl; // } // return false; //} void MainForm::initColtoAction() { // brutal -- set the array of pointers from columns to their menu items // these should have the same elements as the enum in 'custom.h' // PLOT, SSID, MAC, CHANNEL, MODE, SECURITY, PRIVACY, // CIPHER, FREQUENCY, QUALITY, SIGNAL, NOISE, MINSIGNAL, MAXSIGNAL, MBPS, // FIRST_SEEN, LAST_SEEN, VENDOR, PROTOCOL MainForm::colToQAction[PLOT] = MainForm::mainFormWidget.actionPlot; MainForm::colToQAction[SSID] = MainForm::mainFormWidget.actionSSID; MainForm::colToQAction[MAC] = MainForm::mainFormWidget.actionMAC; MainForm::colToQAction[CHANNEL] = MainForm::mainFormWidget.actionChannel; MainForm::colToQAction[MODE] = MainForm::mainFormWidget.actionMode; MainForm::colToQAction[PROTOCOL] = MainForm::mainFormWidget.actionProtocol; MainForm::colToQAction[SECURITY] = MainForm::mainFormWidget.actionSecurity; MainForm::colToQAction[PRIVACY] = MainForm::mainFormWidget.actionPrivacy; MainForm::colToQAction[CIPHER] = MainForm::mainFormWidget.actionCipher; MainForm::colToQAction[FREQUENCY] = MainForm::mainFormWidget.actionFrequency; MainForm::colToQAction[QUALITY] = MainForm::mainFormWidget.actionQuality; MainForm::colToQAction[SIGNAL] = MainForm::mainFormWidget.actionSignal; MainForm::colToQAction[NOISE] = MainForm::mainFormWidget.actionNoise; MainForm::colToQAction[MINSIGNAL] = MainForm::mainFormWidget.actionMin_Signal; MainForm::colToQAction[MAXSIGNAL] = MainForm::mainFormWidget.actionMax_Signal; MainForm::colToQAction[MBPS] = MainForm::mainFormWidget.actionMbps; MainForm::colToQAction[FIRST_SEEN] = MainForm::mainFormWidget.actionFirst_Seen; MainForm::colToQAction[LAST_SEEN] = MainForm::mainFormWidget.actionLast_Seen; MainForm::colToQAction[VENDOR] = MainForm::mainFormWidget.actionVendor; } void MainForm::initPlotGrids() { // add some grids to our plots MainForm::chan24Grid = new QwtPlotGrid(); MainForm::chan24Grid->enableX(false); MainForm::chan24Grid->attach(MainForm::mainFormWidget.chan24Plot); MainForm::chan5Grid = new QwtPlotGrid(); MainForm::chan5Grid->enableX(false); MainForm::chan5Grid->attach(MainForm::mainFormWidget.chan5Plot); MainForm::timeGrid = new QwtPlotGrid(); MainForm::timeGrid->enableX(false); MainForm::timeGrid->attach(MainForm::mainFormWidget.timePlot); } void MainForm::loadVendorDb() { // now deal with the vendor data array // first record is number of vendors then max record length ifstream vendorFile; vendorFile.open(VENDOR_FILE_NAME, ios::in); vendorFile >> MainForm::numVendors >> MainForm::maxVendorRecL; string tempString; // load vendor array with ID and name MainForm::vendor = new MainForm::vendorStruct[MainForm::numVendors]; int vRecNo = 0; istringstream tempStream; getline(vendorFile, tempString); // clear the end of line above while (getline(vendorFile, tempString)) { tempStream.str(tempString.substr(0, 6)); tempStream.clear(); tempStream >> hex >> MainForm::vendor[vRecNo].ID; MainForm::vendor[vRecNo].name = tempString.substr(6); vRecNo++; } vendorFile.close(); } string MainForm::findVendor(string MACaddr) { int left = 0; int right = MainForm::numVendors - 1; int mid; istringstream convert(MACaddr.substr(0, 2) + MACaddr.substr(3, 2) + MACaddr.substr(6, 2)); unsigned int key; convert >> hex >> key; while (left <= right) { mid = (int) ((left + right) / 2); if (key == MainForm::vendor[mid].ID) { return MainForm::vendor[mid].name; } else if (key > MainForm::vendor[mid].ID) left = mid + 1; else right = mid - 1; } return ""; } void MainForm::getUserID() { // must get userid to get full interface scan if (geteuid() == 0) { pwStatus = NOTNEEDED; // must be running as root or with root privilege } else { passBox pwDialog1; for (int pwTry = 0; pwTry < 3; pwTry++) { if (pwTry == 0) pwDialog1.setPassPrompt("First shot:"); else if (pwTry == 1) pwDialog1.setPassPrompt("Second try:"); else pwDialog1.setPassPrompt("Last chance!"); // pwDialog1.show(); pwDialog1.exec(); if (pwStatus == CANCELLED) { MainForm::mainFormWidget.runBtn->setChecked(false); //return; break; } if (pwStatus == GOOD) break; } if (pwStatus == BAD || pwStatus == CANCELLED) { MainForm::mainFormWidget.runBtn->setChecked(false); QMessageBox::warning(0, "password fail", "Unable to verify password"); exit(1); } } } void MainForm::addInterfaces() { string somePipeName = genPipeName(10); string eof = "###EOF###"; mkfifo(somePipeName.c_str(), 0666); static fstream ifs(somePipeName); string commandLine = "iw dev >> " + somePipeName; if (pwStatus == GOOD) { commandLine = "echo \'" + password + "\' | sudo -kS -p \"\" " + commandLine; // cout << commandLine + "\n"; } if (system(commandLine.c_str()) == 0) { commandLine = "echo \'" + eof + "\' >> " + somePipeName; waste(system(commandLine.c_str())); string interfaceLine; mainFormWidget.interfaceCbx->clear(); boost::smatch sm; boost::regex rx("^[ \\t]+Interface +([^ ]+) *"); while (getline(ifs, interfaceLine) && interfaceLine != eof) { // cout << interfaceLine + "\n"; if (boost::regex_match(interfaceLine, sm, rx)) mainFormWidget.interfaceCbx->addItem(QString::fromStdString(sm[1])); } } else { QMessageBox::critical(0, "Bad Stuff", QString("Unable to continue.\nCannot find interface pipe")); ifs.close(); remove(somePipeName.c_str()); exit(1); } // // Now repeat the whole mess because linux wifi drivers can't decide where to announce themselves // commandLine = "cat /proc/net/wireless >> " + somePipeName; if (pwStatus == GOOD) { commandLine = "echo \'" + password + "\' | sudo -kS -p \"\" " + commandLine; // cout << commandLine + "\n"; } if (system(commandLine.c_str()) == 0) { commandLine = "echo \'" + eof + "\' >> " + somePipeName; waste(system(commandLine.c_str())); string interfaceLine; QString interface; boost::smatch sm2; boost::regex rx2("^ *([0-9A-Za-z_-]+) *:.+"); while (getline(ifs, interfaceLine) && interfaceLine != eof) { // cout << interfaceLine + "\n"; if (boost::regex_match(interfaceLine, sm2, rx2)) { interface = QString::fromStdString(sm2[1]); bool found = false; for (int i = 0; i < mainFormWidget.interfaceCbx->count(); i++) { if (interface == mainFormWidget.interfaceCbx->itemText(i)) { found = true; break; } } if (!found) mainFormWidget.interfaceCbx->addItem(interface); } } if (mainFormWidget.interfaceCbx->count() <= 0) { QMessageBox::critical(0, "Bad Stuff", QString("Unable to continue.\nNo wireless interfaces found")); exit(1); } } else { QMessageBox::critical(0, "Bad Stuff", QString("Unable to continue.\nCannot find interface pipe")); ifs.close(); remove(somePipeName.c_str()); exit(1); } ifs.close(); remove(somePipeName.c_str()); } void MainForm::setInterface(int ifIndx) { MainForm::mainFormWidget.interfaceCbx->setCurrentIndex(ifIndx); } string MainForm::getCurrentInterface() { return ((mainFormWidget.interfaceCbx->currentText()).toStdString()); } // Define the custom event identifier const QEvent::Type MainForm::DATA_READY_EVENT = static_cast (DATAREADY); // Define the custom event subclass class MainForm::DataReadyEvent : public QEvent { public: DataReadyEvent(const int customData1) : QEvent(MainForm::DATA_READY_EVENT), readyBlockNo(customData1) { } int getReadyBlockNo() const { return readyBlockNo; } private: int readyBlockNo; }; int MainForm::getNapTime() { return MainForm::mainFormWidget.napTimeSlider->value(); } void MainForm::updatePlotPrefs(int plotMin, int plotMax, bool showGrid) { // a slot called from the prefs dialog to dynamically update the plots MainForm::mainFormWidget.timePlot->setAxisScale(QwtPlot::yLeft, plotMin, plotMax, 20); MainForm::mainFormWidget.chan24Plot->setAxisScale(QwtPlot::yLeft, plotMin, plotMax, 20); MainForm::mainFormWidget.chan5Plot->setAxisScale(QwtPlot::yLeft, plotMin, plotMax, 20); MainForm::timeGrid->enableY(showGrid); MainForm::chan24Grid->enableY(showGrid); MainForm::chan5Grid->enableY(showGrid); MainForm::mainFormWidget.timePlot->replot(); MainForm::mainFormWidget.chan24Plot->replot(); MainForm::mainFormWidget.chan5Plot->replot(); } void MainForm::logPrefChanged(int state) { MainForm::logDataState = state; } void MainForm::writePrefsFile() { struct passwd *pw = getpwuid(getuid()); const char *homeDir = pw->pw_dir; ofstream prefs; prefs.open(string(homeDir) + "/" + string(PREFS_FILE_NAME), ios::out); prefs << "version " << LINSSIDPREFSVER << endl; // col number must match the enum in "custom.h" prefs << "colwidth"; for (int col = 0; col < MAX_TABLE_COLS; col++) { int colWidth = mainFormWidget.mainTableWidget->columnWidth(col); if (colWidth == 0) colWidth = columnWidth[col]; prefs << " " << colWidth; } prefs << endl; prefs << "colvis"; for (int col = 0; col < MAX_TABLE_COLS; col++) prefs << " " << !mainFormWidget.mainTableWidget->isColumnHidden(col); prefs << endl; prefs << "visorder"; for (int visCol = 0; visCol < MAX_TABLE_COLS; visCol++) prefs << " " << mainFormWidget.mainTableWidget->horizontalHeader()->logicalIndex(visCol); prefs << endl; prefs << "sort " << MainForm::mainFormWidget.mainTableWidget->horizontalHeader()->sortIndicatorSection() << " " << MainForm::mainFormWidget.mainTableWidget->horizontalHeader()->sortIndicatorOrder() << endl; prefs << "maingeom " << this->x() << " " << this->y() << " " << this->width() << " " << this->height() << endl; prefs << "mainsplit " << MainForm::mainFormWidget.splitter->sizes().value(0) << " " << MainForm::mainFormWidget.splitter->sizes().value(1) << endl; prefs << "plottab " << MainForm::mainFormWidget.mainTabWgt->currentIndex() << endl; prefs << "naptime " << MainForm::mainFormWidget.napTimeSlider->value() << endl; prefs << "plotprefs " << int(MainForm::mainFormWidget.timePlot->axisScaleDiv(QwtPlot::yLeft).lowerBound()) << " " << int(MainForm::mainFormWidget.timePlot->axisScaleDiv(QwtPlot::yLeft).upperBound()) << " " << MainForm::timeGrid->yEnabled() << endl; prefs << "logdata " << MainForm::logDataState << endl; prefs.close(); } void MainForm::writePrefsBlock(string absPrefsFileName, MainForm::sDefPref prefBlock) { // Writes a block of preferences of the structure sDefPref struct. // At entry, the file must either not exist or be closed. // At exit, the newly written file will be closed. fstream prefs; prefs.open(absPrefsFileName, ios::out); prefs << "version " << LINSSIDPREFSVER << endl; prefs << "colwidth"; for (int i = 0; i < MAX_TABLE_COLS; i++) prefs << " " << prefBlock.colwidth[i]; prefs << endl; prefs << "colvis"; for (int i = 0; i < MAX_TABLE_COLS; i++) prefs << " " << prefBlock.colvis[i]; prefs << endl; prefs << "visorder"; for (int i = 0; i < MAX_TABLE_COLS; i++) prefs << " " << prefBlock.visorder[i]; prefs << endl; prefs << "sort " << prefBlock.sort.column << " " << prefBlock.sort.order << endl; prefs << "maingeom " << prefBlock.maingeom.x << " " << prefBlock.maingeom.y << " " << prefBlock.maingeom.width << " " << prefBlock.maingeom.height << endl; prefs << "mainsplit " << prefBlock.mainsplit.topheight << " " << prefBlock.mainsplit.bottomheight << endl; prefs << "plottab " << prefBlock.plottab << endl; prefs << "naptime " << prefBlock.naptime << endl; prefs << "plotprefs " << prefBlock.plotprefs.plotlb << " " << prefBlock.plotprefs.plutub << " " << prefBlock.plotprefs.showgrid << endl; prefs << "logdata " << prefBlock.logData << endl; prefs.close(); } void MainForm::readPrefsFile() { struct passwd *pw = getpwuid(getuid()); const char *homeDir = pw->pw_dir; string absPrefsFileName = string(homeDir) + "/" + string(PREFS_FILE_NAME); fstream prefs; prefs.open(absPrefsFileName, ios::in); if (!prefs.is_open()) { // no prefs file, so create new with default values writePrefsBlock(absPrefsFileName, MainForm::defPref); prefs.open(absPrefsFileName, ios::in); } // make sure right version string line, tag, vers; istringstream lineParse; while (getline(prefs, line)) { lineParse.str(line); lineParse.clear(); lineParse >> tag; if (tag == "version") { lineParse >> vers; break; } } if (vers != LINSSIDPREFSVER) { // old version so trash and replace with defaults prefs.close(); writePrefsBlock(absPrefsFileName, MainForm::defPref); prefs.open(absPrefsFileName, ios::in); } // have a prefs file so parse prefs.seekg(0); prefs.clear(); int colWidth, sortCol, sortDir; int x, y, winWidth, winHeight; int tab, splitHeight0, splitHeight1; int napTime; bool vis; sortCol = -1; int visOrder[MAX_TABLE_COLS]; // holds mapping from logical to visual as they change for (int lcol = 0; lcol < MAX_TABLE_COLS; lcol++) visOrder[lcol] = lcol; while (getline(prefs, line)) { lineParse.str(line); lineParse.clear(); lineParse >> tag; if (tag == "colwidth") { for (int col = 0; col < MAX_TABLE_COLS; col++) { lineParse >> colWidth; if (colWidth > 0) { MainForm::mainFormWidget.mainTableWidget->setColumnWidth(col, colWidth); columnWidth[col] = colWidth; } } } else if (tag == "colvis") { for (int col = 0; col < MAX_TABLE_COLS; col++) { lineParse >> vis; MainForm::colToQAction[col]->setChecked(vis); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(col, !vis); } } else if (tag == "sort") { lineParse >> sortCol >> sortDir; if (sortCol >= 0 && sortCol < MAX_TABLE_COLS) { MainForm::mainFormWidget.mainTableWidget->horizontalHeader() ->setSortIndicator(sortCol, Qt::SortOrder(sortDir)); } } else if (tag == "maingeom") { lineParse >> x >> y >> winWidth >> winHeight; this->setGeometry(x, y, winWidth, winHeight); } else if (tag == "visorder") { for (int i = 0; i < MAX_TABLE_COLS; i++) lineParse >> visOrder[i]; for (int i = 0; i < MAX_TABLE_COLS - 1; i++) { // loop through visual order if (visOrder[i] != mainFormWidget.mainTableWidget->horizontalHeader()->logicalIndex(i)) { // find the index of the visual column that has the desired logical column for (int j = i + 1; j < MAX_TABLE_COLS; j++) { // and swap if (visOrder[i] == mainFormWidget.mainTableWidget->horizontalHeader()->logicalIndex(j)) { mainFormWidget.mainTableWidget->horizontalHeader()->swapSections(i, j); break; } } } } } else if (tag == "plottab") { lineParse >> tab; MainForm::mainFormWidget.mainTabWgt->setCurrentIndex(tab); } else if (tag == "mainsplit") { lineParse >> splitHeight0 >> splitHeight1; QList bullshit; // Nokia didn't have to rewrite the entire c++ syntax bullshit << splitHeight0 << splitHeight1; MainForm::mainFormWidget.splitter->setSizes(bullshit); } else if (tag == "naptime") { lineParse >> napTime; MainForm::mainFormWidget.napTimeSlider->setValue(napTime); } else if (tag == "plotprefs") { int plotLb, plotUb; bool showGrid; lineParse >> plotLb >> plotUb >> showGrid; // validate or the mess gets big if ((plotLb < -100) || (plotUb > 0) || (plotUb < (plotLb + 10))) { // prefs were hosed plotLb = -100; plotUb = -20; // so reset them to nominal values } MainForm::mainFormWidget.timePlot->setAxisScale(QwtPlot::yLeft, plotLb, plotUb, 20); MainForm::mainFormWidget.chan24Plot->setAxisScale(QwtPlot::yLeft, plotLb, plotUb, 20); MainForm::mainFormWidget.chan5Plot->setAxisScale(QwtPlot::yLeft, plotLb, plotUb, 20); MainForm::timeGrid->enableY(showGrid); MainForm::chan24Grid->enableY(showGrid); MainForm::chan5Grid->enableY(showGrid); } else if (tag == "logdata") { lineParse >> MainForm::logDataState; } } prefs.close(); } void MainForm::postDataReadyEvent(const int customData1) { // This method (postDataReadyEvent) can be called from any thread QApplication::postEvent(this, new DataReadyEvent(customData1)); } void MainForm::doRun() { if (MainForm::mainFormWidget.runBtn->isChecked()) { if (firstScan) { firstScan = false; MainForm::runStartTime = time(NULL); } MainForm::mainFormWidget.statusTxt->setText("Scanning ..."); MainForm::pGetter->Getter::postDataWantedEvent(++lastBlockRequested); MainForm::drawTable(); MainForm::drawChan24Plot(); MainForm::drawChan5Plot(); MainForm::drawTimePlot(); } else { MainForm::mainFormWidget.statusTxt->setText("Waiting for wifi to terminate scan ..."); } } void MainForm::doPlotAll() { for (int tbi = 0; tbi <= maxTableIndex; tbi++) { MainForm::cellDataRay[tbi].pTableItem[PLOT]->setCheckState(Qt::Checked); } fillPlots(); } void MainForm::doPlotNone() { for (int tbi = 0; tbi <= maxTableIndex; tbi++) { MainForm::cellDataRay[tbi].pTableItem[PLOT]->setCheckState(Qt::Unchecked); } fillPlots(); } void MainForm::doTableChanged(int row, int column) { if (column == PLOT) { waste(row); fillPlots(); } } void MainForm::reDrawTable() { MainForm::drawTable(); MainForm::fillTable(); } void MainForm::showAboutBox() { AboutBox aboutBox1; // aboutBox1.show(); aboutBox1.exec(); // aboutBox1.raise(); } void MainForm::showPrefsDlg() { if (MainForm::prefsDlg1 != 0) return; // already a prefs dialog open somewhere... MainForm::prefsDlg1 = new prefsDialog( int(MainForm::mainFormWidget.timePlot->axisScaleDiv(QwtPlot::yLeft).lowerBound()), int(MainForm::mainFormWidget.timePlot->axisScaleDiv(QwtPlot::yLeft).upperBound()), MainForm::timeGrid->yEnabled(), MainForm::logDataState, (QObject*)this); // MainForm::prefsDlg1->show(); MainForm::prefsDlg1->exec(); // MainForm::prefsDlg1->raise(); delete MainForm::prefsDlg1; // release the heap MainForm::prefsDlg1 = 0; // null pointer } void MainForm::columnWidthSave(int col, int oldWidth, int newWidth) { if (newWidth > 0) MainForm::columnWidth[col] = newWidth; else if (oldWidth > 0) MainForm::columnWidth[col] = oldWidth; } void MainForm::customEvent(QEvent * event) { // When we get here, we've crossed the thread boundary and are now // executing in the Qt object's thread if (event->type() == MainForm::DATA_READY_EVENT) { handleDataReadyEvent(static_cast (event)); } // use more else ifs to handle other custom events } void MainForm::closeEvent(QCloseEvent * event) { // cout << "closeEvent intercepted..." << endl; closing = true; // don't let Getter take a nap MainForm::mainFormWidget.statusTxt->setText("Exiting, waiting for wifi driver ..."); MainForm::mainFormWidget.statusTxt->repaint(); pGetterThread->QThread::quit(); writePrefsFile(); pGetterThread->QThread::wait(); MainForm::mainFormWidget.statusTxt->setText("Closing ..."); MainForm::mainFormWidget.statusTxt->repaint(); remove(pipeName.c_str()); linssidLog.close(); if (MainForm::logDataStream.is_open()) MainForm::logDataStream.close(); // QMainWindow::closeEvent(event); event->accept(); std::exit(0); // that's the system exit, not the Qt version } void MainForm::drawTable() { // QMessageBox::information(0, "checkpoint", "entered drawTable"); MainForm::mainFormWidget.mainTableWidget->setColumnCount(MAX_TABLE_COLS); MainForm::mainFormWidget.mainTableWidget->setRowCount(MainForm::maxTableIndex + 1); // Make sure the column labels below are same order as the enum /* enum colTitle { PLOT, SSID, MAC, CHANNEL, MODE, SECURITY, PRIVACY, CIPHER, FREQUENCY, QUALITY, SIGNAL, NOISE, MINSIGNAL, MAXSIGNAL, MBPS, FIRST_SEEN, LAST_SEEN, VENDOR, PROTOCOL // TYPE not yet impl }; */ MainForm::mainFormWidget.mainTableWidget->setHorizontalHeaderLabels( QString("Plot|SSID|MAC|Channel|Mode|Security|Privacy|Cipher|Frequency\ |Quality|Signal|Noise|Min Sig|Max Sig|Mbps|First Seen|Last Seen|Vendor|Protocol|Type").split("|")); setVisibleCols(); MainForm::mainFormWidget.mainTableWidget->horizontalHeader()->setSectionsMovable(true); MainForm::mainFormWidget.mainTableWidget->horizontalHeader() ->setToolTip("Click to sort\nDrag and Drop to re-order\nClick and drag divider to fit"); MainForm::mainFormWidget.mainTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); } void MainForm::setVisibleCols() { // the Plot column is always visible MainForm::mainFormWidget.mainTableWidget->setColumnHidden(SSID, !(MainForm::mainFormWidget.actionSSID->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(MAC, !(MainForm::mainFormWidget.actionMAC->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(CHANNEL, !(MainForm::mainFormWidget.actionChannel->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(MODE, !(MainForm::mainFormWidget.actionMode->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(PROTOCOL, !(MainForm::mainFormWidget.actionProtocol->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(SECURITY, !(MainForm::mainFormWidget.actionSecurity->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(PRIVACY, !(MainForm::mainFormWidget.actionPrivacy->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(CIPHER, !(MainForm::mainFormWidget.actionCipher->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(FREQUENCY, !(MainForm::mainFormWidget.actionFrequency->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(QUALITY, !(MainForm::mainFormWidget.actionQuality->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(SIGNAL, !(MainForm::mainFormWidget.actionSignal->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(NOISE, !(MainForm::mainFormWidget.actionNoise->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(MINSIGNAL, !(MainForm::mainFormWidget.actionMin_Signal->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(MAXSIGNAL, !(MainForm::mainFormWidget.actionMax_Signal->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(MBPS, !(MainForm::mainFormWidget.actionMbps->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(FIRST_SEEN, !(MainForm::mainFormWidget.actionFirst_Seen->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(LAST_SEEN, !(MainForm::mainFormWidget.actionLast_Seen->isChecked())); MainForm::mainFormWidget.mainTableWidget->setColumnHidden(VENDOR, !(MainForm::mainFormWidget.actionVendor->isChecked())); } void MainForm::fillTable() { // fill in the x-y, also set each cell text alignment MainForm::mainFormWidget.mainTableWidget->setRowCount(maxTableIndex + 1); for (int row = 0; row <= maxTableIndex; row++) { MainForm::cellDataRay[row].pTableItem[PLOT]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[SSID]-> setText(MainForm::cellDataRay[row].essid.c_str()); MainForm::cellDataRay[row].pTableItem[MAC]-> setText(MainForm::cellDataRay[row].macAddr.c_str()); MainForm::cellDataRay[row].pTableItem[MAC]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[CHANNEL]-> setData(Qt::DisplayRole, MainForm::cellDataRay[row].channel); MainForm::cellDataRay[row].pTableItem[CHANNEL]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[MODE]-> setText(MainForm::cellDataRay[row].mode.c_str()); MainForm::cellDataRay[row].pTableItem[MODE]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[PROTOCOL]-> setText(MainForm::cellDataRay[row].protocol.c_str()); MainForm::cellDataRay[row].pTableItem[PROTOCOL]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[SECURITY]-> setText(MainForm::cellDataRay[row].security.c_str()); MainForm::cellDataRay[row].pTableItem[SECURITY]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[PRIVACY]-> setText((MainForm::wlPrivacies[MainForm::cellDataRay[row].privacy]).c_str()); MainForm::cellDataRay[row].pTableItem[PRIVACY]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[CIPHER]-> setText((MainForm::wlCiphers[MainForm::cellDataRay[row].cipher]).c_str()); MainForm::cellDataRay[row].pTableItem[CIPHER]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[FREQUENCY]-> setText(MainForm::cellDataRay[row].frequency.c_str()); MainForm::cellDataRay[row].pTableItem[FREQUENCY]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[QUALITY]-> setData(Qt::DisplayRole, MainForm::cellDataRay[row].quality); MainForm::cellDataRay[row].pTableItem[QUALITY]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[SIGNAL]-> setData(Qt::DisplayRole, MainForm::cellDataRay[row].signal); MainForm::cellDataRay[row].pTableItem[SIGNAL]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[NOISE]-> setData(Qt::DisplayRole, MainForm::cellDataRay[row].noise); MainForm::cellDataRay[row].pTableItem[NOISE]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[MINSIGNAL]-> setData(Qt::DisplayRole, MainForm::cellDataRay[row].minSignal); MainForm::cellDataRay[row].pTableItem[MINSIGNAL]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[MAXSIGNAL]-> setData(Qt::DisplayRole, MainForm::cellDataRay[row].maxSignal); MainForm::cellDataRay[row].pTableItem[MAXSIGNAL]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[MBPS]-> setData(Qt::DisplayRole, MainForm::cellDataRay[row].mbps); MainForm::cellDataRay[row].pTableItem[MBPS]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[FIRST_SEEN]-> setText(QDateTime::fromTime_t(MainForm::cellDataRay[row].firstSeen).toString("MM/dd-hh:mm:ss")); MainForm::cellDataRay[row].pTableItem[FIRST_SEEN]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[LAST_SEEN]-> setText(QDateTime::fromTime_t(MainForm::cellDataRay[row].lastSeen).toString("MM/dd-hh:mm:ss")); MainForm::cellDataRay[row].pTableItem[LAST_SEEN]->setTextAlignment(Qt::AlignHCenter); MainForm::cellDataRay[row].pTableItem[VENDOR]-> setText(MainForm::cellDataRay[row].vendor.c_str()); } setVisibleCols(); MainForm::mainFormWidget.mainTableWidget->setSortingEnabled(true); } class MainForm::Chan24ScaleDraw : public QwtScaleDraw { public: Chan24ScaleDraw() { } virtual QwtText label(double v) const { if (v >= 1 && v <= 14) return (QString::number(int(v))); else return (QString("")); } }; class MainForm::Chan5ScaleDraw : public QwtScaleDraw { public: Chan5ScaleDraw() { } virtual QwtText label(double v) const { if ((v >= 1.0) && (v <= 160.0) && (int(v) % 10 == 0)) return (QString::number(int(v))); else return (QString("")); } }; void MainForm::drawChan24Plot() { MainForm::mainFormWidget.chan24Plot->setAxisScale(QwtPlot::xBottom, -1, 16, 1); MainForm::mainFormWidget.chan24Plot->setAxisMaxMinor(QwtPlot::xBottom, 0); MainForm::mainFormWidget.chan24Plot->setAxisScaleDraw(QwtPlot::xBottom, new Chan24ScaleDraw()); // MainForm::mainFormWidget.chan24Plot->setAxisScale(QwtPlot::yLeft, -100, -20, 20); MainForm::mainFormWidget.chan24Plot->replot(); } void MainForm::drawChan5Plot() { MainForm::mainFormWidget.chan5Plot->setAxisScale(QwtPlot::xBottom, 0, 170, 10); MainForm::mainFormWidget.chan5Plot->setAxisMaxMinor(QwtPlot::xBottom, 5); MainForm::mainFormWidget.chan5Plot->setAxisScaleDraw(QwtPlot::xBottom, new Chan5ScaleDraw()); // MainForm::mainFormWidget.chan5Plot->setAxisScale(QwtPlot::yLeft, -100, -20, 20); MainForm::mainFormWidget.chan5Plot->replot(); } void MainForm::drawTimePlot() { MainForm::mainFormWidget.timePlot->setAxisScale(QwtPlot::xBottom, MainForm::blockSampleTime - TIME_PLOT_SCALE, MainForm::blockSampleTime, 10); MainForm::mainFormWidget.timePlot->setAxisMaxMinor(QwtPlot::xBottom, 5); // MainForm::mainFormWidget.timePlot->setAxisScale(QwtPlot::yLeft, -100, -20, 20); MainForm::mainFormWidget.timePlot->replot(); } void MainForm::fillPlots() { // rescale the time plot MainForm::mainFormWidget.timePlot->setAxisScale(QwtPlot::xBottom, MainForm::blockSampleTime - TIME_PLOT_SCALE, MainForm::blockSampleTime, 10); for (int tbi = 0; tbi <= maxTableIndex; tbi++) { // first the 2.5GHz and 5GHz channel vs signal plots MainForm::cellDataRay[tbi].xPlot[0] = MainForm::cellDataRay[tbi].channel - 2.0; MainForm::cellDataRay[tbi].xPlot[1] = MainForm::cellDataRay[tbi].channel - 1.0; MainForm::cellDataRay[tbi].xPlot[2] = MainForm::cellDataRay[tbi].channel + 1.0; MainForm::cellDataRay[tbi].xPlot[3] = MainForm::cellDataRay[tbi].channel + 2.0; MainForm::cellDataRay[tbi].yPlot[0] = MainForm::cellDataRay[tbi].yPlot[3] = -100.0; MainForm::cellDataRay[tbi].yPlot[1] = MainForm::cellDataRay[tbi].yPlot[2] = MainForm::cellDataRay[tbi].signal; if (MainForm::cellDataRay[tbi].pTableItem[PLOT]->checkState() == Qt::Checked) { MainForm::cellDataRay[tbi].pBandCurve->setRawSamples(MainForm::cellDataRay[tbi].xPlot, MainForm::cellDataRay[tbi].yPlot, 4); } else { MainForm::cellDataRay[tbi].pBandCurve->setSamples(0, 0, 0); } // now the signal history plot int ixStart; int ixLength; int numSamples = MainForm::cellDataRay[tbi].pHistory->totalSamples; if (numSamples < MAX_SAMPLES) { ixLength = numSamples; ixStart = 0; } else { ixLength = MAX_SAMPLES; ixStart = numSamples % MAX_SAMPLES; } if (MainForm::cellDataRay[tbi].pTableItem[PLOT]->checkState() == Qt::Checked) { MainForm::cellDataRay[tbi].pTimeCurve->setRawSamples( &(MainForm::cellDataRay[tbi].pHistory->sampleSec[ixStart]), &(MainForm::cellDataRay[tbi].pHistory->signal[ixStart]), ixLength); } else { MainForm::cellDataRay[tbi].pTimeCurve->setSamples(0, 0, 0); } } MainForm::mainFormWidget.chan24Plot->replot(); MainForm::mainFormWidget.chan5Plot->replot(); MainForm::mainFormWidget.timePlot->replot(); } void MainForm::initNewCell(string macAddress, int tbi) { // Initialize a newly found cell. MainForm::cellData* emptyStruct; // C++ is really stupid emptyStruct = new MainForm::cellData(); // unintuitive as heck MainForm::cellDataRay.push_back(*emptyStruct); // This is the only way delete emptyStruct; // to create a new initialized element MainForm::cellDataRay[tbi].macAddr = macAddress; // insert MAC address MainForm::cellDataRay[tbi].minSignal = 0; MainForm::cellDataRay[tbi].maxSignal = -120; MainForm::cellDataRay[tbi].firstSeen = now; MainForm::cellDataRay[tbi].protocol = "unknown"; MainForm::cellDataRay[tbi].vendor = MainForm::findVendor(macAddress); MainForm::cellDataRay[tbi].pHistory = new History(); // give it a history MainForm::cellDataRay[tbi].pTimeCurve = new QwtPlotCurve(""); // and a history curve QColor tempColor = qColorArray[tbi % NUMBER_OF_COLORS]; MainForm::cellDataRay[tbi].color = tempColor; // assign a color from the palette MainForm::cellDataRay[tbi].pTimeCurve->setPen(* new QPen(tempColor, 3.0)); MainForm::cellDataRay[tbi].pTimeCurve->setRenderHint(QwtPlotItem::RenderAntialiased); MainForm::cellDataRay[tbi].pTimeCurve->attach(MainForm::mainFormWidget.timePlot); MainForm::mainFormWidget.mainTableWidget->setRowCount(tbi + 1); for (int ix = 0; ix < MAX_TABLE_COLS; ix++) { MainForm::cellDataRay[tbi].pTableItem[ix] = new QTableWidgetItem(); // Give it a table item for each column MainForm::mainFormWidget.mainTableWidget->setItem(tbi, ix, MainForm::cellDataRay[tbi].pTableItem[ix]); // Give it a spot in the table } MainForm::cellDataRay[tbi].pTableItem[PLOT]->setFlags( Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsEditable); MainForm::cellDataRay[tbi].pTableItem[PLOT]->setCheckState(Qt::Checked); MainForm::cellDataRay[tbi].pTableItem[SSID]->setTextColor(MainForm::cellDataRay[tbi].color); } void MainForm::extractData(string tl, int &tbi) { // extract the information from each line recovered from the pipe from getter boost::smatch sm; if (boost::regex_match(tl, boost::regex(".*?Cell [0-9][0-9].*"))) { string macAddress = boost::regex_replace(tl, boost::regex(".+?((?:[A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}).*"), "$1"); tbi = MainForm::maxTableIndex + 1; for (int i = 0; i <= MainForm::maxTableIndex; i++) { if (macAddress == MainForm::cellDataRay[i].macAddr) { tbi = i; break; } } if (MainForm::maxTableIndex < tbi) { // at this point we have found a **new** mac address. Initialize accordingly. MainForm::initNewCell(macAddress, tbi); MainForm::maxTableIndex = tbi; } MainForm::cellDataRay[tbi].timesSeen++; MainForm::cellDataRay[tbi].lastSeen = now; } else if (boost::regex_match(tl, sm, boost::regex(".*ESSID *: *\"(.*)\".*"))) { string tempSSID = sm[1]; if (tempSSID.length() == 0) tempSSID = ""; if (tempSSID.substr(0, 4) == "\\x00") tempSSID = ""; if (MainForm::cellDataRay[tbi].essid.length() == 0 || MainForm::cellDataRay[tbi].essid == "") MainForm::cellDataRay[tbi].essid = tempSSID; } else if (boost::regex_match(tl, sm, boost::regex( " *Protocol *:.*802\\.11 *([^ ]*) *", boost::regex_constants::icase))) { MainForm::cellDataRay[tbi].protocol = sm[1]; // cout << MainForm::cellDataRay[tbi].macAddr << " " // << MainForm::cellDataRay[tbi].protocol << endl; } else if (boost::regex_match(tl, sm, boost::regex(".*MODE:+ *([^ ]+).*", boost::regex_constants::icase))) { MainForm::cellDataRay[tbi].mode = sm[1]; } else if (boost::regex_match(tl, sm, boost::regex(" *Frequency *[:=] *([\\d\\.]+).*\\(Channel +(\\d{1,2})\\).*", boost::regex_constants::icase))) { string tempFreq = sm[1]; MainForm::cellDataRay[tbi].frequency = tempFreq; string tempChan = sm[2]; MainForm::cellDataRay[tbi].channel = atoi(tempChan.c_str()); if (MainForm::cellDataRay[tbi].pBandCurve == 0) { // wish we knew the band at initial cell discovery MainForm::cellDataRay[tbi].pBandCurve = new QwtPlotCurve(""); MainForm::cellDataRay[tbi].pBandCurve->setPen(* new QPen(MainForm::cellDataRay[tbi].color, 3.0)); MainForm::cellDataRay[tbi].pBandCurve->setRenderHint(QwtPlotItem::RenderAntialiased); if (tempFreq.substr(0, 1) == "2") { MainForm::cellDataRay[tbi].pBandCurve->attach(MainForm::mainFormWidget.chan24Plot); } else { MainForm::cellDataRay[tbi].pBandCurve->attach(MainForm::mainFormWidget.chan5Plot); } } /* fix for RTL8187SE oddball driver that doesn't want to report frequency */ } else if (boost::regex_match(tl, sm, boost::regex(" *Channel *[:=] *(\\d+).*", boost::regex_constants::icase))) { string tempChan = sm[1]; int tempIChan = atoi(tempChan.c_str()); MainForm::cellDataRay[tbi].channel = tempIChan; string tempFreq; if (tempIChan > 0 && tempIChan <= 14 ) { tempFreq = chan24Freq[tempIChan]; } else if (tempIChan > 14 && tempIChan <= 196) { for (int iChan = 0; iChan < 42; iChan++) { if (tempChan == chan50Freq[iChan][1]) { tempFreq == chan50Freq[iChan][2]; break; } } } else tempFreq = "0.000"; MainForm::cellDataRay[tbi].frequency = tempFreq; if (MainForm::cellDataRay[tbi].pBandCurve == 0) { MainForm::cellDataRay[tbi].pBandCurve = new QwtPlotCurve(""); MainForm::cellDataRay[tbi].pBandCurve->setPen(* new QPen(MainForm::cellDataRay[tbi].color, 3.0)); MainForm::cellDataRay[tbi].pBandCurve->setRenderHint(QwtPlotItem::RenderAntialiased); if (tempFreq.substr(0, 1) == "2") { MainForm::cellDataRay[tbi].pBandCurve->attach(MainForm::mainFormWidget.chan24Plot); } else { MainForm::cellDataRay[tbi].pBandCurve->attach(MainForm::mainFormWidget.chan5Plot); } } // end fix for idiotic RTL8187SE driver } else if (boost::regex_match(tl, boost::regex(".*?Signal level[=:].*", boost::regex_constants::icase))) { // first try to get and normalize (0 to 100) a "quality" figure boost::regex_match(tl, sm, boost::regex(".*?(\\d+)/(\\d+).*")); string sNumer = sm[1]; string sDenom = sm[2]; double dNumer = atof(sNumer.c_str()); double dDenom = atof(sDenom.c_str()); if (dDenom == 0.0) dDenom = 100.0; // arbitrary fudge against divide by zero MainForm::cellDataRay[tbi].quality = dNumer / dDenom * 100.0; MainForm::cellDataRay[tbi].signal = cellDataRay[tbi].quality - 110; // now, if we get a real signal value in dBm, use it if (boost::regex_match(tl, sm, boost::regex(".*?Signal level *[:=] *([\\-0-9]+) *dBm.*", boost::regex_constants::icase))) { string sSig = sm[1]; MainForm::cellDataRay[tbi].signal = atoi(sSig.c_str()); MainForm::cellDataRay[tbi].quality = MainForm::cellDataRay[tbi].signal + 110; } if (MainForm::cellDataRay[tbi].signal < MainForm::cellDataRay[tbi].minSignal) MainForm::cellDataRay[tbi].minSignal = MainForm::cellDataRay[tbi].signal; if (MainForm::cellDataRay[tbi].signal > MainForm::cellDataRay[tbi].maxSignal) MainForm::cellDataRay[tbi].maxSignal = MainForm::cellDataRay[tbi].signal; // now, record our sample in the History. The following few lines need some reason why. // Some flaky drivers report a MAC address more than once per scan. In some of // these cases it seems that the first data is bogus. So, we overwrite the first // history entry with the latest. Remember, we don't know that a second entry for // a MAC might be coming... if (MainForm::cellDataRay[tbi].timesSeen == 1) { int ixTemp = MainForm::cellDataRay[tbi].pHistory->totalSamples % MAX_SAMPLES; MainForm::cellDataRay[tbi].pHistory->sampleSec[ixTemp] = MainForm::blockSampleTime; MainForm::cellDataRay[tbi].pHistory->sampleSec[ixTemp + MAX_SAMPLES] = MainForm::blockSampleTime; MainForm::cellDataRay[tbi].pHistory->signal[ixTemp] = MainForm::cellDataRay[tbi].signal; MainForm::cellDataRay[tbi].pHistory->signal[ixTemp + MAX_SAMPLES] = MainForm::cellDataRay[tbi].signal; MainForm::cellDataRay[tbi].pHistory->totalSamples++; } else { int ixTemp = (MainForm::cellDataRay[tbi].pHistory->totalSamples - 1) % MAX_SAMPLES; MainForm::cellDataRay[tbi].pHistory->sampleSec[ixTemp] = MainForm::blockSampleTime; MainForm::cellDataRay[tbi].pHistory->sampleSec[ixTemp + MAX_SAMPLES] = MainForm::blockSampleTime; MainForm::cellDataRay[tbi].pHistory->signal[ixTemp] = MainForm::cellDataRay[tbi].signal; MainForm::cellDataRay[tbi].pHistory->signal[ixTemp + MAX_SAMPLES] = MainForm::cellDataRay[tbi].signal; } // now, if we get a real noise value in dBm use it, otherwise fake it if (boost::regex_match(tl, sm, boost::regex(".*?Noise level *[:=] *([\\-0-9]+) *dBm.*", boost::regex_constants::icase))) { string sNoise = sm[1]; MainForm::cellDataRay[tbi].noise = atoi(sNoise.c_str()); } else MainForm::cellDataRay[tbi].noise = -100; // fake it } else if (boost::regex_match(tl, sm, boost::regex(".*?\\d{1,3} *Mb/s.*", boost::regex_constants::icase))) { // scan thru all instances string::const_iterator tlBegin = tl.begin(); // of "digits Mb/s" to find string::const_iterator tlEnd = tl.end(); // the max. boost::match_results tlWhat; while (boost::regex_search(tlBegin, tlEnd, tlWhat, boost::regex(".*?(\\d{1,3}) *Mb/s"))) { int iWhat = atoi(string(tlWhat[1].first, tlWhat[2].second - 1).c_str()); if (iWhat > MainForm::cellDataRay[tbi].mbps) MainForm::cellDataRay[tbi].mbps = iWhat; tlBegin = tlWhat[0].second; } // Here we deal with encryption privacy and ciphers. } else if (boost::regex_match(tl, sm, boost::regex(" *Encryption key: *([^ ]+) *", boost::regex_constants::icase))) { MainForm::cellDataRay[tbi].security = sm[1]; } else if (boost::regex_match(tl, sm, boost::regex(" *IE: *WPA .*", boost::regex_constants::icase))) { currentPrivacy = WEP; if (MainForm::cellDataRay[tbi].privacy == none) { MainForm::cellDataRay[tbi].privacy = WEP; } } else if (boost::regex_match(tl, sm, boost::regex(" *IE: .+?WPA2 .*", boost::regex_constants::icase))) { currentPrivacy = WPA2; MainForm::cellDataRay[tbi].privacy = WPA2; } else if (boost::regex_match(tl, sm, boost::regex(" *Group Cipher *: *([^ ]+).*", boost::regex_constants::icase))) { if (currentPrivacy == MainForm::cellDataRay[tbi].privacy) { if (sm[1] == "TKIP") { MainForm::cellDataRay[tbi].cipher = TKIP; } else if (sm[1] == "CCMP") { MainForm::cellDataRay[tbi].cipher = AES; } else { MainForm::cellDataRay[tbi].cipher = unknown; } } } } void MainForm::doLogData() { if (!MainForm::logDataStream.is_open()) { // if data log file is not open... struct passwd *pw = getpwuid(getuid()); const char *homeDir = pw->pw_dir; string logDataFileName = string(homeDir) + "/" + string(LOG_DATA_FILE_NAME); MainForm::logDataStream.open(logDataFileName, ios::in); // open for read to see if file already exists if (MainForm::logDataStream) { // if it exists.,.. string arg1 = ""; string arg2 = ""; logDataStream >> arg1 >> arg2; if (arg1 != "LINSSIDDATALOGVER" || arg2 != LINSSIDDATALOGVER) { // old log file version MainForm::logDataStream.close(); // close it for read rename(logDataFileName.c_str(), (logDataFileName + ".old").c_str()); writeLogDataHeader(logDataFileName); // open a new file for write append, insert header } else { // is new log format so open for write append MainForm::logDataStream.close(); // close it for read MainForm::logDataStream.open(logDataFileName, ios::out | ios::app); } } else { // if not exists... open for append and write headers writeLogDataHeader(logDataFileName); } } // now write data char nowStr[64], firstStr[64], lastStr[64]; std::strftime(nowStr, 100, "%Y/%m/%d.%H:%M:%S", std::localtime(&MainForm::now)); for (int tbi = 0; tbi <= MainForm::maxTableIndex; tbi++) { std::strftime(firstStr, 100, "%Y/%m/%d.%H:%M:%S", std::localtime(&MainForm::cellDataRay[tbi].firstSeen)); std::strftime(lastStr, 100, "%Y/%m/%d.%H:%M:%S", std::localtime(&MainForm::cellDataRay[tbi].lastSeen)); MainForm::logDataStream << nowStr << "\t" << "\"" << MainForm::cellDataRay[tbi].essid << "\"\t" << MainForm::cellDataRay[tbi].macAddr << "\t" << MainForm::cellDataRay[tbi].channel << "\t" << MainForm::cellDataRay[tbi].mode << "\t" << MainForm::cellDataRay[tbi].protocol << "\t" << MainForm::cellDataRay[tbi].security << "\t" << MainForm::wlPrivacies[MainForm::cellDataRay[tbi].privacy] << "\t" << MainForm::wlCiphers[MainForm::cellDataRay[tbi].cipher] << "\t" << MainForm::cellDataRay[tbi].frequency << "\t" << MainForm::cellDataRay[tbi].quality << "\t" << MainForm::cellDataRay[tbi].signal << "\t" << MainForm::cellDataRay[tbi].noise << "\t" << MainForm::cellDataRay[tbi].minSignal << "\t" << MainForm::cellDataRay[tbi].maxSignal << "\t" << MainForm::cellDataRay[tbi].mbps << "\t" << firstStr << "\t" << lastStr << "\t" << "\"" << MainForm::cellDataRay[tbi].vendor << "\"\n"; } } void MainForm::writeLogDataHeader(string logDataFileName) { MainForm::logDataStream.close(); // close it for read if was open (don't really need to...) MainForm::logDataStream.open(logDataFileName, ios::out | ios::app); // open for write append MainForm::logDataStream << "LINSSIDDATALOGVER " << LINSSIDDATALOGVER << "\n"; MainForm::logDataStream << "Time\tSSID\tMAC\tChannel\tMode\tProtocol\tSecurity\tPrivacy\t\ Cipher\tFrequency\tQuality\tSignal\tNoise\tMin_Sig\tMax_Sig\tMbps\tFirst_Seen\tLast_Seen\tVendor\n"; } void MainForm::handleDataReadyEvent(const DataReadyEvent * /*event*/) { // Now something can be safely done with the Qt objects. // Access the custom data using event->getReadyBlockNo() etc. QCoreApplication::processEvents(QEventLoop::AllEvents); // TODO is this necessary? static fstream thePipe(pipeName); // reset some stuff from last pass for (int ix = 0; ix <= maxTableIndex; ix++) { MainForm::cellDataRay[ix].quality = 0; MainForm::cellDataRay[ix].signal = -110; MainForm::cellDataRay[ix].noise = -110; MainForm::cellDataRay[ix].timesSeen = 0; } // disable column sorting to prevent segfaults while we muck with the table MainForm::mainFormWidget.mainTableWidget->setSortingEnabled(false); string tempLine; bool lastLine = false; MainForm::now = time(NULL); MainForm::blockSampleTime = now - MainForm::runStartTime; currentPrivacy = none; int tableIndex = -1; // holds current index pointer into cellData while (!lastLine && getline(thePipe, tempLine)) { // getline(thePipe, tempLine); // cout << "tempLine:" << tempLine << endl; MainForm::extractData(tempLine, tableIndex); // the heavy lifting here lastLine = tempLine.substr(0, endBlockString.length()) == endBlockString; if (lastLine) { int block = atoi(tempLine.substr(endBlockString.length() + 1, std::string::npos).c_str()); if (block >= 0) lastBlockReceived = block; if (MainForm::mainFormWidget.runBtn->isChecked()) { if (block >= 0) lastBlockRequested++; MainForm::pGetter->postDataWantedEvent(lastBlockRequested); } else { MainForm::mainFormWidget.statusTxt->setText("Paused"); } if (block >= 0) { MainForm::fillTable(); MainForm::fillPlots(); if (MainForm::logDataState == Qt::Checked) { doLogData(); } } } } } inline void MainForm::waste(int) { // This silliness is to ignore an argument function's return code without // having the compiler whine about it. }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/linssid-app/main.cpp��������������������������������������������������������������������000664 �001750 �001750 �00000004121 12355414341 017542� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * File: main.cpp * Author: warren * * Created on October 25, 2012, 11:41 AM */ #include #include #include #include #include #include #include "MainForm.h" #include "ui_MainForm.h" #include "Getter.h" #include "Custom.h" using namespace std; // Globals here - TODO make some local where possible string pipeName; string password; passStatus pwStatus; string endBlockString = "-=-=-=-=-=-End block"; string beginBlockString = "-=-=-=-=-=-Begin block"; int lastBlockRequested; int lastBlockReceived; qint64 startTime; ofstream linssidLog; bool closing = false; string genPipeName(int); int main(int argc, char *argv[]) { // initialize resources, if needed // Q_INIT_RESOURCE(resfile); QApplication app(argc, argv); // create instances of the main GUI and the worker thread and initialize Getter getter1; // instance of Getter MainForm form1; // instance of MainForm // make a thread for the getter and "movetothread" static QThread getter1Thread; getter1.moveToThread(&getter1Thread); // DEBUG create a log file linssidLog.open("/tmp/linssid_log", ios::out); linssidLog << "log file initiated " << endl; // create our named pipe for inter-thread data pipeName = genPipeName(10); mkfifo(pipeName.c_str(), 0666); form1.init(); // my own kludgy init, not part of constructor // Tell form1 and getter1 how to find each other form1.pGetter = &getter1; // form1 has a pointer to getter1 getter1.pMainForm = &form1; // and getter1 has a pointer to form1 form1.pGetterThread = &getter1Thread; // and form1 has a pointer to getter1 thread // fire up the event loops and run the app getter1Thread.start(); // start getter1 event loop form1.show(); return (app.exec()); } string genPipeName(int len) { string charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; string name = "/tmp/linssid_"; for (int i = 0; i < len; i++) { name = name + charSet[rand() % charSet.size()]; } return (name); }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_panner.cpp���������������������������������������������������������000644 �001750 �001750 �00000014770 12151666703 021773� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_panner.h" #include "qwt_scale_div.h" #include "qwt_plot.h" #include "qwt_painter.h" #include #include #include static QBitmap qwtBorderMask( const QWidget *canvas, const QSize &size ) { const QRect r( 0, 0, size.width(), size.height() ); QPainterPath borderPath; ( void )QMetaObject::invokeMethod( const_cast< QWidget *>( canvas ), "borderPath", Qt::DirectConnection, Q_RETURN_ARG( QPainterPath, borderPath ), Q_ARG( QRect, r ) ); if ( borderPath.isEmpty() ) { if ( canvas->contentsRect() == canvas->rect() ) return QBitmap(); QBitmap mask( size ); mask.fill( Qt::color0 ); QPainter painter( &mask ); painter.fillRect( canvas->contentsRect(), Qt::color1 ); return mask; } QImage image( size, QImage::Format_ARGB32_Premultiplied ); image.fill( Qt::color0 ); QPainter painter( &image ); painter.setClipPath( borderPath ); painter.fillRect( r, Qt::color1 ); // now erase the frame painter.setCompositionMode( QPainter::CompositionMode_DestinationOut ); if ( canvas->testAttribute(Qt::WA_StyledBackground ) ) { QStyleOptionFrame opt; opt.initFrom(canvas); opt.rect = r; canvas->style()->drawPrimitive( QStyle::PE_Frame, &opt, &painter, canvas ); } else { const QVariant borderRadius = canvas->property( "borderRadius" ); const QVariant frameWidth = canvas->property( "frameWidth" ); if ( borderRadius.type() == QVariant::Double && frameWidth.type() == QVariant::Int ) { const double br = borderRadius.toDouble(); const int fw = frameWidth.toInt(); if ( br > 0.0 && fw > 0 ) { painter.setPen( QPen( Qt::color1, fw ) ); painter.setBrush( Qt::NoBrush ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.drawPath( borderPath ); } } } painter.end(); const QImage mask = image.createMaskFromColor( QColor( Qt::color1 ).rgb(), Qt::MaskOutColor ); return QBitmap::fromImage( mask ); } class QwtPlotPanner::PrivateData { public: PrivateData() { for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) isAxisEnabled[axis] = true; } bool isAxisEnabled[QwtPlot::axisCnt]; }; /*! \brief A panner for the canvas of a QwtPlot The panner is enabled for all axes \param canvas Plot canvas to pan, also the parent object \sa setAxisEnabled() */ QwtPlotPanner::QwtPlotPanner( QWidget *canvas ): QwtPanner( canvas ) { d_data = new PrivateData(); connect( this, SIGNAL( panned( int, int ) ), SLOT( moveCanvas( int, int ) ) ); } //! Destructor QwtPlotPanner::~QwtPlotPanner() { delete d_data; } /*! \brief En/Disable an axis Axes that are enabled will be synchronized to the result of panning. All other axes will remain unchanged. \param axis Axis, see QwtPlot::Axis \param on On/Off \sa isAxisEnabled(), moveCanvas() */ void QwtPlotPanner::setAxisEnabled( int axis, bool on ) { if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->isAxisEnabled[axis] = on; } /*! Test if an axis is enabled \param axis Axis, see QwtPlot::Axis \return True, if the axis is enabled \sa setAxisEnabled(), moveCanvas() */ bool QwtPlotPanner::isAxisEnabled( int axis ) const { if ( axis >= 0 && axis < QwtPlot::axisCnt ) return d_data->isAxisEnabled[axis]; return true; } //! Return observed plot canvas QWidget *QwtPlotPanner::canvas() { return parentWidget(); } //! Return Observed plot canvas const QWidget *QwtPlotPanner::canvas() const { return parentWidget(); } //! Return plot widget, containing the observed plot canvas QwtPlot *QwtPlotPanner::plot() { QWidget *w = canvas(); if ( w ) w = w->parentWidget(); return qobject_cast( w ); } //! Return plot widget, containing the observed plot canvas const QwtPlot *QwtPlotPanner::plot() const { const QWidget *w = canvas(); if ( w ) w = w->parentWidget(); return qobject_cast( w ); } /*! Adjust the enabled axes according to dx/dy \param dx Pixel offset in x direction \param dy Pixel offset in y direction \sa QwtPanner::panned() */ void QwtPlotPanner::moveCanvas( int dx, int dy ) { if ( dx == 0 && dy == 0 ) return; QwtPlot *plot = this->plot(); if ( plot == NULL ) return; const bool doAutoReplot = plot->autoReplot(); plot->setAutoReplot( false ); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( !d_data->isAxisEnabled[axis] ) continue; const QwtScaleMap map = plot->canvasMap( axis ); const double p1 = map.transform( plot->axisScaleDiv( axis ).lowerBound() ); const double p2 = map.transform( plot->axisScaleDiv( axis ).upperBound() ); double d1, d2; if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { d1 = map.invTransform( p1 - dx ); d2 = map.invTransform( p2 - dx ); } else { d1 = map.invTransform( p1 - dy ); d2 = map.invTransform( p2 - dy ); } plot->setAxisScale( axis, d1, d2 ); } plot->setAutoReplot( doAutoReplot ); plot->replot(); } /*! Calculate a mask from the border path of the canvas \return Mask as bitmap \sa QwtPlotCanvas::borderPath() */ QBitmap QwtPlotPanner::contentsMask() const { if ( canvas() ) return qwtBorderMask( canvas(), size() ); return QwtPanner::contentsMask(); } /*! \return Pixmap with the content of the canvas */ QPixmap QwtPlotPanner::grab() const { const QWidget *cv = canvas(); if ( cv && cv->inherits( "QGLWidget" ) ) { // we can't grab from a QGLWidget QPixmap pm( cv->size() ); QwtPainter::fillPixmap( cv, pm ); QPainter painter( &pm ); const_cast( plot() )->drawCanvas( &painter ); return pm; } return QwtPanner::grab(); } ��������linssid-2.7/qwt-lib/src/qwt_point_3d.cpp������������������������������������������������������������000644 �001750 �001750 �00000001206 12151666703 021157� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_3d.h" #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtPoint3D &point ) { debug.nospace() << "QwtPoint3D(" << point.x() << "," << point.y() << "," << point.z() << ")"; return debug.space(); } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_legend.cpp��������������������������������������������������������������000644 �001750 �001750 �00000050734 12151666703 020710� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend.h" #include "qwt_legend_label.h" #include "qwt_dyngrid_layout.h" #include "qwt_math.h" #include "qwt_plot_item.h" #include "qwt_painter.h" #include #include #include #include #include #include class QwtLegendMap { public: inline bool isEmpty() const { return d_entries.isEmpty(); } void insert( const QVariant &, const QList & ); void remove( const QVariant & ); void removeWidget( const QWidget * ); QList legendWidgets( const QVariant & ) const; QVariant itemInfo( const QWidget * ) const; private: // we don't know anything about itemInfo and therefore don't have // any key that can be used for a map or hashtab. // But a simple linear list is o.k. here, as we will never have // more than a few entries. class Entry { public: QVariant itemInfo; QList widgets; }; QList< Entry > d_entries; }; void QwtLegendMap::insert( const QVariant &itemInfo, const QList &widgets ) { for ( int i = 0; i < d_entries.size(); i++ ) { Entry &entry = d_entries[i]; if ( entry.itemInfo == itemInfo ) { entry.widgets = widgets; return; } } Entry newEntry; newEntry.itemInfo = itemInfo; newEntry.widgets = widgets; d_entries += newEntry; } void QwtLegendMap::remove( const QVariant &itemInfo ) { for ( int i = 0; i < d_entries.size(); i++ ) { Entry &entry = d_entries[i]; if ( entry.itemInfo == itemInfo ) { d_entries.removeAt( i ); return; } } } void QwtLegendMap::removeWidget( const QWidget *widget ) { QWidget *w = const_cast( widget ); for ( int i = 0; i < d_entries.size(); i++ ) d_entries[ i ].widgets.removeAll( w ); } QVariant QwtLegendMap::itemInfo( const QWidget *widget ) const { if ( widget != NULL ) { QWidget *w = const_cast( widget ); for ( int i = 0; i < d_entries.size(); i++ ) { const Entry &entry = d_entries[i]; if ( entry.widgets.indexOf( w ) >= 0 ) return entry.itemInfo; } } return QVariant(); } QList QwtLegendMap::legendWidgets( const QVariant &itemInfo ) const { if ( itemInfo.isValid() ) { for ( int i = 0; i < d_entries.size(); i++ ) { const Entry &entry = d_entries[i]; if ( entry.itemInfo == itemInfo ) return entry.widgets; } } return QList(); } class QwtLegend::PrivateData { public: PrivateData(): itemMode( QwtLegendData::ReadOnly ), view( NULL ) { } QwtLegendData::Mode itemMode; QwtLegendMap itemMap; class LegendView; LegendView *view; }; class QwtLegend::PrivateData::LegendView: public QScrollArea { public: LegendView( QWidget *parent ): QScrollArea( parent ) { contentsWidget = new QWidget( this ); contentsWidget->setObjectName( "QwtLegendViewContents" ); setWidget( contentsWidget ); setWidgetResizable( false ); viewport()->setObjectName( "QwtLegendViewport" ); // QScrollArea::setWidget internally sets autoFillBackground to true // But we don't want a background. contentsWidget->setAutoFillBackground( false ); viewport()->setAutoFillBackground( false ); } virtual bool event( QEvent *event ) { if ( event->type() == QEvent::PolishRequest ) { setFocusPolicy( Qt::NoFocus ); } if ( event->type() == QEvent::Resize ) { // adjust the size to en/disable the scrollbars // before QScrollArea adjusts the viewport size const QRect cr = contentsRect(); int w = cr.width(); int h = contentsWidget->heightForWidth( cr.width() ); if ( h > w ) { w -= verticalScrollBar()->sizeHint().width(); h = contentsWidget->heightForWidth( w ); } contentsWidget->resize( w, h ); } return QScrollArea::event( event ); } virtual bool viewportEvent( QEvent *event ) { bool ok = QScrollArea::viewportEvent( event ); if ( event->type() == QEvent::Resize ) { layoutContents(); } return ok; } QSize viewportSize( int w, int h ) const { const int sbHeight = horizontalScrollBar()->sizeHint().height(); const int sbWidth = verticalScrollBar()->sizeHint().width(); const int cw = contentsRect().width(); const int ch = contentsRect().height(); int vw = cw; int vh = ch; if ( w > vw ) vh -= sbHeight; if ( h > vh ) { vw -= sbWidth; if ( w > vw && vh == ch ) vh -= sbHeight; } return QSize( vw, vh ); } void layoutContents() { const QwtDynGridLayout *tl = qobject_cast( contentsWidget->layout() ); if ( tl == NULL ) return; const QSize visibleSize = viewport()->contentsRect().size(); const int minW = int( tl->maxItemWidth() ) + 2 * tl->margin(); int w = qMax( visibleSize.width(), minW ); int h = qMax( tl->heightForWidth( w ), visibleSize.height() ); const int vpWidth = viewportSize( w, h ).width(); if ( w > vpWidth ) { w = qMax( vpWidth, minW ); h = qMax( tl->heightForWidth( w ), visibleSize.height() ); } contentsWidget->resize( w, h ); } QWidget *contentsWidget; }; /*! Constructor \param parent Parent widget */ QwtLegend::QwtLegend( QWidget *parent ): QwtAbstractLegend( parent ) { setFrameStyle( NoFrame ); d_data = new QwtLegend::PrivateData; d_data->view = new QwtLegend::PrivateData::LegendView( this ); d_data->view->setObjectName( "QwtLegendView" ); d_data->view->setFrameStyle( NoFrame ); QwtDynGridLayout *gridLayout = new QwtDynGridLayout( d_data->view->contentsWidget ); gridLayout->setAlignment( Qt::AlignHCenter | Qt::AlignTop ); d_data->view->contentsWidget->installEventFilter( this ); QVBoxLayout *layout = new QVBoxLayout( this ); layout->setContentsMargins( 0, 0, 0, 0 ); layout->addWidget( d_data->view ); } //! Destructor QwtLegend::~QwtLegend() { delete d_data; } /*! \brief Set the maximum number of entries in a row F.e when the maximum is set to 1 all items are aligned vertically. 0 means unlimited \param numColums Maximum number of entries in a row \sa maxColumns(), QwtDynGridLayout::setMaxColumns() */ void QwtLegend::setMaxColumns( uint numColums ) { QwtDynGridLayout *tl = qobject_cast( d_data->view->contentsWidget->layout() ); if ( tl ) tl->setMaxColumns( numColums ); } /*! \return Maximum number of entries in a row \sa setMaxColumns(), QwtDynGridLayout::maxColumns() */ uint QwtLegend::maxColumns() const { uint maxCols = 0; const QwtDynGridLayout *tl = qobject_cast( d_data->view->contentsWidget->layout() ); if ( tl ) maxCols = tl->maxColumns(); return maxCols; } /*! \brief Set the default mode for legend labels Legend labels will be constructed according to the attributes in a QwtLegendData object. When it doesn't contain a value for the QwtLegendData::ModeRole the label will be initialized with the default mode of the legend. \param mode Default item mode \sa itemMode(), QwtLegendData::value(), QwtPlotItem::legendData() \note Changing the mode doesn't have any effect on existing labels. */ void QwtLegend::setDefaultItemMode( QwtLegendData::Mode mode ) { d_data->itemMode = mode; } /*! \return Default item mode \sa setDefaultItemMode() */ QwtLegendData::Mode QwtLegend::defaultItemMode() const { return d_data->itemMode; } /*! The contents widget is the only child of the viewport of the internal QScrollArea and the parent widget of all legend items. \return Container widget of the legend items */ QWidget *QwtLegend::contentsWidget() { return d_data->view->contentsWidget; } /*! \return Horizontal scrollbar \sa verticalScrollBar() */ QScrollBar *QwtLegend::horizontalScrollBar() const { return d_data->view->horizontalScrollBar(); } /*! \return Vertical scrollbar \sa horizontalScrollBar() */ QScrollBar *QwtLegend::verticalScrollBar() const { return d_data->view->verticalScrollBar(); } /*! The contents widget is the only child of the viewport of the internal QScrollArea and the parent widget of all legend items. \return Container widget of the legend items */ const QWidget *QwtLegend::contentsWidget() const { return d_data->view->contentsWidget; } /*! \brief Update the entries for an item \param itemInfo Info for an item \param data List of legend entry attributes for the item */ void QwtLegend::updateLegend( const QVariant &itemInfo, const QList &data ) { QList widgetList = legendWidgets( itemInfo ); if ( widgetList.size() != data.size() ) { QLayout *contentsLayout = d_data->view->contentsWidget->layout(); while ( widgetList.size() > data.size() ) { QWidget *w = widgetList.takeLast(); contentsLayout->removeWidget( w ); // updates might be triggered by signals from the legend widget // itself. So we better don't delete it here. w->hide(); w->deleteLater(); } for ( int i = widgetList.size(); i < data.size(); i++ ) { QWidget *widget = createWidget( data[i] ); if ( contentsLayout ) contentsLayout->addWidget( widget ); widgetList += widget; } if ( widgetList.isEmpty() ) { d_data->itemMap.remove( itemInfo ); } else { d_data->itemMap.insert( itemInfo, widgetList ); } updateTabOrder(); } for ( int i = 0; i < data.size(); i++ ) updateWidget( widgetList[i], data[i] ); } /*! \brief Create a widget to be inserted into the legend The default implementation returns a QwtLegendLabel. \param data Attributes of the legend entry \return Widget representing data on the legend \note updateWidget() will called soon after createWidget() with the same attributes. */ QWidget *QwtLegend::createWidget( const QwtLegendData &data ) const { Q_UNUSED( data ); QwtLegendLabel *label = new QwtLegendLabel(); label->setItemMode( defaultItemMode() ); connect( label, SIGNAL( clicked() ), SLOT( itemClicked() ) ); connect( label, SIGNAL( checked( bool ) ), SLOT( itemChecked( bool ) ) ); return label; } /*! \brief Update the widget \param widget Usually a QwtLegendLabel \param data Attributes to be displayed \sa createWidget() \note When widget is no QwtLegendLabel updateWidget() does nothing. */ void QwtLegend::updateWidget( QWidget *widget, const QwtLegendData &data ) { QwtLegendLabel *label = qobject_cast( widget ); if ( label ) { label->setData( data ); if ( !data.value( QwtLegendData::ModeRole ).isValid() ) { // use the default mode, when there is no specific // hint from the legend data label->setItemMode( defaultItemMode() ); } } } void QwtLegend::updateTabOrder() { QLayout *contentsLayout = d_data->view->contentsWidget->layout(); if ( contentsLayout ) { // set tab focus chain QWidget *w = NULL; for ( int i = 0; i < contentsLayout->count(); i++ ) { QLayoutItem *item = contentsLayout->itemAt( i ); if ( w && item->widget() ) QWidget::setTabOrder( w, item->widget() ); w = item->widget(); } } } //! Return a size hint. QSize QwtLegend::sizeHint() const { QSize hint = d_data->view->contentsWidget->sizeHint(); hint += QSize( 2 * frameWidth(), 2 * frameWidth() ); return hint; } /*! \return The preferred height, for a width. \param width Width */ int QwtLegend::heightForWidth( int width ) const { width -= 2 * frameWidth(); int h = d_data->view->contentsWidget->heightForWidth( width ); if ( h >= 0 ) h += 2 * frameWidth(); return h; } /*! Handle QEvent::ChildRemoved andQEvent::LayoutRequest events for the contentsWidget(). \param object Object to be filtered \param event Event \return Forwarded to QwtAbstractLegend::eventFilter() */ bool QwtLegend::eventFilter( QObject *object, QEvent *event ) { if ( object == d_data->view->contentsWidget ) { switch ( event->type() ) { case QEvent::ChildRemoved: { const QChildEvent *ce = static_cast(event); if ( ce->child()->isWidgetType() ) { QWidget *w = static_cast< QWidget * >( ce->child() ); d_data->itemMap.removeWidget( w ); } break; } case QEvent::LayoutRequest: { d_data->view->layoutContents(); if ( parentWidget() && parentWidget()->layout() == NULL ) { /* We want the parent widget ( usually QwtPlot ) to recalculate its layout, when the contentsWidget has changed. But because of the scroll view we have to forward the LayoutRequest event manually. We don't use updateGeometry() because it doesn't post LayoutRequest events when the legend is hidden. But we want the parent widget notified, so it can show/hide the legend depending on its items. */ QApplication::postEvent( parentWidget(), new QEvent( QEvent::LayoutRequest ) ); } break; } default: break; } } return QwtAbstractLegend::eventFilter( object, event ); } /*! Called internally when the legend has been clicked on. Emits a clicked() signal. */ void QwtLegend::itemClicked() { QWidget *w = qobject_cast( sender() ); if ( w ) { const QVariant itemInfo = d_data->itemMap.itemInfo( w ); if ( itemInfo.isValid() ) { const QList widgetList = d_data->itemMap.legendWidgets( itemInfo ); const int index = widgetList.indexOf( w ); if ( index >= 0 ) Q_EMIT clicked( itemInfo, index ); } } } /*! Called internally when the legend has been checked Emits a checked() signal. */ void QwtLegend::itemChecked( bool on ) { QWidget *w = qobject_cast( sender() ); if ( w ) { const QVariant itemInfo = d_data->itemMap.itemInfo( w ); if ( itemInfo.isValid() ) { const QList widgetList = d_data->itemMap.legendWidgets( itemInfo ); const int index = widgetList.indexOf( w ); if ( index >= 0 ) Q_EMIT checked( itemInfo, on, index ); } } } /*! Render the legend into a given rectangle. \param painter Painter \param rect Bounding rectangle \param fillBackground When true, fill rect with the widget background \sa renderLegend() is used by QwtPlotRenderer - not by QwtLegend itself */ void QwtLegend::renderLegend( QPainter *painter, const QRectF &rect, bool fillBackground ) const { if ( d_data->itemMap.isEmpty() ) return; if ( fillBackground ) { if ( autoFillBackground() || testAttribute( Qt::WA_StyledBackground ) ) { QwtPainter::drawBackgound( painter, rect, this ); } } const QwtDynGridLayout *legendLayout = qobject_cast( contentsWidget()->layout() ); if ( legendLayout == NULL ) return; int left, right, top, bottom; getContentsMargins( &left, &top, &right, &bottom ); QRect layoutRect; layoutRect.setLeft( qCeil( rect.left() ) + left ); layoutRect.setTop( qCeil( rect.top() ) + top ); layoutRect.setRight( qFloor( rect.right() ) - right ); layoutRect.setBottom( qFloor( rect.bottom() ) - bottom ); uint numCols = legendLayout->columnsForWidth( layoutRect.width() ); QList itemRects = legendLayout->layoutItems( layoutRect, numCols ); int index = 0; for ( int i = 0; i < legendLayout->count(); i++ ) { QLayoutItem *item = legendLayout->itemAt( i ); QWidget *w = item->widget(); if ( w ) { painter->save(); painter->setClipRect( itemRects[index] ); renderItem( painter, w, itemRects[index], fillBackground ); index++; painter->restore(); } } } /*! Render a legend entry into a given rectangle. \param painter Painter \param widget Widget representing a legend entry \param rect Bounding rectangle \param fillBackground When true, fill rect with the widget background \note When widget is not derived from QwtLegendLabel renderItem does nothing beside the background */ void QwtLegend::renderItem( QPainter *painter, const QWidget *widget, const QRectF &rect, bool fillBackground ) const { if ( fillBackground ) { if ( widget->autoFillBackground() || widget->testAttribute( Qt::WA_StyledBackground ) ) { QwtPainter::drawBackgound( painter, rect, widget ); } } const QwtLegendLabel *label = qobject_cast( widget ); if ( label ) { // icon const QwtGraphic &icon = label->data().icon(); const QSizeF sz = icon.defaultSize(); const QRectF iconRect( rect.x() + label->margin(), rect.center().y() - 0.5 * sz.height(), sz.width(), sz.height() ); icon.render( painter, iconRect, Qt::KeepAspectRatio ); // title QRectF titleRect = rect; titleRect.setX( iconRect.right() + 2 * label->spacing() ); painter->setFont( label->font() ); painter->setPen( label->palette().color( QPalette::Text ) ); const_cast< QwtLegendLabel *>( label )->drawText( painter, titleRect ); } } /*! \return List of widgets associated to a item \param itemInfo Info about an item \sa legendWidget(), itemInfo(), QwtPlot::itemToInfo() */ QList QwtLegend::legendWidgets( const QVariant &itemInfo ) const { return d_data->itemMap.legendWidgets( itemInfo ); } /*! \return First widget in the list of widgets associated to an item \param itemInfo Info about an item \sa itemInfo(), QwtPlot::itemToInfo() \note Almost all types of items have only one widget */ QWidget *QwtLegend::legendWidget( const QVariant &itemInfo ) const { const QList list = d_data->itemMap.legendWidgets( itemInfo ); if ( list.isEmpty() ) return NULL; return list[0]; } /*! Find the item that is associated to a widget \param widget Widget on the legend \return Associated item info \sa legendWidget() */ QVariant QwtLegend::itemInfo( const QWidget *widget ) const { return d_data->itemMap.itemInfo( widget ); } //! \return True, when no item is inserted bool QwtLegend::isEmpty() const { return d_data->itemMap.isEmpty(); } /*! Return the extent, that is needed for the scrollbars \param orientation Orientation ( \return The width of the vertical scrollbar for Qt::Horizontal and v.v. */ int QwtLegend::scrollExtent( Qt::Orientation orientation ) const { int extent = 0; if ( orientation == Qt::Horizontal ) extent = verticalScrollBar()->sizeHint().width(); else extent = horizontalScrollBar()->sizeHint().height(); return extent; } ������������������������������������linssid-2.7/qwt-lib/src/qwt_symbol.h����������������������������������������������������������������000644 �001750 �001750 �00000014107 12151666701 020414� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SYMBOL_H #define QWT_SYMBOL_H #include "qwt_global.h" #include class QPainter; class QRect; class QSize; class QBrush; class QPen; class QColor; class QPointF; class QPolygonF; class QPainterPath; class QPixmap; class QByteArray; class QwtGraphic; //! A class for drawing symbols class QWT_EXPORT QwtSymbol { public: /*! Symbol Style \sa setStyle(), style() */ enum Style { //! No Style. The symbol cannot be drawn. NoSymbol = -1, //! Ellipse or circle Ellipse, //! Rectangle Rect, //! Diamond Diamond, //! Triangle pointing upwards Triangle, //! Triangle pointing downwards DTriangle, //! Triangle pointing upwards UTriangle, //! Triangle pointing left LTriangle, //! Triangle pointing right RTriangle, //! Cross (+) Cross, //! Diagonal cross (X) XCross, //! Horizontal line HLine, //! Vertical line VLine, //! X combined with + Star1, //! Six-pointed star Star2, //! Hexagon Hexagon, /*! The symbol is represented by a painter path, where the origin ( 0, 0 ) of the path coordinate system is mapped to the position of the symbol. \sa setPath(), path() */ Path, /*! The symbol is represented by a pixmap. The pixmap is centered or aligned to its pin point. \sa setPinPoint() */ Pixmap, /*! The symbol is represented by a graphic. The graphic is centered or aligned to its pin point. \sa setPinPoint() */ Graphic, /*! The symbol is represented by a SVG graphic. The graphic is centered or aligned to its pin point. \sa setPinPoint() */ SvgDocument, /*! Styles >= QwtSymbol::UserSymbol are reserved for derived classes of QwtSymbol that overload drawSymbols() with additional application specific symbol types. */ UserStyle = 1000 }; /*! Depending on the render engine and the complexity of the symbol shape it might be faster to render the symbol to a pixmap and to paint this pixmap. F.e. the raster paint engine is a pure software renderer where in cache mode a draw operation usually ends in raster operation with the the backing store, that are usually faster, than the algorithms for rendering polygons. But the opposite can be expected for graphic pipelines that can make use of hardware acceleration. The default setting is AutoCache \sa setCachePolicy(), cachePolicy() \note The policy has no effect, when the symbol is painted to a vector graphics format ( PDF, SVG ). \warning Since Qt 4.8 raster is the default backend on X11 */ enum CachePolicy { //! Don't use a pixmap cache NoCache, //! Always use a pixmap cache Cache, /*! Use a cache when one of the following conditions is true: - The symbol is rendered with the software renderer ( QPaintEngine::Raster ) */ AutoCache }; public: QwtSymbol( Style = NoSymbol ); QwtSymbol( Style, const QBrush &, const QPen &, const QSize & ); QwtSymbol( const QPainterPath &, const QBrush &, const QPen & ); virtual ~QwtSymbol(); void setCachePolicy( CachePolicy ); CachePolicy cachePolicy() const; void setSize( const QSize & ); void setSize( int width, int height = -1 ); const QSize& size() const; void setPinPoint( const QPointF &pos, bool enable = true ); QPointF pinPoint() const; void setPinPointEnabled( bool ); bool isPinPointEnabled() const; virtual void setColor( const QColor & ); void setBrush( const QBrush& b ); const QBrush& brush() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen& pen() const; void setStyle( Style ); Style style() const; void setPath( const QPainterPath & ); const QPainterPath &path() const; void setPixmap( const QPixmap & ); const QPixmap &pixmap() const; void setGraphic( const QwtGraphic & ); const QwtGraphic &graphic() const; #ifndef QWT_NO_SVG void setSvgDocument( const QByteArray & ); #endif void drawSymbol( QPainter *, const QRectF & ) const; void drawSymbol( QPainter *, const QPointF & ) const; void drawSymbols( QPainter *, const QPolygonF & ) const; void drawSymbols( QPainter *, const QPointF *, int numPoints ) const; virtual QRect boundingRect() const; void invalidateCache(); protected: virtual void renderSymbols( QPainter *, const QPointF *, int numPoints ) const; private: // Disabled copy constructor and operator= QwtSymbol( const QwtSymbol & ); QwtSymbol &operator=( const QwtSymbol & ); class PrivateData; PrivateData *d_data; }; /*! \brief Draw the symbol at a specified position \param painter Painter \param pos Position of the symbol in screen coordinates */ inline void QwtSymbol::drawSymbol( QPainter *painter, const QPointF &pos ) const { drawSymbols( painter, &pos, 1 ); } /*! \brief Draw symbols at the specified points \param painter Painter \param points Positions of the symbols in screen coordinates */ inline void QwtSymbol::drawSymbols( QPainter *painter, const QPolygonF &points ) const { drawSymbols( painter, points.data(), points.size() ); } #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/debian/compat���������������������������������������������������������������������������000664 �001750 �001750 �00000000002 12345373236 016317� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������9 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_magnifier.h�������������������������������������������������������������000644 �001750 �001750 �00000004572 12151666701 021055� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_MAGNIFIER_H #define QWT_MAGNIFIER_H 1 #include "qwt_global.h" #include class QWidget; class QMouseEvent; class QWheelEvent; class QKeyEvent; /*! \brief QwtMagnifier provides zooming, by magnifying in steps. Using QwtMagnifier a plot can be zoomed in/out in steps using keys, the mouse wheel or moving a mouse button in vertical direction. */ class QWT_EXPORT QwtMagnifier: public QObject { Q_OBJECT public: explicit QwtMagnifier( QWidget * ); virtual ~QwtMagnifier(); QWidget *parentWidget(); const QWidget *parentWidget() const; void setEnabled( bool ); bool isEnabled() const; // mouse void setMouseFactor( double ); double mouseFactor() const; void setMouseButton( Qt::MouseButton, Qt::KeyboardModifiers = Qt::NoModifier ); void getMouseButton( Qt::MouseButton &, Qt::KeyboardModifiers & ) const; // mouse wheel void setWheelFactor( double ); double wheelFactor() const; void setWheelModifiers( Qt::KeyboardModifiers ); Qt::KeyboardModifiers wheelModifiers() const; // keyboard void setKeyFactor( double ); double keyFactor() const; void setZoomInKey( int key, Qt::KeyboardModifiers = Qt::NoModifier ); void getZoomInKey( int &key, Qt::KeyboardModifiers & ) const; void setZoomOutKey( int key, Qt::KeyboardModifiers = Qt::NoModifier ); void getZoomOutKey( int &key, Qt::KeyboardModifiers & ) const; virtual bool eventFilter( QObject *, QEvent * ); protected: /*! Rescale the parent widget \param factor Scale factor */ virtual void rescale( double factor ) = 0; virtual void widgetMousePressEvent( QMouseEvent * ); virtual void widgetMouseReleaseEvent( QMouseEvent * ); virtual void widgetMouseMoveEvent( QMouseEvent * ); virtual void widgetWheelEvent( QWheelEvent * ); virtual void widgetKeyPressEvent( QKeyEvent * ); virtual void widgetKeyReleaseEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/INSTALL�������������������������������������������������������������������������000644 �001750 �001750 �00000000035 12151666700 016277� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������see doc/html/qwtinstall.html ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_panner.h����������������������������������������������������������������000644 �001750 �001750 �00000005574 12151666701 020402� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PANNER_H #define QWT_PANNER_H 1 #include "qwt_global.h" #include #include class QCursor; /*! \brief QwtPanner provides panning of a widget QwtPanner grabs the contents of a widget, that can be dragged in all directions. The offset between the start and the end position is emitted by the panned signal. QwtPanner grabs the content of the widget into a pixmap and moves the pixmap around, without initiating any repaint events for the widget. Areas, that are not part of content are not painted while panning. This makes panning fast enough for widgets, where repaints are too slow for mouse movements. For widgets, where repaints are very fast it might be better to implement panning manually by mapping mouse events into paint events. */ class QWT_EXPORT QwtPanner: public QWidget { Q_OBJECT public: QwtPanner( QWidget* parent ); virtual ~QwtPanner(); void setEnabled( bool ); bool isEnabled() const; void setMouseButton( Qt::MouseButton, Qt::KeyboardModifiers = Qt::NoModifier ); void getMouseButton( Qt::MouseButton &button, Qt::KeyboardModifiers & ) const; void setAbortKey( int key, Qt::KeyboardModifiers = Qt::NoModifier ); void getAbortKey( int &key, Qt::KeyboardModifiers & ) const; void setCursor( const QCursor & ); const QCursor cursor() const; void setOrientations( Qt::Orientations ); Qt::Orientations orientations() const; bool isOrientationEnabled( Qt::Orientation ) const; virtual bool eventFilter( QObject *, QEvent * ); Q_SIGNALS: /*! Signal emitted, when panning is done \param dx Offset in horizontal direction \param dy Offset in vertical direction */ void panned( int dx, int dy ); /*! Signal emitted, while the widget moved, but panning is not finished. \param dx Offset in horizontal direction \param dy Offset in vertical direction */ void moved( int dx, int dy ); protected: virtual void widgetMousePressEvent( QMouseEvent * ); virtual void widgetMouseReleaseEvent( QMouseEvent * ); virtual void widgetMouseMoveEvent( QMouseEvent * ); virtual void widgetKeyPressEvent( QKeyEvent * ); virtual void widgetKeyReleaseEvent( QKeyEvent * ); virtual void paintEvent( QPaintEvent * ); virtual QBitmap contentsMask() const; virtual QPixmap grab() const; private: #ifndef QT_NO_CURSOR void showCursor( bool ); #endif class PrivateData; PrivateData *d_data; }; #endif ������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/linssid-app/prefsDialog.cpp�������������������������������������������������������������000664 �001750 �001750 �00000005147 12355414341 021066� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * File: Preferences.cpp * Author: warren * * Created on January 2, 2013, 2:40 PM */ #include #include #include "prefsDialog.h" #include "MainForm.h" struct sEntryValue { int plotMin; int plotMax; bool showGrid; bool logDataState; } prefsDialog::entryValue; prefsDialog::prefsDialog(int plotMin, int plotMax, bool showGrid, int logDataState, QObject* mommy) { widget.setupUi(this); prefsDialog::entryValue.plotMin = plotMin; prefsDialog::entryValue.plotMax = plotMax; prefsDialog::entryValue.showGrid = showGrid; prefsDialog::entryValue.logDataState = logDataState; // now set initial values of widgets in the prefs dialog widget.dbMinsb->setValue(plotMin); widget.dbMaxsb->setValue(plotMax); widget.plotGridcbx->setChecked(showGrid); widget.logDatacbx->setCheckState((Qt::CheckState) logDataState); // now finagle the upper and lower bounds of the spin boxes widget.dbMinsb->setMinimum(-100); widget.dbMaxsb->setMaximum(0); widget.dbMinsb->setMaximum(widget.dbMaxsb->value() - 10); widget.dbMaxsb->setMinimum(widget.dbMinsb->value() + 10); // disable user text editing the spin boxes. Yeah, this is the only way. widget.dbMinsb->findChild()->setReadOnly(true); widget.dbMaxsb->findChild()->setReadOnly(true); connect(prefsDialog::widget.dbMinsb, SIGNAL(valueChanged(int)), this, SLOT(minSbChanged(int))); connect(prefsDialog::widget.dbMaxsb, SIGNAL(valueChanged(int)), this, SLOT(maxSbChanged(int))); connect(prefsDialog::widget.plotGridcbx, SIGNAL(stateChanged(int)), this, SLOT(gridChanged(int))); connect(prefsDialog::widget.logDatacbx, SIGNAL(stateChanged(int)), mommy, SLOT(logPrefChanged(int))); connect(this, SIGNAL(plotPrefsChanged(int, int, bool)), mommy, SLOT(updatePlotPrefs(int, int, bool))); connect(this, SIGNAL(finished(int)), this, SLOT(bailOut(int))); } prefsDialog::~prefsDialog() { } void prefsDialog::minSbChanged(int newValue) { emit plotPrefsChanged(newValue, widget.dbMaxsb->value(), widget.plotGridcbx->isChecked()); widget.dbMaxsb->setMinimum(newValue + 10); } void prefsDialog::maxSbChanged(int newValue) { emit plotPrefsChanged(widget.dbMinsb->value(), newValue, widget.plotGridcbx->isChecked()); widget.dbMinsb->setMaximum(newValue - 10); } void prefsDialog::gridChanged(int newValue) { emit plotPrefsChanged(widget.dbMinsb->value(), widget.dbMaxsb->value(), newValue); } void prefsDialog::bailOut(int result) { if (result == 0) emit plotPrefsChanged(entryValue.plotMin, entryValue.plotMax, entryValue.showGrid); }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_point_polar.h�����������������������������������������������������������000644 �001750 �001750 �00000010737 12151666701 021442� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file */ #ifndef _QWT_POINT_POLAR_H_ #define _QWT_POINT_POLAR_H_ 1 #include "qwt_global.h" #include "qwt_math.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A point in polar coordinates In polar coordinates a point is determined by an angle and a distance. See http://en.wikipedia.org/wiki/Polar_coordinate_system */ class QWT_EXPORT QwtPointPolar { public: QwtPointPolar(); QwtPointPolar( double azimuth, double radius ); QwtPointPolar( const QwtPointPolar & ); QwtPointPolar( const QPointF & ); void setPoint( const QPointF & ); QPointF toPoint() const; bool isValid() const; bool isNull() const; double radius() const; double azimuth() const; double &rRadius(); double &rAzimuth(); void setRadius( double ); void setAzimuth( double ); bool operator==( const QwtPointPolar & ) const; bool operator!=( const QwtPointPolar & ) const; QwtPointPolar normalized() const; private: double d_azimuth; double d_radius; }; /*! Constructs a null point, with a radius and azimuth set to 0.0. \sa QPointF::isNull() */ inline QwtPointPolar::QwtPointPolar(): d_azimuth( 0.0 ), d_radius( 0.0 ) { } /*! Constructs a point with coordinates specified by radius and azimuth. \param azimuth Azimuth \param radius Radius */ inline QwtPointPolar::QwtPointPolar( double azimuth, double radius ): d_azimuth( azimuth ), d_radius( radius ) { } /*! Constructs a point using the values of the point specified. \param other Other point */ inline QwtPointPolar::QwtPointPolar( const QwtPointPolar &other ): d_azimuth( other.d_azimuth ), d_radius( other.d_radius ) { } //! Returns true if radius() >= 0.0 inline bool QwtPointPolar::isValid() const { return d_radius >= 0.0; } //! Returns true if radius() >= 0.0 inline bool QwtPointPolar::isNull() const { return d_radius == 0.0; } //! Returns the radius. inline double QwtPointPolar::radius() const { return d_radius; } //! Returns the azimuth. inline double QwtPointPolar::azimuth() const { return d_azimuth; } //! Returns the radius. inline double &QwtPointPolar::rRadius() { return d_radius; } //! Returns the azimuth. inline double &QwtPointPolar::rAzimuth() { return d_azimuth; } //! Sets the radius to radius. inline void QwtPointPolar::setRadius( double radius ) { d_radius = radius; } //! Sets the atimuth to atimuth. inline void QwtPointPolar::setAzimuth( double azimuth ) { d_azimuth = azimuth; } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtPointPolar & ); #endif inline QPoint qwtPolar2Pos( const QPoint &pole, double radius, double angle ) { const double x = pole.x() + radius * qCos( angle ); const double y = pole.y() - radius * qSin( angle ); return QPoint( qRound( x ), qRound( y ) ); } inline QPoint qwtDegree2Pos( const QPoint &pole, double radius, double angle ) { return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } inline QPointF qwtPolar2Pos( const QPointF &pole, double radius, double angle ) { const double x = pole.x() + radius * qCos( angle ); const double y = pole.y() - radius * qSin( angle ); return QPointF( x, y); } inline QPointF qwtDegree2Pos( const QPointF &pole, double radius, double angle ) { return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } inline QPointF qwtFastPolar2Pos( const QPointF &pole, double radius, double angle ) { #if QT_VERSION < 0x040601 const double x = pole.x() + radius * ::cos( angle ); const double y = pole.y() - radius * ::sin( angle ); #else const double x = pole.x() + radius * qFastCos( angle ); const double y = pole.y() - radius * qFastSin( angle ); #endif return QPointF( x, y); } inline QPointF qwtFastDegree2Pos( const QPointF &pole, double radius, double angle ) { return qwtFastPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } inline QwtPointPolar qwtFastPos2Polar( const QPointF &pos ) { return QwtPointPolar( qwtFastAtan2( pos.y(), pos.x() ), qSqrt( qwtSqr( pos.x() ) + qwtSqr( pos.y() ) ) ); } #endif ���������������������������������linssid-2.7/qwt-lib/src/qwt_panner.cpp��������������������������������������������������������������000644 �001750 �001750 �00000030227 12151666703 020730� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_panner.h" #include "qwt_picker.h" #include "qwt_painter.h" #include #include #include #include #include static QVector qwtActivePickers( QWidget *w ) { QVector pickers; QObjectList children = w->children(); for ( int i = 0; i < children.size(); i++ ) { QwtPicker *picker = qobject_cast( children[i] ); if ( picker && picker->isEnabled() ) pickers += picker; } return pickers; } class QwtPanner::PrivateData { public: PrivateData(): button( Qt::LeftButton ), buttonModifiers( Qt::NoModifier ), abortKey( Qt::Key_Escape ), abortKeyModifiers( Qt::NoModifier ), #ifndef QT_NO_CURSOR cursor( NULL ), restoreCursor( NULL ), hasCursor( false ), #endif isEnabled( false ) { orientations = Qt::Vertical | Qt::Horizontal; } ~PrivateData() { #ifndef QT_NO_CURSOR delete cursor; delete restoreCursor; #endif } Qt::MouseButton button; Qt::KeyboardModifiers buttonModifiers; int abortKey; Qt::KeyboardModifiers abortKeyModifiers; QPoint initialPos; QPoint pos; QPixmap pixmap; QBitmap contentsMask; #ifndef QT_NO_CURSOR QCursor *cursor; QCursor *restoreCursor; bool hasCursor; #endif bool isEnabled; Qt::Orientations orientations; }; /*! Creates an panner that is enabled for the left mouse button. \param parent Parent widget to be panned */ QwtPanner::QwtPanner( QWidget *parent ): QWidget( parent ) { d_data = new PrivateData(); setAttribute( Qt::WA_TransparentForMouseEvents ); setAttribute( Qt::WA_NoSystemBackground ); setFocusPolicy( Qt::NoFocus ); hide(); setEnabled( true ); } //! Destructor QwtPanner::~QwtPanner() { delete d_data; } /*! Change the mouse button and modifiers used for panning The defaults are Qt::LeftButton and Qt::NoModifier */ void QwtPanner::setMouseButton( Qt::MouseButton button, Qt::KeyboardModifiers modifiers ) { d_data->button = button; d_data->buttonModifiers = modifiers; } //! Get mouse button and modifiers used for panning void QwtPanner::getMouseButton( Qt::MouseButton &button, Qt::KeyboardModifiers &modifiers ) const { button = d_data->button; modifiers = d_data->buttonModifiers; } /*! Change the abort key The defaults are Qt::Key_Escape and Qt::NoModifiers \param key Key ( See Qt::Keycode ) \param modifiers Keyboard modifiers */ void QwtPanner::setAbortKey( int key, Qt::KeyboardModifiers modifiers ) { d_data->abortKey = key; d_data->abortKeyModifiers = modifiers; } //! Get the abort key and modifiers void QwtPanner::getAbortKey( int &key, Qt::KeyboardModifiers &modifiers ) const { key = d_data->abortKey; modifiers = d_data->abortKeyModifiers; } /*! Change the cursor, that is active while panning The default is the cursor of the parent widget. \param cursor New cursor \sa setCursor() */ #ifndef QT_NO_CURSOR void QwtPanner::setCursor( const QCursor &cursor ) { d_data->cursor = new QCursor( cursor ); } #endif /*! \return Cursor that is active while panning \sa setCursor() */ #ifndef QT_NO_CURSOR const QCursor QwtPanner::cursor() const { if ( d_data->cursor ) return *d_data->cursor; if ( parentWidget() ) return parentWidget()->cursor(); return QCursor(); } #endif /*! \brief En/disable the panner When enabled is true an event filter is installed for the observed widget, otherwise the event filter is removed. \param on true or false \sa isEnabled(), eventFilter() */ void QwtPanner::setEnabled( bool on ) { if ( d_data->isEnabled != on ) { d_data->isEnabled = on; QWidget *w = parentWidget(); if ( w ) { if ( d_data->isEnabled ) { w->installEventFilter( this ); } else { w->removeEventFilter( this ); hide(); } } } } /*! Set the orientations, where panning is enabled The default value is in both directions: Qt::Horizontal | Qt::Vertical /param o Orientation */ void QwtPanner::setOrientations( Qt::Orientations o ) { d_data->orientations = o; } //! Return the orientation, where paning is enabled Qt::Orientations QwtPanner::orientations() const { return d_data->orientations; } /*! \return True if an orientation is enabled \sa orientations(), setOrientations() */ bool QwtPanner::isOrientationEnabled( Qt::Orientation o ) const { return d_data->orientations & o; } /*! \return true when enabled, false otherwise \sa setEnabled, eventFilter() */ bool QwtPanner::isEnabled() const { return d_data->isEnabled; } /*! \brief Paint event Repaint the grabbed pixmap on its current position and fill the empty spaces by the background of the parent widget. \param pe Paint event */ void QwtPanner::paintEvent( QPaintEvent *pe ) { int dx = d_data->pos.x() - d_data->initialPos.x(); int dy = d_data->pos.y() - d_data->initialPos.y(); QRect r( 0, 0, d_data->pixmap.width(), d_data->pixmap.height() ); r.moveCenter( QPoint( r.center().x() + dx, r.center().y() + dy ) ); QPixmap pm( size() ); QwtPainter::fillPixmap( parentWidget(), pm ); QPainter painter( &pm ); if ( !d_data->contentsMask.isNull() ) { QPixmap masked = d_data->pixmap; masked.setMask( d_data->contentsMask ); painter.drawPixmap( r, masked ); } else { painter.drawPixmap( r, d_data->pixmap ); } painter.end(); if ( !d_data->contentsMask.isNull() ) pm.setMask( d_data->contentsMask ); painter.begin( this ); painter.setClipRegion( pe->region() ); painter.drawPixmap( 0, 0, pm ); } /*! \brief Calculate a mask for the contents of the panned widget Sometimes only parts of the contents of a widget should be panned. F.e. for a widget with a styled background with rounded borders only the area inside of the border should be panned. \return An empty bitmap, indicating no mask */ QBitmap QwtPanner::contentsMask() const { return QBitmap(); } /*! Grab the widget into a pixmap. \return Grabbed pixmap */ QPixmap QwtPanner::grab() const { #if QT_VERSION >= 0x050000 return parentWidget()->grab( parentWidget()->rect() ); #else return QPixmap::grabWidget( parentWidget() ); #endif } /*! \brief Event filter When isEnabled() is true mouse events of the observed widget are filtered. \param object Object to be filtered \param event Event \return Always false, beside for paint events for the parent widget. \sa widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseMoveEvent() */ bool QwtPanner::eventFilter( QObject *object, QEvent *event ) { if ( object == NULL || object != parentWidget() ) return false; switch ( event->type() ) { case QEvent::MouseButtonPress: { widgetMousePressEvent( static_cast( event ) ); break; } case QEvent::MouseMove: { widgetMouseMoveEvent( static_cast( event ) ); break; } case QEvent::MouseButtonRelease: { widgetMouseReleaseEvent( static_cast( event ) ); break; } case QEvent::KeyPress: { widgetKeyPressEvent( static_cast( event ) ); break; } case QEvent::KeyRelease: { widgetKeyReleaseEvent( static_cast( event ) ); break; } case QEvent::Paint: { if ( isVisible() ) return true; break; } default:; } return false; } /*! Handle a mouse press event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseMoveEvent(), */ void QwtPanner::widgetMousePressEvent( QMouseEvent *mouseEvent ) { if ( ( mouseEvent->button() != d_data->button ) || ( mouseEvent->modifiers() != d_data->buttonModifiers ) ) { return; } QWidget *w = parentWidget(); if ( w == NULL ) return; #ifndef QT_NO_CURSOR showCursor( true ); #endif d_data->initialPos = d_data->pos = mouseEvent->pos(); setGeometry( parentWidget()->rect() ); // We don't want to grab the picker ! QVector pickers = qwtActivePickers( parentWidget() ); for ( int i = 0; i < pickers.size(); i++ ) pickers[i]->setEnabled( false ); d_data->pixmap = grab(); d_data->contentsMask = contentsMask(); for ( int i = 0; i < pickers.size(); i++ ) pickers[i]->setEnabled( true ); show(); } /*! Handle a mouse move event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent() */ void QwtPanner::widgetMouseMoveEvent( QMouseEvent *mouseEvent ) { if ( !isVisible() ) return; QPoint pos = mouseEvent->pos(); if ( !isOrientationEnabled( Qt::Horizontal ) ) pos.setX( d_data->initialPos.x() ); if ( !isOrientationEnabled( Qt::Vertical ) ) pos.setY( d_data->initialPos.y() ); if ( pos != d_data->pos && rect().contains( pos ) ) { d_data->pos = pos; update(); Q_EMIT moved( d_data->pos.x() - d_data->initialPos.x(), d_data->pos.y() - d_data->initialPos.y() ); } } /*! Handle a mouse release event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseMoveEvent(), */ void QwtPanner::widgetMouseReleaseEvent( QMouseEvent *mouseEvent ) { if ( isVisible() ) { hide(); #ifndef QT_NO_CURSOR showCursor( false ); #endif QPoint pos = mouseEvent->pos(); if ( !isOrientationEnabled( Qt::Horizontal ) ) pos.setX( d_data->initialPos.x() ); if ( !isOrientationEnabled( Qt::Vertical ) ) pos.setY( d_data->initialPos.y() ); d_data->pixmap = QPixmap(); d_data->contentsMask = QBitmap(); d_data->pos = pos; if ( d_data->pos != d_data->initialPos ) { Q_EMIT panned( d_data->pos.x() - d_data->initialPos.x(), d_data->pos.y() - d_data->initialPos.y() ); } } } /*! Handle a key press event for the observed widget. \param keyEvent Key event \sa eventFilter(), widgetKeyReleaseEvent() */ void QwtPanner::widgetKeyPressEvent( QKeyEvent *keyEvent ) { if ( ( keyEvent->key() == d_data->abortKey ) && ( keyEvent->modifiers() == d_data->abortKeyModifiers ) ) { hide(); #ifndef QT_NO_CURSOR showCursor( false ); #endif d_data->pixmap = QPixmap(); } } /*! Handle a key release event for the observed widget. \param keyEvent Key event \sa eventFilter(), widgetKeyReleaseEvent() */ void QwtPanner::widgetKeyReleaseEvent( QKeyEvent *keyEvent ) { Q_UNUSED( keyEvent ); } #ifndef QT_NO_CURSOR void QwtPanner::showCursor( bool on ) { if ( on == d_data->hasCursor ) return; QWidget *w = parentWidget(); if ( w == NULL || d_data->cursor == NULL ) return; d_data->hasCursor = on; if ( on ) { if ( w->testAttribute( Qt::WA_SetCursor ) ) { delete d_data->restoreCursor; d_data->restoreCursor = new QCursor( w->cursor() ); } w->setCursor( *d_data->cursor ); } else { if ( d_data->restoreCursor ) { w->setCursor( *d_data->restoreCursor ); delete d_data->restoreCursor; d_data->restoreCursor = NULL; } else w->unsetCursor(); } } #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_slider.h����������������������������������������������������������������000644 �001750 �001750 �00000006650 12151666701 020375� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SLIDER_H #define QWT_SLIDER_H #include "qwt_global.h" #include "qwt_abstract_slider.h" class QwtScaleDraw; /*! \brief The Slider Widget QwtSlider is a slider widget which operates on an interval of type double. Its position is related to a scale showing the current value. The slider can be customized by having a through, a groove - or both. \image html sliders.png */ class QWT_EXPORT QwtSlider: public QwtAbstractSlider { Q_OBJECT Q_ENUMS( ScalePosition BackgroundStyle ) Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation ) Q_PROPERTY( ScalePosition scalePosition READ scalePosition WRITE setScalePosition ) Q_PROPERTY( bool trough READ hasTrough WRITE setTrough ) Q_PROPERTY( bool groove READ hasGroove WRITE setGroove ) Q_PROPERTY( QSize handleSize READ handleSize WRITE setHandleSize ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( int spacing READ spacing WRITE setSpacing ) public: /*! Position of the scale \sa QwtSlider(), setScalePosition(), setOrientation() */ enum ScalePosition { //! The slider has no scale NoScale, //! The scale is right of a vertical or below a horizontal slider LeadingScale, //! The scale is left of a vertical or above a horizontal slider TrailingScale }; explicit QwtSlider( QWidget *parent = NULL ); explicit QwtSlider( Qt::Orientation, QWidget *parent = NULL ); virtual ~QwtSlider(); void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; void setScalePosition( ScalePosition ); ScalePosition scalePosition() const; void setTrough( bool ); bool hasTrough() const; void setGroove( bool ); bool hasGroove() const; void setHandleSize( const QSize & ); QSize handleSize() const; void setBorderWidth( int bw ); int borderWidth() const; void setSpacing( int ); int spacing() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; void setUpdateInterval( int ); int updateInterval() const; protected: virtual double scrolledTo( const QPoint & ) const; virtual bool isScrollPosition( const QPoint & ) const; virtual void drawSlider ( QPainter *, const QRect & ) const; virtual void drawHandle( QPainter *, const QRect &, int pos ) const; virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void resizeEvent( QResizeEvent * ); virtual void paintEvent ( QPaintEvent * ); virtual void changeEvent( QEvent * ); virtual void timerEvent( QTimerEvent * ); virtual void scaleChange(); QRect sliderRect() const; QRect handleRect() const; private: QwtScaleDraw *scaleDraw(); void layoutSlider( bool ); void initSlider( Qt::Orientation ); class PrivateData; PrivateData *d_data; }; #endif ����������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_legend.h����������������������������������������������������������������000644 �001750 �001750 �00000006562 12151666701 020353� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_H #define QWT_LEGEND_H #include "qwt_global.h" #include "qwt_abstract_legend.h" #include class QScrollBar; /*! \brief The legend widget The QwtLegend widget is a tabular arrangement of legend items. Legend items might be any type of widget, but in general they will be a QwtLegendLabel. \sa QwtLegendLabel, QwtPlotItem, QwtPlot */ class QWT_EXPORT QwtLegend : public QwtAbstractLegend { Q_OBJECT public: explicit QwtLegend( QWidget *parent = NULL ); virtual ~QwtLegend(); void setMaxColumns( uint numColums ); uint maxColumns() const; void setDefaultItemMode( QwtLegendData::Mode ); QwtLegendData::Mode defaultItemMode() const; QWidget *contentsWidget(); const QWidget *contentsWidget() const; QWidget *legendWidget( const QVariant & ) const; QList legendWidgets( const QVariant & ) const; QVariant itemInfo( const QWidget * ) const; virtual bool eventFilter( QObject *, QEvent * ); virtual QSize sizeHint() const; virtual int heightForWidth( int w ) const; QScrollBar *horizontalScrollBar() const; QScrollBar *verticalScrollBar() const; virtual void renderLegend( QPainter *, const QRectF &, bool fillBackground ) const; virtual void renderItem( QPainter *, const QWidget *, const QRectF &, bool fillBackground ) const; virtual bool isEmpty() const; virtual int scrollExtent( Qt::Orientation ) const; Q_SIGNALS: /*! A signal which is emitted when the user has clicked on a legend label, which is in QwtLegendData::Clickable mode. \param itemInfo Info for the item item of the selected legend item \param index Index of the legend label in the list of widgets that are associated with the plot item \note clicks are disabled as default \sa setDefaultItemMode(), defaultItemMode(), QwtPlot::itemToInfo() */ void clicked( const QVariant &itemInfo, int index ); /*! A signal which is emitted when the user has clicked on a legend label, which is in QwtLegendData::Checkable mode \param itemInfo Info for the item of the selected legend label \param index Index of the legend label in the list of widgets that are associated with the plot item \param on True when the legend label is checked \note clicks are disabled as default \sa setDefaultItemMode(), defaultItemMode(), QwtPlot::itemToInfo() */ void checked( const QVariant &itemInfo, bool on, int index ); public Q_SLOTS: virtual void updateLegend( const QVariant &, const QList & ); protected Q_SLOTS: void itemClicked(); void itemChecked( bool ); protected: virtual QWidget *createWidget( const QwtLegendData & ) const; virtual void updateWidget( QWidget *widget, const QwtLegendData &data ); private: void updateTabOrder(); class PrivateData; PrivateData *d_data; }; #endif ����������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_graphic.h���������������������������������������������������������������000644 �001750 �001750 �00000013124 12151666701 020522� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_GRAPHIC_H #define QWT_GRAPHIC_H #include "qwt_global.h" #include "qwt_null_paintdevice.h" #include #include #include class QwtPainterCommand; /*! \brief A paint device for scalable graphics QwtGraphic is the representation of a graphic that is tailored for scalability. Like QPicture it will be initialized by QPainter operations and replayed later to any target paint device. While the usual image representations QImage and QPixmap are not scalable Qt offers two paint devices, that might be candidates for representing a vector graphic: - QPicture\n Unfortunately QPicture had been forgotten, when Qt4 introduced floating point based render engines. Its API is still on integers, what make it unusable for proper scaling. - QSvgRenderer/QSvgGenerator\n Unfortunately QSvgRenderer hides to much information about its nodes in internal APIs, that are necessary proper layout calculations. Also it is derived from QObject and can't be copied like QImage/QPixmap. Also QSvgRenderer/QSvgGenerator are no complete SVG implementations with a questionable future in Qt 5. QwtGraphic maps all scalable drawing primitives to a QPainterPath and stores them together with the painter state changes ( pen, brush, transformation ... ) in a list of QwtPaintCommands. For being a complete QPaintDevice it also stores pixmaps or images, what is somehow against the idea of the class, because these objects can be scaled without a loss in quality. The main issue about scaling a QwtGraphic object are the pens used for drawing the outlines of the painter paths. While non cosmetic pens ( QPen::isCosmetic() ) are scaled with the same ratio as the path, cosmetic pens have a fixed width. A graphic might have paths with different pens - cosmetic and non-cosmetic. QwtGraphic caches 2 different rectangles: - control point rectangle\n The control point rectangle is the bounding rectangle of all control point rectangles of the painter paths, or the target rectangle of the pixmaps/images. - bounding rectangle\n The bounding rectangle extends the control point rectangle by what is needed for rendering the outline with an unscaled pen. Because the offset for drawing the outline depends on the shape of the painter path ( the peak of a triangle is different than the flat side ) scaling with a fixed aspect ratio always needs to be calculated from the control point rectangle. \sa QwtPainterCommand */ class QWT_EXPORT QwtGraphic: public QwtNullPaintDevice { public: /*! Hint how to render a graphic \sa setRenderHint(), testRenderHint() */ enum RenderHint { /*! When RenderPensUnscaled is set non cosmetic pens are painted unscaled - like cosmetic pens. The difference to using cosmetic pens is, when the graphic is rendered to a document in a scalable vector format ( PDF, SVG ): the width of non cosmetic pens will be scaled by the document viewer. */ RenderPensUnscaled = 0x1 }; /*! \brief Render hints The default setting is to disable all hints */ typedef QFlags RenderHints; QwtGraphic(); QwtGraphic( const QwtGraphic & ); virtual ~QwtGraphic(); QwtGraphic& operator=( const QwtGraphic & ); void reset(); bool isNull() const; bool isEmpty() const; void render( QPainter * ) const; void render( QPainter *, const QSizeF &, Qt::AspectRatioMode = Qt::IgnoreAspectRatio ) const; void render( QPainter *, const QRectF &, Qt::AspectRatioMode = Qt::IgnoreAspectRatio ) const; void render( QPainter *, const QPointF &, Qt::Alignment = Qt::AlignTop | Qt::AlignLeft ) const; QPixmap toPixmap() const; QPixmap toPixmap( const QSize &, Qt::AspectRatioMode = Qt::IgnoreAspectRatio ) const; QImage toImage() const; QImage toImage( const QSize &, Qt::AspectRatioMode = Qt::IgnoreAspectRatio ) const; QRectF scaledBoundingRect( double sx, double sy ) const; QRectF boundingRect() const; QRectF controlPointRect() const; const QVector< QwtPainterCommand > &commands() const; void setCommands( QVector< QwtPainterCommand > & ); void setDefaultSize( const QSizeF & ); QSizeF defaultSize() const; void setRenderHint( RenderHint, bool on = true ); bool testRenderHint( RenderHint ) const; protected: virtual QSize sizeMetrics() const; virtual void drawPath( const QPainterPath & ); virtual void drawPixmap( const QRectF &, const QPixmap &, const QRectF & ); virtual void drawImage( const QRectF &, const QImage &, const QRectF &, Qt::ImageConversionFlags ); virtual void updateState( const QPaintEngineState &state ); private: void updateBoundingRect( const QRectF & ); void updateControlPointRect( const QRectF & ); class PathInfo; class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtGraphic::RenderHints ) Q_DECLARE_METATYPE( QwtGraphic ) #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_abstract_legend.cpp�����������������������������������������������������000644 �001750 �001750 �00000001641 12151666703 022564� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_legend.h" /*! Constructor \param parent Parent widget */ QwtAbstractLegend::QwtAbstractLegend( QWidget *parent ): QFrame( parent ) { } //! Destructor QwtAbstractLegend::~QwtAbstractLegend() { } /*! Return the extent, that is needed for elements to scroll the legend ( usually scrollbars ), \param orientation Orientation \return Extent of the corresponding scroll element */ int QwtAbstractLegend::scrollExtent( Qt::Orientation orientation ) const { Q_UNUSED( orientation ); return 0; } �����������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/qwt.prf�������������������������������������������������������������������������000644 �001750 �001750 �00000001456 12151666676 016616� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ include ( ./qwtconfig.pri ) include ( ./qwtfunctions.pri ) contains(QWT_CONFIG, QwtDll) { DEFINES *= QWT_DLL } contains(QWT_CONFIG, QwtSvg) { QT *= svg } else { DEFINES *= QWT_NO_SVG } contains(QWT_CONFIG, QwtFramework) { INCLUDEPATH *= $${QWT_INSTALL_LIBS}/qwt.framework/Headers LIBS *= -F$${QWT_INSTALL_LIBS} } else { INCLUDEPATH *= $${QWT_INSTALL_HEADERS} LIBS *= -L$${QWT_INSTALL_LIBS} } qwtAddLibrary(qwt) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_pixel_matrix.h����������������������������������������������������������000644 �001750 �001750 �00000004431 12151666701 021613� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PIXEL_MATRIX_H #define QWT_PIXEL_MATRIX_H #include "qwt_global.h" #include #include /*! \brief A bit field corresponding to the pixels of a rectangle QwtPixelMatrix is intended to filter out duplicates in an unsorted array of points. */ class QWT_EXPORT QwtPixelMatrix: public QBitArray { public: QwtPixelMatrix( const QRect& rect ); ~QwtPixelMatrix(); void setRect( const QRect& rect ); QRect rect() const; bool testPixel( int x, int y ) const; bool testAndSetPixel( int x, int y, bool on ); int index( int x, int y ) const; private: QRect d_rect; }; /*! \brief Test if a pixel has been set \param x X-coordinate \param y Y-coordinate \return true, when pos is outside of rect(), or when the pixel has already been set. */ inline bool QwtPixelMatrix::testPixel( int x, int y ) const { const int idx = index( x, y ); return ( idx >= 0 ) ? testBit( idx ) : true; } /*! \brief Set a pixel and test if a pixel has been set before \param x X-coordinate \param y Y-coordinate \param on Set/Clear the pixel \return true, when pos is outside of rect(), or when the pixel was set before. */ inline bool QwtPixelMatrix::testAndSetPixel( int x, int y, bool on ) { const int idx = index( x, y ); if ( idx < 0 ) return true; const bool onBefore = testBit( idx ); setBit( idx, on ); return onBefore; } /*! \brief Calculate the index in the bit field corresponding to a position \param x X-coordinate \param y Y-coordinate \return Index, when rect() contains pos - otherwise -1. */ inline int QwtPixelMatrix::index( int x, int y ) const { const int dx = x - d_rect.x(); if ( dx < 0 || dx >= d_rect.width() ) return -1; const int dy = y - d_rect.y(); if ( dy < 0 || dy >= d_rect.height() ) return -1; return dy * d_rect.width() + dx; } #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_slider.cpp��������������������������������������������������������������000644 �001750 �001750 �00000055724 12151666703 020740� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_slider.h" #include "qwt_painter.h" #include "qwt_scale_draw.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include #include static QSize qwtHandleSize( const QSize &size, Qt::Orientation orientation, bool hasTrough ) { QSize handleSize = size; if ( handleSize.isEmpty() ) { const int handleThickness = 16; handleSize.setWidth( 2 * handleThickness ); handleSize.setHeight( handleThickness ); if ( !hasTrough ) handleSize.transpose(); if ( orientation == Qt::Vertical ) handleSize.transpose(); } return handleSize; } static QwtScaleDraw::Alignment qwtScaleDrawAlignment( Qt::Orientation orientation, QwtSlider::ScalePosition scalePos ) { QwtScaleDraw::Alignment align; if ( orientation == Qt::Vertical ) { // NoScale lays out like Left if ( scalePos == QwtSlider::LeadingScale ) align = QwtScaleDraw::RightScale; else align = QwtScaleDraw::LeftScale; } else { // NoScale lays out like Bottom if ( scalePos == QwtSlider::TrailingScale ) align = QwtScaleDraw::TopScale; else align = QwtScaleDraw::BottomScale; } return align; } class QwtSlider::PrivateData { public: PrivateData(): repeatTimerId( 0 ), updateInterval( 150 ), stepsIncrement( 0 ), pendingValueChange( false ), borderWidth( 2 ), spacing( 4 ), scalePosition( QwtSlider::TrailingScale ), hasTrough( true ), hasGroove( false ), mouseOffset( 0 ) { } int repeatTimerId; bool timerTick; int updateInterval; int stepsIncrement; bool pendingValueChange; QRect sliderRect; QSize handleSize; int borderWidth; int spacing; Qt::Orientation orientation; QwtSlider::ScalePosition scalePosition; bool hasTrough; bool hasGroove; int mouseOffset; mutable QSize sizeHintCache; }; /*! Construct vertical slider in QwtSlider::Trough style with a scale to the left. The scale is initialized to [0.0, 100.0] and the value set to 0.0. \param parent Parent widget \sa setOrientation(), setScalePosition(), setBackgroundStyle() */ QwtSlider::QwtSlider( QWidget *parent ): QwtAbstractSlider( parent ) { initSlider( Qt::Vertical ); } /*! Construct a slider in QwtSlider::Trough style When orientation is Qt::Vertical the scale will be aligned to the left - otherwise at the the top of the slider. The scale is initialized to [0.0, 100.0] and the value set to 0.0. \param parent Parent widget \param orientation Orientation of the slider. */ QwtSlider::QwtSlider( Qt::Orientation orientation, QWidget *parent ): QwtAbstractSlider( parent ) { initSlider( orientation ); } //! Destructor QwtSlider::~QwtSlider() { delete d_data; } void QwtSlider::initSlider( Qt::Orientation orientation ) { if ( orientation == Qt::Vertical ) setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ); else setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); d_data = new QwtSlider::PrivateData; d_data->orientation = orientation; scaleDraw()->setAlignment( qwtScaleDrawAlignment( orientation, d_data->scalePosition ) ); scaleDraw()->setLength( 100 ); setScale( 0.0, 100.0 ); setValue( 0.0 ); } /*! \brief Set the orientation. \param orientation Allowed values are Qt::Horizontal and Qt::Vertical. \sa orientation(), scalePosition() */ void QwtSlider::setOrientation( Qt::Orientation orientation ) { if ( orientation == d_data->orientation ) return; d_data->orientation = orientation; scaleDraw()->setAlignment( qwtScaleDrawAlignment( orientation, d_data->scalePosition ) ); if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } /*! \return Orientation \sa setOrientation() */ Qt::Orientation QwtSlider::orientation() const { return d_data->orientation; } /*! \brief Change the position of the scale \param scalePosition Position of the scale. \sa ScalePosition, scalePosition() */ void QwtSlider::setScalePosition( ScalePosition scalePosition ) { if ( d_data->scalePosition == scalePosition ) return; d_data->scalePosition = scalePosition; scaleDraw()->setAlignment( qwtScaleDrawAlignment( d_data->orientation, scalePosition ) ); if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } /*! \return Position of the scale \sa setScalePosition() */ QwtSlider::ScalePosition QwtSlider::scalePosition() const { return d_data->scalePosition; } /*! \brief Change the slider's border width The border width is used for drawing the slider handle and the trough. \param width Border width \sa borderWidth() */ void QwtSlider::setBorderWidth( int width ) { if ( width < 0 ) width = 0; if ( width != d_data->borderWidth ) { d_data->borderWidth = width; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return the border width. \sa setBorderWidth() */ int QwtSlider::borderWidth() const { return d_data->borderWidth; } /*! \brief Change the spacing between trough and scale A spacing of 0 means, that the backbone of the scale is covered by the trough. The default setting is 4 pixels. \param spacing Number of pixels \sa spacing(); */ void QwtSlider::setSpacing( int spacing ) { if ( spacing <= 0 ) spacing = 0; if ( spacing != d_data->spacing ) { d_data->spacing = spacing; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return Number of pixels between slider and scale \sa setSpacing() */ int QwtSlider::spacing() const { return d_data->spacing; } /*! \brief Set the slider's handle size When the size is empty the slider handle will be painted with a default size depending on its orientation() and backgroundStyle(). \param size New size \sa handleSize() */ void QwtSlider::setHandleSize( const QSize &size ) { if ( size != d_data->handleSize ) { d_data->handleSize = size; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return Size of the handle. \sa setHandleSize() */ QSize QwtSlider::handleSize() const { return d_data->handleSize; } /*! \brief Set a scale draw For changing the labels of the scales, it is necessary to derive from QwtScaleDraw and overload QwtScaleDraw::label(). \param scaleDraw ScaleDraw object, that has to be created with new and will be deleted in ~QwtSlider() or the next call of setScaleDraw(). \sa scaleDraw() */ void QwtSlider::setScaleDraw( QwtScaleDraw *scaleDraw ) { const QwtScaleDraw *previousScaleDraw = this->scaleDraw(); if ( scaleDraw == NULL || scaleDraw == previousScaleDraw ) return; if ( previousScaleDraw ) scaleDraw->setAlignment( previousScaleDraw->alignment() ); setAbstractScaleDraw( scaleDraw ); if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } /*! \return the scale draw of the slider \sa setScaleDraw() */ const QwtScaleDraw *QwtSlider::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the slider \sa setScaleDraw() */ QwtScaleDraw *QwtSlider::scaleDraw() { return static_cast( abstractScaleDraw() ); } //! Notify changed scale void QwtSlider::scaleChange() { QwtAbstractSlider::scaleChange(); if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } /*! \brief Specify the update interval for automatic scrolling The minimal accepted value is 50 ms. \param interval Update interval in milliseconds \sa setUpdateInterval() */ void QwtSlider::setUpdateInterval( int interval ) { d_data->updateInterval = qMax( interval, 50 ); } /*! \return Update interval in milliseconds for automatic scrolling \sa setUpdateInterval() */ int QwtSlider::updateInterval() const { return d_data->updateInterval; } /*! Draw the slider into the specified rectangle. \param painter Painter \param sliderRect Bounding rectangle of the slider */ void QwtSlider::drawSlider( QPainter *painter, const QRect &sliderRect ) const { QRect innerRect( sliderRect ); if ( d_data->hasTrough ) { const int bw = d_data->borderWidth; innerRect = sliderRect.adjusted( bw, bw, -bw, -bw ); painter->fillRect( innerRect, palette().brush( QPalette::Mid ) ); qDrawShadePanel( painter, sliderRect, palette(), true, bw, NULL ); } const QSize handleSize = qwtHandleSize( d_data->handleSize, d_data->orientation, d_data->hasTrough ); if ( d_data->hasGroove ) { const int slotExtent = 4; const int slotMargin = 4; QRect slotRect; if ( orientation() == Qt::Horizontal ) { int slotOffset = qMax( 1, handleSize.width() / 2 - slotMargin ); int slotHeight = slotExtent + ( innerRect.height() % 2 ); slotRect.setWidth( innerRect.width() - 2 * slotOffset ); slotRect.setHeight( slotHeight ); } else { int slotOffset = qMax( 1, handleSize.height() / 2 - slotMargin ); int slotWidth = slotExtent + ( innerRect.width() % 2 ); slotRect.setWidth( slotWidth ); slotRect.setHeight( innerRect.height() - 2 * slotOffset ); } slotRect.moveCenter( innerRect.center() ); QBrush brush = palette().brush( QPalette::Dark ); qDrawShadePanel( painter, slotRect, palette(), true, 1 , &brush ); } if ( isValid() ) drawHandle( painter, handleRect(), transform( value() ) ); } /*! Draw the thumb at a position \param painter Painter \param handleRect Bounding rectangle of the handle \param pos Position of the handle marker in widget coordinates */ void QwtSlider::drawHandle( QPainter *painter, const QRect &handleRect, int pos ) const { const int bw = d_data->borderWidth; qDrawShadePanel( painter, handleRect, palette(), false, bw, &palette().brush( QPalette::Button ) ); pos++; // shade line points one pixel below if ( orientation() == Qt::Horizontal ) { qDrawShadeLine( painter, pos, handleRect.top() + bw, pos, handleRect.bottom() - bw, palette(), true, 1 ); } else // Vertical { qDrawShadeLine( painter, handleRect.left() + bw, pos, handleRect.right() - bw, pos, palette(), true, 1 ); } } /*! \brief Determine what to do when the user presses a mouse button. \param pos Mouse position \retval True, when handleRect() contains pos \sa scrolledTo() */ bool QwtSlider::isScrollPosition( const QPoint &pos ) const { if ( handleRect().contains( pos ) ) { const double v = ( orientation() == Qt::Horizontal ) ? pos.x() : pos.y(); d_data->mouseOffset = v - transform( value() ); return true; } return false; } /*! \brief Determine the value for a new position of the slider handle. \param pos Mouse position \return Value for the mouse position \sa isScrollPosition() */ double QwtSlider::scrolledTo( const QPoint &pos ) const { int p = ( orientation() == Qt::Horizontal ) ? pos.x() : pos.y(); p -= d_data->mouseOffset; int min = transform( lowerBound() ); int max = transform( upperBound() ); if ( min > max ) qSwap( min, max ); p = qBound( min, p, max ); return invTransform( p ); } /*! Mouse press event handler \param event Mouse event */ void QwtSlider::mousePressEvent( QMouseEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } const QPoint pos = event->pos(); if ( isValid() && d_data->sliderRect.contains( pos ) ) { if ( !handleRect().contains( pos ) ) { const int markerPos = transform( value() ); d_data->stepsIncrement = pageSteps(); if ( d_data->orientation == Qt::Horizontal ) { if ( pos.x() < markerPos ) d_data->stepsIncrement = -d_data->stepsIncrement; } else { if ( pos.y() < markerPos ) d_data->stepsIncrement = -d_data->stepsIncrement; } if ( isInverted() ) d_data->stepsIncrement = -d_data->stepsIncrement; d_data->timerTick = false; d_data->repeatTimerId = startTimer( qMax( 250, 2 * updateInterval() ) ); return; } } QwtAbstractSlider::mousePressEvent( event ); } /*! Mouse release event handler \param event Mouse event */ void QwtSlider::mouseReleaseEvent( QMouseEvent *event ) { if ( d_data->repeatTimerId > 0 ) { killTimer( d_data->repeatTimerId ); d_data->repeatTimerId = 0; d_data->timerTick = false; d_data->stepsIncrement = 0; } if ( d_data->pendingValueChange ) { d_data->pendingValueChange = false; Q_EMIT valueChanged( value() ); } QwtAbstractSlider::mouseReleaseEvent( event ); } /*! Timer event handler Handles the timer, when the mouse stays pressed inside the sliderRect(). \param event Mouse event */ void QwtSlider::timerEvent( QTimerEvent *event ) { if ( event->timerId() != d_data->repeatTimerId ) { QwtAbstractSlider::timerEvent( event ); return; } if ( !isValid() ) { killTimer( d_data->repeatTimerId ); d_data->repeatTimerId = 0; return; } const double v = value(); incrementValue( d_data->stepsIncrement ); if ( v != value() ) { if ( isTracking() ) Q_EMIT valueChanged( value() ); else d_data->pendingValueChange = true; Q_EMIT sliderMoved( value() ); } if ( !d_data->timerTick ) { // restart the timer with a shorter interval killTimer( d_data->repeatTimerId ); d_data->repeatTimerId = startTimer( updateInterval() ); d_data->timerTick = true; } } /*! Qt paint event handler \param event Paint event */ void QwtSlider::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); if ( d_data->scalePosition != QwtSlider::NoScale ) { if ( !d_data->sliderRect.contains( event->rect() ) ) scaleDraw()->draw( &painter, palette() ); } drawSlider( &painter, d_data->sliderRect ); if ( hasFocus() ) QwtPainter::drawFocusRect( &painter, this, d_data->sliderRect ); } /*! Qt resize event handler \param event Resize event */ void QwtSlider::resizeEvent( QResizeEvent *event ) { Q_UNUSED( event ); layoutSlider( false ); } /*! Handles QEvent::StyleChange and QEvent::FontChange events \param event Change event */ void QwtSlider::changeEvent( QEvent *event ) { if ( event->type() == QEvent::StyleChange || event->type() == QEvent::FontChange ) { if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } QwtAbstractSlider::changeEvent( event ); } /*! Recalculate the slider's geometry and layout based on the current geometry and fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtSlider::layoutSlider( bool update_geometry ) { int bw = 0; if ( d_data->hasTrough ) bw = d_data->borderWidth; const QSize handleSize = qwtHandleSize( d_data->handleSize, d_data->orientation, d_data->hasTrough ); QRect sliderRect = contentsRect(); /* The marker line of the handle needs to be aligned to the scale. But the marker is in the center and we need space enough to display the rest of the handle. But the scale itself usually needs margins for displaying the tick labels, that also might needs space beyond the backbone. Now it depends on what needs more margins. If it is the slider the scale gets shrunk, otherwise the slider. */ int scaleMargin = 0; if ( d_data->scalePosition != QwtSlider::NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); scaleMargin = qMax( d1, d2 ) - bw; } int scaleX, scaleY, scaleLength; if ( d_data->orientation == Qt::Horizontal ) { const int handleMargin = handleSize.width() / 2 - 1; if ( scaleMargin > handleMargin ) { int off = scaleMargin - handleMargin; sliderRect.adjust( off, 0, -off, 0 ); } scaleX = sliderRect.left() + bw + handleSize.width() / 2 - 1; scaleLength = sliderRect.width() - handleSize.width(); } else { int handleMargin = handleSize.height() / 2 - 1; if ( scaleMargin > handleMargin ) { int off = scaleMargin - handleMargin; sliderRect.adjust( 0, off, 0, -off ); } scaleY = sliderRect.top() + bw + handleSize.height() / 2 - 1; scaleLength = sliderRect.height() - handleSize.height(); } scaleLength -= 2 * bw; // now align slider and scale according to the ScalePosition if ( d_data->orientation == Qt::Horizontal ) { const int h = handleSize.height() + 2 * bw; if ( d_data->scalePosition == QwtSlider::TrailingScale ) { sliderRect.setTop( sliderRect.bottom() + 1 - h ); scaleY = sliderRect.top() - d_data->spacing; } else { sliderRect.setHeight( h ); scaleY = sliderRect.bottom() + 1 + d_data->spacing; } } else // Qt::Vertical { const int w = handleSize.width() + 2 * bw; if ( d_data->scalePosition == QwtSlider::LeadingScale ) { sliderRect.setWidth( w ); scaleX = sliderRect.right() + 1 + d_data->spacing; } else { sliderRect.setLeft( sliderRect.right() + 1 - w ); scaleX = sliderRect.left() - d_data->spacing; } } d_data->sliderRect = sliderRect; scaleDraw()->move( scaleX, scaleY ); scaleDraw()->setLength( scaleLength ); if ( update_geometry ) { d_data->sizeHintCache = QSize(); // invalidate updateGeometry(); update(); } } /*! En/Disable the trough The slider can be cutomized by showing a trough for the handle. \param on When true, the groove is visible \sa hasTrough(), setGroove() */ void QwtSlider::setTrough( bool on ) { if ( d_data->hasTrough != on ) { d_data->hasTrough = on; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return True, when the trough is visisble \sa setTrough(), hasGroove() */ bool QwtSlider::hasTrough() const { return d_data->hasTrough; } /*! En/Disable the groove The slider can be cutomized by showing a groove for the handle. \param on When true, the groove is visible \sa hasGroove(), setThrough() */ void QwtSlider::setGroove( bool on ) { if ( d_data->hasGroove != on ) { d_data->hasGroove = on; if ( testAttribute( Qt::WA_WState_Polished ) ) layoutSlider( true ); } } /*! \return True, when the groove is visisble \sa setGroove(), hasTrough() */ bool QwtSlider::hasGroove() const { return d_data->hasGroove; } /*! \return minimumSizeHint() */ QSize QwtSlider::sizeHint() const { const QSize hint = minimumSizeHint(); return hint.expandedTo( QApplication::globalStrut() ); } /*! \return Minimum size hint \sa sizeHint() */ QSize QwtSlider::minimumSizeHint() const { if ( !d_data->sizeHintCache.isEmpty() ) return d_data->sizeHintCache; const QSize handleSize = qwtHandleSize( d_data->handleSize, d_data->orientation, d_data->hasTrough ); int bw = 0; if ( d_data->hasTrough ) bw = d_data->borderWidth; int sliderLength = 0; int scaleExtent = 0; if ( d_data->scalePosition != QwtSlider::NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); const int scaleBorderDist = 2 * ( qMax( d1, d2 ) - bw ); int handleBorderDist; if ( d_data->orientation == Qt::Horizontal ) handleBorderDist = handleSize.width(); else handleBorderDist = handleSize.height(); sliderLength = scaleDraw()->minLength( font() ); if ( handleBorderDist > scaleBorderDist ) { // We need additional space for the overlapping handle sliderLength += handleBorderDist - scaleBorderDist; } scaleExtent += d_data->spacing; scaleExtent += qCeil( scaleDraw()->extent( font() ) ); } sliderLength = qMax( sliderLength, 84 ); // from QSlider int w = 0; int h = 0; if ( d_data->orientation == Qt::Horizontal ) { w = sliderLength; h = handleSize.height() + 2 * bw + scaleExtent; } else { w = handleSize.width() + 2 * bw + scaleExtent; h = sliderLength; } // finally add margins int left, right, top, bottom; getContentsMargins( &left, &top, &right, &bottom ); w += left + right; h += top + bottom; d_data->sizeHintCache = QSize( w, h ); return d_data->sizeHintCache; } /*! \return Bounding rectangle of the slider handle */ QRect QwtSlider::handleRect() const { if ( !isValid() ) return QRect(); const int markerPos = transform( value() ); QPoint center = d_data->sliderRect.center(); if ( d_data->orientation == Qt::Horizontal ) center.setX( markerPos ); else center.setY( markerPos ); QRect rect; rect.setSize( qwtHandleSize( d_data->handleSize, d_data->orientation, d_data->hasTrough ) ); rect.moveCenter( center ); return rect; } /*! \return Bounding rectangle of the slider - without the scale */ QRect QwtSlider::sliderRect() const { return d_data->sliderRect; } ��������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_rescaler.h���������������������������������������������������������000644 �001750 �001750 �00000007440 12151666701 021747� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_RESCALER_H #define QWT_PLOT_RESCALER_H 1 #include "qwt_global.h" #include "qwt_interval.h" #include "qwt_plot.h" #include class QwtPlot; class QResizeEvent; /*! \brief QwtPlotRescaler takes care of fixed aspect ratios for plot scales QwtPlotRescaler auto adjusts the axes of a QwtPlot according to fixed aspect ratios. */ class QWT_EXPORT QwtPlotRescaler: public QObject { public: /*! The rescale policy defines how to rescale the reference axis and their depending axes. \sa ExpandingDirection, setIntervalHint() */ enum RescalePolicy { /*! The interval of the reference axis remains unchanged, when the geometry of the canvas changes. All other axes will be adjusted according to their aspect ratio. */ Fixed, /*! The interval of the reference axis will be shrunk/expanded, when the geometry of the canvas changes. All other axes will be adjusted according to their aspect ratio. The interval, that is represented by one pixel is fixed. */ Expanding, /*! The intervals of the axes are calculated, so that all axes include their interval hint. */ Fitting }; /*! When rescalePolicy() is set to Expanding its direction depends on ExpandingDirection */ enum ExpandingDirection { //! The upper limit of the scale is adjusted ExpandUp, //! The lower limit of the scale is adjusted ExpandDown, //! Both limits of the scale are adjusted ExpandBoth }; explicit QwtPlotRescaler( QWidget *canvas, int referenceAxis = QwtPlot::xBottom, RescalePolicy = Expanding ); virtual ~QwtPlotRescaler(); void setEnabled( bool ); bool isEnabled() const; void setRescalePolicy( RescalePolicy ); RescalePolicy rescalePolicy() const; void setExpandingDirection( ExpandingDirection ); void setExpandingDirection( int axis, ExpandingDirection ); ExpandingDirection expandingDirection( int axis ) const; void setReferenceAxis( int axis ); int referenceAxis() const; void setAspectRatio( double ratio ); void setAspectRatio( int axis, double ratio ); double aspectRatio( int axis ) const; void setIntervalHint( int axis, const QwtInterval& ); QwtInterval intervalHint( int axis ) const; QWidget *canvas(); const QWidget *canvas() const; QwtPlot *plot(); const QwtPlot *plot() const; virtual bool eventFilter( QObject *, QEvent * ); void rescale() const; protected: virtual void canvasResizeEvent( QResizeEvent * ); virtual void rescale( const QSize &oldSize, const QSize &newSize ) const; virtual QwtInterval expandScale( int axis, const QSize &oldSize, const QSize &newSize ) const; virtual QwtInterval syncScale( int axis, const QwtInterval& reference, const QSize &size ) const; virtual void updateScales( QwtInterval intervals[QwtPlot::axisCnt] ) const; Qt::Orientation orientation( int axis ) const; QwtInterval interval( int axis ) const; QwtInterval expandInterval( const QwtInterval &, double width, ExpandingDirection ) const; private: double pixelDist( int axis, const QSize & ) const; class AxisData; class PrivateData; PrivateData *d_data; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_counter.cpp�������������������������������������������������������������000644 �001750 �001750 �00000042424 12151666703 021126� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_arrow_button.h" #include "qwt_math.h" #include "qwt_counter.h" #include #include #include #include #include class QwtCounter::PrivateData { public: PrivateData(): minimum( 0.0 ), maximum( 0.0 ), singleStep( 1.0 ), isValid( false ), value( 0.0 ), wrapping( false ) { increment[Button1] = 1; increment[Button2] = 10; increment[Button3] = 100; } QwtArrowButton *buttonDown[ButtonCnt]; QwtArrowButton *buttonUp[ButtonCnt]; QLineEdit *valueEdit; int increment[ButtonCnt]; int numButtons; double minimum; double maximum; double singleStep; bool isValid; double value; bool wrapping; }; /*! The counter is initialized with a range is set to [0.0, 1.0] with 0.01 as single step size. The value is invalid. The default number of buttons is set to 2. The default increments are: \li Button 1: 1 step \li Button 2: 10 steps \li Button 3: 100 steps \param parent */ QwtCounter::QwtCounter( QWidget *parent ): QWidget( parent ) { initCounter(); } void QwtCounter::initCounter() { d_data = new PrivateData; QHBoxLayout *layout = new QHBoxLayout( this ); layout->setSpacing( 0 ); layout->setMargin( 0 ); for ( int i = ButtonCnt - 1; i >= 0; i-- ) { QwtArrowButton *btn = new QwtArrowButton( i + 1, Qt::DownArrow, this ); btn->setFocusPolicy( Qt::NoFocus ); btn->installEventFilter( this ); layout->addWidget( btn ); connect( btn, SIGNAL( released() ), SLOT( btnReleased() ) ); connect( btn, SIGNAL( clicked() ), SLOT( btnClicked() ) ); d_data->buttonDown[i] = btn; } d_data->valueEdit = new QLineEdit( this ); d_data->valueEdit->setReadOnly( false ); d_data->valueEdit->setValidator( new QDoubleValidator( d_data->valueEdit ) ); layout->addWidget( d_data->valueEdit ); connect( d_data->valueEdit, SIGNAL( editingFinished() ), SLOT( textChanged() ) ); layout->setStretchFactor( d_data->valueEdit, 10 ); for ( int i = 0; i < ButtonCnt; i++ ) { QwtArrowButton *btn = new QwtArrowButton( i + 1, Qt::UpArrow, this ); btn->setFocusPolicy( Qt::NoFocus ); btn->installEventFilter( this ); layout->addWidget( btn ); connect( btn, SIGNAL( released() ), SLOT( btnReleased() ) ); connect( btn, SIGNAL( clicked() ), SLOT( btnClicked() ) ); d_data->buttonUp[i] = btn; } setNumButtons( 2 ); setRange( 0.0, 1.0 ); setSingleStep( 0.001 ); setValue( 0.0 ); setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) ); setFocusProxy( d_data->valueEdit ); setFocusPolicy( Qt::StrongFocus ); } //! Destructor QwtCounter::~QwtCounter() { delete d_data; } /*! Set the counter to be in valid/invalid state When the counter is set to invalid, no numbers are displayed and the buttons are disabled. \param on If true the counter will be set as valid \sa setValue(), isValid() */ void QwtCounter::setValid( bool on ) { if ( on != d_data->isValid ) { d_data->isValid = on; updateButtons(); if ( d_data->isValid ) { showNumber( value() ); Q_EMIT valueChanged( value() ); } else { d_data->valueEdit->setText( QString::null ); } } } /*! \return True, if the value is valid \sa setValid(), setValue() */ bool QwtCounter::isValid() const { return d_data->isValid; } /*! \brief Allow/disallow the user to manually edit the value \param on True disable editing \sa isReadOnly() */ void QwtCounter::setReadOnly( bool on ) { d_data->valueEdit->setReadOnly( on ); } /*! \return True, when the line line edit is read only. (default is no) \sa setReadOnly() */ bool QwtCounter::isReadOnly() const { return d_data->valueEdit->isReadOnly(); } /*! \brief Set a new value without adjusting to the step raster The state of the counter is set to be valid. \param value New value \sa isValid(), value(), valueChanged() \warning The value is clipped when it lies outside the range. */ void QwtCounter::setValue( double value ) { const double vmin = qMin( d_data->minimum, d_data->maximum ); const double vmax = qMax( d_data->minimum, d_data->maximum ); value = qBound( vmin, value, vmax ); if ( !d_data->isValid || value != d_data->value ) { d_data->isValid = true; d_data->value = value; showNumber( value ); updateButtons(); Q_EMIT valueChanged( value ); } } /*! \return Current value of the counter \sa setValue(), valueChanged() */ double QwtCounter::value() const { return d_data->value; } /*! \brief Set the minimum and maximum values The maximum is adjusted if necessary to ensure that the range remains valid. The value might be modified to be inside of the range. \param min Minimum value \param max Maximum value \sa minimum(), maximum() */ void QwtCounter::setRange( double min, double max ) { max = qMax( min, max ); if ( d_data->maximum == max && d_data->minimum == min ) return; d_data->minimum = min; d_data->maximum = max; setSingleStep( singleStep() ); const double value = qBound( min, d_data->value, max ); if ( value != d_data->value ) { d_data->value = value; if ( d_data->isValid ) { showNumber( value ); Q_EMIT valueChanged( value ); } } updateButtons(); } /*! Set the minimum value of the range \param value Minimum value \sa setRange(), setMaximum(), minimum() \note The maximum is adjusted if necessary to ensure that the range remains valid. */ void QwtCounter::setMinimum( double value ) { setRange( value, maximum() ); } /*! \return The minimum of the range \sa setRange(), setMinimum(), maximum() */ double QwtCounter::minimum() const { return d_data->minimum; } /*! Set the maximum value of the range \param value Maximum value \sa setRange(), setMinimum(), maximum() */ void QwtCounter::setMaximum( double value ) { setRange( minimum(), value ); } /*! \return The maximum of the range \sa setRange(), setMaximum(), minimum() */ double QwtCounter::maximum() const { return d_data->maximum; } /*! \brief Set the step size of the counter A value <= 0.0 disables stepping \param stepSize Single step size \sa singleStep() */ void QwtCounter::setSingleStep( double stepSize ) { d_data->singleStep = qMax( stepSize, 0.0 ); } /*! \return Single step size \sa setSingleStep() */ double QwtCounter::singleStep() const { return d_data->singleStep; } /*! \brief En/Disable wrapping If wrapping is true stepping up from maximum() value will take you to the minimum() value and vice versa. \param on En/Disable wrapping \sa wrapping() */ void QwtCounter::setWrapping( bool on ) { d_data->wrapping = on; } /*! \return True, when wrapping is set \sa setWrapping() */ bool QwtCounter::wrapping() const { return d_data->wrapping; } /*! Specify the number of buttons on each side of the label \param numButtons Number of buttons \sa numButtons() */ void QwtCounter::setNumButtons( int numButtons ) { if ( numButtons < 0 || numButtons > QwtCounter::ButtonCnt ) return; for ( int i = 0; i < QwtCounter::ButtonCnt; i++ ) { if ( i < numButtons ) { d_data->buttonDown[i]->show(); d_data->buttonUp[i]->show(); } else { d_data->buttonDown[i]->hide(); d_data->buttonUp[i]->hide(); } } d_data->numButtons = numButtons; } /*! \return The number of buttons on each side of the widget. \sa setNumButtons() */ int QwtCounter::numButtons() const { return d_data->numButtons; } /*! Specify the number of steps by which the value is incremented or decremented when a specified button is pushed. \param button Button index \param numSteps Number of steps \sa incSteps() */ void QwtCounter::setIncSteps( QwtCounter::Button button, int numSteps ) { if ( button >= 0 && button < QwtCounter::ButtonCnt ) d_data->increment[ button ] = numSteps; } /*! \return The number of steps by which a specified button increments the value or 0 if the button is invalid. \param button Button index \sa setIncSteps() */ int QwtCounter::incSteps( QwtCounter::Button button ) const { if ( button >= 0 && button < QwtCounter::ButtonCnt ) return d_data->increment[ button ]; return 0; } /*! Set the number of increment steps for button 1 \param nSteps Number of steps */ void QwtCounter::setStepButton1( int nSteps ) { setIncSteps( QwtCounter::Button1, nSteps ); } //! returns the number of increment steps for button 1 int QwtCounter::stepButton1() const { return incSteps( QwtCounter::Button1 ); } /*! Set the number of increment steps for button 2 \param nSteps Number of steps */ void QwtCounter::setStepButton2( int nSteps ) { setIncSteps( QwtCounter::Button2, nSteps ); } //! returns the number of increment steps for button 2 int QwtCounter::stepButton2() const { return incSteps( QwtCounter::Button2 ); } /*! Set the number of increment steps for button 3 \param nSteps Number of steps */ void QwtCounter::setStepButton3( int nSteps ) { setIncSteps( QwtCounter::Button3, nSteps ); } //! returns the number of increment steps for button 3 int QwtCounter::stepButton3() const { return incSteps( QwtCounter::Button3 ); } //! Set from lineedit void QwtCounter::textChanged() { bool converted = false; const double value = d_data->valueEdit->text().toDouble( &converted ); if ( converted ) setValue( value ); } /*! Handle QEvent::PolishRequest events \param event Event \return see QWidget::event() */ bool QwtCounter::event( QEvent *event ) { if ( event->type() == QEvent::PolishRequest ) { const int w = d_data->valueEdit->fontMetrics().width( "W" ) + 8; for ( int i = 0; i < ButtonCnt; i++ ) { d_data->buttonDown[i]->setMinimumWidth( w ); d_data->buttonUp[i]->setMinimumWidth( w ); } } return QWidget::event( event ); } /*! Handle key events - Ctrl + Qt::Key_Home\n Step to minimum() - Ctrl + Qt::Key_End\n Step to maximum() - Qt::Key_Up\n Increment by incSteps(QwtCounter::Button1) - Qt::Key_Down\n Decrement by incSteps(QwtCounter::Button1) - Qt::Key_PageUp\n Increment by incSteps(QwtCounter::Button2) - Qt::Key_PageDown\n Decrement by incSteps(QwtCounter::Button2) - Shift + Qt::Key_PageUp\n Increment by incSteps(QwtCounter::Button3) - Shift + Qt::Key_PageDown\n Decrement by incSteps(QwtCounter::Button3) \param event Key event */ void QwtCounter::keyPressEvent ( QKeyEvent *event ) { bool accepted = true; switch ( event->key() ) { case Qt::Key_Home: { if ( event->modifiers() & Qt::ControlModifier ) setValue( minimum() ); else accepted = false; break; } case Qt::Key_End: { if ( event->modifiers() & Qt::ControlModifier ) setValue( maximum() ); else accepted = false; break; } case Qt::Key_Up: { incrementValue( d_data->increment[0] ); break; } case Qt::Key_Down: { incrementValue( -d_data->increment[0] ); break; } case Qt::Key_PageUp: case Qt::Key_PageDown: { int increment = d_data->increment[0]; if ( d_data->numButtons >= 2 ) increment = d_data->increment[1]; if ( d_data->numButtons >= 3 ) { if ( event->modifiers() & Qt::ShiftModifier ) increment = d_data->increment[2]; } if ( event->key() == Qt::Key_PageDown ) increment = -increment; incrementValue( increment ); break; } default: { accepted = false; } } if ( accepted ) { event->accept(); return; } QWidget::keyPressEvent ( event ); } /*! Handle wheel events \param event Wheel event */ void QwtCounter::wheelEvent( QWheelEvent *event ) { event->accept(); if ( d_data->numButtons <= 0 ) return; int increment = d_data->increment[0]; if ( d_data->numButtons >= 2 ) { if ( event->modifiers() & Qt::ControlModifier ) increment = d_data->increment[1]; } if ( d_data->numButtons >= 3 ) { if ( event->modifiers() & Qt::ShiftModifier ) increment = d_data->increment[2]; } for ( int i = 0; i < d_data->numButtons; i++ ) { if ( d_data->buttonDown[i]->geometry().contains( event->pos() ) || d_data->buttonUp[i]->geometry().contains( event->pos() ) ) { increment = d_data->increment[i]; } } const int wheel_delta = 120; #if 1 int delta = event->delta(); if ( delta >= 2 * wheel_delta ) delta /= 2; // Never saw an abs(delta) < 240 #endif incrementValue( delta / wheel_delta * increment ); } void QwtCounter::incrementValue( int numSteps ) { const double min = d_data->minimum; const double max = d_data->maximum; double stepSize = d_data->singleStep; if ( !d_data->isValid || min >= max || stepSize <= 0.0 ) return; #if 1 stepSize = qMax( stepSize, 1.0e-10 * ( max - min ) ); #endif double value = d_data->value + numSteps * stepSize; if ( d_data->wrapping ) { const double range = max - min; if ( value < min ) { value += ::ceil( ( min - value ) / range ) * range; } else if ( value > max ) { value -= ::ceil( ( value - max ) / range ) * range; } } else { value = qBound( min, value, max ); } value = min + qRound( ( value - min ) / stepSize ) * stepSize; if ( qFuzzyCompare( value, max ) ) value = max; if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 0.0; if ( value != d_data->value ) { d_data->value = value; showNumber( d_data->value ); updateButtons(); Q_EMIT valueChanged( d_data->value ); } } /*! \brief Update buttons according to the current value When the QwtCounter under- or over-flows, the focus is set to the smallest up- or down-button and counting is disabled. Counting is re-enabled on a button release event (mouse or space bar). */ void QwtCounter::updateButtons() { if ( d_data->isValid ) { // 1. save enabled state of the smallest down- and up-button // 2. change enabled state on under- or over-flow for ( int i = 0; i < QwtCounter::ButtonCnt; i++ ) { d_data->buttonDown[i]->setEnabled( value() > minimum() ); d_data->buttonUp[i]->setEnabled( value() < maximum() ); } } else { for ( int i = 0; i < QwtCounter::ButtonCnt; i++ ) { d_data->buttonDown[i]->setEnabled( false ); d_data->buttonUp[i]->setEnabled( false ); } } } /*! Display number string \param number Number */ void QwtCounter::showNumber( double number ) { QString text; text.setNum( number ); const int cursorPos = d_data->valueEdit->cursorPosition(); d_data->valueEdit->setText( text ); d_data->valueEdit->setCursorPosition( cursorPos ); } //! Button clicked void QwtCounter::btnClicked() { for ( int i = 0; i < ButtonCnt; i++ ) { if ( d_data->buttonUp[i] == sender() ) incrementValue( d_data->increment[i] ); if ( d_data->buttonDown[i] == sender() ) incrementValue( -d_data->increment[i] ); } } //! Button released void QwtCounter::btnReleased() { Q_EMIT buttonReleased( value() ); } //! A size hint QSize QwtCounter::sizeHint() const { QString tmp; int w = tmp.setNum( minimum() ).length(); int w1 = tmp.setNum( maximum() ).length(); if ( w1 > w ) w = w1; w1 = tmp.setNum( minimum() + singleStep() ).length(); if ( w1 > w ) w = w1; w1 = tmp.setNum( maximum() - singleStep() ).length(); if ( w1 > w ) w = w1; tmp.fill( '9', w ); QFontMetrics fm( d_data->valueEdit->font() ); w = fm.width( tmp ) + 2; if ( d_data->valueEdit->hasFrame() ) w += 2 * style()->pixelMetric( QStyle::PM_DefaultFrameWidth ); // Now we replace default sizeHint contribution of d_data->valueEdit by // what we really need. w += QWidget::sizeHint().width() - d_data->valueEdit->sizeHint().width(); const int h = qMin( QWidget::sizeHint().height(), d_data->valueEdit->minimumSizeHint().height() ); return QSize( w, h ); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/textengines/mathml/qwt_mml_document.h�������������������������������������������000644 �001750 �001750 �00000001550 12151666702 024621� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef _QWT_MML_DOCUMENT_H_ #define _QWT_MML_DOCUMENT_H_ 1 #include #include class QPainter; class QPoint; class QwtMmlDocument; class QWT_EXPORT QwtMathMLDocument { public: enum MmlFont { NormalFont, FrakturFont, SansSerifFont, ScriptFont, MonospaceFont, DoublestruckFont }; QwtMathMLDocument(); ~QwtMathMLDocument(); void clear(); bool setContent( QString text, QString *errorMsg = 0, int *errorLine = 0, int *errorColumn = 0 ); void paint( QPainter *p, const QPoint &pos ) const; QSize size() const; QString fontName( MmlFont type ) const; void setFontName( MmlFont type, const QString &name ); int baseFontPointSize() const; void setBaseFontPointSize( int size ); private: QwtMmlDocument *m_doc; }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_compass.cpp�������������������������������������������������������������000644 �001750 �001750 �00000016354 12151666703 021117� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_compass.h" #include "qwt_compass_rose.h" #include "qwt_math.h" #include "qwt_scale_draw.h" #include "qwt_painter.h" #include "qwt_dial_needle.h" #include #include #include /*! \brief Constructor Initializes a label map for multiples of 45 degrees */ QwtCompassScaleDraw::QwtCompassScaleDraw() { enableComponent( QwtAbstractScaleDraw::Backbone, false ); enableComponent( QwtAbstractScaleDraw::Ticks, false ); d_labelMap.insert( 0.0, QString::fromLatin1( "N" ) ); d_labelMap.insert( 45.0, QString::fromLatin1( "NE" ) ); d_labelMap.insert( 90.0, QString::fromLatin1( "E" ) ); d_labelMap.insert( 135.0, QString::fromLatin1( "SE" ) ); d_labelMap.insert( 180.0, QString::fromLatin1( "S" ) ); d_labelMap.insert( 225.0, QString::fromLatin1( "SW" ) ); d_labelMap.insert( 270.0, QString::fromLatin1( "W" ) ); d_labelMap.insert( 315.0, QString::fromLatin1( "NW" ) ); #if 0 d_labelMap.insert( 22.5, QString::fromLatin1( "NNE" ) ); d_labelMap.insert( 67.5, QString::fromLatin1( "NEE" ) ); d_labelMap.insert( 112.5, QString::fromLatin1( "SEE" ) ); d_labelMap.insert( 157.5, QString::fromLatin1( "SSE" ) ); d_labelMap.insert( 202.5, QString::fromLatin1( "SSW" ) ); d_labelMap.insert( 247.5, QString::fromLatin1( "SWW" ) ); d_labelMap.insert( 292.5, QString::fromLatin1( "NWW" ) ); d_labelMap.insert( 337.5, QString::fromLatin1( "NNW" ) ); #endif } /*! \brief Constructor \param map Value to label map */ QwtCompassScaleDraw::QwtCompassScaleDraw( const QMap &map ): d_labelMap( map ) { enableComponent( QwtAbstractScaleDraw::Backbone, false ); enableComponent( QwtAbstractScaleDraw::Ticks, false ); } /*! \brief Set a map, mapping values to labels \param map Value to label map The values of the major ticks are found by looking into this map. The default map consists of the labels N, NE, E, SE, S, SW, W, NW. \warning The map will have no effect for values that are no major tick values. Major ticks can be changed by QwtScaleDraw::setScale \sa labelMap(), scaleDraw(), setScale() */ void QwtCompassScaleDraw::setLabelMap( const QMap &map ) { d_labelMap = map; } /*! \return map, mapping values to labels \sa setLabelMap() */ QMap QwtCompassScaleDraw::labelMap() const { return d_labelMap; } /*! Map a value to a corresponding label \param value Value that will be mapped label() looks in the labelMap() for a corresponding label for value or returns an null text. \return Label, or QString::null \sa labelMap(), setLabelMap() */ QwtText QwtCompassScaleDraw::label( double value ) const { if ( qFuzzyCompare( value + 1.0, 1.0 ) ) value = 0.0; if ( value < 0.0 ) value += 360.0; if ( d_labelMap.contains( value ) ) return d_labelMap[value]; return QwtText(); } class QwtCompass::PrivateData { public: PrivateData(): rose( NULL ) { } ~PrivateData() { delete rose; } QwtCompassRose *rose; }; /*! \brief Constructor \param parent Parent widget Create a compass widget with a scale, no needle and no rose. The default origin is 270.0 with no valid value. It accepts mouse and keyboard inputs and has no step size. The default mode is QwtDial::RotateNeedle. */ QwtCompass::QwtCompass( QWidget* parent ): QwtDial( parent ) { d_data = new PrivateData; setScaleDraw( new QwtCompassScaleDraw() ); setOrigin( 270.0 ); setWrapping( true ); setScaleMaxMajor( 36 ); setScaleMaxMinor( 10 ); setScale( 0.0, 360.0 ); // degrees as default setTotalSteps( 360 ); } //! Destructor QwtCompass::~QwtCompass() { delete d_data; } /*! Draw the contents of the scale \param painter Painter \param center Center of the content circle \param radius Radius of the content circle */ void QwtCompass::drawScaleContents( QPainter *painter, const QPointF ¢er, double radius ) const { QPalette::ColorGroup cg; if ( isEnabled() ) cg = hasFocus() ? QPalette::Active : QPalette::Inactive; else cg = QPalette::Disabled; double north = origin(); if ( isValid() ) { if ( mode() == RotateScale ) north -= value(); } const int margin = 4; drawRose( painter, center, radius - margin, 360.0 - north, cg ); } /*! Draw the compass rose \param painter Painter \param center Center of the compass \param radius of the circle, where to paint the rose \param north Direction pointing north, in degrees counter clockwise \param cg Color group */ void QwtCompass::drawRose( QPainter *painter, const QPointF ¢er, double radius, double north, QPalette::ColorGroup cg ) const { if ( d_data->rose ) d_data->rose->draw( painter, center, radius, north, cg ); } /*! Set a rose for the compass \param rose Compass rose \warning The rose will be deleted, when a different rose is set or in ~QwtCompass \sa rose() */ void QwtCompass::setRose( QwtCompassRose *rose ) { if ( rose != d_data->rose ) { if ( d_data->rose ) delete d_data->rose; d_data->rose = rose; update(); } } /*! \return rose \sa setRose() */ const QwtCompassRose *QwtCompass::rose() const { return d_data->rose; } /*! \return rose \sa setRose() */ QwtCompassRose *QwtCompass::rose() { return d_data->rose; } /*! Handles key events Beside the keys described in QwtDial::keyPressEvent numbers from 1-9 (without 5) set the direction according to their position on the num pad. \sa isReadOnly() */ void QwtCompass::keyPressEvent( QKeyEvent *kev ) { if ( isReadOnly() ) return; #if 0 if ( kev->key() == Key_5 ) { invalidate(); // signal ??? return; } #endif double newValue = value(); if ( kev->key() >= Qt::Key_1 && kev->key() <= Qt::Key_9 ) { if ( mode() != RotateNeedle || kev->key() == Qt::Key_5 ) return; switch ( kev->key() ) { case Qt::Key_6: newValue = 180.0 * 0.0; break; case Qt::Key_3: newValue = 180.0 * 0.25; break; case Qt::Key_2: newValue = 180.0 * 0.5; break; case Qt::Key_1: newValue = 180.0 * 0.75; break; case Qt::Key_4: newValue = 180.0 * 1.0; break; case Qt::Key_7: newValue = 180.0 * 1.25; break; case Qt::Key_8: newValue = 180.0 * 1.5; break; case Qt::Key_9: newValue = 180.0 * 1.75; break; } newValue -= origin(); setValue( newValue ); } else { QwtDial::keyPressEvent( kev ); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_marker.cpp���������������������������������������������������������000644 �001750 �001750 �00000033761 12151666703 021772� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_marker.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include "qwt_symbol.h" #include "qwt_text.h" #include "qwt_math.h" #include class QwtPlotMarker::PrivateData { public: PrivateData(): labelAlignment( Qt::AlignCenter ), labelOrientation( Qt::Horizontal ), spacing( 2 ), symbol( NULL ), style( QwtPlotMarker::NoLine ), xValue( 0.0 ), yValue( 0.0 ) { } ~PrivateData() { delete symbol; } QwtText label; Qt::Alignment labelAlignment; Qt::Orientation labelOrientation; int spacing; QPen pen; const QwtSymbol *symbol; LineStyle style; double xValue; double yValue; }; //! Sets alignment to Qt::AlignCenter, and style to QwtPlotMarker::NoLine QwtPlotMarker::QwtPlotMarker( const QString &title ): QwtPlotItem( QwtText( title ) ) { d_data = new PrivateData; setZ( 30.0 ); } //! Sets alignment to Qt::AlignCenter, and style to QwtPlotMarker::NoLine QwtPlotMarker::QwtPlotMarker( const QwtText &title ): QwtPlotItem( title ) { d_data = new PrivateData; setZ( 30.0 ); } //! Destructor QwtPlotMarker::~QwtPlotMarker() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotMarker int QwtPlotMarker::rtti() const { return QwtPlotItem::Rtti_PlotMarker; } //! Return Value QPointF QwtPlotMarker::value() const { return QPointF( d_data->xValue, d_data->yValue ); } //! Return x Value double QwtPlotMarker::xValue() const { return d_data->xValue; } //! Return y Value double QwtPlotMarker::yValue() const { return d_data->yValue; } //! Set Value void QwtPlotMarker::setValue( const QPointF& pos ) { setValue( pos.x(), pos.y() ); } //! Set Value void QwtPlotMarker::setValue( double x, double y ) { if ( x != d_data->xValue || y != d_data->yValue ) { d_data->xValue = x; d_data->yValue = y; itemChanged(); } } //! Set X Value void QwtPlotMarker::setXValue( double x ) { setValue( x, d_data->yValue ); } //! Set Y Value void QwtPlotMarker::setYValue( double y ) { setValue( d_data->xValue, y ); } /*! Draw the marker \param painter Painter \param xMap x Scale Map \param yMap y Scale Map \param canvasRect Contents rectangle of the canvas in painter coordinates */ void QwtPlotMarker::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { const QPointF pos( xMap.transform( d_data->xValue ), yMap.transform( d_data->yValue ) ); // draw lines drawLines( painter, canvasRect, pos ); // draw symbol if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { const QSizeF sz = d_data->symbol->size(); const QRectF clipRect = canvasRect.adjusted( -sz.width(), -sz.height(), sz.width(), sz.height() ); if ( clipRect.contains( pos ) ) d_data->symbol->drawSymbol( painter, pos ); } drawLabel( painter, canvasRect, pos ); } /*! Draw the lines marker \param painter Painter \param canvasRect Contents rectangle of the canvas in painter coordinates \param pos Position of the marker, translated into widget coordinates \sa drawLabel(), QwtSymbol::drawSymbol() */ void QwtPlotMarker::drawLines( QPainter *painter, const QRectF &canvasRect, const QPointF &pos ) const { if ( d_data->style == NoLine ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); painter->setPen( d_data->pen ); if ( d_data->style == QwtPlotMarker::HLine || d_data->style == QwtPlotMarker::Cross ) { double y = pos.y(); if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, canvasRect.left(), y, canvasRect.right() - 1.0, y ); } if ( d_data->style == QwtPlotMarker::VLine || d_data->style == QwtPlotMarker::Cross ) { double x = pos.x(); if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, canvasRect.top(), x, canvasRect.bottom() - 1.0 ); } } /*! Align and draw the text label of the marker \param painter Painter \param canvasRect Contents rectangle of the canvas in painter coordinates \param pos Position of the marker, translated into widget coordinates \sa drawLabel(), QwtSymbol::drawSymbol() */ void QwtPlotMarker::drawLabel( QPainter *painter, const QRectF &canvasRect, const QPointF &pos ) const { if ( d_data->label.isEmpty() ) return; Qt::Alignment align = d_data->labelAlignment; QPointF alignPos = pos; QSizeF symbolOff( 0, 0 ); switch ( d_data->style ) { case QwtPlotMarker::VLine: { // In VLine-style the y-position is pointless and // the alignment flags are relative to the canvas if ( d_data->labelAlignment & Qt::AlignTop ) { alignPos.setY( canvasRect.top() ); align &= ~Qt::AlignTop; align |= Qt::AlignBottom; } else if ( d_data->labelAlignment & Qt::AlignBottom ) { // In HLine-style the x-position is pointless and // the alignment flags are relative to the canvas alignPos.setY( canvasRect.bottom() - 1 ); align &= ~Qt::AlignBottom; align |= Qt::AlignTop; } else { alignPos.setY( canvasRect.center().y() ); } break; } case QwtPlotMarker::HLine: { if ( d_data->labelAlignment & Qt::AlignLeft ) { alignPos.setX( canvasRect.left() ); align &= ~Qt::AlignLeft; align |= Qt::AlignRight; } else if ( d_data->labelAlignment & Qt::AlignRight ) { alignPos.setX( canvasRect.right() - 1 ); align &= ~Qt::AlignRight; align |= Qt::AlignLeft; } else { alignPos.setX( canvasRect.center().x() ); } break; } default: { if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { symbolOff = d_data->symbol->size() + QSizeF( 1, 1 ); symbolOff /= 2; } } } qreal pw2 = d_data->pen.widthF() / 2.0; if ( pw2 == 0.0 ) pw2 = 0.5; const int spacing = d_data->spacing; const qreal xOff = qMax( pw2, symbolOff.width() ); const qreal yOff = qMax( pw2, symbolOff.height() ); const QSizeF textSize = d_data->label.textSize( painter->font() ); if ( align & Qt::AlignLeft ) { alignPos.rx() -= xOff + spacing; if ( d_data->labelOrientation == Qt::Vertical ) alignPos.rx() -= textSize.height(); else alignPos.rx() -= textSize.width(); } else if ( align & Qt::AlignRight ) { alignPos.rx() += xOff + spacing; } else { if ( d_data->labelOrientation == Qt::Vertical ) alignPos.rx() -= textSize.height() / 2; else alignPos.rx() -= textSize.width() / 2; } if ( align & Qt::AlignTop ) { alignPos.ry() -= yOff + spacing; if ( d_data->labelOrientation != Qt::Vertical ) alignPos.ry() -= textSize.height(); } else if ( align & Qt::AlignBottom ) { alignPos.ry() += yOff + spacing; if ( d_data->labelOrientation == Qt::Vertical ) alignPos.ry() += textSize.width(); } else { if ( d_data->labelOrientation == Qt::Vertical ) alignPos.ry() += textSize.width() / 2; else alignPos.ry() -= textSize.height() / 2; } painter->translate( alignPos.x(), alignPos.y() ); if ( d_data->labelOrientation == Qt::Vertical ) painter->rotate( -90.0 ); const QRectF textRect( 0, 0, textSize.width(), textSize.height() ); d_data->label.draw( painter, textRect ); } /*! \brief Set the line style \param style Line style. \sa lineStyle() */ void QwtPlotMarker::setLineStyle( LineStyle style ) { if ( style != d_data->style ) { d_data->style = style; legendChanged(); itemChanged(); } } /*! \return the line style \sa setLineStyle() */ QwtPlotMarker::LineStyle QwtPlotMarker::lineStyle() const { return d_data->style; } /*! \brief Assign a symbol \param symbol New symbol \sa symbol() */ void QwtPlotMarker::setSymbol( const QwtSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; if ( symbol ) setLegendIconSize( symbol->boundingRect().size() ); legendChanged(); itemChanged(); } } /*! \return the symbol \sa setSymbol(), QwtSymbol */ const QwtSymbol *QwtPlotMarker::symbol() const { return d_data->symbol; } /*! \brief Set the label \param label Label text \sa label() */ void QwtPlotMarker::setLabel( const QwtText& label ) { if ( label != d_data->label ) { d_data->label = label; itemChanged(); } } /*! \return the label \sa setLabel() */ QwtText QwtPlotMarker::label() const { return d_data->label; } /*! \brief Set the alignment of the label In case of QwtPlotMarker::HLine the alignment is relative to the y position of the marker, but the horizontal flags correspond to the canvas rectangle. In case of QwtPlotMarker::VLine the alignment is relative to the x position of the marker, but the vertical flags correspond to the canvas rectangle. In all other styles the alignment is relative to the marker's position. \param align Alignment. \sa labelAlignment(), labelOrientation() */ void QwtPlotMarker::setLabelAlignment( Qt::Alignment align ) { if ( align != d_data->labelAlignment ) { d_data->labelAlignment = align; itemChanged(); } } /*! \return the label alignment \sa setLabelAlignment(), setLabelOrientation() */ Qt::Alignment QwtPlotMarker::labelAlignment() const { return d_data->labelAlignment; } /*! \brief Set the orientation of the label When orientation is Qt::Vertical the label is rotated by 90.0 degrees ( from bottom to top ). \param orientation Orientation of the label \sa labelOrientation(), setLabelAlignment() */ void QwtPlotMarker::setLabelOrientation( Qt::Orientation orientation ) { if ( orientation != d_data->labelOrientation ) { d_data->labelOrientation = orientation; itemChanged(); } } /*! \return the label orientation \sa setLabelOrientation(), labelAlignment() */ Qt::Orientation QwtPlotMarker::labelOrientation() const { return d_data->labelOrientation; } /*! \brief Set the spacing When the label is not centered on the marker position, the spacing is the distance between the position and the label. \param spacing Spacing \sa spacing(), setLabelAlignment() */ void QwtPlotMarker::setSpacing( int spacing ) { if ( spacing < 0 ) spacing = 0; if ( spacing == d_data->spacing ) return; d_data->spacing = spacing; itemChanged(); } /*! \return the spacing \sa setSpacing() */ int QwtPlotMarker::spacing() const { return d_data->spacing; } /*! Build and assign a line pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotMarker::setLinePen( const QColor &color, qreal width, Qt::PenStyle style ) { setLinePen( QPen( color, width, style ) ); } /*! Specify a pen for the line. \param pen New pen \sa linePen() */ void QwtPlotMarker::setLinePen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; legendChanged(); itemChanged(); } } /*! \return the line pen \sa setLinePen() */ const QPen &QwtPlotMarker::linePen() const { return d_data->pen; } QRectF QwtPlotMarker::boundingRect() const { return QRectF( d_data->xValue, d_data->yValue, 0.0, 0.0 ); } /*! \return Icon representing the marker on the legend \param index Index of the legend entry ( usually there is only one ) \param size Icon size \sa setLegendIconSize(), legendData() */ QwtGraphic QwtPlotMarker::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); if ( size.isEmpty() ) return QwtGraphic(); QwtGraphic icon; icon.setDefaultSize( size ); icon.setRenderHint( QwtGraphic::RenderPensUnscaled, true ); QPainter painter( &icon ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); if ( d_data->style != QwtPlotMarker::NoLine ) { painter.setPen( d_data->pen ); if ( d_data->style == QwtPlotMarker::HLine || d_data->style == QwtPlotMarker::Cross ) { const double y = 0.5 * size.height(); QwtPainter::drawLine( &painter, 0.0, y, size.width(), y ); } if ( d_data->style == QwtPlotMarker::VLine || d_data->style == QwtPlotMarker::Cross ) { const double x = 0.5 * size.width(); QwtPainter::drawLine( &painter, x, 0.0, x, size.height() ); } } if ( d_data->symbol ) { const QRect r( 0.0, 0.0, size.width(), size.height() ); d_data->symbol->drawSymbol( &painter, r ); } return icon; } ���������������linssid-2.7/qwt-lib/src/qwt_point_3d.h��������������������������������������������������������������000644 �001750 �001750 �00000007571 12151666701 020635� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file */ #ifndef QWT_POINT_3D_H #define QWT_POINT_3D_H 1 #include "qwt_global.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief QwtPoint3D class defines a 3D point in double coordinates */ class QWT_EXPORT QwtPoint3D { public: QwtPoint3D(); QwtPoint3D( double x, double y, double z ); QwtPoint3D( const QwtPoint3D & ); QwtPoint3D( const QPointF & ); bool isNull() const; double x() const; double y() const; double z() const; double &rx(); double &ry(); double &rz(); void setX( double x ); void setY( double y ); void setZ( double y ); QPointF toPoint() const; bool operator==( const QwtPoint3D & ) const; bool operator!=( const QwtPoint3D & ) const; private: double d_x; double d_y; double d_z; }; Q_DECLARE_TYPEINFO(QwtPoint3D, Q_MOVABLE_TYPE); #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtPoint3D & ); #endif /*! Constructs a null point. \sa isNull() */ inline QwtPoint3D::QwtPoint3D(): d_x( 0.0 ), d_y( 0.0 ), d_z( 0.0 ) { } //! Constructs a point with coordinates specified by x, y and z. inline QwtPoint3D::QwtPoint3D( double x, double y, double z = 0.0 ): d_x( x ), d_y( y ), d_z( z ) { } /*! Copy constructor. Constructs a point using the values of the point specified. */ inline QwtPoint3D::QwtPoint3D( const QwtPoint3D &other ): d_x( other.d_x ), d_y( other.d_y ), d_z( other.d_z ) { } /*! Constructs a point with x and y coordinates from a 2D point, and a z coordinate of 0. */ inline QwtPoint3D::QwtPoint3D( const QPointF &other ): d_x( other.x() ), d_y( other.y() ), d_z( 0.0 ) { } /*! \return True if the point is null; otherwise returns false. A point is considered to be null if x, y and z-coordinates are equal to zero. */ inline bool QwtPoint3D::isNull() const { return d_x == 0.0 && d_y == 0.0 && d_z == 0.0; } //! \return The x-coordinate of the point. inline double QwtPoint3D::x() const { return d_x; } //! \return The y-coordinate of the point. inline double QwtPoint3D::y() const { return d_y; } //! \return The z-coordinate of the point. inline double QwtPoint3D::z() const { return d_z; } //! \return A reference to the x-coordinate of the point. inline double &QwtPoint3D::rx() { return d_x; } //! \return A reference to the y-coordinate of the point. inline double &QwtPoint3D::ry() { return d_y; } //! \return A reference to the z-coordinate of the point. inline double &QwtPoint3D::rz() { return d_z; } //! Sets the x-coordinate of the point to the value specified by x. inline void QwtPoint3D::setX( double x ) { d_x = x; } //! Sets the y-coordinate of the point to the value specified by y. inline void QwtPoint3D::setY( double y ) { d_y = y; } //! Sets the z-coordinate of the point to the value specified by z. inline void QwtPoint3D::setZ( double z ) { d_z = z; } /*! \return 2D point, where the z coordinate is dropped. */ inline QPointF QwtPoint3D::toPoint() const { return QPointF( d_x, d_y ); } //! \return True, if this point and other are equal; otherwise returns false. inline bool QwtPoint3D::operator==( const QwtPoint3D &other ) const { return ( d_x == other.d_x ) && ( d_y == other.d_y ) && ( d_z == other.d_z ); } //! \return True if this rect and other are different; otherwise returns false. inline bool QwtPoint3D::operator!=( const QwtPoint3D &other ) const { return !operator==( other ); } #endif ���������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_scale_map.h�������������������������������������������������������������000644 �001750 �001750 �00000007301 12151666702 021032� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_MAP_H #define QWT_SCALE_MAP_H #include "qwt_global.h" #include "qwt_transform.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif class QRectF; /*! \brief A scale map QwtScaleMap offers transformations from the coordinate system of a scale into the linear coordinate system of a paint device and vice versa. */ class QWT_EXPORT QwtScaleMap { public: QwtScaleMap(); QwtScaleMap( const QwtScaleMap& ); ~QwtScaleMap(); QwtScaleMap &operator=( const QwtScaleMap & ); void setTransformation( QwtTransform * ); const QwtTransform *transformation() const; void setPaintInterval( double p1, double p2 ); void setScaleInterval( double s1, double s2 ); double transform( double s ) const; double invTransform( double p ) const; double p1() const; double p2() const; double s1() const; double s2() const; double pDist() const; double sDist() const; static QRectF transform( const QwtScaleMap &, const QwtScaleMap &, const QRectF & ); static QRectF invTransform( const QwtScaleMap &, const QwtScaleMap &, const QRectF & ); static QPointF transform( const QwtScaleMap &, const QwtScaleMap &, const QPointF & ); static QPointF invTransform( const QwtScaleMap &, const QwtScaleMap &, const QPointF & ); bool isInverting() const; private: void updateFactor(); double d_s1, d_s2; // scale interval boundaries double d_p1, d_p2; // paint device interval boundaries double d_cnv; // conversion factor double d_ts1; QwtTransform *d_transform; }; /*! \return First border of the scale interval */ inline double QwtScaleMap::s1() const { return d_s1; } /*! \return Second border of the scale interval */ inline double QwtScaleMap::s2() const { return d_s2; } /*! \return First border of the paint interval */ inline double QwtScaleMap::p1() const { return d_p1; } /*! \return Second border of the paint interval */ inline double QwtScaleMap::p2() const { return d_p2; } /*! \return qwtAbs(p2() - p1()) */ inline double QwtScaleMap::pDist() const { return qAbs( d_p2 - d_p1 ); } /*! \return qwtAbs(s2() - s1()) */ inline double QwtScaleMap::sDist() const { return qAbs( d_s2 - d_s1 ); } /*! Transform a point related to the scale interval into an point related to the interval of the paint device \param s Value relative to the coordinates of the scale \return Transformed value \sa invTransform() */ inline double QwtScaleMap::transform( double s ) const { if ( d_transform ) s = d_transform->transform( s ); return d_p1 + ( s - d_ts1 ) * d_cnv; } /*! Transform an paint device value into a value in the interval of the scale. \param p Value relative to the coordinates of the paint device \return Transformed value \sa transform() */ inline double QwtScaleMap::invTransform( double p ) const { double s = d_ts1 + ( p - d_p1 ) / d_cnv; if ( d_transform ) s = d_transform->invTransform( s ); return s; } //! \return True, when ( p1() < p2() ) != ( s1() < s2() ) inline bool QwtScaleMap::isInverting() const { return ( ( d_p1 < d_p2 ) != ( d_s1 < d_s2 ) ); } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtScaleMap & ); #endif #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_zoomer.cpp���������������������������������������������������������000644 �001750 �001750 �00000035461 12151666703 022023� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_zoomer.h" #include "qwt_plot.h" #include "qwt_scale_div.h" #include "qwt_picker_machine.h" #include class QwtPlotZoomer::PrivateData { public: uint zoomRectIndex; QStack zoomStack; int maxStackDepth; }; /*! \brief Create a zoomer for a plot canvas. The zoomer is set to those x- and y-axis of the parent plot of the canvas that are enabled. If both or no x-axis are enabled, the picker is set to QwtPlot::xBottom. If both or no y-axis are enabled, it is set to QwtPlot::yLeft. The zoomer is initialized with a QwtPickerDragRectMachine, the tracker mode is set to QwtPicker::ActiveOnly and the rubber band is set to QwtPicker::RectRubberBand \param canvas Plot canvas to observe, also the parent object \param doReplot Call QwtPlot::replot() for the attached plot before initializing the zoomer with its scales. This might be necessary, when the plot is in a state with pending scale changes. \sa QwtPlot::autoReplot(), QwtPlot::replot(), setZoomBase() */ QwtPlotZoomer::QwtPlotZoomer( QWidget *canvas, bool doReplot ): QwtPlotPicker( canvas ) { if ( canvas ) init( doReplot ); } /*! \brief Create a zoomer for a plot canvas. The zoomer is initialized with a QwtPickerDragRectMachine, the tracker mode is set to QwtPicker::ActiveOnly and the rubber band is set to QwtPicker;;RectRubberBand \param xAxis X axis of the zoomer \param yAxis Y axis of the zoomer \param canvas Plot canvas to observe, also the parent object \param doReplot Call QwtPlot::replot() for the attached plot before initializing the zoomer with its scales. This might be necessary, when the plot is in a state with pending scale changes. \sa QwtPlot::autoReplot(), QwtPlot::replot(), setZoomBase() */ QwtPlotZoomer::QwtPlotZoomer( int xAxis, int yAxis, QWidget *canvas, bool doReplot ): QwtPlotPicker( xAxis, yAxis, canvas ) { if ( canvas ) init( doReplot ); } //! Init the zoomer, used by the constructors void QwtPlotZoomer::init( bool doReplot ) { d_data = new PrivateData; d_data->maxStackDepth = -1; setTrackerMode( ActiveOnly ); setRubberBand( RectRubberBand ); setStateMachine( new QwtPickerDragRectMachine() ); if ( doReplot && plot() ) plot()->replot(); setZoomBase( scaleRect() ); } QwtPlotZoomer::~QwtPlotZoomer() { delete d_data; } /*! \brief Limit the number of recursive zoom operations to depth. A value of -1 set the depth to unlimited, 0 disables zooming. If the current zoom rectangle is below depth, the plot is unzoomed. \param depth Maximum for the stack depth \sa maxStackDepth() \note depth doesn't include the zoom base, so zoomStack().count() might be maxStackDepth() + 1. */ void QwtPlotZoomer::setMaxStackDepth( int depth ) { d_data->maxStackDepth = depth; if ( depth >= 0 ) { // unzoom if the current depth is below d_data->maxStackDepth const int zoomOut = int( d_data->zoomStack.count() ) - 1 - depth; // -1 for the zoom base if ( zoomOut > 0 ) { zoom( -zoomOut ); for ( int i = int( d_data->zoomStack.count() ) - 1; i > int( d_data->zoomRectIndex ); i-- ) { ( void )d_data->zoomStack.pop(); // remove trailing rects } } } } /*! \return Maximal depth of the zoom stack. \sa setMaxStackDepth() */ int QwtPlotZoomer::maxStackDepth() const { return d_data->maxStackDepth; } /*! \return The zoom stack. zoomStack()[0] is the zoom base, zoomStack()[1] the first zoomed rectangle. \sa setZoomStack(), zoomRectIndex() */ const QStack &QwtPlotZoomer::zoomStack() const { return d_data->zoomStack; } /*! \return Initial rectangle of the zoomer \sa setZoomBase(), zoomRect() */ QRectF QwtPlotZoomer::zoomBase() const { return d_data->zoomStack[0]; } /*! Reinitialized the zoom stack with scaleRect() as base. \param doReplot Call QwtPlot::replot() for the attached plot before initializing the zoomer with its scales. This might be necessary, when the plot is in a state with pending scale changes. \sa zoomBase(), scaleRect() QwtPlot::autoReplot(), QwtPlot::replot(). */ void QwtPlotZoomer::setZoomBase( bool doReplot ) { QwtPlot *plt = plot(); if ( plt == NULL ) return; if ( doReplot ) plt->replot(); d_data->zoomStack.clear(); d_data->zoomStack.push( scaleRect() ); d_data->zoomRectIndex = 0; rescale(); } /*! \brief Set the initial size of the zoomer. base is united with the current scaleRect() and the zoom stack is reinitialized with it as zoom base. plot is zoomed to scaleRect(). \param base Zoom base \sa zoomBase(), scaleRect() */ void QwtPlotZoomer::setZoomBase( const QRectF &base ) { const QwtPlot *plt = plot(); if ( !plt ) return; const QRectF sRect = scaleRect(); const QRectF bRect = base | sRect; d_data->zoomStack.clear(); d_data->zoomStack.push( bRect ); d_data->zoomRectIndex = 0; if ( base != sRect ) { d_data->zoomStack.push( sRect ); d_data->zoomRectIndex++; } rescale(); } /*! \return Rectangle at the current position on the zoom stack. \sa zoomRectIndex(), scaleRect(). */ QRectF QwtPlotZoomer::zoomRect() const { return d_data->zoomStack[d_data->zoomRectIndex]; } /*! \return Index of current position of zoom stack. */ uint QwtPlotZoomer::zoomRectIndex() const { return d_data->zoomRectIndex; } /*! \brief Zoom in Clears all rectangles above the current position of the zoom stack and pushes the normalized rectangle on it. \note If the maximal stack depth is reached, zoom is ignored. \note The zoomed signal is emitted. */ void QwtPlotZoomer::zoom( const QRectF &rect ) { if ( d_data->maxStackDepth >= 0 && int( d_data->zoomRectIndex ) >= d_data->maxStackDepth ) { return; } const QRectF zoomRect = rect.normalized(); if ( zoomRect != d_data->zoomStack[d_data->zoomRectIndex] ) { for ( uint i = int( d_data->zoomStack.count() ) - 1; i > d_data->zoomRectIndex; i-- ) { ( void )d_data->zoomStack.pop(); } d_data->zoomStack.push( zoomRect ); d_data->zoomRectIndex++; rescale(); Q_EMIT zoomed( zoomRect ); } } /*! \brief Zoom in or out Activate a rectangle on the zoom stack with an offset relative to the current position. Negative values of offset will zoom out, positive zoom in. A value of 0 zooms out to the zoom base. \param offset Offset relative to the current position of the zoom stack. \note The zoomed signal is emitted. \sa zoomRectIndex() */ void QwtPlotZoomer::zoom( int offset ) { if ( offset == 0 ) d_data->zoomRectIndex = 0; else { int newIndex = d_data->zoomRectIndex + offset; newIndex = qMax( 0, newIndex ); newIndex = qMin( int( d_data->zoomStack.count() ) - 1, newIndex ); d_data->zoomRectIndex = uint( newIndex ); } rescale(); Q_EMIT zoomed( zoomRect() ); } /*! \brief Assign a zoom stack In combination with other types of navigation it might be useful to modify to manipulate the complete zoom stack. \param zoomStack New zoom stack \param zoomRectIndex Index of the current position of zoom stack. In case of -1 the current position is at the top of the stack. \note The zoomed signal might be emitted. \sa zoomStack(), zoomRectIndex() */ void QwtPlotZoomer::setZoomStack( const QStack &zoomStack, int zoomRectIndex ) { if ( zoomStack.isEmpty() ) return; if ( d_data->maxStackDepth >= 0 && int( zoomStack.count() ) > d_data->maxStackDepth ) { return; } if ( zoomRectIndex < 0 || zoomRectIndex > int( zoomStack.count() ) ) zoomRectIndex = zoomStack.count() - 1; const bool doRescale = zoomStack[zoomRectIndex] != zoomRect(); d_data->zoomStack = zoomStack; d_data->zoomRectIndex = uint( zoomRectIndex ); if ( doRescale ) { rescale(); Q_EMIT zoomed( zoomRect() ); } } /*! Adjust the observed plot to zoomRect() \note Initiates QwtPlot::replot() */ void QwtPlotZoomer::rescale() { QwtPlot *plt = plot(); if ( !plt ) return; const QRectF &rect = d_data->zoomStack[d_data->zoomRectIndex]; if ( rect != scaleRect() ) { const bool doReplot = plt->autoReplot(); plt->setAutoReplot( false ); double x1 = rect.left(); double x2 = rect.right(); if ( !plt->axisScaleDiv( xAxis() ).isIncreasing() ) qSwap( x1, x2 ); plt->setAxisScale( xAxis(), x1, x2 ); double y1 = rect.top(); double y2 = rect.bottom(); if ( !plt->axisScaleDiv( yAxis() ).isIncreasing() ) qSwap( y1, y2 ); plt->setAxisScale( yAxis(), y1, y2 ); plt->setAutoReplot( doReplot ); plt->replot(); } } /*! Reinitialize the axes, and set the zoom base to their scales. \param xAxis X axis \param yAxis Y axis */ void QwtPlotZoomer::setAxis( int xAxis, int yAxis ) { if ( xAxis != QwtPlotPicker::xAxis() || yAxis != QwtPlotPicker::yAxis() ) { QwtPlotPicker::setAxis( xAxis, yAxis ); setZoomBase( scaleRect() ); } } /*! Qt::MidButton zooms out one position on the zoom stack, Qt::RightButton to the zoom base. Changes the current position on the stack, but doesn't pop any rectangle. \note The mouse events can be changed, using QwtEventPattern::setMousePattern: 2, 1 */ void QwtPlotZoomer::widgetMouseReleaseEvent( QMouseEvent *me ) { if ( mouseMatch( MouseSelect2, me ) ) zoom( 0 ); else if ( mouseMatch( MouseSelect3, me ) ) zoom( -1 ); else if ( mouseMatch( MouseSelect6, me ) ) zoom( +1 ); else QwtPlotPicker::widgetMouseReleaseEvent( me ); } /*! Qt::Key_Plus zooms in, Qt::Key_Minus zooms out one position on the zoom stack, Qt::Key_Escape zooms out to the zoom base. Changes the current position on the stack, but doesn't pop any rectangle. \note The keys codes can be changed, using QwtEventPattern::setKeyPattern: 3, 4, 5 */ void QwtPlotZoomer::widgetKeyPressEvent( QKeyEvent *ke ) { if ( !isActive() ) { if ( keyMatch( KeyUndo, ke ) ) zoom( -1 ); else if ( keyMatch( KeyRedo, ke ) ) zoom( +1 ); else if ( keyMatch( KeyHome, ke ) ) zoom( 0 ); } QwtPlotPicker::widgetKeyPressEvent( ke ); } /*! Move the current zoom rectangle. \param dx X offset \param dy Y offset \note The changed rectangle is limited by the zoom base */ void QwtPlotZoomer::moveBy( double dx, double dy ) { const QRectF &rect = d_data->zoomStack[d_data->zoomRectIndex]; moveTo( QPointF( rect.left() + dx, rect.top() + dy ) ); } /*! Move the the current zoom rectangle. \param pos New position \sa QRectF::moveTo() \note The changed rectangle is limited by the zoom base */ void QwtPlotZoomer::moveTo( const QPointF &pos ) { double x = pos.x(); double y = pos.y(); if ( x < zoomBase().left() ) x = zoomBase().left(); if ( x > zoomBase().right() - zoomRect().width() ) x = zoomBase().right() - zoomRect().width(); if ( y < zoomBase().top() ) y = zoomBase().top(); if ( y > zoomBase().bottom() - zoomRect().height() ) y = zoomBase().bottom() - zoomRect().height(); if ( x != zoomRect().left() || y != zoomRect().top() ) { d_data->zoomStack[d_data->zoomRectIndex].moveTo( x, y ); rescale(); } } /*! \brief Check and correct a selected rectangle Reject rectangles with a height or width < 2, otherwise expand the selected rectangle to a minimum size of 11x11 and accept it. \return true If the rectangle is accepted, or has been changed to an accepted one. */ bool QwtPlotZoomer::accept( QPolygon &pa ) const { if ( pa.count() < 2 ) return false; QRect rect = QRect( pa[0], pa[int( pa.count() ) - 1] ); rect = rect.normalized(); const int minSize = 2; if ( rect.width() < minSize && rect.height() < minSize ) return false; const int minZoomSize = 11; const QPoint center = rect.center(); rect.setSize( rect.size().expandedTo( QSize( minZoomSize, minZoomSize ) ) ); rect.moveCenter( center ); pa.resize( 2 ); pa[0] = rect.topLeft(); pa[1] = rect.bottomRight(); return true; } /*! \brief Limit zooming by a minimum rectangle \return zoomBase().width() / 10e4, zoomBase().height() / 10e4 */ QSizeF QwtPlotZoomer::minZoomSize() const { return QSizeF( d_data->zoomStack[0].width() / 10e4, d_data->zoomStack[0].height() / 10e4 ); } /*! Rejects selections, when the stack depth is too deep, or the zoomed rectangle is minZoomSize(). \sa minZoomSize(), maxStackDepth() */ void QwtPlotZoomer::begin() { if ( d_data->maxStackDepth >= 0 ) { if ( d_data->zoomRectIndex >= uint( d_data->maxStackDepth ) ) return; } const QSizeF minSize = minZoomSize(); if ( minSize.isValid() ) { const QSizeF sz = d_data->zoomStack[d_data->zoomRectIndex].size() * 0.9999; if ( minSize.width() >= sz.width() && minSize.height() >= sz.height() ) { return; } } QwtPlotPicker::begin(); } /*! Expand the selected rectangle to minZoomSize() and zoom in if accepted. \param ok If true, complete the selection and emit selected signals otherwise discard the selection. \sa accept(), minZoomSize() \return True if the selection has been accepted, false otherwise */ bool QwtPlotZoomer::end( bool ok ) { ok = QwtPlotPicker::end( ok ); if ( !ok ) return false; QwtPlot *plot = QwtPlotZoomer::plot(); if ( !plot ) return false; const QPolygon &pa = selection(); if ( pa.count() < 2 ) return false; QRect rect = QRect( pa[0], pa[int( pa.count() - 1 )] ); rect = rect.normalized(); QRectF zoomRect = invTransform( rect ).normalized(); const QSizeF minSize = minZoomSize(); if ( minSize.isValid() ) { const QPointF center = zoomRect.center(); zoomRect.setSize( zoomRect.size().expandedTo( minZoomSize() ) ); zoomRect.moveCenter( center ); } zoom( zoomRect ); return true; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_multi_barchart.h���������������������������������������������������000644 �001750 �001750 �00000007661 12151666701 023154� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_BAR_CHART_H #define QWT_PLOT_BAR_CHART_H #include "qwt_global.h" #include "qwt_plot_abstract_barchart.h" #include "qwt_series_data.h" class QwtColumnRect; class QwtColumnSymbol; /*! \brief QwtPlotMultiBarChart displays a series of a samples that consist each of a set of values. Each value is displayed as a bar, the bars of each set can be organized side by side or accumulated. Each bar of a set is rendered by a QwtColumnSymbol, that is set by setSymbol(). The bars of different sets use the same symbols. Exceptions are possible by overloading specialSymbol() or overloading drawBar(). Depending on its orientation() the bars are displayed horizontally or vertically. The bars cover the interval between the baseline() and the value. In opposite to most other plot items, QwtPlotMultiBarChart returns more than one entry for the legend - one for each symbol. \sa QwtPlotBarChart, QwtPlotHistogram QwtPlotSeriesItem::orientation(), QwtPlotAbstractBarChart::baseline() */ class QWT_EXPORT QwtPlotMultiBarChart: public QwtPlotAbstractBarChart, public QwtSeriesStore { public: /*! \brief Chart styles. The default setting is QwtPlotMultiBarChart::Grouped. \sa setStyle(), style() */ enum ChartStyle { //! The bars of a set are displayed side by side Grouped, /*! The bars are displayed on top of each other accumulating to a single bar. All values of a set need to have the same sign. */ Stacked }; explicit QwtPlotMultiBarChart( const QString &title = QString::null ); explicit QwtPlotMultiBarChart( const QwtText &title ); virtual ~QwtPlotMultiBarChart(); virtual int rtti() const; void setBarTitles( const QList & ); QList barTitles() const; void setSamples( const QVector & ); void setSamples( const QVector< QVector > & ); void setSamples( QwtSeriesData * ); void setStyle( ChartStyle style ); ChartStyle style() const; void setSymbol( int barIndex, QwtColumnSymbol *symbol ); const QwtColumnSymbol *symbol( int barIndex ) const; void resetSymbolMap(); virtual void drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QList legendData() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: QwtColumnSymbol *symbol( int barIndex ); virtual QwtColumnSymbol *specialSymbol( int sampleIndex, int valueIndex ) const; virtual void drawSample( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, const QwtInterval &boundingInterval, int index, const QwtSetSample& sample ) const; virtual void drawBar( QPainter *, int sampleIndex, int barIndex, const QwtColumnRect & ) const; void drawStackedBars( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int index, double sampleWidth, const QwtSetSample& sample ) const; void drawGroupedBars( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int index, double sampleWidth, const QwtSetSample& sample ) const; private: void init(); class PrivateData; PrivateData *d_data; }; #endif �������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_abstract_slider.cpp�����������������������������������������������������000644 �001750 �001750 �00000043742 12151666703 022620� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_slider.h" #include "qwt_abstract_scale_draw.h" #include "qwt_math.h" #include "qwt_scale_map.h" #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #endif static double qwtAlignToScaleDiv( const QwtAbstractSlider *slider, double value ) { const QwtScaleDiv &sd = slider->scaleDiv(); const int tValue = slider->transform( value ); if ( tValue == slider->transform( sd.lowerBound() ) ) return sd.lowerBound(); if ( tValue == slider->transform( sd.lowerBound() ) ) return sd.upperBound(); for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) { const QList ticks = sd.ticks( i ); for ( int j = 0; j < ticks.size(); j++ ) { if ( slider->transform( ticks[ j ] ) == tValue ) return ticks[ j ]; } } return value; } class QwtAbstractSlider::PrivateData { public: PrivateData(): isScrolling( false ), isTracking( true ), pendingValueChanged( false ), readOnly( false ), totalSteps( 100 ), singleSteps( 1 ), pageSteps( 10 ), stepAlignment( true ), isValid( false ), value( 0.0 ), wrapping( false ), invertedControls( false ) { } bool isScrolling; bool isTracking; bool pendingValueChanged; bool readOnly; uint totalSteps; uint singleSteps; uint pageSteps; bool stepAlignment; bool isValid; double value; bool wrapping; bool invertedControls; }; /*! \brief Constructor The scale is initialized to [0.0, 100.0], the number of steps is set to 100 with 1 and 10 and single an page step sizes. Step alignment is enabled. The initial value is invalid. \param parent Parent widget */ QwtAbstractSlider::QwtAbstractSlider( QWidget *parent ): QwtAbstractScale( parent ) { d_data = new QwtAbstractSlider::PrivateData; setScale( 0.0, 100.0 ); setFocusPolicy( Qt::StrongFocus ); } //! Destructor QwtAbstractSlider::~QwtAbstractSlider() { delete d_data; } /*! Set the value to be valid/invalid \param on When true, the value is invalidated \sa setValue() */ void QwtAbstractSlider::setValid( bool on ) { if ( on != d_data->isValid ) { d_data->isValid = on; sliderChange(); Q_EMIT valueChanged( d_data->value ); } } //! \return True, when the value is invalid bool QwtAbstractSlider::isValid() const { return d_data->isValid; } /*! En/Disable read only mode In read only mode the slider can't be controlled by mouse or keyboard. \param on Enables in case of true \sa isReadOnly() \warning The focus policy is set to Qt::StrongFocus or Qt::NoFocus */ void QwtAbstractSlider::setReadOnly( bool on ) { if ( d_data->readOnly != on ) { d_data->readOnly = on; setFocusPolicy( on ? Qt::StrongFocus : Qt::NoFocus ); update(); } } /*! In read only mode the slider can't be controlled by mouse or keyboard. \return true if read only \sa setReadOnly() */ bool QwtAbstractSlider::isReadOnly() const { return d_data->readOnly; } /*! \brief Enables or disables tracking. If tracking is enabled, the slider emits the valueChanged() signal while the movable part of the slider is being dragged. If tracking is disabled, the slider emits the valueChanged() signal only when the user releases the slider. Tracking is enabled by default. \param on \c true (enable) or \c false (disable) tracking. \sa isTracking(), sliderMoved() */ void QwtAbstractSlider::setTracking( bool on ) { d_data->isTracking = on; } /*! \return True, when tracking has been enabled \sa setTracking() */ bool QwtAbstractSlider::isTracking() const { return d_data->isTracking; } /*! Mouse press event handler \param event Mouse event */ void QwtAbstractSlider::mousePressEvent( QMouseEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( !d_data->isValid || lowerBound() == upperBound() ) return; d_data->isScrolling = isScrollPosition( event->pos() ); if ( d_data->isScrolling ) { d_data->pendingValueChanged = false; Q_EMIT sliderPressed(); } } /*! Mouse Move Event handler \param event Mouse event */ void QwtAbstractSlider::mouseMoveEvent( QMouseEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( d_data->isValid && d_data->isScrolling ) { double value = scrolledTo( event->pos() ); if ( value != d_data->value ) { value = boundedValue( value ); if ( d_data->stepAlignment ) { value = alignedValue( value ); } else { value = qwtAlignToScaleDiv( this, value ); } if ( value != d_data->value ) { d_data->value = value; sliderChange(); Q_EMIT sliderMoved( d_data->value ); if ( d_data->isTracking ) Q_EMIT valueChanged( d_data->value ); else d_data->pendingValueChanged = true; } } } } /*! Mouse Release Event handler \param event Mouse event */ void QwtAbstractSlider::mouseReleaseEvent( QMouseEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( d_data->isScrolling && d_data->isValid ) { d_data->isScrolling = false; if ( d_data->pendingValueChanged ) Q_EMIT valueChanged( d_data->value ); Q_EMIT sliderReleased(); } } /*! Wheel Event handler In/decreases the value by s number of steps. The direction depends on the invertedControls() property. When the control or shift modifier is pressed the wheel delta ( divided by 120 ) is mapped to an increment according to pageSteps(). Otherwise it is mapped to singleSteps(). \param event Wheel event */ void QwtAbstractSlider::wheelEvent( QWheelEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( !d_data->isValid || d_data->isScrolling ) return; int numSteps = 0; if ( ( event->modifiers() & Qt::ControlModifier) || ( event->modifiers() & Qt::ShiftModifier ) ) { // one page regardless of delta numSteps = d_data->pageSteps; if ( event->delta() < 0 ) numSteps = -numSteps; } else { const int numTurns = ( event->delta() / 120 ); numSteps = numTurns * d_data->singleSteps; } if ( d_data->invertedControls ) numSteps = -numSteps; const double value = incrementedValue( d_data->value, numSteps ); if ( value != d_data->value ) { d_data->value = value; sliderChange(); Q_EMIT sliderMoved( d_data->value ); Q_EMIT valueChanged( d_data->value ); } } /*! Handles key events QwtAbstractSlider handles the following keys: - Qt::Key_Left\n Add/Subtract singleSteps() in direction to lowerBound(); - Qt::Key_Right\n Add/Subtract singleSteps() in direction to upperBound(); - Qt::Key_Down\n Subtract singleSteps(), when invertedControls() is false - Qt::Key_Up\n Add singleSteps(), when invertedControls() is false - Qt::Key_PageDown\n Subtract pageSteps(), when invertedControls() is false - Qt::Key_PageUp\n Add pageSteps(), when invertedControls() is false - Qt::Key_Home\n Set the value to the minimum() - Qt::Key_End\n Set the value to the maximum() \param event Key event \sa isReadOnly() */ void QwtAbstractSlider::keyPressEvent( QKeyEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( !d_data->isValid || d_data->isScrolling ) return; int numSteps = 0; double value = d_data->value; switch ( event->key() ) { case Qt::Key_Left: { numSteps = -static_cast( d_data->singleSteps ); if ( isInverted() ) numSteps = -numSteps; break; } case Qt::Key_Right: { numSteps = d_data->singleSteps; if ( isInverted() ) numSteps = -numSteps; break; } case Qt::Key_Down: { numSteps = -static_cast( d_data->singleSteps ); if ( d_data->invertedControls ) numSteps = -numSteps; break; } case Qt::Key_Up: { numSteps = d_data->singleSteps; if ( d_data->invertedControls ) numSteps = -numSteps; break; } case Qt::Key_PageUp: { numSteps = d_data->pageSteps; if ( d_data->invertedControls ) numSteps = -numSteps; break; } case Qt::Key_PageDown: { numSteps = -static_cast( d_data->pageSteps ); if ( d_data->invertedControls ) numSteps = -numSteps; break; } case Qt::Key_Home: { value = minimum(); break; } case Qt::Key_End: { value = maximum(); break; } default:; { event->ignore(); } } if ( numSteps != 0 ) { value = incrementedValue( d_data->value, numSteps ); } if ( value != d_data->value ) { d_data->value = value; sliderChange(); Q_EMIT sliderMoved( d_data->value ); Q_EMIT valueChanged( d_data->value ); } } /*! \brief Set the number of steps The range of the slider is divided into a number of steps from which the value increments according to user inputs depend. The default setting is 100. \param stepCount Number of steps \sa totalSteps(), setSingleSteps(), setPageSteps() */ void QwtAbstractSlider::setTotalSteps( uint stepCount ) { d_data->totalSteps = stepCount; } /*! \return Number of steps \sa setTotalSteps(), singleSteps(), pageSteps() */ uint QwtAbstractSlider::totalSteps() const { return d_data->totalSteps; } /*! \brief Set the number of steps for a single increment The range of the slider is divided into a number of steps from which the value increments according to user inputs depend. \param stepCount Number of steps \sa singleSteps(), setTotalSteps(), setPageSteps() */ void QwtAbstractSlider::setSingleSteps( uint stepCount ) { d_data->singleSteps = stepCount; } /*! \return Number of steps \sa setSingleSteps(), totalSteps(), pageSteps() */ uint QwtAbstractSlider::singleSteps() const { return d_data->singleSteps; } /*! \brief Set the number of steps for a page increment The range of the slider is divided into a number of steps from which the value increments according to user inputs depend. \param stepCount Number of steps \sa pageSteps(), setTotalSteps(), setSingleSteps() */ void QwtAbstractSlider::setPageSteps( uint stepCount ) { d_data->pageSteps = stepCount; } /*! \return Number of steps \sa setPageSteps(), totalSteps(), singleSteps() */ uint QwtAbstractSlider::pageSteps() const { return d_data->pageSteps; } /*! \brief Enable step alignment When step alignment is enabled values resulting from slider movements are aligned to the step size. \param on Enable step alignment when true \sa stepAlignment() */ void QwtAbstractSlider::setStepAlignment( bool on ) { if ( on != d_data->stepAlignment ) { d_data->stepAlignment = on; } } /*! \return True, when step alignment is enabled \sa setStepAlignment() */ bool QwtAbstractSlider::stepAlignment() const { return d_data->stepAlignment; } /*! Set the slider to the specified value \param value New value \sa setValid(), sliderChange(), valueChanged() */ void QwtAbstractSlider::setValue( double value ) { value = qBound( minimum(), value, maximum() ); const bool changed = ( d_data->value != value ) || !d_data->isValid; d_data->value = value; d_data->isValid = true; if ( changed ) { sliderChange(); Q_EMIT valueChanged( d_data->value ); } } //! Returns the current value. double QwtAbstractSlider::value() const { return d_data->value; } /*! If wrapping is true stepping up from upperBound() value will take you to the minimum() value and vice versa. \param on En/Disable wrapping \sa wrapping() */ void QwtAbstractSlider::setWrapping( bool on ) { d_data->wrapping = on; } /*! \return True, when wrapping is set \sa setWrapping() */ bool QwtAbstractSlider::wrapping() const { return d_data->wrapping; } /*! Invert wheel and key events Usually scrolling the mouse wheel "up" and using keys like page up will increase the slider's value towards its maximum. When invertedControls() is enabled the value is scrolled towards its minimum. Inverting the controls might be f.e. useful for a vertical slider with an inverted scale ( decreasing from top to bottom ). \param on Invert controls, when true \sa invertedControls(), keyEvent(), wheelEvent() */ void QwtAbstractSlider::setInvertedControls( bool on ) { d_data->invertedControls = on; } /*! \return True, when the controls are inverted \sa setInvertedControls() */ bool QwtAbstractSlider::invertedControls() const { return d_data->invertedControls; } /*! Increment the slider The step size depends on the number of totalSteps() \param stepCount Number of steps \sa setTotalSteps(), incrementedValue() */ void QwtAbstractSlider::incrementValue( int stepCount ) { const double value = incrementedValue( d_data->value, stepCount ); if ( value != d_data->value ) { d_data->value = value; sliderChange(); } } /*! Increment a value \param value Value \param stepCount Number of steps \return Incremented value */ double QwtAbstractSlider::incrementedValue( double value, int stepCount ) const { if ( d_data->totalSteps == 0 ) return value; const QwtTransform *transformation = scaleMap().transformation(); if ( transformation == NULL ) { const double range = maximum() - minimum(); value += stepCount * range / d_data->totalSteps; } else { QwtScaleMap map = scaleMap(); map.setPaintInterval( 0, d_data->totalSteps ); // we need equidant steps according to // paint device coordinates const double range = transformation->transform( maximum() ) - transformation->transform( minimum() ); const double stepSize = range / d_data->totalSteps; double v = transformation->transform( value ); v = qRound( v / stepSize ) * stepSize; v += stepCount * range / d_data->totalSteps; value = transformation->invTransform( v ); } value = boundedValue( value ); if ( d_data->stepAlignment ) value = alignedValue( value ); return value; } double QwtAbstractSlider::boundedValue( double value ) const { const double vmin = minimum(); const double vmax = maximum(); if ( d_data->wrapping && vmin != vmax ) { const int fullCircle = 360 * 16; const double pd = scaleMap().pDist(); if ( int( pd / fullCircle ) * fullCircle == pd ) { // full circle scales: min and max are the same const double range = vmax - vmin; if ( value < vmin ) { value += ::ceil( ( vmin - value ) / range ) * range; } else if ( value > vmax ) { value -= ::ceil( ( value - vmax ) / range ) * range; } } else { if ( value < vmin ) value = vmax; else if ( value > vmax ) value = vmin; } } else { value = qBound( vmin, value, vmax ); } return value; } double QwtAbstractSlider::alignedValue( double value ) const { if ( d_data->totalSteps == 0 ) return value; if ( scaleMap().transformation() == NULL ) { const double stepSize = ( maximum() - minimum() ) / d_data->totalSteps; if ( stepSize > 0.0 ) { value = lowerBound() + qRound( ( value - lowerBound() ) / stepSize ) * stepSize; } } else { const double stepSize = ( scaleMap().p2() - scaleMap().p1() ) / d_data->totalSteps; if ( stepSize > 0.0 ) { double v = scaleMap().transform( value ); v = scaleMap().p1() + qRound( ( v - scaleMap().p1() ) / stepSize ) * stepSize; value = scaleMap().invTransform( v ); } } // correct rounding error if value = 0 if ( qFuzzyCompare( value + 1.0, 1.0 ) ) { value = 0.0; } else { // correct rounding error at the border if ( qFuzzyCompare( value, upperBound() ) ) value = upperBound(); else if ( qFuzzyCompare( value, lowerBound() ) ) value = lowerBound(); } return value; } /*! Update the slider according to modifications of the scale */ void QwtAbstractSlider::scaleChange() { const double value = qBound( minimum(), d_data->value, maximum() ); const bool changed = ( value != d_data->value ); if ( changed ) { d_data->value = value; } if ( d_data->isValid || changed ) Q_EMIT valueChanged( d_data->value ); updateGeometry(); update(); } //! Calling update() void QwtAbstractSlider::sliderChange() { update(); } ������������������������������linssid-2.7/linssid-app/����������������������������������������������������������������������������000775 �001750 �001750 �00000000000 12367032203 016110� 5����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_zoneitem.h���������������������������������������������������������000644 �001750 �001750 �00000003337 12151666701 022002� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ZONE_ITEM_H #define QWT_PLOT_ZONE_ITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_interval.h" class QPen; class QBrush; /*! \brief A plot item, which displays a zone A horizontal zone highlights an interval of the y axis - a vertical zone an interval of the x axis - and is unbounded in the opposite direction. It is filled with a brush and its border lines are optionally displayed with a pen. \note For displaying an area that is bounded for x and y coordinates use QwtPlotShapeItem */ class QWT_EXPORT QwtPlotZoneItem: public QwtPlotItem { public: explicit QwtPlotZoneItem(); virtual ~QwtPlotZoneItem(); virtual int rtti() const; void setOrientation( Qt::Orientation ); Qt::Orientation orientation(); void setInterval( double min, double max ); void setInterval( const QwtInterval & ); QwtInterval interval() const; void setPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; virtual void draw( QPainter *, const QwtScaleMap &, const QwtScaleMap &, const QRectF &) const; virtual QRectF boundingRect() const; private: class PrivateData; PrivateData *d_data; }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_plot_axis.cpp�����������������������������������������������������������000644 �001750 �001750 �00000043327 12151666703 021454� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_math.h" #include "qwt_scale_widget.h" #include "qwt_scale_div.h" #include "qwt_scale_engine.h" class QwtPlot::AxisData { public: bool isEnabled; bool doAutoScale; double minValue; double maxValue; double stepSize; int maxMajor; int maxMinor; bool isValid; QwtScaleDiv scaleDiv; QwtScaleEngine *scaleEngine; QwtScaleWidget *scaleWidget; }; //! Initialize axes void QwtPlot::initAxesData() { int axisId; for ( axisId = 0; axisId < axisCnt; axisId++ ) d_axisData[axisId] = new AxisData; d_axisData[yLeft]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::LeftScale, this ); d_axisData[yRight]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::RightScale, this ); d_axisData[xTop]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::TopScale, this ); d_axisData[xBottom]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::BottomScale, this ); d_axisData[yLeft]->scaleWidget->setObjectName( "QwtPlotAxisYLeft" ); d_axisData[yRight]->scaleWidget->setObjectName( "QwtPlotAxisYRight" ); d_axisData[xTop]->scaleWidget->setObjectName( "QwtPlotAxisXTop" ); d_axisData[xBottom]->scaleWidget->setObjectName( "QwtPlotAxisXBottom" ); #if 1 // better find the font sizes from the application font QFont fscl( fontInfo().family(), 10 ); QFont fttl( fontInfo().family(), 12, QFont::Bold ); #endif for ( axisId = 0; axisId < axisCnt; axisId++ ) { AxisData &d = *d_axisData[axisId]; d.scaleEngine = new QwtLinearScaleEngine; d.scaleWidget->setTransformation( d.scaleEngine->transformation() ); d.scaleWidget->setFont( fscl ); d.scaleWidget->setMargin( 2 ); QwtText text = d.scaleWidget->title(); text.setFont( fttl ); d.scaleWidget->setTitle( text ); d.doAutoScale = true; d.minValue = 0.0; d.maxValue = 1000.0; d.stepSize = 0.0; d.maxMinor = 5; d.maxMajor = 8; d.isValid = false; } d_axisData[yLeft]->isEnabled = true; d_axisData[yRight]->isEnabled = false; d_axisData[xBottom]->isEnabled = true; d_axisData[xTop]->isEnabled = false; } void QwtPlot::deleteAxesData() { for ( int axisId = 0; axisId < axisCnt; axisId++ ) { delete d_axisData[axisId]->scaleEngine; delete d_axisData[axisId]; d_axisData[axisId] = NULL; } } /*! \return Scale widget of the specified axis, or NULL if axisId is invalid. \param axisId Axis index */ const QwtScaleWidget *QwtPlot::axisWidget( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleWidget; return NULL; } /*! \return Scale widget of the specified axis, or NULL if axisId is invalid. \param axisId Axis index */ QwtScaleWidget *QwtPlot::axisWidget( int axisId ) { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleWidget; return NULL; } /*! Change the scale engine for an axis \param axisId Axis index \param scaleEngine Scale engine \sa axisScaleEngine() */ void QwtPlot::setAxisScaleEngine( int axisId, QwtScaleEngine *scaleEngine ) { if ( axisValid( axisId ) && scaleEngine != NULL ) { AxisData &d = *d_axisData[axisId]; delete d.scaleEngine; d.scaleEngine = scaleEngine; d_axisData[axisId]->scaleWidget->setTransformation( scaleEngine->transformation() ); d.isValid = false; autoRefresh(); } } /*! \param axisId Axis index \return Scale engine for a specific axis */ QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleEngine; else return NULL; } /*! \param axisId Axis index \return Scale engine for a specific axis */ const QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleEngine; else return NULL; } /*! \return \c True, if autoscaling is enabled \param axisId Axis index */ bool QwtPlot::axisAutoScale( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->doAutoScale; else return false; } /*! \return \c True, if a specified axis is enabled \param axisId Axis index */ bool QwtPlot::axisEnabled( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->isEnabled; else return false; } /*! \return The font of the scale labels for a specified axis \param axisId Axis index */ QFont QwtPlot::axisFont( int axisId ) const { if ( axisValid( axisId ) ) return axisWidget( axisId )->font(); else return QFont(); } /*! \return The maximum number of major ticks for a specified axis \param axisId Axis index \sa setAxisMaxMajor(), QwtScaleEngine::divideScale() */ int QwtPlot::axisMaxMajor( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->maxMajor; else return 0; } /*! \return the maximum number of minor ticks for a specified axis \param axisId Axis index \sa setAxisMaxMinor(), QwtScaleEngine::divideScale() */ int QwtPlot::axisMaxMinor( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->maxMinor; else return 0; } /*! \brief Return the scale division of a specified axis axisScaleDiv(axisId).lowerBound(), axisScaleDiv(axisId).upperBound() are the current limits of the axis scale. \param axisId Axis index \return Scale division \sa QwtScaleDiv, setAxisScaleDiv(), QwtScaleEngine::divideScale() */ const QwtScaleDiv &QwtPlot::axisScaleDiv( int axisId ) const { return d_axisData[axisId]->scaleDiv; } /*! \brief Return the scale draw of a specified axis \param axisId Axis index \return Specified scaleDraw for axis, or NULL if axis is invalid. */ const QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) const { if ( !axisValid( axisId ) ) return NULL; return axisWidget( axisId )->scaleDraw(); } /*! \brief Return the scale draw of a specified axis \param axisId Axis index \return Specified scaleDraw for axis, or NULL if axis is invalid. */ QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) { if ( !axisValid( axisId ) ) return NULL; return axisWidget( axisId )->scaleDraw(); } /*! \brief Return the step size parameter that has been set in setAxisScale. This doesn't need to be the step size of the current scale. \param axisId Axis index \return step size parameter value \sa setAxisScale(), QwtScaleEngine::divideScale() */ double QwtPlot::axisStepSize( int axisId ) const { if ( !axisValid( axisId ) ) return 0; return d_axisData[axisId]->stepSize; } /*! \brief Return the current interval of the specified axis This is only a convenience function for axisScaleDiv( axisId )->interval(); \param axisId Axis index \return Scale interval \sa QwtScaleDiv, axisScaleDiv() */ QwtInterval QwtPlot::axisInterval( int axisId ) const { if ( !axisValid( axisId ) ) return QwtInterval(); return d_axisData[axisId]->scaleDiv.interval(); } /*! \return Title of a specified axis \param axisId Axis index */ QwtText QwtPlot::axisTitle( int axisId ) const { if ( axisValid( axisId ) ) return axisWidget( axisId )->title(); else return QwtText(); } /*! \brief Enable or disable a specified axis When an axis is disabled, this only means that it is not visible on the screen. Curves, markers and can be attached to disabled axes, and transformation of screen coordinates into values works as normal. Only xBottom and yLeft are enabled by default. \param axisId Axis index \param tf \c true (enabled) or \c false (disabled) */ void QwtPlot::enableAxis( int axisId, bool tf ) { if ( axisValid( axisId ) && tf != d_axisData[axisId]->isEnabled ) { d_axisData[axisId]->isEnabled = tf; updateLayout(); } } /*! Transform the x or y coordinate of a position in the drawing region into a value. \param axisId Axis index \param pos position \return Position as axis coordinate \warning The position can be an x or a y coordinate, depending on the specified axis. */ double QwtPlot::invTransform( int axisId, int pos ) const { if ( axisValid( axisId ) ) return( canvasMap( axisId ).invTransform( pos ) ); else return 0.0; } /*! \brief Transform a value into a coordinate in the plotting region \param axisId Axis index \param value value \return X or Y coordinate in the plotting region corresponding to the value. */ double QwtPlot::transform( int axisId, double value ) const { if ( axisValid( axisId ) ) return( canvasMap( axisId ).transform( value ) ); else return 0.0; } /*! \brief Change the font of an axis \param axisId Axis index \param font Font \warning This function changes the font of the tick labels, not of the axis title. */ void QwtPlot::setAxisFont( int axisId, const QFont &font ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setFont( font ); } /*! \brief Enable autoscaling for a specified axis This member function is used to switch back to autoscaling mode after a fixed scale has been set. Autoscaling is enabled by default. \param axisId Axis index \param on On/Off \sa setAxisScale(), setAxisScaleDiv(), updateAxes() \note The autoscaling flag has no effect until updateAxes() is executed ( called by replot() ). */ void QwtPlot::setAxisAutoScale( int axisId, bool on ) { if ( axisValid( axisId ) && ( d_axisData[axisId]->doAutoScale != on ) ) { d_axisData[axisId]->doAutoScale = on; autoRefresh(); } } /*! \brief Disable autoscaling and specify a fixed scale for a selected axis. In updateAxes() the scale engine calculates a scale division from the specified parameters, that will be assigned to the scale widget. So updates of the scale widget usually happen delayed with the next replot. \param axisId Axis index \param min Minimum of the scale \param max Maximum of the scale \param stepSize Major step size. If
step == 0, the step size is calculated automatically using the maxMajor setting. \sa setAxisMaxMajor(), setAxisAutoScale(), axisStepSize(), QwtScaleEngine::divideScale() */ void QwtPlot::setAxisScale( int axisId, double min, double max, double stepSize ) { if ( axisValid( axisId ) ) { AxisData &d = *d_axisData[axisId]; d.doAutoScale = false; d.isValid = false; d.minValue = min; d.maxValue = max; d.stepSize = stepSize; autoRefresh(); } } /*! \brief Disable autoscaling and specify a fixed scale for a selected axis. The scale division will be stored locally only until the next call of updateAxes(). So updates of the scale widget usually happen delayed with the next replot. \param axisId Axis index \param scaleDiv Scale division \sa setAxisScale(), setAxisAutoScale() */ void QwtPlot::setAxisScaleDiv( int axisId, const QwtScaleDiv &scaleDiv ) { if ( axisValid( axisId ) ) { AxisData &d = *d_axisData[axisId]; d.doAutoScale = false; d.scaleDiv = scaleDiv; d.isValid = true; autoRefresh(); } } /*! \brief Set a scale draw \param axisId Axis index \param scaleDraw Object responsible for drawing scales. By passing scaleDraw it is possible to extend QwtScaleDraw functionality and let it take place in QwtPlot. Please note that scaleDraw has to be created with new and will be deleted by the corresponding QwtScale member ( like a child object ). \sa QwtScaleDraw, QwtScaleWidget \warning The attributes of scaleDraw will be overwritten by those of the previous QwtScaleDraw. */ void QwtPlot::setAxisScaleDraw( int axisId, QwtScaleDraw *scaleDraw ) { if ( axisValid( axisId ) ) { axisWidget( axisId )->setScaleDraw( scaleDraw ); autoRefresh(); } } /*! Change the alignment of the tick labels \param axisId Axis index \param alignment Or'd Qt::AlignmentFlags see \sa QwtScaleDraw::setLabelAlignment() */ void QwtPlot::setAxisLabelAlignment( int axisId, Qt::Alignment alignment ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setLabelAlignment( alignment ); } /*! Rotate all tick labels \param axisId Axis index \param rotation Angle in degrees. When changing the label rotation, the label alignment might be adjusted too. \sa QwtScaleDraw::setLabelRotation(), setAxisLabelAlignment() */ void QwtPlot::setAxisLabelRotation( int axisId, double rotation ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setLabelRotation( rotation ); } /*! Set the maximum number of minor scale intervals for a specified axis \param axisId Axis index \param maxMinor Maximum number of minor steps \sa axisMaxMinor() */ void QwtPlot::setAxisMaxMinor( int axisId, int maxMinor ) { if ( axisValid( axisId ) ) { maxMinor = qBound( 0, maxMinor, 100 ); AxisData &d = *d_axisData[axisId]; if ( maxMinor != d.maxMinor ) { d.maxMinor = maxMinor; d.isValid = false; autoRefresh(); } } } /*! Set the maximum number of major scale intervals for a specified axis \param axisId Axis index \param maxMajor Maximum number of major steps \sa axisMaxMajor() */ void QwtPlot::setAxisMaxMajor( int axisId, int maxMajor ) { if ( axisValid( axisId ) ) { maxMajor = qBound( 1, maxMajor, 10000 ); AxisData &d = *d_axisData[axisId]; if ( maxMajor != d.maxMajor ) { d.maxMajor = maxMajor; d.isValid = false; autoRefresh(); } } } /*! \brief Change the title of a specified axis \param axisId Axis index \param title axis title */ void QwtPlot::setAxisTitle( int axisId, const QString &title ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setTitle( title ); } /*! \brief Change the title of a specified axis \param axisId Axis index \param title Axis title */ void QwtPlot::setAxisTitle( int axisId, const QwtText &title ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setTitle( title ); } /*! \brief Rebuild the axes scales In case of autoscaling the boundaries of a scale are calculated from the bounding rectangles of all plot items, having the QwtPlotItem::AutoScale flag enabled ( QwtScaleEngine::autoScale() ). Then a scale division is calculated ( QwtScaleEngine::didvideScale() ) and assigned to scale widget. When the scale boundaries have been assigned with setAxisScale() a scale division is calculated ( QwtScaleEngine::didvideScale() ) for this interval and assigned to the scale widget. When the scale has been set explicitly by setAxisScaleDiv() the locally stored scale division gets assigned to the scale widget. The scale widget indicates modifications by emitting a QwtScaleWidget::scaleDivChanged() signal. updateAxes() is usually called by replot(). \sa setAxisAutoScale(), setAxisScale(), setAxisScaleDiv(), replot() QwtPlotItem::boundingRect() */ void QwtPlot::updateAxes() { // Find bounding interval of the item data // for all axes, where autoscaling is enabled QwtInterval intv[axisCnt]; const QwtPlotItemList& itmList = itemList(); QwtPlotItemIterator it; for ( it = itmList.begin(); it != itmList.end(); ++it ) { const QwtPlotItem *item = *it; if ( !item->testItemAttribute( QwtPlotItem::AutoScale ) ) continue; if ( !item->isVisible() ) continue; if ( axisAutoScale( item->xAxis() ) || axisAutoScale( item->yAxis() ) ) { const QRectF rect = item->boundingRect(); if ( rect.width() >= 0.0 ) intv[item->xAxis()] |= QwtInterval( rect.left(), rect.right() ); if ( rect.height() >= 0.0 ) intv[item->yAxis()] |= QwtInterval( rect.top(), rect.bottom() ); } } // Adjust scales for ( int axisId = 0; axisId < axisCnt; axisId++ ) { AxisData &d = *d_axisData[axisId]; double minValue = d.minValue; double maxValue = d.maxValue; double stepSize = d.stepSize; if ( d.doAutoScale && intv[axisId].isValid() ) { d.isValid = false; minValue = intv[axisId].minValue(); maxValue = intv[axisId].maxValue(); d.scaleEngine->autoScale( d.maxMajor, minValue, maxValue, stepSize ); } if ( !d.isValid ) { d.scaleDiv = d.scaleEngine->divideScale( minValue, maxValue, d.maxMajor, d.maxMinor, stepSize ); d.isValid = true; } QwtScaleWidget *scaleWidget = axisWidget( axisId ); scaleWidget->setScaleDiv( d.scaleDiv ); int startDist, endDist; scaleWidget->getBorderDistHint( startDist, endDist ); scaleWidget->setBorderDist( startDist, endDist ); } for ( it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; if ( item->testItemInterest( QwtPlotItem::ScaleInterest ) ) { item->updateScaleDiv( axisScaleDiv( item->xAxis() ), axisScaleDiv( item->yAxis() ) ); } } } linssid-2.7/qwt-lib/src/qwt_plot_textlabel.cpp000644 001750 001750 00000012722 12151666703 022467 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_textlabel.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include #include #include static QRect qwtItemRect( int renderFlags, const QRectF &rect, const QSizeF &itemSize ) { int x; if ( renderFlags & Qt::AlignLeft ) { x = rect.left(); } else if ( renderFlags & Qt::AlignRight ) { x = rect.right() - itemSize.width(); } else { x = rect.center().x() - 0.5 * itemSize.width(); } int y; if ( renderFlags & Qt::AlignTop ) { y = rect.top(); } else if ( renderFlags & Qt::AlignBottom ) { y = rect.bottom() - itemSize.height(); } else { y = rect.center().y() - 0.5 * itemSize.height(); } return QRect( x, y, itemSize.width(), itemSize.height() ); } class QwtPlotTextLabel::PrivateData { public: PrivateData(): margin( 5 ) { } QwtText text; int margin; QPixmap pixmap; }; /*! \brief Constructor Initializes an text label with an empty text Sets the following item attributes: - QwtPlotItem::AutoScale: true - QwtPlotItem::Legend: false The z value is initialized by 150 \sa QwtPlotItem::setItemAttribute(), QwtPlotItem::setZ() */ QwtPlotTextLabel::QwtPlotTextLabel(): QwtPlotItem( QwtText( "Label" ) ) { d_data = new PrivateData; setItemAttribute( QwtPlotItem::AutoScale, false ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 150 ); } //! Destructor QwtPlotTextLabel::~QwtPlotTextLabel() { delete d_data; } //! \return QwtPlotItem::Rtti_PlotTextLabel int QwtPlotTextLabel::rtti() const { return QwtPlotItem::Rtti_PlotTextLabel; } /*! Set the text The label will be aligned to the plot canvas according to the alignment flags of text. \param text Text to be displayed \sa text(), QwtText::renderFlags() */ void QwtPlotTextLabel::setText( const QwtText &text ) { if ( d_data->text != text ) { d_data->text = text; invalidateCache(); itemChanged(); } } /*! \return Text to be displayed \sa setText() */ QwtText QwtPlotTextLabel::text() const { return d_data->text; } /*! Set the margin The margin is the distance between the contentsRect() of the plot canvas and the rectangle where the label can be displayed. \param margin Margin \sa margin(), textRect() */ void QwtPlotTextLabel::setMargin( int margin ) { margin = qMax( margin, 0 ); if ( d_data->margin != margin ) { d_data->margin = margin; itemChanged(); } } /*! \return Margin added to the contentsMargins() of the canvas \sa setMargin() */ int QwtPlotTextLabel::margin() const { return d_data->margin; } /*! Draw the text label \param painter Painter \param xMap x Scale Map \param yMap y Scale Map \param canvasRect Contents rectangle of the canvas in painter coordinates \sa textRect() */ void QwtPlotTextLabel::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { Q_UNUSED( xMap ); Q_UNUSED( yMap ); const int m = d_data->margin; const QRectF rect = textRect( canvasRect.adjusted( m, m, -m, -m ), d_data->text.textSize( painter->font() ) ); const bool doAlign = QwtPainter::roundingAlignment( painter ); if ( doAlign ) { // when the paint device is aligning it is not one // where scalability matters ( PDF, SVG ). // As rendering a text label is an expensive operation // we use a cache. int pw = 0; if ( d_data->text.borderPen().style() != Qt::NoPen ) pw = qMax( d_data->text.borderPen().width(), 1 ); QRect pixmapRect; pixmapRect.setLeft( qFloor( rect.left() ) - pw ); pixmapRect.setTop( qFloor( rect.top() ) - pw ); pixmapRect.setRight( qCeil( rect.right() ) + pw ); pixmapRect.setBottom( qCeil( rect.bottom() ) + pw ); if ( d_data->pixmap.isNull() || ( pixmapRect.size() != d_data->pixmap.size() ) ) { d_data->pixmap = QPixmap( pixmapRect.size() ); d_data->pixmap.fill( Qt::transparent ); const QRect r( pw, pw, pixmapRect.width() - 2 * pw, pixmapRect.height() - 2 * pw ); QPainter pmPainter( &d_data->pixmap ); d_data->text.draw( &pmPainter, r ); } painter->drawPixmap( pixmapRect, d_data->pixmap ); } else { d_data->text.draw( painter, rect ); } } /*! \brief Align the text label \param rect Canvas rectangle with margins subtracted \param textSize Size required to draw the text \return A rectangle aligned according the the alignment flags of the text. \sa setMargin(), QwtText::renderFlags(), QwtText::textSize() */ QRectF QwtPlotTextLabel::textRect( const QRectF &rect, const QSizeF &textSize ) const { return qwtItemRect( d_data->text.renderFlags(), rect, textSize ); } //! Invalidate all internal cache void QwtPlotTextLabel::invalidateCache() { d_data->pixmap = QPixmap(); } linssid-2.7/linssid-app/linssid48.png000664 001750 001750 00000002320 12355414341 020440 0ustar00warrenwarren000000 000000 PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<MIDAThMlTUg:P>Ę"!iHPP&nHLe;4_4Ȕh,;],pc,Q!1J"J։529.ty34?y~?}gވ*ƢpD1ciTK֍Ep3 [7U`QƢKrH6 l[a{6>G'U)I(XĽ: \4vH^m hd'B]tL:6 $.g:Q0 2q:=F]ЊQ9 FWA)[m`e D-.7HpW"*T"3>/|:TUɩ 4r >dHXFӀ/0D:aCp"a$XEWhBon<ܙjc!-Do}-K\V;lO7p <H2">"wa4GQMϳIS]b/x(t4K)[u[s VࡀygX: I%hMB,o6TWEK\/jӮ[:`N$׺G-P`P8@^ 7[ ȇIENDB`linssid-2.7/qwt-lib/src/qwt_curve_fitter.cpp000644 001750 001750 00000024071 12151666703 022146 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_curve_fitter.h" #include "qwt_math.h" #include "qwt_spline.h" #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #endif //! Constructor QwtCurveFitter::QwtCurveFitter() { } //! Destructor QwtCurveFitter::~QwtCurveFitter() { } class QwtSplineCurveFitter::PrivateData { public: PrivateData(): fitMode( QwtSplineCurveFitter::Auto ), splineSize( 250 ) { } QwtSpline spline; QwtSplineCurveFitter::FitMode fitMode; int splineSize; }; //! Constructor QwtSplineCurveFitter::QwtSplineCurveFitter() { d_data = new PrivateData; } //! Destructor QwtSplineCurveFitter::~QwtSplineCurveFitter() { delete d_data; } /*! Select the algorithm used for building the spline \param mode Mode representing a spline algorithm \sa fitMode() */ void QwtSplineCurveFitter::setFitMode( FitMode mode ) { d_data->fitMode = mode; } /*! \return Mode representing a spline algorithm \sa setFitMode() */ QwtSplineCurveFitter::FitMode QwtSplineCurveFitter::fitMode() const { return d_data->fitMode; } /*! Assign a spline \param spline Spline \sa spline() */ void QwtSplineCurveFitter::setSpline( const QwtSpline &spline ) { d_data->spline = spline; d_data->spline.reset(); } /*! \return Spline \sa setSpline() */ const QwtSpline &QwtSplineCurveFitter::spline() const { return d_data->spline; } /*! \return Spline \sa setSpline() */ QwtSpline &QwtSplineCurveFitter::spline() { return d_data->spline; } /*! Assign a spline size ( has to be at least 10 points ) \param splineSize Spline size \sa splineSize() */ void QwtSplineCurveFitter::setSplineSize( int splineSize ) { d_data->splineSize = qMax( splineSize, 10 ); } /*! \return Spline size \sa setSplineSize() */ int QwtSplineCurveFitter::splineSize() const { return d_data->splineSize; } /*! Find a curve which has the best fit to a series of data points \param points Series of data points \return Curve points */ QPolygonF QwtSplineCurveFitter::fitCurve( const QPolygonF &points ) const { const int size = points.size(); if ( size <= 2 ) return points; FitMode fitMode = d_data->fitMode; if ( fitMode == Auto ) { fitMode = Spline; const QPointF *p = points.data(); for ( int i = 1; i < size; i++ ) { if ( p[i].x() <= p[i-1].x() ) { fitMode = ParametricSpline; break; } }; } if ( fitMode == ParametricSpline ) return fitParametric( points ); else return fitSpline( points ); } QPolygonF QwtSplineCurveFitter::fitSpline( const QPolygonF &points ) const { d_data->spline.setPoints( points ); if ( !d_data->spline.isValid() ) return points; QPolygonF fittedPoints( d_data->splineSize ); const double x1 = points[0].x(); const double x2 = points[int( points.size() - 1 )].x(); const double dx = x2 - x1; const double delta = dx / ( d_data->splineSize - 1 ); for ( int i = 0; i < d_data->splineSize; i++ ) { QPointF &p = fittedPoints[i]; const double v = x1 + i * delta; const double sv = d_data->spline.value( v ); p.setX( v ); p.setY( sv ); } d_data->spline.reset(); return fittedPoints; } QPolygonF QwtSplineCurveFitter::fitParametric( const QPolygonF &points ) const { int i; const int size = points.size(); QPolygonF fittedPoints( d_data->splineSize ); QPolygonF splinePointsX( size ); QPolygonF splinePointsY( size ); const QPointF *p = points.data(); QPointF *spX = splinePointsX.data(); QPointF *spY = splinePointsY.data(); double param = 0.0; for ( i = 0; i < size; i++ ) { const double x = p[i].x(); const double y = p[i].y(); if ( i > 0 ) { const double delta = qSqrt( qwtSqr( x - spX[i-1].y() ) + qwtSqr( y - spY[i-1].y() ) ); param += qMax( delta, 1.0 ); } spX[i].setX( param ); spX[i].setY( x ); spY[i].setX( param ); spY[i].setY( y ); } d_data->spline.setPoints( splinePointsX ); if ( !d_data->spline.isValid() ) return points; const double deltaX = splinePointsX[size - 1].x() / ( d_data->splineSize - 1 ); for ( i = 0; i < d_data->splineSize; i++ ) { const double dtmp = i * deltaX; fittedPoints[i].setX( d_data->spline.value( dtmp ) ); } d_data->spline.setPoints( splinePointsY ); if ( !d_data->spline.isValid() ) return points; const double deltaY = splinePointsY[size - 1].x() / ( d_data->splineSize - 1 ); for ( i = 0; i < d_data->splineSize; i++ ) { const double dtmp = i * deltaY; fittedPoints[i].setY( d_data->spline.value( dtmp ) ); } return fittedPoints; } class QwtWeedingCurveFitter::PrivateData { public: PrivateData(): tolerance( 1.0 ), chunkSize( 0 ) { } double tolerance; uint chunkSize; }; class QwtWeedingCurveFitter::Line { public: Line( int i1 = 0, int i2 = 0 ): from( i1 ), to( i2 ) { } int from; int to; }; /*! Constructor \param tolerance Tolerance \sa setTolerance(), tolerance() */ QwtWeedingCurveFitter::QwtWeedingCurveFitter( double tolerance ) { d_data = new PrivateData; setTolerance( tolerance ); } //! Destructor QwtWeedingCurveFitter::~QwtWeedingCurveFitter() { delete d_data; } /*! Assign the tolerance The tolerance is the maximum distance, that is acceptable between the original curve and the smoothed curve. Increasing the tolerance will reduce the number of the resulting points. \param tolerance Tolerance \sa tolerance() */ void QwtWeedingCurveFitter::setTolerance( double tolerance ) { d_data->tolerance = qMax( tolerance, 0.0 ); } /*! \return Tolerance \sa setTolerance() */ double QwtWeedingCurveFitter::tolerance() const { return d_data->tolerance; } /*! Limit the number of points passed to a run of the algorithm The runtime of the Douglas Peucker algorithm increases non linear with the number of points. For a chunk size > 0 the polygon is split into pieces passed to the algorithm one by one. \param numPoints Maximum for the number of points passed to the algorithm \sa chunkSize() */ void QwtWeedingCurveFitter::setChunkSize( uint numPoints ) { if ( numPoints > 0 ) numPoints = qMax( numPoints, 3U ); d_data->chunkSize = numPoints; } /*! \return Maximum for the number of points passed to a run of the algorithm - or 0, when unlimited \sa setChunkSize() */ uint QwtWeedingCurveFitter::chunkSize() const { return d_data->chunkSize; } /*! \param points Series of data points \return Curve points */ QPolygonF QwtWeedingCurveFitter::fitCurve( const QPolygonF &points ) const { QPolygonF fittedPoints; if ( d_data->chunkSize == 0 ) { fittedPoints = simplify( points ); } else { for ( int i = 0; i < points.size(); i += d_data->chunkSize ) { const QPolygonF p = points.mid( i, d_data->chunkSize ); fittedPoints += simplify( p ); } } return fittedPoints; } QPolygonF QwtWeedingCurveFitter::simplify( const QPolygonF &points ) const { const double toleranceSqr = d_data->tolerance * d_data->tolerance; QStack stack; stack.reserve( 500 ); const QPointF *p = points.data(); const int nPoints = points.size(); QVector usePoint( nPoints, false ); stack.push( Line( 0, nPoints - 1 ) ); while ( !stack.isEmpty() ) { const Line r = stack.pop(); // initialize line segment const double vecX = p[r.to].x() - p[r.from].x(); const double vecY = p[r.to].y() - p[r.from].y(); const double vecLength = qSqrt( vecX * vecX + vecY * vecY ); const double unitVecX = ( vecLength != 0.0 ) ? vecX / vecLength : 0.0; const double unitVecY = ( vecLength != 0.0 ) ? vecY / vecLength : 0.0; double maxDistSqr = 0.0; int nVertexIndexMaxDistance = r.from + 1; for ( int i = r.from + 1; i < r.to; i++ ) { //compare to anchor const double fromVecX = p[i].x() - p[r.from].x(); const double fromVecY = p[i].y() - p[r.from].y(); double distToSegmentSqr; if ( fromVecX * unitVecX + fromVecY * unitVecY < 0.0 ) { distToSegmentSqr = fromVecX * fromVecX + fromVecY * fromVecY; } else { const double toVecX = p[i].x() - p[r.to].x(); const double toVecY = p[i].y() - p[r.to].y(); const double toVecLength = toVecX * toVecX + toVecY * toVecY; const double s = toVecX * ( -unitVecX ) + toVecY * ( -unitVecY ); if ( s < 0.0 ) { distToSegmentSqr = toVecLength; } else { distToSegmentSqr = qFabs( toVecLength - s * s ); } } if ( maxDistSqr < distToSegmentSqr ) { maxDistSqr = distToSegmentSqr; nVertexIndexMaxDistance = i; } } if ( maxDistSqr <= toleranceSqr ) { usePoint[r.from] = true; usePoint[r.to] = true; } else { stack.push( Line( r.from, nVertexIndexMaxDistance ) ); stack.push( Line( nVertexIndexMaxDistance, r.to ) ); } } QPolygonF stripped; for ( int i = 0; i < nPoints; i++ ) { if ( usePoint[i] ) stripped += p[i]; } return stripped; } linssid-2.7/qwt-lib/src/qwt_system_clock.cpp000644 001750 001750 00000017607 12151666703 022153 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_system_clock.h" #if QT_VERSION >= 0x040800 #define USE_ELAPSED_TIMER 1 #endif #if USE_ELAPSED_TIMER #include class QwtSystemClock::PrivateData { public: QElapsedTimer timer; }; QwtSystemClock::QwtSystemClock() { d_data = new PrivateData(); } QwtSystemClock::~QwtSystemClock() { delete d_data; } bool QwtSystemClock::isNull() const { return d_data->timer.isValid(); } void QwtSystemClock::start() { d_data->timer.start(); } double QwtSystemClock::restart() { const qint64 nsecs = d_data->timer.restart(); return nsecs / 1e6; } double QwtSystemClock::elapsed() const { const qint64 nsecs = d_data->timer.nsecsElapsed(); return nsecs / 1e6; } #else // !USE_ELAPSED_TIMER #include #if !defined(Q_OS_WIN) #include #endif #if defined(Q_OS_MAC) #include #include #define QWT_HIGH_RESOLUTION_CLOCK #elif defined(_POSIX_TIMERS) #include #define QWT_HIGH_RESOLUTION_CLOCK #elif defined(Q_OS_WIN) #define QWT_HIGH_RESOLUTION_CLOCK #include #endif #if defined(QWT_HIGH_RESOLUTION_CLOCK) class QwtHighResolutionClock { public: QwtHighResolutionClock(); void start(); double restart(); double elapsed() const; bool isNull() const; static double precision(); private: #if defined(Q_OS_MAC) static double msecsTo( uint64_t, uint64_t ); uint64_t d_timeStamp; #elif defined(_POSIX_TIMERS) static double msecsTo( const struct timespec &, const struct timespec & ); static bool isMonotonic(); struct timespec d_timeStamp; clockid_t d_clockId; #elif defined(Q_OS_WIN) LARGE_INTEGER d_startTicks; LARGE_INTEGER d_ticksPerSecond; #endif }; #if defined(Q_OS_MAC) QwtHighResolutionClock::QwtHighResolutionClock(): d_timeStamp( 0 ) { } double QwtHighResolutionClock::precision() { return 1e-6; } void QwtHighResolutionClock::start() { d_timeStamp = mach_absolute_time(); } double QwtHighResolutionClock::restart() { const uint64_t timeStamp = mach_absolute_time(); const double elapsed = msecsTo( d_timeStamp, timeStamp ); d_timeStamp = timeStamp; return elapsed; } double QwtHighResolutionClock::elapsed() const { return msecsTo( d_timeStamp, mach_absolute_time() ); } bool QwtHighResolutionClock::isNull() const { return d_timeStamp == 0; } double QwtHighResolutionClock::msecsTo( uint64_t from, uint64_t to ) { const uint64_t difference = to - from; static double conversion = 0.0; if ( conversion == 0.0 ) { mach_timebase_info_data_t info; kern_return_t err = mach_timebase_info( &info ); // convert the timebase into ms if ( err == 0 ) conversion = 1e-6 * ( double ) info.numer / ( double ) info.denom; } return conversion * ( double ) difference; } #elif defined(_POSIX_TIMERS) QwtHighResolutionClock::QwtHighResolutionClock() { d_clockId = isMonotonic() ? CLOCK_MONOTONIC : CLOCK_REALTIME; d_timeStamp.tv_sec = d_timeStamp.tv_nsec = 0; } double QwtHighResolutionClock::precision() { struct timespec resolution; int clockId = isMonotonic() ? CLOCK_MONOTONIC : CLOCK_REALTIME; ::clock_getres( clockId, &resolution ); return resolution.tv_nsec / 1e3; } inline bool QwtHighResolutionClock::isNull() const { return d_timeStamp.tv_sec <= 0 && d_timeStamp.tv_nsec <= 0; } inline void QwtHighResolutionClock::start() { ::clock_gettime( d_clockId, &d_timeStamp ); } double QwtHighResolutionClock::restart() { struct timespec timeStamp; ::clock_gettime( d_clockId, &timeStamp ); const double elapsed = msecsTo( d_timeStamp, timeStamp ); d_timeStamp = timeStamp; return elapsed; } inline double QwtHighResolutionClock::elapsed() const { struct timespec timeStamp; ::clock_gettime( d_clockId, &timeStamp ); return msecsTo( d_timeStamp, timeStamp ); } inline double QwtHighResolutionClock::msecsTo( const struct timespec &t1, const struct timespec &t2 ) { return ( t2.tv_sec - t1.tv_sec ) * 1e3 + ( t2.tv_nsec - t1.tv_nsec ) * 1e-6; } bool QwtHighResolutionClock::isMonotonic() { // code copied from qcore_unix.cpp #if (_POSIX_MONOTONIC_CLOCK-0 > 0) return true; #else static int returnValue = 0; if ( returnValue == 0 ) { #if (_POSIX_MONOTONIC_CLOCK-0 < 0) || !defined(_SC_MONOTONIC_CLOCK) returnValue = -1; #elif (_POSIX_MONOTONIC_CLOCK == 0) // detect if the system support monotonic timers const long x = sysconf( _SC_MONOTONIC_CLOCK ); returnValue = ( x >= 200112L ) ? 1 : -1; #endif } return returnValue != -1; #endif } #elif defined(Q_OS_WIN) QwtHighResolutionClock::QwtHighResolutionClock() { d_startTicks.QuadPart = 0; QueryPerformanceFrequency( &d_ticksPerSecond ); } double QwtHighResolutionClock::precision() { LARGE_INTEGER ticks; if ( QueryPerformanceFrequency( &ticks ) && ticks.QuadPart > 0 ) return 1e3 / ticks.QuadPart; return 0.0; } inline bool QwtHighResolutionClock::isNull() const { return d_startTicks.QuadPart <= 0; } inline void QwtHighResolutionClock::start() { QueryPerformanceCounter( &d_startTicks ); } inline double QwtHighResolutionClock::restart() { LARGE_INTEGER ticks; QueryPerformanceCounter( &ticks ); const double dt = ticks.QuadPart - d_startTicks.QuadPart; d_startTicks = ticks; return dt / d_ticksPerSecond.QuadPart * 1e3; } inline double QwtHighResolutionClock::elapsed() const { LARGE_INTEGER ticks; QueryPerformanceCounter( &ticks ); const double dt = ticks.QuadPart - d_startTicks.QuadPart; return dt / d_ticksPerSecond.QuadPart * 1e3; } #endif #endif // QWT_HIGH_RESOLUTION_CLOCK class QwtSystemClock::PrivateData { public: #if defined(QWT_HIGH_RESOLUTION_CLOCK) QwtHighResolutionClock *clock; #endif QTime time; }; //! Constructs a null clock object. QwtSystemClock::QwtSystemClock() { d_data = new PrivateData; #if defined(QWT_HIGH_RESOLUTION_CLOCK) d_data->clock = NULL; if ( QwtHighResolutionClock::precision() > 0.0 ) d_data->clock = new QwtHighResolutionClock; #endif } //! Destructor QwtSystemClock::~QwtSystemClock() { #if defined(QWT_HIGH_RESOLUTION_CLOCK) delete d_data->clock; #endif delete d_data; } /*! \return true if the clock has never been started. */ bool QwtSystemClock::isNull() const { #if defined(QWT_HIGH_RESOLUTION_CLOCK) if ( d_data->clock ) return d_data->clock->isNull(); #endif return d_data->time.isNull(); } /*! Sets the start time to the current time. */ void QwtSystemClock::start() { #if defined(QWT_HIGH_RESOLUTION_CLOCK) if ( d_data->clock ) { d_data->clock->start(); return; } #endif d_data->time.start(); } /*! Set the start time to the current time \return Time, that is elapsed since the previous start time. */ double QwtSystemClock::restart() { #if defined(QWT_HIGH_RESOLUTION_CLOCK) if ( d_data->clock ) return d_data->clock->restart(); #endif return d_data->time.restart(); } /*! \return Number of milliseconds that have elapsed since the last time start() or restart() was called or 0.0 for null clocks. */ double QwtSystemClock::elapsed() const { double elapsed = 0.0; #if defined(QWT_HIGH_RESOLUTION_CLOCK) if ( d_data->clock ) { if ( !d_data->clock->isNull() ) elapsed = d_data->clock->elapsed(); return elapsed; } #endif if ( !d_data->time.isNull() ) elapsed = d_data->time.elapsed(); return elapsed; } #endif linssid-2.7/qwt-lib/textengines/mathml/qwt_mml_document.cpp000644 001750 001750 00001027072 12151666703 025165 0ustar00warrenwarren000000 000000 #include #include #include #include #include #include #include "qwt_mml_document.h" // ******************************************************************* // Declarations // ******************************************************************* #define ROUND(a) (int)((a)+.5) static bool g_draw_frames = false; static const double g_mfrac_spacing = 0.1; static const double g_mroot_base_margin = 0.1; static const double g_script_size_multiplier = 0.7071; // sqrt(1/2) static const int g_min_font_point_size = 8; static const QChar g_radical_char = QChar( 0x1A, 0x22 ); static const unsigned g_oper_spec_rows = 9; struct QwtMml { enum NodeType { NoNode = 0, MiNode, MnNode, MfracNode, MrowNode, MsqrtNode, MrootNode, MsupNode, MsubNode, MsubsupNode, MoNode, MstyleNode, TextNode, MphantomNode, MfencedNode, MtableNode, MtrNode, MtdNode, MoverNode, MunderNode, MunderoverNode, MerrorNode, MtextNode, MpaddedNode, MspaceNode, MalignMarkNode, UnknownNode }; enum MathVariant { NormalMV = 0x0000, BoldMV = 0x0001, ItalicMV = 0x0002, DoubleStruckMV = 0x0004, ScriptMV = 0x0008, FrakturMV = 0x0010, SansSerifMV = 0x0020, MonospaceMV = 0x0040 }; enum FormType { PrefixForm, InfixForm, PostfixForm }; enum ColAlign { ColAlignLeft, ColAlignCenter, ColAlignRight }; enum RowAlign { RowAlignTop, RowAlignCenter, RowAlignBottom, RowAlignAxis, RowAlignBaseline }; enum FrameType { FrameNone, FrameSolid, FrameDashed }; struct FrameSpacing { FrameSpacing( int hor = 0, int ver = 0 ) : m_hor( hor ), m_ver( ver ) {} int m_hor, m_ver; }; }; struct QwtMmlOperSpec { enum StretchDir { NoStretch, HStretch, VStretch, HVStretch }; const char *name; QwtMml::FormType form; const char *attributes[g_oper_spec_rows]; StretchDir stretch_dir; }; struct QwtMmlNodeSpec { QwtMml::NodeType type; const char *tag; const char *type_str; int child_spec; const char *child_types; const char *attributes; enum ChildSpec { ChildAny = -1, // any number of children allowed ChildIgnore = -2, // do not build subexpression of children ImplicitMrow = -3 // if more than one child, build mrow }; }; struct QwtMmlEntitySpec { const char *name; const char *value; }; typedef QMap QwtMmlAttributeMap; class QwtMmlNode; class QwtMmlDocument : public QwtMml { public: QwtMmlDocument(); ~QwtMmlDocument(); void clear(); bool setContent( QString text, QString *errorMsg = 0, int *errorLine = 0, int *errorColumn = 0 ); void paint( QPainter *p, const QPoint &pos ) const; void dump() const; QSize size() const; void layout(); QString fontName( QwtMathMLDocument::MmlFont type ) const; void setFontName( QwtMathMLDocument::MmlFont type, const QString &name ); int baseFontPointSize() const { return m_base_font_point_size; } void setBaseFontPointSize( int size ) { m_base_font_point_size = size; } QColor foregroundColor() const { return m_foreground_color; } void setForegroundColor( const QColor &color ) { m_foreground_color = color; } QColor backgroundColor() const { return m_background_color; } void setBackgroundColor( const QColor &color ) { m_background_color = color; } private: void _dump( const QwtMmlNode *node, QString &indent ) const; bool insertChild( QwtMmlNode *parent, QwtMmlNode *new_node, QString *errorMsg ); QwtMmlNode *domToMml( const QDomNode &dom_node, bool *ok, QString *errorMsg ); QwtMmlNode *createNode( NodeType type, const QwtMmlAttributeMap &mml_attr, const QString &mml_value, QString *errorMsg ); QwtMmlNode *createImplicitMrowNode( const QDomNode &dom_node, bool *ok, QString *errorMsg ); void insertOperator( QwtMmlNode *node, const QString &text ); QwtMmlNode *m_root_node; QString m_normal_font_name; QString m_fraktur_font_name; QString m_sans_serif_font_name; QString m_script_font_name; QString m_monospace_font_name; QString m_doublestruck_font_name; int m_base_font_point_size; QColor m_foreground_color; QColor m_background_color; }; class QwtMmlNode : public QwtMml { friend class QwtMmlDocument; public: QwtMmlNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ); virtual ~QwtMmlNode(); // Mml stuff NodeType nodeType() const { return m_node_type; } virtual QString toStr() const; void setRelOrigin( const QPoint &rel_origin ); QPoint relOrigin() const { return m_rel_origin; } void stretchTo( const QRect &rect ); bool isStretched() const { return m_stretched; } QPoint devicePoint( const QPoint &p ) const; QRect myRect() const { return m_my_rect; } QRect parentRect() const; virtual QRect deviceRect() const; void updateMyRect(); virtual void setMyRect( const QRect &rect ) { m_my_rect = rect; } virtual void stretch(); virtual void layout(); virtual void paint( QPainter *p ); int basePos() const; int overlinePos() const; int underlinePos() const; int em() const; int ex() const; QString explicitAttribute( const QString &name, const QString &def = QString::null ) const; QString inheritAttributeFromMrow( const QString &name, const QString &def = QString::null ) const; virtual QFont font() const; virtual QColor color() const; virtual QColor background() const; virtual int scriptlevel( const QwtMmlNode *child = 0 ) const; // Node stuff QwtMmlDocument *document() const { return m_document; } QwtMmlNode *parent() const { return m_parent; } QwtMmlNode *firstChild() const { return m_first_child; } QwtMmlNode *nextSibling() const { return m_next_sibling; } QwtMmlNode *previousSibling() const { return m_previous_sibling; } QwtMmlNode *lastSibling() const; QwtMmlNode *firstSibling() const; bool isLastSibling() const { return m_next_sibling == 0; } bool isFirstSibling() const { return m_previous_sibling == 0; } bool hasChildNodes() const { return m_first_child != 0; } protected: virtual void layoutSymbol(); virtual void paintSymbol( QPainter *p ) const; virtual QRect symbolRect() const { return QRect( 0, 0, 0, 0 ); } QwtMmlNode *parentWithExplicitAttribute( const QString &name, NodeType type = NoNode ); int interpretSpacing( const QString &value, bool *ok ) const; private: QwtMmlAttributeMap m_attribute_map; bool m_stretched; QRect m_my_rect, m_parent_rect; QPoint m_rel_origin; NodeType m_node_type; QwtMmlDocument *m_document; QwtMmlNode *m_parent, *m_first_child, *m_next_sibling, *m_previous_sibling; }; class QwtMmlTokenNode : public QwtMmlNode { public: QwtMmlTokenNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( type, document, attribute_map ) {} QString text() const; }; class QwtMmlMphantomNode : public QwtMmlNode { public: QwtMmlMphantomNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MphantomNode, document, attribute_map ) {} virtual void paint( QPainter * ) {} }; class QwtMmlUnknownNode : public QwtMmlNode { public: QwtMmlUnknownNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( UnknownNode, document, attribute_map ) {} }; class QwtMmlMfencedNode : public QwtMmlNode { public: QwtMmlMfencedNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MfencedNode, document, attribute_map ) {} }; class QwtMmlMalignMarkNode : public QwtMmlNode { public: QwtMmlMalignMarkNode( QwtMmlDocument *document ) : QwtMmlNode( MalignMarkNode, document, QwtMmlAttributeMap() ) {} }; class QwtMmlMfracNode : public QwtMmlNode { public: QwtMmlMfracNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MfracNode, document, attribute_map ) {} QwtMmlNode *numerator() const; QwtMmlNode *denominator() const; protected: virtual void layoutSymbol(); virtual void paintSymbol( QPainter *p ) const; virtual QRect symbolRect() const; }; class QwtMmlMrowNode : public QwtMmlNode { public: QwtMmlMrowNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MrowNode, document, attribute_map ) {} }; class QwtMmlRootBaseNode : public QwtMmlNode { public: QwtMmlRootBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( type, document, attribute_map ) {} QwtMmlNode *base() const; QwtMmlNode *index() const; virtual int scriptlevel( const QwtMmlNode *child = 0 ) const; protected: virtual void layoutSymbol(); virtual void paintSymbol( QPainter *p ) const; virtual QRect symbolRect() const; int tailWidth() const; }; class QwtMmlMrootNode : public QwtMmlRootBaseNode { public: QwtMmlMrootNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlRootBaseNode( MrootNode, document, attribute_map ) {} }; class QwtMmlMsqrtNode : public QwtMmlRootBaseNode { public: QwtMmlMsqrtNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlRootBaseNode( MsqrtNode, document, attribute_map ) {} }; class QwtMmlTextNode : public QwtMmlNode { public: QwtMmlTextNode( const QString &text, QwtMmlDocument *document ); virtual QString toStr() const; QString text() const { return m_text; } // TextNodes are not xml elements, so they can't have attributes of // their own. Everything is taken from the parent. virtual QFont font() const { return parent()->font(); } virtual int scriptlevel( const QwtMmlNode* = 0 ) const { return parent()->scriptlevel( this ); } virtual QColor color() const { return parent()->color(); } virtual QColor background() const { return parent()->background(); } protected: virtual void paintSymbol( QPainter *p ) const; virtual QRect symbolRect() const; QString m_text; }; class QwtMmlMiNode : public QwtMmlTokenNode { public: QwtMmlMiNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlTokenNode( MiNode, document, attribute_map ) {} }; class QwtMmlMnNode : public QwtMmlTokenNode { public: QwtMmlMnNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlTokenNode( MnNode, document, attribute_map ) {} }; class QwtMmlSubsupBaseNode : public QwtMmlNode { public: QwtMmlSubsupBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( type, document, attribute_map ) {} QwtMmlNode *base() const; QwtMmlNode *sscript() const; virtual int scriptlevel( const QwtMmlNode *child = 0 ) const; }; class QwtMmlMsupNode : public QwtMmlSubsupBaseNode { public: QwtMmlMsupNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlSubsupBaseNode( MsupNode, document, attribute_map ) {} protected: virtual void layoutSymbol(); }; class QwtMmlMsubNode : public QwtMmlSubsupBaseNode { public: QwtMmlMsubNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlSubsupBaseNode( MsubNode, document, attribute_map ) {} protected: virtual void layoutSymbol(); }; class QwtMmlMsubsupNode : public QwtMmlNode { public: QwtMmlMsubsupNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MsubsupNode, document, attribute_map ) {} QwtMmlNode *base() const; QwtMmlNode *superscript() const; QwtMmlNode *subscript() const; virtual int scriptlevel( const QwtMmlNode *child = 0 ) const; protected: virtual void layoutSymbol(); }; class QwtMmlMoNode : public QwtMmlTokenNode { public: QwtMmlMoNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ); QString dictionaryAttribute( const QString &name ) const; virtual void stretch(); virtual int lspace() const; virtual int rspace() const; virtual QString toStr() const; protected: virtual void layoutSymbol(); virtual QRect symbolRect() const; virtual FormType form() const; private: const QwtMmlOperSpec *m_oper_spec; }; class QwtMmlMstyleNode : public QwtMmlNode { public: QwtMmlMstyleNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MstyleNode, document, attribute_map ) {} }; class QwtMmlTableBaseNode : public QwtMmlNode { public: QwtMmlTableBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( type, document, attribute_map ) {} }; class QwtMmlMtableNode : public QwtMmlTableBaseNode { public: QwtMmlMtableNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlTableBaseNode( MtableNode, document, attribute_map ) {} int rowspacing() const; int columnspacing() const; int framespacing_hor() const; int framespacing_ver() const; FrameType frame() const; FrameType columnlines( int idx ) const; FrameType rowlines( int idx ) const; protected: virtual void layoutSymbol(); virtual QRect symbolRect() const; virtual void paintSymbol( QPainter *p ) const; private: struct CellSizeData { void init( const QwtMmlNode *first_row ); QList col_widths, row_heights; int numCols() const { return col_widths.count(); } int numRows() const { return row_heights.count(); } uint colWidthSum() const; uint rowHeightSum() const; }; CellSizeData m_cell_size_data; int m_content_width, m_content_height; }; class QwtMmlMtrNode : public QwtMmlTableBaseNode { public: QwtMmlMtrNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlTableBaseNode( MtrNode, document, attribute_map ) {} void layoutCells( const QList &col_widths, int col_spc ); }; class QwtMmlMtdNode : public QwtMmlTableBaseNode { public: QwtMmlMtdNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlTableBaseNode( MtdNode, document, attribute_map ) { m_scriptlevel_adjust = 0; } virtual void setMyRect( const QRect &rect ); ColAlign columnalign(); RowAlign rowalign(); uint colNum(); uint rowNum(); virtual int scriptlevel( const QwtMmlNode *child = 0 ) const; private: int m_scriptlevel_adjust; // added or subtracted to scriptlevel to // make contents fit the cell }; class QwtMmlMoverNode : public QwtMmlNode { public: QwtMmlMoverNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MoverNode, document, attribute_map ) {} virtual int scriptlevel( const QwtMmlNode *node = 0 ) const; protected: virtual void layoutSymbol(); }; class QwtMmlMunderNode : public QwtMmlNode { public: QwtMmlMunderNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MunderNode, document, attribute_map ) {} virtual int scriptlevel( const QwtMmlNode *node = 0 ) const; protected: virtual void layoutSymbol(); }; class QwtMmlMunderoverNode : public QwtMmlNode { public: QwtMmlMunderoverNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MunderoverNode, document, attribute_map ) {} virtual int scriptlevel( const QwtMmlNode *node = 0 ) const; protected: virtual void layoutSymbol(); }; class QwtMmlMerrorNode : public QwtMmlNode { public: QwtMmlMerrorNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MerrorNode, document, attribute_map ) {} }; class QwtMmlMtextNode : public QwtMmlNode { public: QwtMmlMtextNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MtextNode, document, attribute_map ) {} }; class QwtMmlMpaddedNode : public QwtMmlNode { public: QwtMmlMpaddedNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MpaddedNode, document, attribute_map ) {} public: int lspace() const; int width() const; int height() const; int depth() const; protected: int interpretSpacing( QString value, int base_value, bool *ok ) const; virtual void layoutSymbol(); virtual QRect symbolRect() const; }; class QwtMmlMspaceNode : public QwtMmlNode { public: QwtMmlMspaceNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlNode( MspaceNode, document, attribute_map ) {} }; static const QwtMmlNodeSpec *mmlFindNodeSpec( QwtMml::NodeType type ); static const QwtMmlNodeSpec *mmlFindNodeSpec( const QString &tag ); static bool mmlCheckChildType( QwtMml::NodeType parent_type, QwtMml::NodeType child_type, QString *error_str ); static bool mmlCheckAttributes( QwtMml::NodeType child_type, const QwtMmlAttributeMap &attr, QString *error_str ); static QString mmlDictAttribute( const QString &name, const QwtMmlOperSpec *spec ); static const QwtMmlOperSpec *mmlFindOperSpec( const QString &name, QwtMml::FormType form ); static int interpretSpacing( QString name, int em, int ex, bool *ok ); static int interpretPercentSpacing( QString value, int base, bool *ok ); static uint interpretMathVariant( const QString &value, bool *ok ); static QwtMml::FormType interpretForm( const QString &value, bool *ok ); static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok ); static QwtMml::FrameSpacing interpretFrameSpacing( const QString &value_list, int em, int ex, bool *ok ); static QwtMml::ColAlign interpretColAlign( const QString &value_list, uint colnum, bool *ok ); static QwtMml::RowAlign interpretRowAlign( const QString &value_list, uint rownum, bool *ok ); static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok ); static QFont interpretDepreciatedFontAttr( const QwtMmlAttributeMap &font_attr, QFont &fn, int em, int ex ); static QFont interpretMathSize( QString value, QFont &fn, int em, int ex, bool *ok ); static QString interpretListAttr( const QString &value_list, int idx, const QString &def ); static QString rectToStr( const QRect &rect ); static QString entityDeclarations(); #define MML_ATT_COMMON " class style id xref actiontype " #define MML_ATT_FONTSIZE " fontsize fontweight fontstyle fontfamily color " #define MML_ATT_MATHVARIANT " mathvariant mathsize mathcolor mathbackground " #define MML_ATT_FONTINFO MML_ATT_FONTSIZE MML_ATT_MATHVARIANT #define MML_ATT_OPINFO " form fence separator lspace rspace stretchy symmetric " \ " maxsize minsize largeop movablelimits accent " #define MML_ATT_SIZEINFO " width height depth " #define MML_ATT_TABLEINFO " align rowalign columnalign columnwidth groupalign " \ " alignmentscope side rowspacing columnspacing rowlines " \ " columnlines width frame framespacing equalrows " \ " equalcolumns displaystyle " #define MML_ATT_MFRAC " bevelled numalign denomalign linethickness " #define MML_ATT_MSTYLE MML_ATT_FONTINFO MML_ATT_OPINFO \ " scriptlevel lquote rquote linethickness displaystyle " \ " scriptsizemultiplier scriptminsize background " \ " veryverythinmathspace verythinmathspace thinmathspace " \ " mediummathspace thickmathspace verythickmathspace " \ " veryverythickmathspace open close separators " \ " subscriptshift superscriptshift accentunder tableinfo " \ " rowspan columnspan edge selection bevelled " #define MML_ATT_MTABLE " align rowalign columnalign groupalign alignmentscope " \ " columnwidth width rowspacing columnspacing rowlines columnlines " \ " frame framespacing equalrows equalcolumns displaystyle side " \ " minlabelspacing " static const QwtMmlNodeSpec g_node_spec_data[] = { // type tag type_str child_spec child_types attributes ""=none, 0=any // ----------------------- --------------- ------------------- ----------------------- ------------------------ ------------------------------------ { QwtMml::MiNode, "mi", "MiNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO }, { QwtMml::MnNode, "mn", "MnNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO }, { QwtMml::MfracNode, "mfrac", "MfracNode", 2, 0, MML_ATT_COMMON MML_ATT_MFRAC }, { QwtMml::MrowNode, "mrow", "MrowNode", QwtMmlNodeSpec::ChildAny, 0, MML_ATT_COMMON " display mode " }, { QwtMml::MsqrtNode, "msqrt", "MsqrtNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON }, { QwtMml::MrootNode, "mroot", "MrootNode", 2, 0, MML_ATT_COMMON }, { QwtMml::MsupNode, "msup", "MsupNode", 2, 0, MML_ATT_COMMON " subscriptshift " }, { QwtMml::MsubNode, "msub", "MsubNode", 2, 0, MML_ATT_COMMON " superscriptshift " }, { QwtMml::MsubsupNode, "msubsup", "MsubsupNode", 3, 0, MML_ATT_COMMON " subscriptshift superscriptshift " }, { QwtMml::MoNode, "mo", "MoNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO MML_ATT_OPINFO }, { QwtMml::MstyleNode, "mstyle", "MstyleNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON MML_ATT_MSTYLE }, { QwtMml::MphantomNode, "mphantom", "MphantomNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON }, { QwtMml::MalignMarkNode, "malignmark", "MalignMarkNode", 0, 0, "" }, { QwtMml::MfencedNode, "mfenced", "MfencedNode", QwtMmlNodeSpec::ChildAny, 0, MML_ATT_COMMON " open close separators " }, { QwtMml::MtableNode, "mtable", "MtableNode", QwtMmlNodeSpec::ChildAny, " MtrNode ", MML_ATT_COMMON MML_ATT_MTABLE }, { QwtMml::MtrNode, "mtr", "MtrNode", QwtMmlNodeSpec::ChildAny, " MtdNode ", MML_ATT_COMMON " rowalign columnalign groupalign " }, { QwtMml::MtdNode, "mtd", "MtdNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " rowspan columnspan rowalign columnalign groupalign " }, { QwtMml::MoverNode, "mover", "MoverNode", 2, 0, MML_ATT_COMMON " accent " }, { QwtMml::MunderNode, "munder", "MunderNode", 2, 0, MML_ATT_COMMON " accentunder " }, { QwtMml::MunderoverNode, "munderover", "MunderoverNode", 3, 0, MML_ATT_COMMON " accentunder accent " }, { QwtMml::MerrorNode, "merror", "MerrorNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON }, { QwtMml::MtextNode, "mtext", "MtextNode", 1, " TextNode ", MML_ATT_COMMON " width height depth linebreak " }, { QwtMml::MpaddedNode, "mpadded", "MpaddedNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " width height depth lspace " }, { QwtMml::MspaceNode, "mspace", "MspaceNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " width height depth linebreak " }, { QwtMml::TextNode, 0, "TextNode", QwtMmlNodeSpec::ChildIgnore, 0, "" }, { QwtMml::UnknownNode, 0, "UnknownNode", QwtMmlNodeSpec::ChildAny, 0, 0 }, { QwtMml::NoNode, 0, 0, 0, 0, 0 } }; static const char *g_oper_spec_names[g_oper_spec_rows] = { "accent", "fence", "largeop", "lspace", "minsize", "movablelimits", "rspace", "separator", "stretchy" /* stretchdir */ }; static const QwtMmlOperSpec g_oper_spec_data[] = { { "!!" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!!" { "!" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!" { "!=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!=" { "⩓" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⩓" { "⁡" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⁡" { "≔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≔" { "∖" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "∖" { "∵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∵" { "˘" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "˘" { "⋒" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋒" { "ⅅ" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⅅ" { "¸" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "¸" { "·" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "·" { "⊙" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊙" { "⊖" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊖" { "⊕" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊕" { "⊗" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊗" { "∲" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true"}, QwtMmlOperSpec::VStretch }, // ∲" { "”" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ”" { "’" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "’" { "∷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∷" { "≡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≡" { "∮" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "∮" { "∐" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∐" { "∳", QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // &CounterClockwiseContourInteg { "⨯" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⨯" { "⋓" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋓" { "≍" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≍" { "∇" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∇" { "´" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "´" { "˙" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "˙" { "˝" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ˝" { "`" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "`" { "&DiacriticalLeftArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftArrow;" { "&DiacriticalLeftRightArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftRightArrow;" { "&DiacriticalLeftRightVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftRightVector;" { "&DiacriticalLeftVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftVector;" { "&DiacriticalRightArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalRightArrow;" { "&DiacriticalRightVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalRightVector;" { "˜" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::NoStretch }, // "˜" { "⋄" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋄" { "ⅆ" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "ⅆ" { "≐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≐" { "∯" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // ∯" { "¨" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "¨" { "⇓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇓" { "⇐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇐" { "⇔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⇔" { "⫤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⫤" { "⟸" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟸" { "⟺" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⟺" { "⟹" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⟹" { "⇒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇒" { "⊨" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊨" { "⇑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇑" { "⇕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇕" { "∥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∥" { "↓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↓" { "⤓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⤓" { "⇵" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇵" { "̑" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "̑" { "⥐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥐" { "⥞" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥞" { "↽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↽" { "⥖" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥖" { "⥟" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥟" { "⇁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇁" { "⥗" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥗" { "⊤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊤" { "↧" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↧" { "∈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∈" { "⩵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩵" { "≂" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≂" { "⇌" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇌" { "∃" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∃" { "∀" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∀" { "≥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≥" { "⋛" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋛" { "≧" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≧" { "⪢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪢" { "≷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≷" { "⩾" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩾" { "≳" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≳" { "ˇ" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::NoStretch }, // "ˇ" { "^" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "^" { "─" , QwtMml::InfixForm, { 0, 0, 0, "0em", "0", 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "─" { "≎" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≎" { "≏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≏" { "⇒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇒" { "∫" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∫" { "⋂" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⋂" { "⁣" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", "true", 0 }, QwtMmlOperSpec::NoStretch }, // "⁣" { "⁢" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⁢" { "⟨" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟨" { "←" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "←" { "⇤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇤" { "⇆" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇆" { "&LeftBracketingBar;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "&LeftBracketingBar;" { "⌈" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌈" { "⟦" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟦" { "&LeftDoubleBracketingBar;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &LeftDoubleBracketingBar;" { "⥡" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥡" { "⇃" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇃" { "⥙" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥙" { "⌊" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌊" { "↔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↔" { "⥎" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥎" { "&LeftSkeleton;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&LeftSkeleton;" { "⊣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊣" { "↤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↤" { "⥚" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥚" { "⊲" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊲" { "⧏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧏" { "⊴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊴" { "⥑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥑" { "⥠" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥠" { "↿" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↿" { "⥘" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥘" { "↼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↼" { "⥒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥒" { "⋚" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋚" { "≦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≦" { "≶" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≶" { "⪡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪡" { "⩽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩽" { "≲" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≲" { "⟵" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟵" { "⟷" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟷" { "⟶" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟶" { "↙" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↙" { "↘" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↘" { "∓" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∓" { "≫" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ≫" { "≪" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≪" { "⫬" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⫬" { "≢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≢" { "≭" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≭" { "∦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ∦" { "∉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∉" { "≠" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≠" { "≂̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≂̸" { "∄" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∄" { "≯" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≯" { "≱" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≱" { "≧̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≧̸" { "≫̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≫̸" { "≹" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≹" { "⩾̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⩾̸" { "≵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≵" { "≎̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≎̸" { "≏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≏̸" { "⋪" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋪" { "⧏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧏̸" { "⋬" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋬" { "≮" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≮" { "≰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≰" { "&NotLessFullEqual;" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&NotLessFullEqual;" { "≸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≸" { "≪̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≪̸" { "⩽̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩽̸" { "≴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≴" { "⪢̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⪢̸" { "⪡̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪡̸" { "⊀" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊀" { "⪯̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪯̸" { "⋠" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋠" { "&NotPrecedesTilde;" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&NotPrecedesTilde;" { "∌" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∌" { "⋫" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋫" { "⧐̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧐̸" { "⋭" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋭" { "⊏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊏̸" { "⋢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋢" { "⊐̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊐̸" { "⋣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋣" { "⊂⃒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊂⃒" { "⊈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊈" { "⊁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊁" { "⪰̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪰̸" { "⋡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋡" { "≿̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≿̸" { "⊃⃒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊃⃒" { "⊉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊉" { "≁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≁" { "≄" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≄" { "≇" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≇" { "≉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≉" { "∤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∤" { "“" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // “" { "‘" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "‘" { "⩔" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⩔" { "‾" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "‾" { "⏞" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏞" { "⎴" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⎴" { "⏜" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⏜" { "∂" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∂" { "±" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "±" { "≺" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≺" { "⪯" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪯" { "≼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≼" { "≾" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≾" { "∏" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∏" { "∷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∷" { "∝" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∝" { "∋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∋" { "⇋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇋" { "⥯" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⥯" { "⟩" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟩" { "→" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "→" { "⇥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇥" { "⇄" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇄" { "&RightBracketingBar;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "&RightBracketingBar;" { "⌉" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌉" { "⟧" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟧" { "&RightDoubleBracketingBar;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &RightDoubleBracketingBar;" { "⥝" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥝" { "⇂" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇂" { "⥕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥕" { "⌋" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌋" { "&RightSkeleton;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&RightSkeleton;" { "⊢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊢" { "↦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↦" { "⥛" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥛" { "⊳" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊳" { "⧐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧐" { "⊵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊵" { "⥏" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥏" { "⥜" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥜" { "↾" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↾" { "⥔" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥔" { "⇀" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇀" { "⥓" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥓" { "⥰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⥰" { "↓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "↓" { "←" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::HStretch }, // "←" { "→" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::HStretch }, // "→" { "↑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::VStretch }, // "↑" { "∘" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∘" { "√" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "√" { "□" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "□" { "⊓" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊓" { "⊏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊏" { "⊑" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊑" { "⊐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊐" { "⊒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊒" { "⊔" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊔" { "⋆" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋆" { "⋐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋐" { "⊆" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊆" { "≻" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≻" { "⪰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪰" { "≽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≽" { "≿" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≿" { "∋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∋" { "∑" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∑" { "⊃" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊃" { "⊇" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊇" { "∴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∴" { "∼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∼" { "≃" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≃" { "≅" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≅" { "≈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≈" { "⃛" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⃛" { "_" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "_" { "⏟" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏟" { "⎵" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⎵" { "⏝" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏝" { "⋃" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⋃" { "⊎" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊎" { "↑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↑" { "⤒" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⤒" { "⇅" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇅" { "↕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↕" { "⥮" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥮" { "⊥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊥" { "↥" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↥" { "↖" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↖" { "↗" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↗" { "⋁" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋁" { "∣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∣" { "|" , QwtMml::InfixForm, { 0, 0, 0, "0em", "0", 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "|" { "❘" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "❘" { "≀" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≀" { "⋀" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋀" { "&" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&" { "&&" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&&" { "≤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≤" { "<" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<" { "<=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<=" { "<>" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<>" { "'" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "'" { "(" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "(" { ")" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // ")" { "*" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "*" { "**" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "**" { "*=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "*=" { "+" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+" { "+" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+" { "++" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "++" { "+=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+=" { "," , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "verythickmathspace", "true", 0 }, QwtMmlOperSpec::NoStretch }, // "," { "-" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-" { "-" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-" { "--" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "--" { "-=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-=" { "->" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "->" { "." , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "." { ".." , QwtMml::PostfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ".." { "..." , QwtMml::PostfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "..." { "/" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "/" { "//" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "//" { "/=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "/=" { ":" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ":" { ":=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ":=" { ";" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "verythickmathspace", "true", 0 }, QwtMmlOperSpec::NoStretch }, // ";" { ";" , QwtMml::PostfixForm, { 0, 0, 0, "0em", 0, 0, "0em", "true", 0 }, QwtMmlOperSpec::NoStretch }, // ";" { "=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "=" { "==" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "==" { ">" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ">" { ">=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ">=" { "?" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "?" { "@" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "@" { "[" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "[" { "]" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "]" { "^" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "^" { "_" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "_" { "lim" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "lim" { "max" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "max" { "min" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "min" { "{" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "{" { "|" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "|" { "||" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "||" { "}" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "}" { "~" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "~" { 0 , QwtMml::InfixForm, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, QwtMmlOperSpec::NoStretch } }; static const QwtMmlOperSpec g_oper_spec_defaults = { 0 , QwtMml::InfixForm, { "false", "false", "false", "thickmathspace", "1", "false", "thickmathspace", "false", "false" }, QwtMmlOperSpec::NoStretch }; static const uint g_oper_spec_count = sizeof( g_oper_spec_data ) / sizeof( QwtMmlOperSpec ) - 1; static const QwtMmlEntitySpec g_xml_entity_data[] = { { "angzarr", "⍼" }, { "cirmid", "⫯" }, { "cudarrl", "⤸" }, { "cudarrr", "⤵" }, { "cularr", "↶" }, { "cularrp", "⤽" }, { "curarr", "↷" }, { "curarrm", "⤼" }, { "Darr", "↡" }, { "dArr", "⇓" }, { "ddarr", "⇊" }, { "DDotrahd", "⤑" }, { "dfisht", "⥿" }, { "dHar", "⥥" }, { "dharl", "⇃" }, { "dharr", "⇂" }, { "duarr", "⇵" }, { "duhar", "⥯" }, { "dzigrarr", "⟿" }, { "erarr", "⥱" }, { "hArr", "⇔" }, { "harr", "↔" }, { "harrcir", "⥈" }, { "harrw", "↭" }, { "hoarr", "⇿" }, { "imof", "⊷" }, { "lAarr", "⇚" }, { "Larr", "↞" }, { "larrbfs", "⤟" }, { "larrfs", "⤝" }, { "larrhk", "↩" }, { "larrlp", "↫" }, { "larrpl", "⤹" }, { "larrsim", "⥳" }, { "larrtl", "↢" }, { "lAtail", "⤛" }, { "latail", "⤙" }, { "lBarr", "⤎" }, { "lbarr", "⤌" }, { "ldca", "⤶" }, { "ldrdhar", "⥧" }, { "ldrushar", "⥋" }, { "ldsh", "↲" }, { "lfisht", "⥼" }, { "lHar", "⥢" }, { "lhard", "↽" }, { "lharu", "↼" }, { "lharul", "⥪" }, { "llarr", "⇇" }, { "llhard", "⥫" }, { "loarr", "⇽" }, { "lrarr", "⇆" }, { "lrhar", "⇋" }, { "lrhard", "⥭" }, { "lsh", "↰" }, { "lurdshar", "⥊" }, { "luruhar", "⥦" }, { "Map", "⤅" }, { "map", "↦" }, { "midcir", "⫰" }, { "mumap", "⊸" }, { "nearhk", "⤤" }, { "neArr", "⇗" }, { "nearr", "↗" }, { "nesear", "⤨" }, { "nhArr", "⇎" }, { "nharr", "↮" }, { "nlArr", "⇍" }, { "nlarr", "↚" }, { "nrArr", "⇏" }, { "nrarr", "↛" }, { "nrarrc", "⤳̸" }, { "nrarrw", "↝̸" }, { "nvHarr", "⤄" }, { "nvlArr", "⤂" }, { "nvrArr", "⤃" }, { "nwarhk", "⤣" }, { "nwArr", "⇖" }, { "nwarr", "↖" }, { "nwnear", "⤧" }, { "olarr", "↺" }, { "orarr", "↻" }, { "origof", "⊶" }, { "rAarr", "⇛" }, { "Rarr", "↠" }, { "rarrap", "⥵" }, { "rarrbfs", "⤠" }, { "rarrc", "⤳" }, { "rarrfs", "⤞" }, { "rarrhk", "↪" }, { "rarrlp", "↬" }, { "rarrpl", "⥅" }, { "rarrsim", "⥴" }, { "Rarrtl", "⤖" }, { "rarrtl", "↣" }, { "rarrw", "↝" }, { "rAtail", "⤜" }, { "ratail", "⤚" }, { "RBarr", "⤐" }, { "rBarr", "⤏" }, { "rbarr", "⤍" }, { "rdca", "⤷" }, { "rdldhar", "⥩" }, { "rdsh", "↳" }, { "rfisht", "⥽" }, { "rHar", "⥤" }, { "rhard", "⇁" }, { "rharu", "⇀" }, { "rharul", "⥬" }, { "rlarr", "⇄" }, { "rlhar", "⇌" }, { "roarr", "⇾" }, { "rrarr", "⇉" }, { "rsh", "↱" }, { "ruluhar", "⥨" }, { "searhk", "⤥" }, { "seArr", "⇘" }, { "searr", "↘" }, { "seswar", "⤩" }, { "simrarr", "⥲" }, { "slarr", "←" }, { "srarr", "→" }, { "swarhk", "⤦" }, { "swArr", "⇙" }, { "swarr", "↙" }, { "swnwar", "⤪" }, { "Uarr", "↟" }, { "uArr", "⇑" }, { "Uarrocir", "⥉" }, { "udarr", "⇅" }, { "udhar", "⥮" }, { "ufisht", "⥾" }, { "uHar", "⥣" }, { "uharl", "↿" }, { "uharr", "↾" }, { "uuarr", "⇈" }, { "vArr", "⇕" }, { "varr", "↕" }, { "xhArr", "⟺" }, { "xharr", "⟷" }, { "xlArr", "⟸" }, { "xlarr", "⟵" }, { "xmap", "⟼" }, { "xrArr", "⟹" }, { "xrarr", "⟶" }, { "zigrarr", "⇝" }, { "ac", "∾" }, { "acE", "∾̳" }, { "amalg", "⨿" }, { "barvee", "⊽" }, { "Barwed", "⌆" }, { "barwed", "⌅" }, { "bsolb", "⧅" }, { "Cap", "⋒" }, { "capand", "⩄" }, { "capbrcup", "⩉" }, { "capcap", "⩋" }, { "capcup", "⩇" }, { "capdot", "⩀" }, { "caps", "∩︀" }, { "ccaps", "⩍" }, { "ccups", "⩌" }, { "ccupssm", "⩐" }, { "coprod", "∐" }, { "Cup", "⋓" }, { "cupbrcap", "⩈" }, { "cupcap", "⩆" }, { "cupcup", "⩊" }, { "cupdot", "⊍" }, { "cupor", "⩅" }, { "cups", "∪︀" }, { "cuvee", "⋎" }, { "cuwed", "⋏" }, { "Dagger", "‡" }, { "dagger", "†" }, { "diam", "⋄" }, { "divonx", "⋇" }, { "eplus", "⩱" }, { "hercon", "⊹" }, { "intcal", "⊺" }, { "iprod", "⨼" }, { "loplus", "⨭" }, { "lotimes", "⨴" }, { "lthree", "⋋" }, { "ltimes", "⋉" }, { "midast", "*" }, { "minusb", "⊟" }, { "minusd", "∸" }, { "minusdu", "⨪" }, { "ncap", "⩃" }, { "ncup", "⩂" }, { "oast", "⊛" }, { "ocir", "⊚" }, { "odash", "⊝" }, { "odiv", "⨸" }, { "odot", "⊙" }, { "odsold", "⦼" }, { "ofcir", "⦿" }, { "ogt", "⧁" }, { "ohbar", "⦵" }, { "olcir", "⦾" }, { "olt", "⧀" }, { "omid", "⦶" }, { "ominus", "⊖" }, { "opar", "⦷" }, { "operp", "⦹" }, { "oplus", "⊕" }, { "osol", "⊘" }, { "Otimes", "⨷" }, { "otimes", "⊗" }, { "otimesas", "⨶" }, { "ovbar", "⌽" }, { "plusacir", "⨣" }, { "plusb", "⊞" }, { "pluscir", "⨢" }, { "plusdo", "∔" }, { "plusdu", "⨥" }, { "pluse", "⩲" }, { "plussim", "⨦" }, { "plustwo", "⨧" }, { "prod", "∏" }, { "race", "⧚" }, { "roplus", "⨮" }, { "rotimes", "⨵" }, { "rthree", "⋌" }, { "rtimes", "⋊" }, { "sdot", "⋅" }, { "sdotb", "⊡" }, { "setmn", "∖" }, { "simplus", "⨤" }, { "smashp", "⨳" }, { "solb", "⧄" }, { "sqcap", "⊓" }, { "sqcaps", "⊓︀" }, { "sqcup", "⊔" }, { "sqcups", "⊔︀" }, { "ssetmn", "∖" }, { "sstarf", "⋆" }, { "subdot", "⪽" }, { "sum", "∑" }, { "supdot", "⪾" }, { "timesb", "⊠" }, { "timesbar", "⨱" }, { "timesd", "⨰" }, { "tridot", "◬" }, { "triminus", "⨺" }, { "triplus", "⨹" }, { "trisb", "⧍" }, { "tritime", "⨻" }, { "uplus", "⊎" }, { "veebar", "⊻" }, { "wedbar", "⩟" }, { "wreath", "≀" }, { "xcap", "⋂" }, { "xcirc", "◯" }, { "xcup", "⋃" }, { "xdtri", "▽" }, { "xodot", "⨀" }, { "xoplus", "⨁" }, { "xotime", "⨂" }, { "xsqcup", "⨆" }, { "xuplus", "⨄" }, { "xutri", "△" }, { "xvee", "⋁" }, { "xwedge", "⋀" }, { "dlcorn", "⌞" }, { "drcorn", "⌟" }, { "gtlPar", "⦕" }, { "langd", "⦑" }, { "lbrke", "⦋" }, { "lbrksld", "⦏" }, { "lbrkslu", "⦍" }, { "lceil", "⌈" }, { "lfloor", "⌊" }, { "lmoust", "⎰" }, { "lparlt", "⦓" }, { "ltrPar", "⦖" }, { "rangd", "⦒" }, { "rbrke", "⦌" }, { "rbrksld", "⦎" }, { "rbrkslu", "⦐" }, { "rceil", "⌉" }, { "rfloor", "⌋" }, { "rmoust", "⎱" }, { "rpargt", "⦔" }, { "ulcorn", "⌜" }, { "urcorn", "⌝" }, { "gnap", "⪊" }, { "gnE", "≩" }, { "gne", "⪈" }, { "gnsim", "⋧" }, { "gvnE", "≩︀" }, { "lnap", "⪉" }, { "lnE", "≨" }, { "lne", "⪇" }, { "lnsim", "⋦" }, { "lvnE", "≨︀" }, { "nap", "≉" }, { "napE", "⩰̸" }, { "napid", "≋̸" }, { "ncong", "≇" }, { "ncongdot", "⩭̸" }, { "nequiv", "≢" }, { "ngE", "≧̸" }, { "nge", "≱" }, { "nges", "⩾̸" }, { "nGg", "⋙̸" }, { "ngsim", "≵" }, { "nGt", "≫⃒" }, { "ngt", "≯" }, { "nGtv", "≫̸" }, { "nlE", "≦̸" }, { "nle", "≰" }, { "nles", "⩽̸" }, { "nLl", "⋘̸" }, { "nlsim", "≴" }, { "nLt", "≪⃒" }, { "nlt", "≮" }, { "nltri", "⋪" }, { "nltrie", "⋬" }, { "nLtv", "≪̸" }, { "nmid", "∤" }, { "npar", "∦" }, { "npr", "⊀" }, { "nprcue", "⋠" }, { "npre", "⪯̸" }, { "nrtri", "⋫" }, { "nrtrie", "⋭" }, { "nsc", "⊁" }, { "nsccue", "⋡" }, { "nsce", "⪰̸" }, { "nsim", "≁" }, { "nsime", "≄" }, { "nsmid", "∤" }, { "nspar", "∦" }, { "nsqsube", "⋢" }, { "nsqsupe", "⋣" }, { "nsub", "⊄" }, { "nsubE", "⫅̸" }, { "nsube", "⊈" }, { "nsup", "⊅" }, { "nsupE", "⫆̸" }, { "nsupe", "⊉" }, { "ntgl", "≹" }, { "ntlg", "≸" }, { "nvap", "≍⃒" }, { "nVDash", "⊯" }, { "nVdash", "⊮" }, { "nvDash", "⊭" }, { "nvdash", "⊬" }, { "nvge", "≥⃒" }, { "nvgt", ">⃒" }, { "nvle", "≤⃒" }, { "nvlt", "<⃒" }, { "nvltrie", "⊴⃒" }, { "nvrtrie", "⊵⃒" }, { "nvsim", "∼⃒" }, { "parsim", "⫳" }, { "prnap", "⪹" }, { "prnE", "⪵" }, { "prnsim", "⋨" }, { "rnmid", "⫮" }, { "scnap", "⪺" }, { "scnE", "⪶" }, { "scnsim", "⋩" }, { "simne", "≆" }, { "solbar", "⌿" }, { "subnE", "⫋" }, { "subne", "⊊" }, { "supnE", "⫌" }, { "supne", "⊋" }, { "vnsub", "⊂⃒" }, { "vnsup", "⊃⃒" }, { "vsubnE", "⫋︀" }, { "vsubne", "⊊︀" }, { "vsupnE", "⫌︀" }, { "vsupne", "⊋︀" }, { "ang", "∠" }, { "ange", "⦤" }, { "angmsd", "∡" }, { "angmsdaa", "⦨" }, { "angmsdab", "⦩" }, { "angmsdac", "⦪" }, { "angmsdad", "⦫" }, { "angmsdae", "⦬" }, { "angmsdaf", "⦭" }, { "angmsdag", "⦮" }, { "angmsdah", "⦯" }, { "angrtvb", "⊾" }, { "angrtvbd", "⦝" }, { "bbrk", "⎵" }, { "bemptyv", "⦰" }, { "beth", "ℶ" }, { "boxbox", "⧉" }, { "bprime", "‵" }, { "bsemi", "⁏" }, { "cemptyv", "⦲" }, { "cirE", "⧃" }, { "cirscir", "⧂" }, { "comp", "∁" }, { "daleth", "ℸ" }, { "demptyv", "⦱" }, { "ell", "ℓ" }, { "empty", "∅" }, { "emptyv", "∅" }, { "gimel", "ℷ" }, { "iiota", "℩" }, { "image", "ℑ" }, { "imath", "ı" }, { "jmath", "j" }, { "laemptyv", "⦴" }, { "lltri", "◺" }, { "lrtri", "⊿" }, { "mho", "℧" }, { "nang", "∠⃒" }, { "nexist", "∄" }, { "oS", "Ⓢ" }, { "planck", "ℏ" }, { "plankv", "ℏ" }, { "raemptyv", "⦳" }, { "range", "⦥" }, { "real", "ℜ" }, { "tbrk", "⎴" }, { "ultri", "◸" }, { "urtri", "◹" }, { "vzigzag", "⦚" }, { "weierp", "℘" }, { "apE", "⩰" }, { "ape", "≊" }, { "apid", "≋" }, { "asymp", "≈" }, { "Barv", "⫧" }, { "bcong", "≌" }, { "bepsi", "϶" }, { "bowtie", "⋈" }, { "bsim", "∽" }, { "bsime", "⋍" }, { "bsolhsub", "\⊂" }, { "bump", "≎" }, { "bumpE", "⪮" }, { "bumpe", "≏" }, { "cire", "≗" }, { "Colon", "∷" }, { "Colone", "⩴" }, { "colone", "≔" }, { "congdot", "⩭" }, { "csub", "⫏" }, { "csube", "⫑" }, { "csup", "⫐" }, { "csupe", "⫒" }, { "cuepr", "⋞" }, { "cuesc", "⋟" }, { "Dashv", "⫤" }, { "dashv", "⊣" }, { "easter", "⩮" }, { "ecir", "≖" }, { "ecolon", "≕" }, { "eDDot", "⩷" }, { "eDot", "≑" }, { "efDot", "≒" }, { "eg", "⪚" }, { "egs", "⪖" }, { "egsdot", "⪘" }, { "el", "⪙" }, { "els", "⪕" }, { "elsdot", "⪗" }, { "equest", "≟" }, { "equivDD", "⩸" }, { "erDot", "≓" }, { "esdot", "≐" }, { "Esim", "⩳" }, { "esim", "≂" }, { "fork", "⋔" }, { "forkv", "⫙" }, { "frown", "⌢" }, { "gap", "⪆" }, { "gE", "≧" }, { "gEl", "⪌" }, { "gel", "⋛" }, { "ges", "⩾" }, { "gescc", "⪩" }, { "gesdot", "⪀" }, { "gesdoto", "⪂" }, { "gesdotol", "⪄" }, { "gesl", "⋛︀" }, { "gesles", "⪔" }, { "Gg", "⋙" }, { "gl", "≷" }, { "gla", "⪥" }, { "glE", "⪒" }, { "glj", "⪤" }, { "gsim", "≳" }, { "gsime", "⪎" }, { "gsiml", "⪐" }, { "Gt", "≫" }, { "gtcc", "⪧" }, { "gtcir", "⩺" }, { "gtdot", "⋗" }, { "gtquest", "⩼" }, { "gtrarr", "⥸" }, { "homtht", "∻" }, { "lap", "⪅" }, { "lat", "⪫" }, { "late", "⪭" }, { "lates", "⪭︀" }, { "lE", "≦" }, { "lEg", "⪋" }, { "leg", "⋚" }, { "les", "⩽" }, { "lescc", "⪨" }, { "lesdot", "⩿" }, { "lesdoto", "⪁" }, { "lesdotor", "⪃" }, { "lesg", "⋚︀" }, { "lesges", "⪓" }, { "lg", "≶" }, { "lgE", "⪑" }, { "Ll", "⋘" }, { "lsim", "≲" }, { "lsime", "⪍" }, { "lsimg", "⪏" }, { "Lt", "≪" }, { "ltcc", "⪦" }, { "ltcir", "⩹" }, { "ltdot", "⋖" }, { "ltlarr", "⥶" }, { "ltquest", "⩻" }, { "ltrie", "⊴" }, { "mcomma", "⨩" }, { "mDDot", "∺" }, { "mid", "∣" }, { "mlcp", "⫛" }, { "models", "⊧" }, { "mstpos", "∾" }, { "Pr", "⪻" }, { "pr", "≺" }, { "prap", "⪷" }, { "prcue", "≼" }, { "prE", "⪳" }, { "pre", "⪯" }, { "prsim", "≾" }, { "prurel", "⊰" }, { "ratio", "∶" }, { "rtrie", "⊵" }, { "rtriltri", "⧎" }, { "Sc", "⪼" }, { "sc", "≻" }, { "scap", "⪸" }, { "sccue", "≽" }, { "scE", "⪴" }, { "sce", "⪰" }, { "scsim", "≿" }, { "sdote", "⩦" }, { "simg", "⪞" }, { "simgE", "⪠" }, { "siml", "⪝" }, { "simlE", "⪟" }, { "smid", "∣" }, { "smile", "⌣" }, { "smt", "⪪" }, { "smte", "⪬" }, { "smtes", "⪬︀" }, { "spar", "∥" }, { "sqsub", "⊏" }, { "sqsube", "⊑" }, { "sqsup", "⊐" }, { "sqsupe", "⊒" }, { "Sub", "⋐" }, { "subE", "⫅" }, { "subedot", "⫃" }, { "submult", "⫁" }, { "subplus", "⪿" }, { "subrarr", "⥹" }, { "subsim", "⫇" }, { "subsub", "⫕" }, { "subsup", "⫓" }, { "Sup", "⋑" }, { "supdsub", "⫘" }, { "supE", "⫆" }, { "supedot", "⫄" }, { "suphsol", "⊅" }, { "suphsub", "⫗" }, { "suplarr", "⥻" }, { "supmult", "⫂" }, { "supplus", "⫀" }, { "supsim", "⫈" }, { "supsub", "⫔" }, { "supsup", "⫖" }, { "thkap", "≈" }, { "topfork", "⫚" }, { "trie", "≜" }, { "twixt", "≬" }, { "Vbar", "⫫" }, { "vBar", "⫨" }, { "vBarv", "⫩" }, { "VDash", "⊫" }, { "Vdash", "⊩" }, { "vDash", "⊨" }, { "vdash", "⊢" }, { "Vdashl", "⫦" }, { "vltri", "⊲" }, { "vprop", "∝" }, { "vrtri", "⊳" }, { "Vvdash", "⊪" }, { "alpha", "α" }, { "beta", "β" }, { "chi", "χ" }, { "Delta", "Δ" }, { "delta", "δ" }, { "epsi", "ε" }, { "epsiv", "ɛ" }, { "eta", "η" }, { "Gamma", "Γ" }, { "gamma", "γ" }, { "Gammad", "Ϝ" }, { "gammad", "ϝ" }, { "iota", "ι" }, { "kappa", "κ" }, { "kappav", "ϰ" }, { "Lambda", "Λ" }, { "lambda", "λ" }, { "mu", "μ" }, { "nu", "ν" }, { "Omega", "Ω" }, { "omega", "ω" }, { "Phi", "Φ" }, { "phi", "ϕ" }, { "phiv", "φ" }, { "Pi", "Π" }, { "pi", "π" }, { "piv", "ϖ" }, { "Psi", "Ψ" }, { "psi", "ψ" }, { "rho", "ρ" }, { "rhov", "ϱ" }, { "Sigma", "Σ" }, { "sigma", "σ" }, { "sigmav", "ς" }, { "tau", "τ" }, { "Theta", "Θ" }, { "theta", "θ" }, { "thetav", "ϑ" }, { "Upsi", "ϒ" }, { "upsi", "υ" }, { "Xi", "Ξ" }, { "xi", "ξ" }, { "zeta", "ζ" }, { "Cfr", "ℭ" }, { "Hfr", "ℌ" }, { "Ifr", "ℑ" }, { "Rfr", "ℜ" }, { "Zfr", "ℨ" }, { "Copf", "ℂ" }, { "Hopf", "ℍ" }, { "Nopf", "ℕ" }, { "Popf", "ℙ" }, { "Qopf", "ℚ" }, { "Ropf", "ℝ" }, { "Zopf", "ℤ" }, { "Bscr", "ℬ" }, { "Escr", "ℰ" }, { "escr", "ℯ" }, { "Fscr", "ℱ" }, { "gscr", "ℊ" }, { "Hscr", "ℋ" }, { "Iscr", "ℐ" }, { "Lscr", "ℒ" }, { "Mscr", "ℳ" }, { "oscr", "ℴ" }, { "pscr", "𝓅" }, { "Rscr", "ℛ" }, { "acd", "∿" }, { "aleph", "ℵ" }, { "And", "⩓" }, { "and", "∧" }, { "andand", "⩕" }, { "andd", "⩜" }, { "andslope", "⩘" }, { "andv", "⩚" }, { "angrt", "∟" }, { "angsph", "∢" }, { "angst", "Å" }, { "ap", "≈" }, { "apacir", "⩯" }, { "awconint", "∳" }, { "awint", "⨑" }, { "becaus", "∵" }, { "bernou", "ℬ" }, { "bne", "=⃥" }, { "bnequiv", "≡⃥" }, { "bNot", "⫭" }, { "bnot", "⌐" }, { "bottom", "⊥" }, { "cap", "∩" }, { "Cconint", "∰" }, { "cirfnint", "⨐" }, { "compfn", "∘" }, { "cong", "≅" }, { "Conint", "∯" }, { "conint", "∮" }, { "ctdot", "⋯" }, { "cup", "∪" }, { "cwconint", "∲" }, { "cwint", "∱" }, { "cylcty", "⌭" }, { "disin", "⋲" }, { "Dot", "¨" }, { "DotDot", "⃜" }, { "dsol", "⧶" }, { "dtdot", "⋱" }, { "dwangle", "⦦" }, { "epar", "⋕" }, { "eparsl", "⧣" }, { "equiv", "≡" }, { "eqvparsl", "⧥" }, { "exist", "∃" }, { "fnof", "ƒ" }, { "forall", "∀" }, { "fpartint", "⨍" }, { "ge", "≥" }, { "hamilt", "ℋ" }, { "iff", "⇔" }, { "iinfin", "⧜" }, { "infin", "∞" }, { "Int", "∬" }, { "int", "∫" }, { "intlarhk", "⨗" }, { "isin", "∈" }, { "isindot", "⋵" }, { "isinE", "⋹" }, { "isins", "⋴" }, { "isinsv", "⋳" }, { "isinv", "∈" }, { "lagran", "ℒ" }, { "Lang", "《" }, { "lang", "〈" }, { "lArr", "⇐" }, { "lbbrk", "〔" }, { "le", "≤" }, { "loang", "〘" }, { "lobrk", "〚" }, { "lopar", "⦅" }, { "lowast", "∗" }, { "minus", "−" }, { "mnplus", "∓" }, { "nabla", "∇" }, { "ne", "≠" }, { "nedot", "≐̸" }, { "nhpar", "⫲" }, { "ni", "∋" }, { "nis", "⋼" }, { "nisd", "⋺" }, { "niv", "∋" }, { "Not", "⫬" }, { "notin", "∉" }, { "notindot", "⋵̸" }, { "notinva", "∉" }, { "notinvb", "⋷" }, { "notinvc", "⋶" }, { "notni", "∌" }, { "notniva", "∌" }, { "notnivb", "⋾" }, { "notnivc", "⋽" }, { "nparsl", "⫽⃥" }, { "npart", "∂̸" }, { "npolint", "⨔" }, { "nvinfin", "⧞" }, { "olcross", "⦻" }, { "Or", "⩔" }, { "or", "∨" }, { "ord", "⩝" }, { "order", "ℴ" }, { "oror", "⩖" }, { "orslope", "⩗" }, { "orv", "⩛" }, { "par", "∥" }, { "parsl", "⫽" }, { "part", "∂" }, { "permil", "‰" }, { "perp", "⊥" }, { "pertenk", "‱" }, { "phmmat", "ℳ" }, { "pointint", "⨕" }, { "Prime", "″" }, { "prime", "′" }, { "profalar", "⌮" }, { "profline", "⌒" }, { "profsurf", "⌓" }, { "prop", "∝" }, { "qint", "⨌" }, { "qprime", "⁗" }, { "quatint", "⨖" }, { "radic", "√" }, { "Rang", "》" }, { "rang", "〉" }, { "rArr", "⇒" }, { "rbbrk", "〕" }, { "roang", "〙" }, { "robrk", "〛" }, { "ropar", "⦆" }, { "rppolint", "⨒" }, { "scpolint", "⨓" }, { "sim", "∼" }, { "simdot", "⩪" }, { "sime", "≃" }, { "smeparsl", "⧤" }, { "square", "□" }, { "squarf", "▪" }, { "sub", "⊂" }, { "sube", "⊆" }, { "sup", "⊃" }, { "supe", "⊇" }, { "tdot", "⃛" }, { "there4", "∴" }, { "tint", "∭" }, { "top", "⊤" }, { "topbot", "⌶" }, { "topcir", "⫱" }, { "tprime", "‴" }, { "utdot", "⋰" }, { "uwangle", "⦧" }, { "vangrt", "⦜" }, { "veeeq", "≚" }, { "Verbar", "‖" }, { "wedgeq", "≙" }, { "xnis", "⋻" }, { "boxDL", "╗" }, { "boxDl", "╖" }, { "boxdL", "╕" }, { "boxdl", "┐" }, { "boxDR", "╔" }, { "boxDr", "╓" }, { "boxdR", "╒" }, { "boxdr", "┌" }, { "boxH", "═" }, { "boxh", "─" }, { "boxHD", "╦" }, { "boxHd", "╤" }, { "boxhD", "╥" }, { "boxhd", "┬" }, { "boxHU", "╩" }, { "boxHu", "╧" }, { "boxhU", "╨" }, { "boxhu", "┴" }, { "boxUL", "╝" }, { "boxUl", "╜" }, { "boxuL", "╛" }, { "boxul", "┘" }, { "boxUR", "╚" }, { "boxUr", "╙" }, { "boxuR", "╘" }, { "boxur", "└" }, { "boxV", "║" }, { "boxv", "│" }, { "boxVH", "╬" }, { "boxVh", "╫" }, { "boxvH", "╪" }, { "boxvh", "┼" }, { "boxVL", "╣" }, { "boxVl", "╢" }, { "boxvL", "╡" }, { "boxvl", "┤" }, { "boxVR", "╠" }, { "boxVr", "╟" }, { "boxvR", "╞" }, { "boxvr", "├" }, { "Acy", "А" }, { "acy", "а" }, { "Bcy", "Б" }, { "bcy", "б" }, { "CHcy", "Ч" }, { "chcy", "ч" }, { "Dcy", "Д" }, { "dcy", "д" }, { "Ecy", "Э" }, { "ecy", "э" }, { "Fcy", "Ф" }, { "fcy", "ф" }, { "Gcy", "Г" }, { "gcy", "г" }, { "HARDcy", "Ъ" }, { "hardcy", "ъ" }, { "Icy", "И" }, { "icy", "и" }, { "IEcy", "Е" }, { "iecy", "е" }, { "IOcy", "Ё" }, { "iocy", "ё" }, { "Jcy", "Й" }, { "jcy", "й" }, { "Kcy", "К" }, { "kcy", "к" }, { "KHcy", "Х" }, { "khcy", "х" }, { "Lcy", "Л" }, { "lcy", "л" }, { "Mcy", "М" }, { "mcy", "м" }, { "Ncy", "Н" }, { "ncy", "н" }, { "numero", "№" }, { "Ocy", "О" }, { "ocy", "о" }, { "Pcy", "П" }, { "pcy", "п" }, { "Rcy", "Р" }, { "rcy", "р" }, { "Scy", "С" }, { "scy", "с" }, { "SHCHcy", "Щ" }, { "shchcy", "щ" }, { "SHcy", "Ш" }, { "shcy", "ш" }, { "SOFTcy", "Ь" }, { "softcy", "ь" }, { "Tcy", "Т" }, { "tcy", "т" }, { "TScy", "Ц" }, { "tscy", "ц" }, { "Ucy", "У" }, { "ucy", "у" }, { "Vcy", "В" }, { "vcy", "в" }, { "YAcy", "Я" }, { "yacy", "я" }, { "Ycy", "Ы" }, { "ycy", "ы" }, { "YUcy", "Ю" }, { "yucy", "ю" }, { "Zcy", "З" }, { "zcy", "з" }, { "ZHcy", "Ж" }, { "zhcy", "ж" }, { "DJcy", "Ђ" }, { "djcy", "ђ" }, { "DScy", "Ѕ" }, { "dscy", "ѕ" }, { "DZcy", "Џ" }, { "dzcy", "џ" }, { "GJcy", "Ѓ" }, { "gjcy", "ѓ" }, { "Iukcy", "І" }, { "iukcy", "і" }, { "Jsercy", "Ј" }, { "jsercy", "ј" }, { "Jukcy", "Є" }, { "jukcy", "є" }, { "KJcy", "Ќ" }, { "kjcy", "ќ" }, { "LJcy", "Љ" }, { "ljcy", "љ" }, { "NJcy", "Њ" }, { "njcy", "њ" }, { "TSHcy", "Ћ" }, { "tshcy", "ћ" }, { "Ubrcy", "Ў" }, { "ubrcy", "ў" }, { "YIcy", "Ї" }, { "yicy", "ї" }, { "acute", "´" }, { "breve", "˘" }, { "caron", "ˇ" }, { "cedil", "¸" }, { "circ", "ˆ" }, { "dblac", "˝" }, { "die", "¨" }, { "dot", "˙" }, { "grave", "`" }, { "macr", "¯" }, { "ogon", "˛" }, { "ring", "˚" }, { "tilde", "˜" }, { "uml", "¨" }, { "Aacute", "Á" }, { "aacute", "á" }, { "Acirc", "Â" }, { "acirc", "â" }, { "AElig", "Æ" }, { "aelig", "æ" }, { "Agrave", "À" }, { "agrave", "à" }, { "Aring", "Å" }, { "aring", "å" }, { "Atilde", "Ã" }, { "atilde", "ã" }, { "Auml", "Ä" }, { "auml", "ä" }, { "Ccedil", "Ç" }, { "ccedil", "ç" }, { "Eacute", "É" }, { "eacute", "é" }, { "Ecirc", "Ê" }, { "ecirc", "ê" }, { "Egrave", "È" }, { "egrave", "è" }, { "ETH", "Ð" }, { "eth", "ð" }, { "Euml", "Ë" }, { "euml", "ë" }, { "Iacute", "Í" }, { "iacute", "í" }, { "Icirc", "Î" }, { "icirc", "î" }, { "Igrave", "Ì" }, { "igrave", "ì" }, { "Iuml", "Ï" }, { "iuml", "ï" }, { "Ntilde", "Ñ" }, { "ntilde", "ñ" }, { "Oacute", "Ó" }, { "oacute", "ó" }, { "Ocirc", "Ô" }, { "ocirc", "ô" }, { "Ograve", "Ò" }, { "ograve", "ò" }, { "Oslash", "Ø" }, { "oslash", "ø" }, { "Otilde", "Õ" }, { "otilde", "õ" }, { "Ouml", "Ö" }, { "ouml", "ö" }, { "szlig", "ß" }, { "THORN", "Þ" }, { "thorn", "þ" }, { "Uacute", "Ú" }, { "uacute", "ú" }, { "Ucirc", "Û" }, { "ucirc", "û" }, { "Ugrave", "Ù" }, { "ugrave", "ù" }, { "Uuml", "Ü" }, { "uuml", "ü" }, { "Yacute", "Ý" }, { "yacute", "ý" }, { "yuml", "ÿ" }, { "Abreve", "Ă" }, { "abreve", "ă" }, { "Amacr", "Ā" }, { "amacr", "ā" }, { "Aogon", "Ą" }, { "aogon", "ą" }, { "Cacute", "Ć" }, { "cacute", "ć" }, { "Ccaron", "Č" }, { "ccaron", "č" }, { "Ccirc", "Ĉ" }, { "ccirc", "ĉ" }, { "Cdot", "Ċ" }, { "cdot", "ċ" }, { "Dcaron", "Ď" }, { "dcaron", "ď" }, { "Dstrok", "Đ" }, { "dstrok", "đ" }, { "Ecaron", "Ě" }, { "ecaron", "ě" }, { "Edot", "Ė" }, { "edot", "ė" }, { "Emacr", "Ē" }, { "emacr", "ē" }, { "ENG", "Ŋ" }, { "eng", "ŋ" }, { "Eogon", "Ę" }, { "eogon", "ę" }, { "gacute", "ǵ" }, { "Gbreve", "Ğ" }, { "gbreve", "ğ" }, { "Gcedil", "Ģ" }, { "Gcirc", "Ĝ" }, { "gcirc", "ĝ" }, { "Gdot", "Ġ" }, { "gdot", "ġ" }, { "Hcirc", "Ĥ" }, { "hcirc", "ĥ" }, { "Hstrok", "Ħ" }, { "hstrok", "ħ" }, { "Idot", "İ" }, { "IJlig", "IJ" }, { "ijlig", "ij" }, { "Imacr", "Ī" }, { "imacr", "ī" }, { "inodot", "ı" }, { "Iogon", "Į" }, { "iogon", "į" }, { "Itilde", "Ĩ" }, { "itilde", "ĩ" }, { "Jcirc", "Ĵ" }, { "jcirc", "ĵ" }, { "Kcedil", "Ķ" }, { "kcedil", "ķ" }, { "kgreen", "ĸ" }, { "Lacute", "Ĺ" }, { "lacute", "ĺ" }, { "Lcaron", "Ľ" }, { "lcaron", "ľ" }, { "Lcedil", "Ļ" }, { "lcedil", "ļ" }, { "Lmidot", "Ŀ" }, { "lmidot", "ŀ" }, { "Lstrok", "Ł" }, { "lstrok", "ł" }, { "Nacute", "Ń" }, { "nacute", "ń" }, { "napos", "ʼn" }, { "Ncaron", "Ň" }, { "ncaron", "ň" }, { "Ncedil", "Ņ" }, { "ncedil", "ņ" }, { "Odblac", "Ő" }, { "odblac", "ő" }, { "OElig", "Œ" }, { "oelig", "œ" }, { "Omacr", "Ō" }, { "omacr", "ō" }, { "Racute", "Ŕ" }, { "racute", "ŕ" }, { "Rcaron", "Ř" }, { "rcaron", "ř" }, { "Rcedil", "Ŗ" }, { "rcedil", "ŗ" }, { "Sacute", "Ś" }, { "sacute", "ś" }, { "Scaron", "Š" }, { "scaron", "š" }, { "Scedil", "Ş" }, { "scedil", "ş" }, { "Scirc", "Ŝ" }, { "scirc", "ŝ" }, { "Tcaron", "Ť" }, { "tcaron", "ť" }, { "Tcedil", "Ţ" }, { "tcedil", "ţ" }, { "Tstrok", "Ŧ" }, { "tstrok", "ŧ" }, { "Ubreve", "Ŭ" }, { "ubreve", "ŭ" }, { "Udblac", "Ű" }, { "udblac", "ű" }, { "Umacr", "Ū" }, { "umacr", "ū" }, { "Uogon", "Ų" }, { "uogon", "ų" }, { "Uring", "Ů" }, { "uring", "ů" }, { "Utilde", "Ũ" }, { "utilde", "ũ" }, { "Wcirc", "Ŵ" }, { "wcirc", "ŵ" }, { "Ycirc", "Ŷ" }, { "ycirc", "ŷ" }, { "Yuml", "Ÿ" }, { "Zacute", "Ź" }, { "zacute", "ź" }, { "Zcaron", "Ž" }, { "zcaron", "ž" }, { "Zdot", "Ż" }, { "zdot", "ż" }, { "apos", "'" }, { "ast", "*" }, { "brvbar", "¦" }, { "bsol", "\" }, { "cent", "¢" }, { "colon", ":" }, { "comma", "," }, { "commat", "@" }, { "copy", "©" }, { "curren", "¤" }, { "darr", "↓" }, { "deg", "°" }, { "divide", "÷" }, { "dollar", "$" }, { "equals", "=" }, { "excl", "!" }, { "frac12", "½" }, { "frac14", "¼" }, { "frac18", "⅛" }, { "frac34", "¾" }, { "frac38", "⅜" }, { "frac58", "⅝" }, { "frac78", "⅞" }, { "gt", ">" }, { "half", "½" }, { "horbar", "―" }, { "hyphen", "‐" }, { "iexcl", "¡" }, { "iquest", "¿" }, { "laquo", "«" }, { "larr", "←" }, { "lcub", "{" }, { "ldquo", "“" }, { "lowbar", "_" }, { "lpar", "(" }, { "lsqb", "[" }, { "lsquo", "‘" }, { "lt", "<" }, { "micro", "µ" }, { "middot", "·" }, { "nbsp", " " }, { "not", "¬" }, { "num", "#" }, { "ohm", "Ω" }, { "ordf", "ª" }, { "ordm", "º" }, { "para", "¶" }, { "percnt", "%" }, { "period", "." }, { "plus", "+" }, { "plusmn", "±" }, { "pound", "£" }, { "quest", "?" }, { "quot", """ }, { "raquo", "»" }, { "rarr", "→" }, { "rcub", "}" }, { "rdquo", "”" }, { "reg", "®" }, { "rpar", ")" }, { "rsqb", "]" }, { "rsquo", "’" }, { "sect", "§" }, { "semi", ";" }, { "shy", "­" }, { "sol", "/" }, { "sung", "♪" }, { "sup1", "¹" }, { "sup2", "²" }, { "sup3", "³" }, { "times", "×" }, { "trade", "™" }, { "uarr", "↑" }, { "verbar", "|" }, { "yen", "¥" }, { "blank", "␣" }, { "blk12", "▒" }, { "blk14", "░" }, { "blk34", "▓" }, { "block", "█" }, { "bull", "•" }, { "caret", "⁁" }, { "check", "✓" }, { "cir", "○" }, { "clubs", "♣" }, { "copysr", "℗" }, { "cross", "✗" }, { "Dagger", "‡" }, { "dagger", "†" }, { "dash", "‐" }, { "diams", "♦" }, { "dlcrop", "⌍" }, { "drcrop", "⌌" }, { "dtri", "▿" }, { "dtrif", "▾" }, { "emsp", " " }, { "emsp13", " " }, { "emsp14", " " }, { "ensp", " " }, { "female", "♀" }, { "ffilig", "ffi" }, { "fflig", "ff" }, { "ffllig", "ffl" }, { "filig", "fi" }, { "flat", "♭" }, { "fllig", "fl" }, { "frac13", "⅓" }, { "frac15", "⅕" }, { "frac16", "⅙" }, { "frac23", "⅔" }, { "frac25", "⅖" }, { "frac35", "⅗" }, { "frac45", "⅘" }, { "frac56", "⅚" }, { "hairsp", " " }, { "hearts", "♥" }, { "hellip", "…" }, { "hybull", "⁃" }, { "incare", "℅" }, { "ldquor", "„" }, { "lhblk", "▄" }, { "loz", "◊" }, { "lozf", "⧫" }, { "lsquor", "‚" }, { "ltri", "◃" }, { "ltrif", "◂" }, { "male", "♂" }, { "malt", "✠" }, { "marker", "▮" }, { "mdash", "—" }, { "mldr", "…" }, { "natur", "♮" }, { "ndash", "–" }, { "nldr", "‥" }, { "numsp", " " }, { "phone", "☎" }, { "puncsp", " " }, { "rdquor", "”" }, { "rect", "▭" }, { "rsquor", "’" }, { "rtri", "▹" }, { "rtrif", "▸" }, { "rx", "℞" }, { "sext", "✶" }, { "sharp", "♯" }, { "spades", "♠" }, { "squ", "□" }, { "squf", "▪" }, { "star", "☆" }, { "starf", "★" }, { "target", "⌖" }, { "telrec", "⌕" }, { "thinsp", " " }, { "uhblk", "▀" }, { "ulcrop", "⌏" }, { "urcrop", "⌎" }, { "utri", "▵" }, { "utrif", "▴" }, { "vellip", "⋮" }, { "af", "⁡" }, { "asympeq", "≍" }, { "Cross", "⨯" }, { "DD", "ⅅ" }, { "dd", "ⅆ" }, { "DownArrowBar", "⤓" }, { "DownBreve", "̑" }, { "DownLeftRightVector", "⥐" }, { "DownLeftTeeVector", "⥞" }, { "DownLeftVectorBar", "⥖" }, { "DownRightTeeVector", "⥟" }, { "DownRightVectorBar", "⥗" }, { "ee", "ⅇ" }, { "EmptySmallSquare", "◻" }, { "EmptyVerySmallSquare", "▫" }, { "Equal", "⩵" }, { "FilledSmallSquare", "◼" }, { "FilledVerySmallSquare", "▪" }, { "GreaterGreater", "⪢" }, { "Hat", "^" }, { "HorizontalLine", "─" }, { "ic", "⁣" }, { "ii", "ⅈ" }, { "it", "⁢" }, { "larrb", "⇤" }, { "LeftDownTeeVector", "⥡" }, { "LeftDownVectorBar", "⥙" }, { "LeftRightVector", "⥎" }, { "LeftTeeVector", "⥚" }, { "LeftTriangleBar", "⧏" }, { "LeftUpDownVector", "⥑" }, { "LeftUpTeeVector", "⥠" }, { "LeftUpVectorBar", "⥘" }, { "LeftVectorBar", "⥒" }, { "LessLess", "⪡" }, { "mapstodown", "↧" }, { "mapstoleft", "↤" }, { "mapstoup", "↥" }, { "MediumSpace", " " }, { "nbump", "≎̸" }, { "nbumpe", "≏̸" }, { "nesim", "≂̸" }, { "NewLine", " " }, { "NoBreak", "⁠" }, { "NotCupCap", "≭" }, { "NotHumpEqual", "≏̸" }, { "NotLeftTriangleBar", "⧏̸" }, { "NotNestedGreaterGreater", "⪢̸" }, { "NotNestedLessLess", "⪡̸" }, { "NotRightTriangleBar", "⧐̸" }, { "NotSquareSubset", "⊏̸" }, { "NotSquareSuperset", "⊐̸" }, { "NotSucceedsTilde", "≿̸" }, { "OverBar", "¯" }, { "OverBrace", "︷" }, { "OverBracket", "⎴" }, { "OverParenthesis", "︵" }, { "planckh", "ℎ" }, { "Product", "∏" }, { "rarrb", "⇥" }, { "RightDownTeeVector", "⥝" }, { "RightDownVectorBar", "⥕" }, { "RightTeeVector", "⥛" }, { "RightTriangleBar", "⧐" }, { "RightUpDownVector", "⥏" }, { "RightUpTeeVector", "⥜" }, { "RightUpVectorBar", "⥔" }, { "RightVectorBar", "⥓" }, { "RoundImplies", "⥰" }, { "RuleDelayed", "⧴" }, { "Tab", " " }, { "ThickSpace", "   " }, { "UnderBar", "̲" }, { "UnderBrace", "︸" }, { "UnderBracket", "⎵" }, { "UnderParenthesis", "︶" }, { "UpArrowBar", "⤒" }, { "Upsilon", "Υ" }, { "VerticalLine", "|" }, { "VerticalSeparator", "❘" }, { "ZeroWidthSpace", "​" }, { "angle", "∠" }, { "ApplyFunction", "⁡" }, { "approx", "≈" }, { "approxeq", "≊" }, { "Assign", "≔" }, { "backcong", "≌" }, { "backepsilon", "϶" }, { "backprime", "‵" }, { "backsim", "∽" }, { "backsimeq", "⋍" }, { "Backslash", "∖" }, { "barwedge", "⌅" }, { "Because", "∵" }, { "because", "∵" }, { "Bernoullis", "ℬ" }, { "between", "≬" }, { "bigcap", "⋂" }, { "bigcirc", "◯" }, { "bigcup", "⋃" }, { "bigodot", "⨀" }, { "bigoplus", "⨁" }, { "bigotimes", "⨂" }, { "bigsqcup", "⨆" }, { "bigstar", "★" }, { "bigtriangledown", "▽" }, { "bigtriangleup", "△" }, { "biguplus", "⨄" }, { "bigvee", "⋁" }, { "bigwedge", "⋀" }, { "bkarow", "⤍" }, { "blacklozenge", "⧫" }, { "blacksquare", "▪" }, { "blacktriangle", "▴" }, { "blacktriangledown", "▾" }, { "blacktriangleleft", "◂" }, { "blacktriangleright", "▸" }, { "bot", "⊥" }, { "boxminus", "⊟" }, { "boxplus", "⊞" }, { "boxtimes", "⊠" }, { "Breve", "˘" }, { "bullet", "•" }, { "Bumpeq", "≎" }, { "bumpeq", "≏" }, { "CapitalDifferentialD", "ⅅ" }, { "Cayleys", "ℭ" }, { "Cedilla", "¸" }, { "CenterDot", "·" }, { "centerdot", "·" }, { "checkmark", "✓" }, { "circeq", "≗" }, { "circlearrowleft", "↺" }, { "circlearrowright", "↻" }, { "circledast", "⊛" }, { "circledcirc", "⊚" }, { "circleddash", "⊝" }, { "CircleDot", "⊙" }, { "circledR", "®" }, { "circledS", "Ⓢ" }, { "CircleMinus", "⊖" }, { "CirclePlus", "⊕" }, { "CircleTimes", "⊗" }, { "ClockwiseContourIntegral", "∲" }, { "CloseCurlyDoubleQuote", "”" }, { "CloseCurlyQuote", "’" }, { "clubsuit", "♣" }, { "coloneq", "≔" }, { "complement", "∁" }, { "complexes", "ℂ" }, { "Congruent", "≡" }, { "ContourIntegral", "∮" }, { "Coproduct", "∐" }, { "CounterClockwiseContourIntegral", "∳" }, { "CupCap", "≍" }, { "curlyeqprec", "⋞" }, { "curlyeqsucc", "⋟" }, { "curlyvee", "⋎" }, { "curlywedge", "⋏" }, { "curvearrowleft", "↶" }, { "curvearrowright", "↷" }, { "dbkarow", "⤏" }, { "ddagger", "‡" }, { "ddotseq", "⩷" }, { "Del", "∇" }, { "DiacriticalAcute", "´" }, { "DiacriticalDot", "˙" }, { "DiacriticalDoubleAcute", "˝" }, { "DiacriticalGrave", "`" }, { "DiacriticalTilde", "˜" }, { "Diamond", "⋄" }, { "diamond", "⋄" }, { "diamondsuit", "♦" }, { "DifferentialD", "ⅆ" }, { "digamma", "ϝ" }, { "div", "÷" }, { "divideontimes", "⋇" }, { "doteq", "≐" }, { "doteqdot", "≑" }, { "DotEqual", "≐" }, { "dotminus", "∸" }, { "dotplus", "∔" }, { "dotsquare", "⊡" }, { "doublebarwedge", "⌆" }, { "DoubleContourIntegral", "∯" }, { "DoubleDot", "¨" }, { "DoubleDownArrow", "⇓" }, { "DoubleLeftArrow", "⇐" }, { "DoubleLeftRightArrow", "⇔" }, { "DoubleLeftTee", "⫤" }, { "DoubleLongLeftArrow", "⟸" }, { "DoubleLongLeftRightArrow", "⟺" }, { "DoubleLongRightArrow", "⟹" }, { "DoubleRightArrow", "⇒" }, { "DoubleRightTee", "⊨" }, { "DoubleUpArrow", "⇑" }, { "DoubleUpDownArrow", "⇕" }, { "DoubleVerticalBar", "∥" }, { "DownArrow", "↓" }, { "Downarrow", "⇓" }, { "downarrow", "↓" }, { "DownArrowUpArrow", "⇵" }, { "downdownarrows", "⇊" }, { "downharpoonleft", "⇃" }, { "downharpoonright", "⇂" }, { "DownLeftVector", "↽" }, { "DownRightVector", "⇁" }, { "DownTee", "⊤" }, { "DownTeeArrow", "↧" }, { "drbkarow", "⤐" }, { "Element", "∈" }, { "emptyset", "∅" }, { "eqcirc", "≖" }, { "eqcolon", "≕" }, { "eqsim", "≂" }, { "eqslantgtr", "⪖" }, { "eqslantless", "⪕" }, { "EqualTilde", "≂" }, { "Equilibrium", "⇌" }, { "Exists", "∃" }, { "expectation", "ℰ" }, { "ExponentialE", "ⅇ" }, { "exponentiale", "ⅇ" }, { "fallingdotseq", "≒" }, { "ForAll", "∀" }, { "Fouriertrf", "ℱ" }, { "geq", "≥" }, { "geqq", "≧" }, { "geqslant", "⩾" }, { "gg", "≫" }, { "ggg", "⋙" }, { "gnapprox", "⪊" }, { "gneq", "⪈" }, { "gneqq", "≩" }, { "GreaterEqual", "≥" }, { "GreaterEqualLess", "⋛" }, { "GreaterFullEqual", "≧" }, { "GreaterLess", "≷" }, { "GreaterSlantEqual", "⩾" }, { "GreaterTilde", "≳" }, { "gtrapprox", "⪆" }, { "gtrdot", "⋗" }, { "gtreqless", "⋛" }, { "gtreqqless", "⪌" }, { "gtrless", "≷" }, { "gtrsim", "≳" }, { "gvertneqq", "≩︀" }, { "Hacek", "ˇ" }, { "hbar", "ℏ" }, { "heartsuit", "♥" }, { "HilbertSpace", "ℋ" }, { "hksearow", "⤥" }, { "hkswarow", "⤦" }, { "hookleftarrow", "↩" }, { "hookrightarrow", "↪" }, { "hslash", "ℏ" }, { "HumpDownHump", "≎" }, { "HumpEqual", "≏" }, { "iiiint", "⨌" }, { "iiint", "∭" }, { "Im", "ℑ" }, { "ImaginaryI", "ⅈ" }, { "imagline", "ℐ" }, { "imagpart", "ℑ" }, { "Implies", "⇒" }, { "in", "∈" }, { "integers", "ℤ" }, { "Integral", "∫" }, { "intercal", "⊺" }, { "Intersection", "⋂" }, { "intprod", "⨼" }, { "InvisibleComma", "⁣" }, { "InvisibleTimes", "⁢" }, { "langle", "〈" }, { "Laplacetrf", "ℒ" }, { "lbrace", "{" }, { "lbrack", "[" }, { "LeftAngleBracket", "〈" }, { "LeftArrow", "←" }, { "Leftarrow", "⇐" }, { "leftarrow", "←" }, { "LeftArrowBar", "⇤" }, { "LeftArrowRightArrow", "⇆" }, { "leftarrowtail", "↢" }, { "LeftCeiling", "⌈" }, { "LeftDoubleBracket", "〚" }, { "LeftDownVector", "⇃" }, { "LeftFloor", "⌊" }, { "leftharpoondown", "↽" }, { "leftharpoonup", "↼" }, { "leftleftarrows", "⇇" }, { "LeftRightArrow", "↔" }, { "Leftrightarrow", "⇔" }, { "leftrightarrow", "↔" }, { "leftrightarrows", "⇆" }, { "leftrightharpoons", "⇋" }, { "leftrightsquigarrow", "↭" }, { "LeftTee", "⊣" }, { "LeftTeeArrow", "↤" }, { "leftthreetimes", "⋋" }, { "LeftTriangle", "⊲" }, { "LeftTriangleEqual", "⊴" }, { "LeftUpVector", "↿" }, { "LeftVector", "↼" }, { "leq", "≤" }, { "leqq", "≦" }, { "leqslant", "⩽" }, { "lessapprox", "⪅" }, { "lessdot", "⋖" }, { "lesseqgtr", "⋚" }, { "lesseqqgtr", "⪋" }, { "LessEqualGreater", "⋚" }, { "LessFullEqual", "≦" }, { "LessGreater", "≶" }, { "lessgtr", "≶" }, { "lesssim", "≲" }, { "LessSlantEqual", "⩽" }, { "LessTilde", "≲" }, { "ll", "≪" }, { "llcorner", "⌞" }, { "Lleftarrow", "⇚" }, { "lmoustache", "⎰" }, { "lnapprox", "⪉" }, { "lneq", "⪇" }, { "lneqq", "≨" }, { "LongLeftArrow", "⟵" }, { "Longleftarrow", "⟸" }, { "longleftarrow", "⟵" }, { "LongLeftRightArrow", "⟷" }, { "Longleftrightarrow", "⟺" }, { "longleftrightarrow", "⟷" }, { "longmapsto", "⟼" }, { "LongRightArrow", "⟶" }, { "Longrightarrow", "⟹" }, { "longrightarrow", "⟶" }, { "looparrowleft", "↫" }, { "looparrowright", "↬" }, { "LowerLeftArrow", "↙" }, { "LowerRightArrow", "↘" }, { "lozenge", "◊" }, { "lrcorner", "⌟" }, { "Lsh", "↰" }, { "lvertneqq", "≨︀" }, { "maltese", "✠" }, { "mapsto", "↦" }, { "measuredangle", "∡" }, { "Mellintrf", "ℳ" }, { "MinusPlus", "∓" }, { "mp", "∓" }, { "multimap", "⊸" }, { "napprox", "≉" }, { "natural", "♮" }, { "naturals", "ℕ" }, { "nearrow", "↗" }, { "NegativeMediumSpace", "​" }, { "NegativeThickSpace", "​" }, { "NegativeThinSpace", "​" }, { "NegativeVeryThinSpace", "​" }, { "NestedGreaterGreater", "≫" }, { "NestedLessLess", "≪" }, { "nexists", "∄" }, { "ngeq", "≱" }, { "ngeqq", "≧̸" }, { "ngeqslant", "⩾̸" }, { "ngtr", "≯" }, { "nLeftarrow", "⇍" }, { "nleftarrow", "↚" }, { "nLeftrightarrow", "⇎" }, { "nleftrightarrow", "↮" }, { "nleq", "≰" }, { "nleqq", "≦̸" }, { "nleqslant", "⩽̸" }, { "nless", "≮" }, { "NonBreakingSpace", " " }, { "NotCongruent", "≢" }, { "NotDoubleVerticalBar", "∦" }, { "NotElement", "∉" }, { "NotEqual", "≠" }, { "NotEqualTilde", "≂̸" }, { "NotExists", "∄" }, { "NotGreater", "≯" }, { "NotGreaterEqual", "≱" }, { "NotGreaterFullEqual", "≦̸" }, { "NotGreaterGreater", "≫̸" }, { "NotGreaterLess", "≹" }, { "NotGreaterSlantEqual", "⩾̸" }, { "NotGreaterTilde", "≵" }, { "NotHumpDownHump", "≎̸" }, { "NotLeftTriangle", "⋪" }, { "NotLeftTriangleEqual", "⋬" }, { "NotLess", "≮" }, { "NotLessEqual", "≰" }, { "NotLessGreater", "≸" }, { "NotLessLess", "≪̸" }, { "NotLessSlantEqual", "⩽̸" }, { "NotLessTilde", "≴" }, { "NotPrecedes", "⊀" }, { "NotPrecedesEqual", "⪯̸" }, { "NotPrecedesSlantEqual", "⋠" }, { "NotReverseElement", "∌" }, { "NotRightTriangle", "⋫" }, { "NotRightTriangleEqual", "⋭" }, { "NotSquareSubsetEqual", "⋢" }, { "NotSquareSupersetEqual", "⋣" }, { "NotSubset", "⊂⃒" }, { "NotSubsetEqual", "⊈" }, { "NotSucceeds", "⊁" }, { "NotSucceedsEqual", "⪰̸" }, { "NotSucceedsSlantEqual", "⋡" }, { "NotSuperset", "⊃⃒" }, { "NotSupersetEqual", "⊉" }, { "NotTilde", "≁" }, { "NotTildeEqual", "≄" }, { "NotTildeFullEqual", "≇" }, { "NotTildeTilde", "≉" }, { "NotVerticalBar", "∤" }, { "nparallel", "∦" }, { "nprec", "⊀" }, { "npreceq", "⪯̸" }, { "nRightarrow", "⇏" }, { "nrightarrow", "↛" }, { "nshortmid", "∤" }, { "nshortparallel", "∦" }, { "nsimeq", "≄" }, { "nsubset", "⊂⃒" }, { "nsubseteq", "⊈" }, { "nsubseteqq", "⫅̸" }, { "nsucc", "⊁" }, { "nsucceq", "⪰̸" }, { "nsupset", "⊃⃒" }, { "nsupseteq", "⊉" }, { "nsupseteqq", "⫆̸" }, { "ntriangleleft", "⋪" }, { "ntrianglelefteq", "⋬" }, { "ntriangleright", "⋫" }, { "ntrianglerighteq", "⋭" }, { "nwarrow", "↖" }, { "oint", "∮" }, { "OpenCurlyDoubleQuote", "“" }, { "OpenCurlyQuote", "‘" }, { "orderof", "ℴ" }, { "parallel", "∥" }, { "PartialD", "∂" }, { "pitchfork", "⋔" }, { "PlusMinus", "±" }, { "pm", "±" }, { "Poincareplane", "ℌ" }, { "prec", "≺" }, { "precapprox", "⪷" }, { "preccurlyeq", "≼" }, { "Precedes", "≺" }, { "PrecedesEqual", "⪯" }, { "PrecedesSlantEqual", "≼" }, { "PrecedesTilde", "≾" }, { "preceq", "⪯" }, { "precnapprox", "⪹" }, { "precneqq", "⪵" }, { "precnsim", "⋨" }, { "precsim", "≾" }, { "primes", "ℙ" }, { "Proportion", "∷" }, { "Proportional", "∝" }, { "propto", "∝" }, { "quaternions", "ℍ" }, { "questeq", "≟" }, { "rangle", "〉" }, { "rationals", "ℚ" }, { "rbrace", "}" }, { "rbrack", "]" }, { "Re", "ℜ" }, { "realine", "ℛ" }, { "realpart", "ℜ" }, { "reals", "ℝ" }, { "ReverseElement", "∋" }, { "ReverseEquilibrium", "⇋" }, { "ReverseUpEquilibrium", "⥯" }, { "RightAngleBracket", "〉" }, { "RightArrow", "→" }, { "Rightarrow", "⇒" }, { "rightarrow", "→" }, { "RightArrowBar", "⇥" }, { "RightArrowLeftArrow", "⇄" }, { "rightarrowtail", "↣" }, { "RightCeiling", "⌉" }, { "RightDoubleBracket", "〛" }, { "RightDownVector", "⇂" }, { "RightFloor", "⌋" }, { "rightharpoondown", "⇁" }, { "rightharpoonup", "⇀" }, { "rightleftarrows", "⇄" }, { "rightleftharpoons", "⇌" }, { "rightrightarrows", "⇉" }, { "rightsquigarrow", "↝" }, { "RightTee", "⊢" }, { "RightTeeArrow", "↦" }, { "rightthreetimes", "⋌" }, { "RightTriangle", "⊳" }, { "RightTriangleEqual", "⊵" }, { "RightUpVector", "↾" }, { "RightVector", "⇀" }, { "risingdotseq", "≓" }, { "rmoustache", "⎱" }, { "Rrightarrow", "⇛" }, { "Rsh", "↱" }, { "searrow", "↘" }, { "setminus", "∖" }, { "ShortDownArrow", "↓" }, { "ShortLeftArrow", "←" }, { "shortmid", "∣" }, { "shortparallel", "∥" }, { "ShortRightArrow", "→" }, { "ShortUpArrow", "↑" }, { "simeq", "≃" }, { "SmallCircle", "∘" }, { "smallsetminus", "∖" }, { "spadesuit", "♠" }, { "Sqrt", "√" }, { "sqsubset", "⊏" }, { "sqsubseteq", "⊑" }, { "sqsupset", "⊐" }, { "sqsupseteq", "⊒" }, { "Square", "□" }, { "SquareIntersection", "⊓" }, { "SquareSubset", "⊏" }, { "SquareSubsetEqual", "⊑" }, { "SquareSuperset", "⊐" }, { "SquareSupersetEqual", "⊒" }, { "SquareUnion", "⊔" }, { "Star", "⋆" }, { "straightepsilon", "ε" }, { "straightphi", "ϕ" }, { "Subset", "⋐" }, { "subset", "⊂" }, { "subseteq", "⊆" }, { "subseteqq", "⫅" }, { "SubsetEqual", "⊆" }, { "subsetneq", "⊊" }, { "subsetneqq", "⫋" }, { "succ", "≻" }, { "succapprox", "⪸" }, { "succcurlyeq", "≽" }, { "Succeeds", "≻" }, { "SucceedsEqual", "⪰" }, { "SucceedsSlantEqual", "≽" }, { "SucceedsTilde", "≿" }, { "succeq", "⪰" }, { "succnapprox", "⪺" }, { "succneqq", "⪶" }, { "succnsim", "⋩" }, { "succsim", "≿" }, { "SuchThat", "∋" }, { "Sum", "∑" }, { "Superset", "⊃" }, { "SupersetEqual", "⊇" }, { "Supset", "⋑" }, { "supset", "⊃" }, { "supseteq", "⊇" }, { "supseteqq", "⫆" }, { "supsetneq", "⊋" }, { "supsetneqq", "⫌" }, { "swarrow", "↙" }, { "Therefore", "∴" }, { "therefore", "∴" }, { "thickapprox", "≈" }, { "thicksim", "∼" }, { "ThinSpace", " " }, { "Tilde", "∼" }, { "TildeEqual", "≃" }, { "TildeFullEqual", "≅" }, { "TildeTilde", "≈" }, { "toea", "⤨" }, { "tosa", "⤩" }, { "triangle", "▵" }, { "triangledown", "▿" }, { "triangleleft", "◃" }, { "trianglelefteq", "⊴" }, { "triangleq", "≜" }, { "triangleright", "▹" }, { "trianglerighteq", "⊵" }, { "TripleDot", "⃛" }, { "twoheadleftarrow", "↞" }, { "twoheadrightarrow", "↠" }, { "ulcorner", "⌜" }, { "Union", "⋃" }, { "UnionPlus", "⊎" }, { "UpArrow", "↑" }, { "Uparrow", "⇑" }, { "uparrow", "↑" }, { "UpArrowDownArrow", "⇅" }, { "UpDownArrow", "↕" }, { "Updownarrow", "⇕" }, { "updownarrow", "↕" }, { "UpEquilibrium", "⥮" }, { "upharpoonleft", "↿" }, { "upharpoonright", "↾" }, { "UpperLeftArrow", "↖" }, { "UpperRightArrow", "↗" }, { "upsilon", "υ" }, { "UpTee", "⊥" }, { "UpTeeArrow", "↥" }, { "upuparrows", "⇈" }, { "urcorner", "⌝" }, { "varepsilon", "ɛ" }, { "varkappa", "ϰ" }, { "varnothing", "∅" }, { "varphi", "φ" }, { "varpi", "ϖ" }, { "varpropto", "∝" }, { "varrho", "ϱ" }, { "varsigma", "ς" }, { "varsubsetneq", "⊊︀" }, { "varsubsetneqq", "⫋︀" }, { "varsupsetneq", "⊋︀" }, { "varsupsetneqq", "⫌︀" }, { "vartheta", "ϑ" }, { "vartriangleleft", "⊲" }, { "vartriangleright", "⊳" }, { "Vee", "⋁" }, { "vee", "∨" }, { "Vert", "‖" }, { "vert", "|" }, { "VerticalBar", "∣" }, { "VerticalTilde", "≀" }, { "VeryThinSpace", " " }, { "Wedge", "⋀" }, { "wedge", "∧" }, { "wp", "℘" }, { "wr", "≀" }, { "zeetrf", "ℨ" }, { 0, 0 } }; // ******************************************************************* // QwtMmlDocument // ******************************************************************* QString QwtMmlDocument::fontName( QwtMathMLDocument::MmlFont type ) const { switch ( type ) { case QwtMathMLDocument::NormalFont: return m_normal_font_name; case QwtMathMLDocument::FrakturFont: return m_fraktur_font_name; case QwtMathMLDocument::SansSerifFont: return m_sans_serif_font_name; case QwtMathMLDocument::ScriptFont: return m_script_font_name; case QwtMathMLDocument::MonospaceFont: return m_monospace_font_name; case QwtMathMLDocument::DoublestruckFont: return m_doublestruck_font_name; }; return QString::null; } void QwtMmlDocument::setFontName( QwtMathMLDocument::MmlFont type, const QString &name ) { switch ( type ) { case QwtMathMLDocument::NormalFont: m_normal_font_name = name; break; case QwtMathMLDocument::FrakturFont: m_fraktur_font_name = name; break; case QwtMathMLDocument::SansSerifFont: m_sans_serif_font_name = name; break; case QwtMathMLDocument::ScriptFont: m_script_font_name = name; break; case QwtMathMLDocument::MonospaceFont: m_monospace_font_name = name; break; case QwtMathMLDocument::DoublestruckFont: m_doublestruck_font_name = name; break; }; } QwtMml::NodeType domToQwtMmlNodeType( const QDomNode &dom_node ) { QwtMml::NodeType mml_type = QwtMml::NoNode; switch ( dom_node.nodeType() ) { case QDomNode::ElementNode: { QString tag = dom_node.nodeName(); const QwtMmlNodeSpec *spec = mmlFindNodeSpec( tag ); // treat urecognised tags as mrow if ( spec == 0 ) mml_type = QwtMml::UnknownNode; else mml_type = spec->type; break; } case QDomNode::TextNode: mml_type = QwtMml::TextNode; break; case QDomNode::DocumentNode: mml_type = QwtMml::MrowNode; break; case QDomNode::EntityReferenceNode: // qWarning("EntityReferenceNode: name=\"" + dom_node.nodeName() + "\" value=\"" + dom_node.nodeValue() + "\""); break; case QDomNode::AttributeNode: case QDomNode::CDATASectionNode: case QDomNode::EntityNode: case QDomNode::ProcessingInstructionNode: case QDomNode::CommentNode: case QDomNode::DocumentTypeNode: case QDomNode::DocumentFragmentNode: case QDomNode::NotationNode: case QDomNode::BaseNode: case QDomNode::CharacterDataNode: break; } return mml_type; } QwtMmlDocument::QwtMmlDocument() { m_root_node = 0; // Some defaults which happen to work on my computer, // but probably won't work on other's #if defined(Q_OS_WIN) m_normal_font_name = "Times New Roman"; #else m_normal_font_name = "Century Schoolbook L"; #endif m_fraktur_font_name = "Fraktur"; m_sans_serif_font_name = "Luxi Sans"; m_script_font_name = "Urw Chancery L"; m_monospace_font_name = "Luxi Mono"; m_doublestruck_font_name = "Doublestruck"; m_base_font_point_size = 16; m_foreground_color = Qt::black; m_background_color = Qt::white; } QwtMmlDocument::~QwtMmlDocument() { clear(); } void QwtMmlDocument::clear() { delete m_root_node; m_root_node = 0; } void QwtMmlDocument::dump() const { if ( m_root_node == 0 ) return; QString indent; _dump( m_root_node, indent ); } void QwtMmlDocument::_dump( const QwtMmlNode *node, QString &indent ) const { if ( node == 0 ) return; qWarning() << indent + node->toStr(); indent += " "; const QwtMmlNode *child = node->firstChild(); for ( ; child != 0; child = child->nextSibling() ) _dump( child, indent ); indent.truncate( indent.length() - 2 ); } bool QwtMmlDocument::setContent( QString text, QString *errorMsg, int *errorLine, int *errorColumn ) { clear(); QString prefix = "\n"; prefix.append( entityDeclarations() ); uint prefix_lines = 0; for ( int i = 0; i < prefix.length(); ++i ) { if ( prefix.at( i ) == '\n' ) ++prefix_lines; } QDomDocument dom; if ( !dom.setContent( prefix + text, false, errorMsg, errorLine, errorColumn ) ) { if ( errorLine != 0 ) *errorLine -= prefix_lines; return false; } // we don't have access to line info from now on if ( errorLine != 0 ) *errorLine = -1; if ( errorColumn != 0 ) *errorColumn = -1; bool ok; QwtMmlNode *root_node = domToMml( dom, &ok, errorMsg ); if ( !ok ) return false; if ( root_node == 0 ) { if ( errorMsg != 0 ) *errorMsg = "empty document"; return false; } insertChild( 0, root_node, 0 ); layout(); /* QFile of("/tmp/dump.xml"); of.open(IO_WriteOnly); QTextStream os(&of); os.setEncoding(QTextStream::UnicodeUTF8); os << dom.toString(); */ return true; } void QwtMmlDocument::layout() { if ( m_root_node == 0 ) return; m_root_node->layout(); m_root_node->stretch(); // dump(); } bool QwtMmlDocument::insertChild( QwtMmlNode *parent, QwtMmlNode *new_node, QString *errorMsg ) { if ( new_node == 0 ) return true; Q_ASSERT( new_node->parent() == 0 && new_node->nextSibling() == 0 && new_node->previousSibling() == 0 ); if ( parent != 0 ) { if ( !mmlCheckChildType( parent->nodeType(), new_node->nodeType(), errorMsg ) ) return false; } if ( parent == 0 ) { if ( m_root_node == 0 ) m_root_node = new_node; else { QwtMmlNode *n = m_root_node->lastSibling(); n->m_next_sibling = new_node; new_node->m_previous_sibling = n; } } else { new_node->m_parent = parent; if ( parent->hasChildNodes() ) { QwtMmlNode *n = parent->firstChild()->lastSibling(); n->m_next_sibling = new_node; new_node->m_previous_sibling = n; } else parent->m_first_child = new_node; } return true; } QwtMmlNode *QwtMmlDocument::createNode( NodeType type, const QwtMmlAttributeMap &mml_attr, const QString &mml_value, QString *errorMsg ) { Q_ASSERT( type != NoNode ); QwtMmlNode *mml_node = 0; if ( !mmlCheckAttributes( type, mml_attr, errorMsg ) ) return 0; switch ( type ) { case MiNode: mml_node = new QwtMmlMiNode( this, mml_attr ); break; case MnNode: mml_node = new QwtMmlMnNode( this, mml_attr ); break; case MfracNode: mml_node = new QwtMmlMfracNode( this, mml_attr ); break; case MrowNode: mml_node = new QwtMmlMrowNode( this, mml_attr ); break; case MsqrtNode: mml_node = new QwtMmlMsqrtNode( this, mml_attr ); break; case MrootNode: mml_node = new QwtMmlMrootNode( this, mml_attr ); break; case MsupNode: mml_node = new QwtMmlMsupNode( this, mml_attr ); break; case MsubNode: mml_node = new QwtMmlMsubNode( this, mml_attr ); break; case MsubsupNode: mml_node = new QwtMmlMsubsupNode( this, mml_attr ); break; case MoNode: mml_node = new QwtMmlMoNode( this, mml_attr ); break; case MstyleNode: mml_node = new QwtMmlMstyleNode( this, mml_attr ); break; case TextNode: mml_node = new QwtMmlTextNode( mml_value, this ); break; case MphantomNode: mml_node = new QwtMmlMphantomNode( this, mml_attr ); break; case MfencedNode: mml_node = new QwtMmlMfencedNode( this, mml_attr ); break; case MtableNode: mml_node = new QwtMmlMtableNode( this, mml_attr ); break; case MtrNode: mml_node = new QwtMmlMtrNode( this, mml_attr ); break; case MtdNode: mml_node = new QwtMmlMtdNode( this, mml_attr ); break; case MoverNode: mml_node = new QwtMmlMoverNode( this, mml_attr ); break; case MunderNode: mml_node = new QwtMmlMunderNode( this, mml_attr ); break; case MunderoverNode: mml_node = new QwtMmlMunderoverNode( this, mml_attr ); break; case MalignMarkNode: mml_node = new QwtMmlMalignMarkNode( this ); break; case MerrorNode: mml_node = new QwtMmlMerrorNode( this, mml_attr ); break; case MtextNode: mml_node = new QwtMmlMtextNode( this, mml_attr ); break; case MpaddedNode: mml_node = new QwtMmlMpaddedNode( this, mml_attr ); break; case MspaceNode: mml_node = new QwtMmlMspaceNode( this, mml_attr ); break; case UnknownNode: mml_node = new QwtMmlUnknownNode( this, mml_attr ); break; case NoNode: mml_node = 0; break; } return mml_node; } void QwtMmlDocument::insertOperator( QwtMmlNode *node, const QString &text ) { QwtMmlNode *text_node = createNode( TextNode, QwtMmlAttributeMap(), text, 0 ); QwtMmlNode *mo_node = createNode( MoNode, QwtMmlAttributeMap(), QString::null, 0 ); bool ok = insertChild( node, mo_node, 0 ); Q_ASSERT( ok ); ok = insertChild( mo_node, text_node, 0 ); Q_ASSERT( ok ); } QwtMmlNode *QwtMmlDocument::domToMml( const QDomNode &dom_node, bool *ok, QString *errorMsg ) { // create the node Q_ASSERT( ok != 0 ); NodeType mml_type = domToQwtMmlNodeType( dom_node ); if ( mml_type == NoNode ) { *ok = true; return 0; } QDomNamedNodeMap dom_attr = dom_node.attributes(); QwtMmlAttributeMap mml_attr; for ( int i = 0; i < dom_attr.length(); ++i ) { QDomNode attr_node = dom_attr.item( i ); Q_ASSERT( !attr_node.nodeName().isNull() ); Q_ASSERT( !attr_node.nodeValue().isNull() ); mml_attr[attr_node.nodeName()] = attr_node.nodeValue(); } QString mml_value; if ( mml_type == TextNode ) mml_value = dom_node.nodeValue(); QwtMmlNode *mml_node = createNode( mml_type, mml_attr, mml_value, errorMsg ); if ( mml_node == 0 ) { *ok = false; return 0; } // create the node's children according to the child_spec const QwtMmlNodeSpec *spec = mmlFindNodeSpec( mml_type ); QDomNodeList dom_child_list = dom_node.childNodes(); int child_cnt = dom_child_list.count(); QwtMmlNode *mml_child = 0; QString separator_list; if ( mml_type == MfencedNode ) separator_list = mml_node->explicitAttribute( "separators", "," ); switch ( spec->child_spec ) { case QwtMmlNodeSpec::ChildIgnore: break; case QwtMmlNodeSpec::ImplicitMrow: if ( child_cnt > 0 ) { mml_child = createImplicitMrowNode( dom_node, ok, errorMsg ); if ( !*ok ) { delete mml_node; return 0; } if ( !insertChild( mml_node, mml_child, errorMsg ) ) { delete mml_node; delete mml_child; *ok = false; return 0; } } break; default: // exact ammount of children specified - check... if ( spec->child_spec != child_cnt ) { if ( errorMsg != 0 ) *errorMsg = QString( "element " ) + spec->tag + " requires exactly " + QString::number( spec->child_spec ) + " arguments, got " + QString::number( child_cnt ); delete mml_node; *ok = false; return 0; } // ...and continue just as in ChildAny case QwtMmlNodeSpec::ChildAny: if ( mml_type == MfencedNode ) insertOperator( mml_node, mml_node->explicitAttribute( "open", "(" ) ); for ( int i = 0; i < child_cnt; ++i ) { QDomNode dom_child = dom_child_list.item( i ); QwtMmlNode *mml_child = domToMml( dom_child, ok, errorMsg ); if ( !*ok ) { delete mml_node; return 0; } if ( mml_type == MtableNode && mml_child->nodeType() != MtrNode ) { QwtMmlNode *mtr_node = createNode( MtrNode, QwtMmlAttributeMap(), QString::null, 0 ); insertChild( mml_node, mtr_node, 0 ); if ( !insertChild( mtr_node, mml_child, errorMsg ) ) { delete mml_node; delete mml_child; *ok = false; return 0; } } else if ( mml_type == MtrNode && mml_child->nodeType() != MtdNode ) { QwtMmlNode *mtd_node = createNode( MtdNode, QwtMmlAttributeMap(), QString::null, 0 ); insertChild( mml_node, mtd_node, 0 ); if ( !insertChild( mtd_node, mml_child, errorMsg ) ) { delete mml_node; delete mml_child; *ok = false; return 0; } } else { if ( !insertChild( mml_node, mml_child, errorMsg ) ) { delete mml_node; delete mml_child; *ok = false; return 0; } } if ( i < child_cnt - 1 && mml_type == MfencedNode && !separator_list.isEmpty() ) { QChar separator; if ( i >= ( int )separator_list.length() ) separator = separator_list.at( separator_list.length() - 1 ); else separator = separator_list[i]; insertOperator( mml_node, QString( separator ) ); } } if ( mml_type == MfencedNode ) insertOperator( mml_node, mml_node->explicitAttribute( "close", ")" ) ); break; } *ok = true; return mml_node; } QwtMmlNode *QwtMmlDocument::createImplicitMrowNode( const QDomNode &dom_node, bool *ok, QString *errorMsg ) { QDomNodeList dom_child_list = dom_node.childNodes(); int child_cnt = dom_child_list.count(); if ( child_cnt == 0 ) { *ok = true; return 0; } if ( child_cnt == 1 ) return domToMml( dom_child_list.item( 0 ), ok, errorMsg ); QwtMmlNode *mml_node = createNode( MrowNode, QwtMmlAttributeMap(), QString::null, errorMsg ); Q_ASSERT( mml_node != 0 ); // there is no reason in heaven or hell for this to fail for ( int i = 0; i < child_cnt; ++i ) { QDomNode dom_child = dom_child_list.item( i ); QwtMmlNode *mml_child = domToMml( dom_child, ok, errorMsg ); if ( !*ok ) { delete mml_node; return 0; } if ( !insertChild( mml_node, mml_child, errorMsg ) ) { delete mml_node; delete mml_child; *ok = false; return 0; } } return mml_node; } void QwtMmlDocument::paint( QPainter *p, const QPoint &pos ) const { if ( m_root_node == 0 ) return; /* p->save(); p->setPen(Qt::blue); p->drawLine(pos.x() - 5, pos.y(), pos.x() + 5, pos.y()); p->drawLine(pos.x(), pos.y() - 5, pos.x(), pos.y() + 5); p->restore(); */ QRect mr = m_root_node->myRect(); m_root_node->setRelOrigin( pos - mr.topLeft() ); m_root_node->paint( p ); } QSize QwtMmlDocument::size() const { if ( m_root_node == 0 ) return QSize( 0, 0 ); return m_root_node->deviceRect().size(); } // ******************************************************************* // QwtMmlNode // ******************************************************************* QwtMmlNode::QwtMmlNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) { m_parent = 0; m_first_child = 0; m_next_sibling = 0; m_previous_sibling = 0; m_node_type = type; m_document = document; m_attribute_map = attribute_map; m_my_rect = m_parent_rect = QRect( 0, 0, 0, 0 ); m_rel_origin = QPoint( 0, 0 ); m_stretched = false; } QwtMmlNode::~QwtMmlNode() { QwtMmlNode *n = firstChild(); while ( n != 0 ) { QwtMmlNode *tmp = n->nextSibling(); delete n; n = tmp; } } static QString rectToStr( const QRect &rect ) { return QString( "[(%1, %2), %3x%4]" ) .arg( rect.x() ) .arg( rect.y() ) .arg( rect.width() ) .arg( rect.height() ); } QString QwtMmlNode::toStr() const { const QwtMmlNodeSpec *spec = mmlFindNodeSpec( nodeType() ); Q_ASSERT( spec != 0 ); return QString( "%1 %2 mr=%3 pr=%4 dr=%5 ro=(%7, %8) str=%9" ) .arg( spec->type_str ) .arg( ( quintptr )this, 0, 16 ) .arg( rectToStr( myRect() ) ) .arg( rectToStr( parentRect() ) ) .arg( rectToStr( deviceRect() ) ) .arg( m_rel_origin.x() ) .arg( m_rel_origin.y() ) .arg( ( int )isStretched() ); } int QwtMmlNode::interpretSpacing( const QString &value, bool *ok ) const { return ::interpretSpacing( value, em(), ex(), ok ); } int QwtMmlNode::basePos() const { QFontMetrics fm( font() ); return fm.strikeOutPos(); } int QwtMmlNode::underlinePos() const { QFontMetrics fm( font() ); return basePos() + fm.underlinePos(); } int QwtMmlNode::overlinePos() const { QFontMetrics fm( font() ); return basePos() - fm.overlinePos(); } QwtMmlNode *QwtMmlNode::lastSibling() const { const QwtMmlNode *n = this; while ( !n->isLastSibling() ) n = n->nextSibling(); return const_cast( n ); } QwtMmlNode *QwtMmlNode::firstSibling() const { const QwtMmlNode *n = this; while ( !n->isFirstSibling() ) n = n->previousSibling(); return const_cast( n ); } int QwtMmlNode::em() const { return QFontMetrics( font() ).boundingRect( 'm' ).width(); } int QwtMmlNode::ex() const { return QFontMetrics( font() ).boundingRect( 'x' ).height(); } int QwtMmlNode::scriptlevel( const QwtMmlNode * ) const { int parent_sl; const QwtMmlNode *p = parent(); if ( p == 0 ) parent_sl = 0; else parent_sl = p->scriptlevel( this ); QString expl_sl_str = explicitAttribute( "scriptlevel" ); if ( expl_sl_str.isNull() ) return parent_sl; if ( expl_sl_str.startsWith( "+" ) || expl_sl_str.startsWith( "-" ) ) { bool ok; int expl_sl = expl_sl_str.toInt( &ok ); if ( ok ) { return parent_sl + expl_sl; } else { qWarning() << "QwtMmlNode::scriptlevel(): bad value " + expl_sl_str; return parent_sl; } } bool ok; int expl_sl = expl_sl_str.toInt( &ok ); if ( ok ) return expl_sl; if ( expl_sl_str == "+" ) return parent_sl + 1; else if ( expl_sl_str == "-" ) return parent_sl - 1; else { qWarning() << "QwtMmlNode::scriptlevel(): could not parse value: \"" + expl_sl_str + "\""; return parent_sl; } } QPoint QwtMmlNode::devicePoint( const QPoint &p ) const { QRect mr = myRect(); QRect dr = deviceRect(); if ( isStretched() ) return dr.topLeft() + QPoint( ( p.x() - mr.left() ) * dr.width() / mr.width(), ( p.y() - mr.top() ) * dr.height() / mr.height() ); else return dr.topLeft() + p - mr.topLeft(); } QString QwtMmlNode::inheritAttributeFromMrow( const QString &name, const QString &def ) const { const QwtMmlNode *p = this; for ( ; p != 0; p = p->parent() ) { if ( p == this || p->nodeType() == MstyleNode ) { QString value = p->explicitAttribute( name ); if ( !value.isNull() ) return value; } } return def; } QColor QwtMmlNode::color() const { // If we are child of return red const QwtMmlNode *p = this; for ( ; p != 0; p = p->parent() ) { if ( p->nodeType() == MerrorNode ) return QColor( "red" ); } QString value_str = inheritAttributeFromMrow( "mathcolor" ); if ( value_str.isNull() ) value_str = inheritAttributeFromMrow( "color" ); if ( value_str.isNull() ) return QColor(); return QColor( value_str ); } QColor QwtMmlNode::background() const { QString value_str = inheritAttributeFromMrow( "mathbackground" ); if ( value_str.isNull() ) value_str = inheritAttributeFromMrow( "background" ); if ( value_str.isNull() ) return QColor(); return QColor( value_str ); } static void updateFontAttr( QwtMmlAttributeMap &font_attr, const QwtMmlNode *n, const QString &name, const QString &preferred_name = QString::null ) { if ( font_attr.contains( preferred_name ) || font_attr.contains( name ) ) return; QString value = n->explicitAttribute( name ); if ( !value.isNull() ) font_attr[name] = value; } static QwtMmlAttributeMap collectFontAttributes( const QwtMmlNode *node ) { QwtMmlAttributeMap font_attr; for ( const QwtMmlNode *n = node; n != 0; n = n->parent() ) { if ( n == node || n->nodeType() == QwtMml::MstyleNode ) { updateFontAttr( font_attr, n, "mathvariant" ); updateFontAttr( font_attr, n, "mathsize" ); // depreciated attributes updateFontAttr( font_attr, n, "fontsize", "mathsize" ); updateFontAttr( font_attr, n, "fontweight", "mathvariant" ); updateFontAttr( font_attr, n, "fontstyle", "mathvariant" ); updateFontAttr( font_attr, n, "fontfamily", "mathvariant" ); } } return font_attr; } QFont QwtMmlNode::font() const { QFont fn( document()->fontName( QwtMathMLDocument::NormalFont ), document()->baseFontPointSize() ); int ps = fn.pointSize(); int sl = scriptlevel(); if ( sl >= 0 ) { for ( int i = 0; i < sl; ++i ) ps = ( int )( ps * g_script_size_multiplier ); } else { for ( int i = 0; i > sl; --i ) ps = ( int )( ps / g_script_size_multiplier ); } if ( ps < g_min_font_point_size ) ps = g_min_font_point_size; fn.setPointSize( ps ); int em = QFontMetrics( fn ).boundingRect( 'm' ).width(); int ex = QFontMetrics( fn ).boundingRect( 'x' ).height(); QwtMmlAttributeMap font_attr = collectFontAttributes( this ); if ( font_attr.contains( "mathvariant" ) ) { QString value = font_attr["mathvariant"]; bool ok; uint mv = interpretMathVariant( value, &ok ); if ( ok ) { if ( mv & ScriptMV ) fn.setFamily( document()->fontName( QwtMathMLDocument::ScriptFont ) ); if ( mv & FrakturMV ) fn.setFamily( document()->fontName( QwtMathMLDocument::FrakturFont ) ); if ( mv & SansSerifMV ) fn.setFamily( document()->fontName( QwtMathMLDocument::SansSerifFont ) ); if ( mv & MonospaceMV ) fn.setFamily( document()->fontName( QwtMathMLDocument::MonospaceFont ) ); if ( mv & DoubleStruckMV ) fn.setFamily( document()->fontName( QwtMathMLDocument::DoublestruckFont ) ); if ( mv & BoldMV ) fn.setBold( true ); if ( mv & ItalicMV ) fn.setItalic( true ); } } if ( font_attr.contains( "mathsize" ) ) { QString value = font_attr["mathsize"]; fn = interpretMathSize( value, fn, em, ex, 0 ); } fn = interpretDepreciatedFontAttr( font_attr, fn, em, ex ); if ( nodeType() == MiNode && !font_attr.contains( "mathvariant" ) && !font_attr.contains( "fontstyle" ) ) { const QwtMmlMiNode *mi_node = ( const QwtMmlMiNode* ) this; if ( mi_node->text().length() == 1 ) fn.setItalic( true ); } if ( nodeType() == MoNode ) { fn.setItalic( false ); fn.setBold( false ); } return fn; } QString QwtMmlNode::explicitAttribute( const QString &name, const QString &def ) const { QwtMmlAttributeMap::const_iterator it = m_attribute_map.find( name ); if ( it != m_attribute_map.end() ) return *it; return def; } QRect QwtMmlNode::parentRect() const { if ( isStretched() ) return m_parent_rect; QRect mr = myRect(); QPoint ro = relOrigin(); return QRect( ro + mr.topLeft(), mr.size() ); } void QwtMmlNode::stretchTo( const QRect &rect ) { m_parent_rect = rect; m_stretched = true; } void QwtMmlNode::setRelOrigin( const QPoint &rel_origin ) { m_rel_origin = rel_origin + QPoint( -myRect().left(), 0 ); m_stretched = false; } void QwtMmlNode::updateMyRect() { m_my_rect = symbolRect(); QwtMmlNode *child = firstChild(); for ( ; child != 0; child = child->nextSibling() ) m_my_rect |= child->parentRect(); } void QwtMmlNode::layout() { m_parent_rect = QRect( 0, 0, 0, 0 ); m_stretched = false; m_rel_origin = QPoint( 0, 0 ); QwtMmlNode *child = firstChild(); for ( ; child != 0; child = child->nextSibling() ) child->layout(); layoutSymbol(); updateMyRect(); if ( parent() == 0 ) m_rel_origin = QPoint( 0, 0 ); } QRect QwtMmlNode::deviceRect() const { if ( parent() == 0 ) return QRect( relOrigin() + myRect().topLeft(), myRect().size() ); /* if (!isStretched()) { QRect pdr = parent()->deviceRect(); QRect pmr = parent()->myRect(); QRect pr = parentRect(); QRect mr = myRect(); return QRect(pdr.left() + pr.left() - pmr.left(), pdr.top() + pr.top() - pmr.top(), mr.width(), mr.height()); } */ QRect pdr = parent()->deviceRect(); QRect pr = parentRect(); QRect pmr = parent()->myRect(); float scale_w = 0; if ( pmr.width() != 0 ) scale_w = ( float )pdr.width() / pmr.width(); float scale_h = 0; if ( pmr.height() != 0 ) scale_h = ( float )pdr.height() / pmr.height(); return QRect( pdr.left() + ROUND( ( pr.left() - pmr.left() ) * scale_w ), pdr.top() + ROUND( ( pr.top() - pmr.top() ) * scale_h ), ROUND( ( pr.width() * scale_w ) ), ROUND( ( pr.height() * scale_h ) ) ); } void QwtMmlNode::layoutSymbol() { // default behaves like an mrow // now lay them out in a neat row, aligning their origins to my origin int w = 0; QwtMmlNode *child = firstChild(); for ( ; child != 0; child = child->nextSibling() ) { child->setRelOrigin( QPoint( w, 0 ) ); w += child->parentRect().width() + 1; } } void QwtMmlNode::paint( QPainter *p ) { if ( !myRect().isValid() ) return; p->save(); QColor fg = color(); QColor bg = background(); if ( bg.isValid() ) p->fillRect( myRect(), bg ); if ( fg.isValid() ) p->setPen( QPen( color(), 0 ) ); QwtMmlNode *child = firstChild(); for ( ; child != 0; child = child->nextSibling() ) child->paint( p ); paintSymbol( p ); p->restore(); } void QwtMmlNode::paintSymbol( QPainter *p ) const { if ( g_draw_frames && myRect().isValid() ) { p->save(); p->setPen( QPen( Qt::red, 0 ) ); p->drawRect( m_my_rect ); QPen pen = p->pen(); pen.setStyle( Qt::DotLine ); p->setPen( pen ); p->drawLine( myRect().left(), 0, myRect().right(), 0 ); p->restore(); } } void QwtMmlNode::stretch() { QwtMmlNode *child = firstChild(); for ( ; child != 0; child = child->nextSibling() ) child->stretch(); } QString QwtMmlTokenNode::text() const { QString result; const QwtMmlNode *child = firstChild(); for ( ; child != 0; child = child->nextSibling() ) { if ( child->nodeType() != TextNode ) continue; if ( !result.isEmpty() ) result += ' '; result += static_cast( child )->text(); } return result; } QwtMmlNode *QwtMmlMfracNode::numerator() const { QwtMmlNode *node = firstChild(); Q_ASSERT( node != 0 ); return node; } QwtMmlNode *QwtMmlMfracNode::denominator() const { QwtMmlNode *node = numerator()->nextSibling(); Q_ASSERT( node != 0 ); return node; } QRect QwtMmlMfracNode::symbolRect() const { int num_width = numerator()->myRect().width(); int denom_width = denominator()->myRect().width(); int my_width = qMax( num_width, denom_width ) + 4; return QRect( -my_width / 2, 0, my_width, 1 ); } void QwtMmlMfracNode::layoutSymbol() { QwtMmlNode *num = numerator(); QwtMmlNode *denom = denominator(); QRect num_rect = num->myRect(); QRect denom_rect = denom->myRect(); int spacing = ( int )( g_mfrac_spacing * ( num_rect.height() + denom_rect.height() ) ); num->setRelOrigin( QPoint( -num_rect.width() / 2, - spacing - num_rect.bottom() ) ); denom->setRelOrigin( QPoint( -denom_rect.width() / 2, spacing - denom_rect.top() ) ); } static bool zeroLineThickness( const QString &s ) { if ( s.length() == 0 || !s[0].isDigit() ) return false; for ( int i = 0; i < s.length(); ++i ) { QChar c = s.at( i ); if ( c.isDigit() && c != '0' ) return false; } return true; } void QwtMmlMfracNode::paintSymbol( QPainter *p ) const { QString linethickness_str = inheritAttributeFromMrow( "linethickness", "1" ); /* InterpretSpacing returns an int, which might be 0 even if the thickness is > 0, though very very small. That's ok, because the painter then paints a line of thickness 1. However, we have to run this check if the line thickness really is zero */ if ( !zeroLineThickness( linethickness_str ) ) { bool ok; int linethickness = interpretSpacing( linethickness_str, &ok ); if ( !ok ) linethickness = 1; p->save(); QPen pen = p->pen(); pen.setWidth( linethickness ); p->setPen( pen ); QSize s = myRect().size(); p->drawLine( -s.width() / 2, 0, s.width() / 2, 0 ); p->restore(); } } QwtMmlNode *QwtMmlRootBaseNode::base() const { QwtMmlNode *node = firstChild(); // Q_ASSERT(node != 0); return node; } QwtMmlNode *QwtMmlRootBaseNode::index() const { QwtMmlNode *b = base(); if ( b == 0 ) return 0; return b->nextSibling(); } int QwtMmlRootBaseNode::scriptlevel( const QwtMmlNode *child ) const { int sl = QwtMmlNode::scriptlevel(); QwtMmlNode *i = index(); if ( child != 0 && child == i ) return sl + 1; else return sl; } QRect QwtMmlRootBaseNode::symbolRect() const { QwtMmlNode *b = base(); QRect base_rect; if ( b == 0 ) base_rect = QRect( 0, 0, 1, 1 ); else base_rect = base()->myRect(); int margin = ( int )( g_mroot_base_margin * base_rect.height() ); int tw = tailWidth(); return QRect( -tw, base_rect.top() - margin, tw, base_rect.height() + 2 * margin ); } int QwtMmlRootBaseNode::tailWidth() const { QFontMetrics fm( font() ); return fm.boundingRect( g_radical_char ).width(); } void QwtMmlRootBaseNode::layoutSymbol() { QwtMmlNode *b = base(); QSize base_size; if ( b != 0 ) { b->setRelOrigin( QPoint( 0, 0 ) ); base_size = base()->myRect().size(); } else base_size = QSize( 1, 1 ); QwtMmlNode *i = index(); if ( i != 0 ) { int tw = tailWidth(); QRect i_rect = i->myRect(); i->setRelOrigin( QPoint( -tw / 2 - i_rect.width(), -i_rect.bottom() - 4 ) ); } } void QwtMmlRootBaseNode::paintSymbol( QPainter *p ) const { QFont fn = font(); p->save(); QRect sr = symbolRect(); QRect r = sr; r.moveTopLeft( devicePoint( sr.topLeft() ) ); p->setViewport( r ); p->setWindow( QFontMetrics( fn ).boundingRect( g_radical_char ) ); p->setFont( font() ); p->drawText( 0, 0, QString( g_radical_char ) ); p->restore(); p->drawLine( sr.right(), sr.top(), myRect().right(), sr.top() ); } QwtMmlTextNode::QwtMmlTextNode( const QString &text, QwtMmlDocument *document ) : QwtMmlNode( TextNode, document, QwtMmlAttributeMap() ) { m_text = text; // Trim whitespace from ends, but keep nbsp and thinsp m_text.remove( QRegExp( "^[^\\S\\x00a0\\x2009]+" ) ); m_text.remove( QRegExp( "[^\\S\\x00a0\\x2009]+$" ) ); if ( m_text == QString( QChar( 0x62, 0x20 ) ) // ⁢ || m_text == QString( QChar( 0x63, 0x20 ) ) // ⁣ || m_text == QString( QChar( 0x61, 0x20 ) ) ) // ⁡ m_text = ""; } QString QwtMmlTextNode::toStr() const { return QwtMmlNode::toStr() + ", text=\"" + m_text + "\""; } void QwtMmlTextNode::paintSymbol( QPainter *p ) const { QwtMmlNode::paintSymbol( p ); QFont fn = font(); QFontInfo fi( fn ); // qWarning("MmlTextNode::paintSymbol(): requested: %s, used: %s, size=%d, italic=%d, bold=%d, text=\"%s\" sl=%d", // fn.family().latin1(), fi.family().latin1(), fi.pointSize(), (int)fi.italic(), (int)fi.bold(), m_text.latin1(), scriptlevel()); QFontMetrics fm( fn ); p->save(); p->setFont( fn ); QPoint dPos = devicePoint( relOrigin() ); p->drawText( dPos.x(), dPos.y() + fm.strikeOutPos(), m_text ); p->restore(); } QRect QwtMmlTextNode::symbolRect() const { QFontMetrics fm( font() ); QRect br = fm.tightBoundingRect( m_text ); br.translate( 0, fm.strikeOutPos() ); return br; } QwtMmlNode *QwtMmlSubsupBaseNode::base() const { QwtMmlNode *b = firstChild(); Q_ASSERT( b != 0 ); return b; } QwtMmlNode *QwtMmlSubsupBaseNode::sscript() const { QwtMmlNode *s = base()->nextSibling(); Q_ASSERT( s != 0 ); return s; } int QwtMmlSubsupBaseNode::scriptlevel( const QwtMmlNode *child ) const { int sl = QwtMmlNode::scriptlevel(); QwtMmlNode *s = sscript(); if ( child != 0 && child == s ) return sl + 1; else return sl; } void QwtMmlMsupNode::layoutSymbol() { QwtMmlNode *b = base(); QwtMmlNode *s = sscript(); b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) ); s->setRelOrigin( QPoint( 0, b->myRect().top() ) ); } void QwtMmlMsubNode::layoutSymbol() { QwtMmlNode *b = base(); QwtMmlNode *s = sscript(); b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) ); s->setRelOrigin( QPoint( 0, b->myRect().bottom() ) ); } QwtMmlNode *QwtMmlMsubsupNode::base() const { QwtMmlNode *b = firstChild(); Q_ASSERT( b != 0 ); return b; } QwtMmlNode *QwtMmlMsubsupNode::subscript() const { QwtMmlNode *sub = base()->nextSibling(); Q_ASSERT( sub != 0 ); return sub; } QwtMmlNode *QwtMmlMsubsupNode::superscript() const { QwtMmlNode *sup = subscript()->nextSibling(); Q_ASSERT( sup != 0 ); return sup; } void QwtMmlMsubsupNode::layoutSymbol() { QwtMmlNode *b = base(); QwtMmlNode *sub = subscript(); QwtMmlNode *sup = superscript(); b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) ); sub->setRelOrigin( QPoint( 0, b->myRect().bottom() ) ); sup->setRelOrigin( QPoint( 0, b->myRect().top() ) ); } int QwtMmlMsubsupNode::scriptlevel( const QwtMmlNode *child ) const { int sl = QwtMmlNode::scriptlevel(); QwtMmlNode *sub = subscript(); QwtMmlNode *sup = superscript(); if ( child != 0 && ( child == sup || child == sub ) ) return sl + 1; else return sl; } QString QwtMmlMoNode::toStr() const { return QwtMmlNode::toStr() + QString( " form=%1" ).arg( ( int )form() ); } void QwtMmlMoNode::layoutSymbol() { QwtMmlNode *child = firstChild(); if ( child == 0 ) return; child->setRelOrigin( QPoint( 0, 0 ) ); if ( m_oper_spec == 0 ) m_oper_spec = mmlFindOperSpec( text(), form() ); } QwtMmlMoNode::QwtMmlMoNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map ) : QwtMmlTokenNode( MoNode, document, attribute_map ) { m_oper_spec = 0; } QString QwtMmlMoNode::dictionaryAttribute( const QString &name ) const { const QwtMmlNode *p = this; for ( ; p != 0; p = p->parent() ) { if ( p == this || p->nodeType() == MstyleNode ) { QString expl_attr = p->explicitAttribute( name ); if ( !expl_attr.isNull() ) return expl_attr; } } return mmlDictAttribute( name, m_oper_spec ); } QwtMml::FormType QwtMmlMoNode::form() const { QString value_str = inheritAttributeFromMrow( "form" ); if ( !value_str.isNull() ) { bool ok; FormType value = interpretForm( value_str, &ok ); if ( ok ) return value; else qWarning( "Could not convert %s to form", value_str.toLatin1().data() ); } // Default heuristic. if ( firstSibling() == ( QwtMmlNode* )this && lastSibling() != ( QwtMmlNode* )this ) return PrefixForm; else if ( lastSibling() == ( QwtMmlNode* )this && firstSibling() != ( QwtMmlNode* )this ) return PostfixForm; else return InfixForm; } void QwtMmlMoNode::stretch() { if ( parent() == 0 ) return; if ( m_oper_spec == 0 ) return; if ( m_oper_spec->stretch_dir == QwtMmlOperSpec::HStretch && parent()->nodeType() == MrowNode && ( nextSibling() != 0 || previousSibling() != 0 ) ) return; QRect pmr = parent()->myRect(); QRect pr = parentRect(); switch ( m_oper_spec->stretch_dir ) { case QwtMmlOperSpec::VStretch: stretchTo( QRect( pr.left(), pmr.top(), pr.width(), pmr.height() ) ); break; case QwtMmlOperSpec::HStretch: stretchTo( QRect( pmr.left(), pr.top(), pmr.width(), pr.height() ) ); break; case QwtMmlOperSpec::HVStretch: stretchTo( pmr ); break; case QwtMmlOperSpec::NoStretch: break; } } int QwtMmlMoNode::lspace() const { Q_ASSERT( m_oper_spec != 0 ); if ( parent() == 0 || ( parent()->nodeType() != MrowNode && parent()->nodeType() != MfencedNode && parent()->nodeType() != UnknownNode ) || ( previousSibling() == 0 && nextSibling() == 0 ) ) return 0; else return interpretSpacing( dictionaryAttribute( "lspace" ), 0 ); } int QwtMmlMoNode::rspace() const { Q_ASSERT( m_oper_spec != 0 ); if ( parent() == 0 || ( parent()->nodeType() != MrowNode && parent()->nodeType() != MfencedNode && parent()->nodeType() != UnknownNode ) || ( previousSibling() == 0 && nextSibling() == 0 ) ) return 0; else return interpretSpacing( dictionaryAttribute( "rspace" ), 0 ); } QRect QwtMmlMoNode::symbolRect() const { const QwtMmlNode *child = firstChild(); if ( child == 0 ) return QRect( 0, 0, 0, 0 ); QRect cmr = child->myRect(); return QRect( -lspace(), cmr.top(), cmr.width() + lspace() + rspace(), cmr.height() ); } int QwtMmlMtableNode::rowspacing() const { QString value = explicitAttribute( "rowspacing" ); if ( value.isNull() ) return ex(); bool ok; int r = interpretSpacing( value, &ok ); if ( ok ) return r; else return ex(); } int QwtMmlMtableNode::columnspacing() const { QString value = explicitAttribute( "columnspacing" ); if ( value.isNull() ) return ( int )( 0.8 * em() ); bool ok; int r = interpretSpacing( value, &ok ); if ( ok ) return r; else return ( int )( 0.8 * em() ); } uint QwtMmlMtableNode::CellSizeData::colWidthSum() const { uint w = 0; for ( int i = 0; i < col_widths.count(); ++i ) w += col_widths[i]; return w; } uint QwtMmlMtableNode::CellSizeData::rowHeightSum() const { uint h = 0; for ( int i = 0; i < row_heights.count(); ++i ) h += row_heights[i]; return h; } void QwtMmlMtableNode::CellSizeData::init( const QwtMmlNode *first_row ) { col_widths.clear(); row_heights.clear(); const QwtMmlNode *mtr = first_row; for ( ; mtr != 0; mtr = mtr->nextSibling() ) { Q_ASSERT( mtr->nodeType() == MtrNode ); int col_cnt = 0; const QwtMmlNode *mtd = mtr->firstChild(); for ( ; mtd != 0; mtd = mtd->nextSibling(), ++col_cnt ) { Q_ASSERT( mtd->nodeType() == MtdNode ); QRect mtdmr = mtd->myRect(); if ( col_cnt == col_widths.count() ) col_widths.append( mtdmr.width() ); else col_widths[col_cnt] = qMax( col_widths[col_cnt], mtdmr.width() ); } row_heights.append( mtr->myRect().height() ); } } void QwtMmlMtableNode::layoutSymbol() { // Obtain natural widths of columns m_cell_size_data.init( firstChild() ); int col_spc = columnspacing(); int row_spc = rowspacing(); int frame_spc_hor = framespacing_hor(); QString columnwidth_attr = explicitAttribute( "columnwidth", "auto" ); // Is table width set by user? If so, set col_width_sum and never ever change it. int col_width_sum = m_cell_size_data.colWidthSum(); bool width_set_by_user = false; QString width_str = explicitAttribute( "width", "auto" ); if ( width_str != "auto" ) { bool ok; int w = interpretSpacing( width_str, &ok ); if ( ok ) { col_width_sum = w - col_spc * ( m_cell_size_data.numCols() - 1 ) - frame_spc_hor * 2; width_set_by_user = true; } } // Find out what kind of columns we are dealing with and set the widths of // statically sized columns. int fixed_width_sum = 0; // sum of widths of statically sized set columns int auto_width_sum = 0; // sum of natural widths of auto sized columns int relative_width_sum = 0; // sum of natural widths of relatively sized columns double relative_fraction_sum = 0; // total fraction of width taken by relatively // sized columns int i; for ( i = 0; i < m_cell_size_data.numCols(); ++i ) { QString value = interpretListAttr( columnwidth_attr, i, "auto" ); // Is it an auto sized column? if ( value == "auto" || value == "fit" ) { auto_width_sum += m_cell_size_data.col_widths[i]; continue; } // Is it a statically sized column? bool ok; int w = interpretSpacing( value, &ok ); if ( ok ) { // Yup, sets its width to the user specified value m_cell_size_data.col_widths[i] = w; fixed_width_sum += w; continue; } // Is it a relatively sized column? if ( value.endsWith( "%" ) ) { value.truncate( value.length() - 1 ); double factor = value.toFloat( &ok ); if ( ok && !value.isEmpty() ) { factor /= 100.0; relative_width_sum += m_cell_size_data.col_widths[i]; relative_fraction_sum += factor; if ( !width_set_by_user ) { // If the table width was not set by the user, we are free to increase // it so that the width of this column will be >= than its natural width int min_col_width_sum = ROUND( m_cell_size_data.col_widths[i] / factor ); if ( min_col_width_sum > col_width_sum ) col_width_sum = min_col_width_sum; } continue; } else qWarning( "MmlMtableNode::layoutSymbol(): could not parse value %s%%", value.toLatin1().data() ); } // Relatively sized column, but we failed to parse the factor. Treat is like an auto // column. auto_width_sum += m_cell_size_data.col_widths[i]; } // Work out how much space remains for the auto olumns, after allocating // the statically sized and the relatively sized columns. int required_auto_width_sum = col_width_sum - ROUND( relative_fraction_sum * col_width_sum ) - fixed_width_sum; if ( !width_set_by_user && required_auto_width_sum < auto_width_sum ) { if ( relative_fraction_sum < 1 ) col_width_sum = ROUND( ( fixed_width_sum + auto_width_sum ) / ( 1 - relative_fraction_sum ) ); else col_width_sum = fixed_width_sum + auto_width_sum + relative_width_sum; required_auto_width_sum = auto_width_sum; } // Ratio by which we have to shring/grow all auto sized columns to make it all fit double auto_width_scale = 1; if ( auto_width_sum > 0 ) auto_width_scale = ( float )required_auto_width_sum / auto_width_sum; // Set correct sizes for the auto sized and the relatively sized columns. for ( i = 0; i < m_cell_size_data.numCols(); ++i ) { QString value = interpretListAttr( columnwidth_attr, i, "auto" ); // Is it a relatively sized column? if ( value.endsWith( "%" ) ) { bool ok; int w = interpretPercentSpacing( value, col_width_sum, &ok ); if ( ok ) m_cell_size_data.col_widths[i] = w; else // We're treating parsing errors here as auto sized columns m_cell_size_data.col_widths[i] = ROUND( auto_width_scale * m_cell_size_data.col_widths[i] ); } // Is it an auto sized column? else if ( value == "auto" ) { m_cell_size_data.col_widths[i] = ROUND( auto_width_scale * m_cell_size_data.col_widths[i] ); } } QString s; QList &col_widths = m_cell_size_data.col_widths; for ( i = 0; i < col_widths.count(); ++i ) { s += QString( "[w=%1 %2%%]" ) .arg( col_widths[i] ) .arg( 100 * col_widths[i] / m_cell_size_data.colWidthSum() ); } // qWarning(s); m_content_width = m_cell_size_data.colWidthSum() + col_spc * ( m_cell_size_data.numCols() - 1 ); m_content_height = m_cell_size_data.rowHeightSum() + row_spc * ( m_cell_size_data.numRows() - 1 ); int bottom = -m_content_height / 2; QwtMmlNode *child = firstChild(); for ( ; child != 0; child = child->nextSibling() ) { Q_ASSERT( child->nodeType() == MtrNode ); QwtMmlMtrNode *row = ( QwtMmlMtrNode* ) child; row->layoutCells( m_cell_size_data.col_widths, col_spc ); QRect rmr = row->myRect(); row->setRelOrigin( QPoint( 0, bottom - rmr.top() ) ); bottom += rmr.height() + row_spc; } } QRect QwtMmlMtableNode::symbolRect() const { int frame_spc_hor = framespacing_hor(); int frame_spc_ver = framespacing_ver(); return QRect( -frame_spc_hor, -m_content_height / 2 - frame_spc_ver, m_content_width + 2 * frame_spc_hor, m_content_height + 2 * frame_spc_ver ); } QwtMml::FrameType QwtMmlMtableNode::frame() const { QString value = explicitAttribute( "frame", "none" ); return interpretFrameType( value, 0, 0 ); } QwtMml::FrameType QwtMmlMtableNode::columnlines( int idx ) const { QString value = explicitAttribute( "columnlines", "none" ); return interpretFrameType( value, idx, 0 ); } QwtMml::FrameType QwtMmlMtableNode::rowlines( int idx ) const { QString value = explicitAttribute( "rowlines", "none" ); return interpretFrameType( value, idx, 0 ); } void QwtMmlMtableNode::paintSymbol( QPainter *p ) const { FrameType f = frame(); if ( f != FrameNone ) { p->save(); QPen pen = p->pen(); if ( f == FrameDashed ) pen.setStyle( Qt::DashLine ); else pen.setStyle( Qt::SolidLine ); p->setPen( pen ); p->drawRect( myRect() ); p->restore(); } p->save(); int col_spc = columnspacing(); int row_spc = rowspacing(); QPen pen = p->pen(); int col_offset = 0; int i; for ( i = 0; i < m_cell_size_data.numCols() - 1; ++i ) { FrameType f = columnlines( i ); col_offset += m_cell_size_data.col_widths[i]; if ( f != FrameNone ) { if ( f == FrameDashed ) pen.setStyle( Qt::DashLine ); else if ( f == FrameSolid ) pen.setStyle( Qt::SolidLine ); p->setPen( pen ); int x = col_offset + col_spc / 2; p->drawLine( x, -m_content_height / 2, x, m_content_height / 2 ); } col_offset += col_spc; } int row_offset = 0; for ( i = 0; i < m_cell_size_data.numRows() - 1; ++i ) { FrameType f = rowlines( i ); row_offset += m_cell_size_data.row_heights[i]; if ( f != FrameNone ) { if ( f == FrameDashed ) pen.setStyle( Qt::DashLine ); else if ( f == FrameSolid ) pen.setStyle( Qt::SolidLine ); p->setPen( pen ); int y = row_offset + row_spc / 2 - m_content_height / 2; p->drawLine( 0, y, m_content_width, y ); } row_offset += row_spc; } p->restore(); } int QwtMmlMtableNode::framespacing_ver() const { if ( frame() == FrameNone ) return ( int )( 0.2 * em() ); QString value = explicitAttribute( "framespacing", "0.4em 0.5ex" ); bool ok; FrameSpacing fs = interpretFrameSpacing( value, em(), ex(), &ok ); if ( ok ) return fs.m_ver; else return ( int )( 0.5 * ex() ); } int QwtMmlMtableNode::framespacing_hor() const { if ( frame() == FrameNone ) return ( int )( 0.2 * em() ); QString value = explicitAttribute( "framespacing", "0.4em 0.5ex" ); bool ok; FrameSpacing fs = interpretFrameSpacing( value, em(), ex(), &ok ); if ( ok ) return fs.m_hor; else return ( int )( 0.4 * em() ); } void QwtMmlMtrNode::layoutCells( const QList &col_widths, int col_spc ) { QRect mr = myRect(); QwtMmlNode *child = firstChild(); int col_offset = 0; uint colnum = 0; for ( ; child != 0; child = child->nextSibling(), ++colnum ) { Q_ASSERT( child->nodeType() == MtdNode ); QwtMmlMtdNode *mtd = ( QwtMmlMtdNode* ) child; QRect r = QRect( 0, mr.top(), col_widths[colnum], mr.height() ); mtd->setMyRect( r ); mtd->setRelOrigin( QPoint( col_offset, 0 ) ); col_offset += col_widths[colnum] + col_spc; } updateMyRect(); } int QwtMmlMtdNode::scriptlevel( const QwtMmlNode *child ) const { int sl = QwtMmlNode::scriptlevel(); if ( child != 0 && child == firstChild() ) return sl + m_scriptlevel_adjust; else return sl; } void QwtMmlMtdNode::setMyRect( const QRect &rect ) { QwtMmlNode::setMyRect( rect ); QwtMmlNode *child = firstChild(); if ( child == 0 ) return; if ( rect.width() < child->myRect().width() ) { while ( rect.width() < child->myRect().width() && child->font().pointSize() > g_min_font_point_size ) { // qWarning("MmlMtdNode::setMyRect(): rect.width()=%d, child()->myRect().width=%d sl=%d", // rect.width(), child->myRect().width(), m_scriptlevel_adjust); ++m_scriptlevel_adjust; child->layout(); } // qWarning("MmlMtdNode::setMyRect(): rect.width()=%d, child()->myRect().width=%d sl=%d", // rect.width(), child->myRect().width(), m_scriptlevel_adjust); } QRect mr = myRect(); QRect cmr = child->myRect(); QPoint child_rel_origin; switch ( columnalign() ) { case ColAlignLeft: child_rel_origin.setX( 0 ); break; case ColAlignCenter: child_rel_origin.setX( mr.left() + ( mr.width() - cmr.width() ) / 2 ); break; case ColAlignRight: child_rel_origin.setX( mr.right() - cmr.width() ); break; } switch ( rowalign() ) { case RowAlignTop: child_rel_origin.setY( mr.top() - cmr.top() ); break; case RowAlignCenter: case RowAlignBaseline: child_rel_origin.setY( mr.top() - cmr.top() + ( mr.height() - cmr.height() ) / 2 ); break; case RowAlignBottom: child_rel_origin.setY( mr.bottom() - cmr.bottom() ); break; case RowAlignAxis: child_rel_origin.setY( 0 ); break; } child->setRelOrigin( child_rel_origin ); } uint QwtMmlMtdNode::colNum() { QwtMmlNode *syb = previousSibling(); uint i = 0; for ( ; syb != 0; syb = syb->previousSibling() ) ++i; return i; } uint QwtMmlMtdNode::rowNum() { QwtMmlNode *row = parent()->previousSibling(); uint i = 0; for ( ; row != 0; row = row->previousSibling() ) ++i; return i; } QwtMmlMtdNode::ColAlign QwtMmlMtdNode::columnalign() { QString val = explicitAttribute( "columnalign" ); if ( !val.isNull() ) return interpretColAlign( val, 0, 0 ); QwtMmlNode *node = parent(); // if ( node == 0 ) return ColAlignCenter; uint colnum = colNum(); val = node->explicitAttribute( "columnalign" ); if ( !val.isNull() ) return interpretColAlign( val, colnum, 0 ); node = node->parent(); // if ( node == 0 ) return ColAlignCenter; val = node->explicitAttribute( "columnalign" ); if ( !val.isNull() ) return interpretColAlign( val, colnum, 0 ); return ColAlignCenter; } QwtMmlMtdNode::RowAlign QwtMmlMtdNode::rowalign() { QString val = explicitAttribute( "rowalign" ); if ( !val.isNull() ) return interpretRowAlign( val, 0, 0 ); QwtMmlNode *node = parent(); // if ( node == 0 ) return RowAlignAxis; uint rownum = rowNum(); val = node->explicitAttribute( "rowalign" ); if ( !val.isNull() ) return interpretRowAlign( val, rownum, 0 ); node = node->parent(); // if ( node == 0 ) return RowAlignAxis; val = node->explicitAttribute( "rowalign" ); if ( !val.isNull() ) return interpretRowAlign( val, rownum, 0 ); return RowAlignAxis; } void QwtMmlMoverNode::layoutSymbol() { QwtMmlNode *base = firstChild(); Q_ASSERT( base != 0 ); QwtMmlNode *over = base->nextSibling(); Q_ASSERT( over != 0 ); QRect base_rect = base->myRect(); QRect over_rect = over->myRect(); int spacing = ( int )( g_mfrac_spacing * ( over_rect.height() + base_rect.height() ) ); base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) ); over->setRelOrigin( QPoint( -over_rect.width() / 2, base_rect.top() - spacing - over_rect.bottom() ) ); } int QwtMmlMoverNode::scriptlevel( const QwtMmlNode *node ) const { QwtMmlNode *base = firstChild(); Q_ASSERT( base != 0 ); QwtMmlNode *over = base->nextSibling(); Q_ASSERT( over != 0 ); int sl = QwtMmlNode::scriptlevel(); if ( node != 0 && node == over ) return sl + 1; else return sl; } void QwtMmlMunderNode::layoutSymbol() { QwtMmlNode *base = firstChild(); Q_ASSERT( base != 0 ); QwtMmlNode *under = base->nextSibling(); Q_ASSERT( under != 0 ); QRect base_rect = base->myRect(); QRect under_rect = under->myRect(); int spacing = ( int )( g_mfrac_spacing * ( under_rect.height() + base_rect.height() ) ); base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) ); under->setRelOrigin( QPoint( -under_rect.width() / 2, base_rect.bottom() + spacing - under_rect.top() ) ); } int QwtMmlMunderNode::scriptlevel( const QwtMmlNode *node ) const { QwtMmlNode *base = firstChild(); Q_ASSERT( base != 0 ); QwtMmlNode *under = base->nextSibling(); Q_ASSERT( under != 0 ); int sl = QwtMmlNode::scriptlevel(); if ( node != 0 && node == under ) return sl + 1; else return sl; } void QwtMmlMunderoverNode::layoutSymbol() { QwtMmlNode *base = firstChild(); Q_ASSERT( base != 0 ); QwtMmlNode *under = base->nextSibling(); Q_ASSERT( under != 0 ); QwtMmlNode *over = under->nextSibling(); Q_ASSERT( over != 0 ); QRect base_rect = base->myRect(); QRect under_rect = under->myRect(); QRect over_rect = over->myRect(); int spacing = ( int )( g_mfrac_spacing * ( base_rect.height() + under_rect.height() + over_rect.height() ) ); base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) ); under->setRelOrigin( QPoint( -under_rect.width() / 2, base_rect.bottom() + spacing - under_rect.top() ) ); over->setRelOrigin( QPoint( -over_rect.width() / 2, base_rect.top() - spacing - under_rect.bottom() ) ); } int QwtMmlMunderoverNode::scriptlevel( const QwtMmlNode *node ) const { QwtMmlNode *base = firstChild(); Q_ASSERT( base != 0 ); QwtMmlNode *under = base->nextSibling(); Q_ASSERT( under != 0 ); QwtMmlNode *over = under->nextSibling(); Q_ASSERT( over != 0 ); int sl = QwtMmlNode::scriptlevel(); if ( node != 0 && ( node == under || node == over ) ) return sl + 1; else return sl; } int QwtMmlMpaddedNode::interpretSpacing( QString value, int base_value, bool *ok ) const { if ( ok != 0 ) *ok = false; value.replace( ' ', "" ); QString sign, factor_str, pseudo_unit; bool percent = false; // extract the sign int idx = 0; if ( idx < value.length() && ( value.at( idx ) == '+' || value.at( idx ) == '-' ) ) sign = value.at( idx++ ); // extract the factor while ( idx < value.length() && ( value.at( idx ).isDigit() || value.at( idx ) == '.' ) ) factor_str.append( value.at( idx++ ) ); // extract the % sign if ( idx < value.length() && value.at( idx ) == '%' ) { percent = true; ++idx; } // extract the pseudo-unit pseudo_unit = value.mid( idx ); bool float_ok; double factor = factor_str.toFloat( &float_ok ); if ( !float_ok || factor < 0 ) { qWarning( "MmlMpaddedNode::interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() ); return 0; } if ( percent ) factor /= 100.0; QRect cr; if ( firstChild() == 0 ) cr = QRect( 0, 0, 0, 0 ); else cr = firstChild()->myRect(); int unit_size; if ( pseudo_unit.isEmpty() ) unit_size = base_value; else if ( pseudo_unit == "width" ) unit_size = cr.width(); else if ( pseudo_unit == "height" ) unit_size = -cr.top(); else if ( pseudo_unit == "depth" ) unit_size = cr.bottom(); else { bool unit_ok; unit_size = QwtMmlNode::interpretSpacing( "1" + pseudo_unit, &unit_ok ); if ( !unit_ok ) { qWarning( "MmlMpaddedNode::interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() ); return 0; } } if ( ok != 0 ) *ok = true; if ( sign.isNull() ) return ( int )( factor * unit_size ); else if ( sign == "+" ) return base_value + ( int )( factor * unit_size ); else // sign == "-" return base_value - ( int )( factor * unit_size ); } int QwtMmlMpaddedNode::lspace() const { QString value = explicitAttribute( "lspace" ); if ( value.isNull() ) return 0; bool ok; int lspace = interpretSpacing( value, 0, &ok ); if ( ok ) return lspace; return 0; } int QwtMmlMpaddedNode::width() const { int child_width = 0; if ( firstChild() != 0 ) child_width = firstChild()->myRect().width(); QString value = explicitAttribute( "width" ); if ( value.isNull() ) return child_width; bool ok; int w = interpretSpacing( value, child_width, &ok ); if ( ok ) return w; return child_width; } int QwtMmlMpaddedNode::height() const { QRect cr; if ( firstChild() == 0 ) cr = QRect( 0, 0, 0, 0 ); else cr = firstChild()->myRect(); QString value = explicitAttribute( "height" ); if ( value.isNull() ) return -cr.top(); bool ok; int h = interpretSpacing( value, -cr.top(), &ok ); if ( ok ) return h; return -cr.top(); } int QwtMmlMpaddedNode::depth() const { QRect cr; if ( firstChild() == 0 ) cr = QRect( 0, 0, 0, 0 ); else cr = firstChild()->myRect(); QString value = explicitAttribute( "depth" ); if ( value.isNull() ) return cr.bottom(); bool ok; int h = interpretSpacing( value, cr.bottom(), &ok ); if ( ok ) return h; return cr.bottom(); } void QwtMmlMpaddedNode::layoutSymbol() { QwtMmlNode *child = firstChild(); if ( child == 0 ) return; child->setRelOrigin( QPoint( 0, 0 ) ); } QRect QwtMmlMpaddedNode::symbolRect() const { return QRect( -lspace(), -height(), lspace() + width(), height() + depth() ); } // ******************************************************************* // Static helper functions // ******************************************************************* static QString entityDeclarations() { QString result = "name != 0; ++ent ) { result += "\tname ) + " \"" + ent->value + "\">\n"; } result += "]>\n"; return result; } static int interpretSpacing( QString value, int em, int ex, bool *ok ) { if ( ok != 0 ) *ok = true; if ( value == "thin" ) return 1; if ( value == "medium" ) return 2; if ( value == "thick" ) return 3; struct HSpacingValue { const char *name; float factor; }; static const HSpacingValue g_h_spacing_data[] = { { "veryverythinmathspace", ( float ) 0.0555556 }, { "verythinmathspace", ( float ) 0.111111 }, { "thinmathspace", ( float ) 0.166667 }, { "mediummathspace", ( float ) 0.222222 }, { "thickmathspace", ( float ) 0.277778 }, { "verythickmathspace", ( float ) 0.333333 }, { "veryverythickmathspace", ( float ) 0.388889 }, { 0, ( float ) 0 } }; const HSpacingValue *v = g_h_spacing_data; for ( ; v->name != 0; ++v ) { if ( value == v->name ) return ( int )( em * v->factor ); } if ( value.endsWith( "em" ) ) { value.truncate( value.length() - 2 ); bool float_ok; float factor = value.toFloat( &float_ok ); if ( float_ok && factor >= 0 ) return ( int )( em * factor ); else { qWarning( "interpretSpacing(): could not parse \"%sem\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } } if ( value.endsWith( "ex" ) ) { value.truncate( value.length() - 2 ); bool float_ok; float factor = value.toFloat( &float_ok ); if ( float_ok && factor >= 0 ) return ( int )( ex * factor ); else { qWarning( "interpretSpacing(): could not parse \"%sex\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } } if ( value.endsWith( "cm" ) ) { value.truncate( value.length() - 2 ); bool float_ok; float factor = value.toFloat( &float_ok ); if ( float_ok && factor >= 0 ) { Q_ASSERT( qApp->desktop() != 0 ); QDesktopWidget *dw = qApp->desktop(); Q_ASSERT( dw->width() != 0 ); Q_ASSERT( dw->widthMM() != 0 ); return ( int )( factor * 10 * dw->width() / dw->widthMM() ); } else { qWarning( "interpretSpacing(): could not parse \"%scm\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } } if ( value.endsWith( "mm" ) ) { value.truncate( value.length() - 2 ); bool float_ok; float factor = value.toFloat( &float_ok ); if ( float_ok && factor >= 0 ) { Q_ASSERT( qApp->desktop() != 0 ); QDesktopWidget *dw = qApp->desktop(); Q_ASSERT( dw->width() != 0 ); Q_ASSERT( dw->widthMM() != 0 ); return ( int )( factor * dw->width() / dw->widthMM() ); } else { qWarning( "interpretSpacing(): could not parse \"%smm\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } } if ( value.endsWith( "in" ) ) { value.truncate( value.length() - 2 ); bool float_ok; float factor = value.toFloat( &float_ok ); if ( float_ok && factor >= 0 ) { Q_ASSERT( qApp->desktop() != 0 ); QDesktopWidget *dw = qApp->desktop(); Q_ASSERT( dw->width() != 0 ); Q_ASSERT( dw->widthMM() != 0 ); return ( int )( factor * 10 * dw->width() / ( 2.54 * dw->widthMM() ) ); } else { qWarning( "interpretSpacing(): could not parse \"%sin\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } } if ( value.endsWith( "px" ) ) { value.truncate( value.length() - 2 ); bool float_ok; int i = ( int ) value.toFloat( &float_ok ); if ( float_ok && i >= 0 ) return i; else { qWarning( "interpretSpacing(): could not parse \"%spx\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } } bool float_ok; int i = ( int )value.toFloat( &float_ok ); if ( float_ok && i >= 0 ) return i; qWarning( "interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } static int interpretPercentSpacing( QString value, int base, bool *ok ) { if ( !value.endsWith( "%" ) ) { if ( ok != 0 ) *ok = false; return 0; } value.truncate( value.length() - 1 ); bool float_ok; float factor = value.toFloat( &float_ok ); if ( float_ok && factor >= 0 ) { if ( ok != 0 ) *ok = true; return ( int )( base * factor / 100.0 ); } qWarning( "interpretPercentSpacing(): could not parse \"%s%%\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } static int interpretPointSize( QString value, bool *ok ) { if ( !value.endsWith( "pt" ) ) { if ( ok != 0 ) *ok = false; return 0; } value.truncate( value.length() - 2 ); bool float_ok; int pt_size = ( int ) value.toFloat( &float_ok ); if ( float_ok && pt_size > 0 ) { if ( ok != 0 ) *ok = true; return pt_size; } qWarning( "interpretPointSize(): could not parse \"%spt\"", value.toLatin1().data() ); if ( ok != 0 ) *ok = false; return 0; } static const QwtMmlNodeSpec *mmlFindNodeSpec( QwtMml::NodeType type ) { const QwtMmlNodeSpec *spec = g_node_spec_data; for ( ; spec->type != QwtMml::NoNode; ++spec ) { if ( type == spec->type ) return spec; } return 0; } static const QwtMmlNodeSpec *mmlFindNodeSpec( const QString &tag ) { const QwtMmlNodeSpec *spec = g_node_spec_data; for ( ; spec->type != QwtMml::NoNode; ++spec ) { if ( tag == spec->tag ) return spec; } return 0; } static bool mmlCheckChildType( QwtMml::NodeType parent_type, QwtMml::NodeType child_type, QString *error_str ) { if ( parent_type == QwtMml::UnknownNode || child_type == QwtMml::UnknownNode ) return true; const QwtMmlNodeSpec *child_spec = mmlFindNodeSpec( child_type ); const QwtMmlNodeSpec *parent_spec = mmlFindNodeSpec( parent_type ); Q_ASSERT( parent_spec != 0 ); Q_ASSERT( child_spec != 0 ); QString allowed_child_types( parent_spec->child_types ); // null list means any child type is valid if ( allowed_child_types.isNull() ) return true; QString child_type_str = QString( " " ) + child_spec->type_str + " "; if ( !allowed_child_types.contains( child_type_str ) ) { if ( error_str != 0 ) *error_str = QString( "illegal child " ) + child_spec->type_str + " for parent " + parent_spec->type_str; return false; } return true; } static bool mmlCheckAttributes( QwtMml::NodeType child_type, const QwtMmlAttributeMap &attr, QString *error_str ) { const QwtMmlNodeSpec *spec = mmlFindNodeSpec( child_type ); Q_ASSERT( spec != 0 ); QString allowed_attr( spec->attributes ); // empty list means any attr is valid if ( allowed_attr.isEmpty() ) return true; QwtMmlAttributeMap::const_iterator it = attr.begin(), end = attr.end(); for ( ; it != end; ++it ) { QString name = it.key(); if ( name.indexOf( ':' ) != -1 ) continue; QString padded_name = " " + name + " "; if ( !allowed_attr.contains( padded_name ) ) { if ( error_str != 0 ) *error_str = QString( "illegal attribute " ) + name + " in " + spec->type_str; return false; } } return true; } static int attributeIndex( const QString &name ) { for ( unsigned i = 0; i < g_oper_spec_rows; ++i ) { if ( name == g_oper_spec_names[i] ) return i; } return -1; } static QString decodeEntityValue( QString literal ) { QString result; while ( !literal.isEmpty() ) { if ( !literal.startsWith( "&#" ) ) { qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\""; return QString::null; } literal = literal.right( literal.length() - 2 ); int i = literal.indexOf( ';' ); if ( i == -1 ) { qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\""; return QString::null; } QString char_code = literal.left( i ); literal = literal.right( literal.length() - i - 1 ); if ( char_code.isEmpty() ) { qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\""; return QString::null; } if ( char_code.at( 0 ) == 'x' ) { char_code = char_code.right( char_code.length() - 1 ); bool ok; unsigned c = char_code.toUInt( &ok, 16 ); if ( !ok ) { qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\""; return QString::null; } result += QChar( c ); } else { bool ok; unsigned c = char_code.toUInt( &ok, 10 ); if ( !ok ) { qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\""; return QString::null; } result += QChar( c ); } } return result; } static const QwtMmlEntitySpec *searchEntitySpecData( const QString &value, const QwtMmlEntitySpec *from = 0 ) { const QwtMmlEntitySpec *ent = from; if ( ent == 0 ) ent = g_xml_entity_data; for ( ; ent->name != 0; ++ent ) { QString ent_value = decodeEntityValue( ent->value ); if ( value == ent_value ) return ent; } return 0; } struct OperSpecSearchResult { OperSpecSearchResult() { prefix_form = infix_form = postfix_form = 0; } const QwtMmlOperSpec *prefix_form, *infix_form, *postfix_form; const QwtMmlOperSpec *&getForm( QwtMml::FormType f ); bool haveForm( QwtMml::FormType f ) { return getForm( f ) != 0; } void addForm( const QwtMmlOperSpec *spec ) { getForm( spec->form ) = spec; } }; const QwtMmlOperSpec *&OperSpecSearchResult::getForm( QwtMml::FormType f ) { switch ( f ) { case QwtMml::PrefixForm: return prefix_form; case QwtMml::InfixForm: return infix_form; case QwtMml::PostfixForm: return postfix_form; } return postfix_form; // just to avoid warning } /* Searches g_oper_spec_data and returns any instance of operator name. There may be more instances, but since the list is sorted, they will be next to each other. */ static const QwtMmlOperSpec *searchOperSpecData( const QString &name ) { const char *name_latin1 = name.toLatin1().data(); // binary search // establish invariant g_oper_spec_data[begin].name < name < g_oper_spec_data[end].name int cmp = qstrcmp( name_latin1, g_oper_spec_data[0].name ); if ( cmp < 0 ) return 0; if ( cmp == 0 ) return g_oper_spec_data; uint begin = 0; uint end = g_oper_spec_count; // invariant holds while ( end - begin > 1 ) { uint mid = ( begin + end ) / 2; const QwtMmlOperSpec *spec = g_oper_spec_data + mid; int cmp = qstrcmp( name_latin1, spec->name ); if ( cmp < 0 ) end = mid; else if ( cmp > 0 ) begin = mid; else return spec; } return 0; } /* This searches g_oper_spec_data until at least one name in name_list is found with FormType form, or until name_list is exhausted. The idea here is that if we don't find the operator in the specified form, we still want to use some other available form of that operator. */ static OperSpecSearchResult _mmlFindOperSpec( const QStringList &name_list, QwtMml::FormType form ) { OperSpecSearchResult result; QStringList::const_iterator it = name_list.begin(); for ( ; it != name_list.end(); ++it ) { const QString &name = *it; const QwtMmlOperSpec *spec = searchOperSpecData( name ); if ( spec == 0 ) continue; const char *name_latin1 = name.toLatin1().data(); // backtrack to the first instance of name while ( spec > g_oper_spec_data && qstrcmp( ( spec - 1 )->name, name_latin1 ) == 0 ) --spec; // iterate over instances of name until the instances are exhausted or until we // find an instance in the specified form. do { result.addForm( spec++ ); if ( result.haveForm( form ) ) break; } while ( qstrcmp( spec->name, name_latin1 ) == 0 ); if ( result.haveForm( form ) ) break; } return result; } /* text is a string between and . It can be a character ('+'), an entity reference ("∞") or a character reference ("∞"). Our job is to find an operator spec in the operator dictionary (g_oper_spec_data) that matches text. Things are further complicated by the fact, that many operators come in several forms (prefix, infix, postfix). If available, this function returns an operator spec matching text in the specified form. If such operator is not available, returns an operator spec that matches text, but of some other form in the preference order specified by the MathML spec. If that's not available either, returns the default operator spec. */ static const QwtMmlOperSpec *mmlFindOperSpec( const QString &text, QwtMml::FormType form ) { QStringList name_list; name_list.append( text ); // First, just try to find text in the operator dictionary. OperSpecSearchResult result = _mmlFindOperSpec( name_list, form ); if ( !result.haveForm( form ) ) { // Try to find other names for the operator represented by text. const QwtMmlEntitySpec *ent = 0; for ( ;; ) { ent = searchEntitySpecData( text, ent ); if ( ent == 0 ) break; name_list.append( '&' + QString( ent->name ) + ';' ); ++ent; } result = _mmlFindOperSpec( name_list, form ); } const QwtMmlOperSpec *spec = result.getForm( form ); if ( spec != 0 ) return spec; spec = result.getForm( QwtMml::InfixForm ); if ( spec != 0 ) return spec; spec = result.getForm( QwtMml::PostfixForm ); if ( spec != 0 ) return spec; spec = result.getForm( QwtMml::PrefixForm ); if ( spec != 0 ) return spec; return &g_oper_spec_defaults; } static QString mmlDictAttribute( const QString &name, const QwtMmlOperSpec *spec ) { int i = attributeIndex( name ); if ( i == -1 ) return QString::null; else return spec->attributes[i]; } static uint interpretMathVariant( const QString &value, bool *ok ) { struct MathVariantValue { const char *value; uint mv; }; static const MathVariantValue g_mv_data[] = { { "normal", QwtMml::NormalMV }, { "bold", QwtMml::BoldMV }, { "italic", QwtMml::ItalicMV }, { "bold-italic", QwtMml::BoldMV | QwtMml::ItalicMV }, { "double-struck", QwtMml::DoubleStruckMV }, { "bold-fraktur", QwtMml::BoldMV | QwtMml::FrakturMV }, { "script", QwtMml::ScriptMV }, { "bold-script", QwtMml::BoldMV | QwtMml::ScriptMV }, { "fraktur", QwtMml::FrakturMV }, { "sans-serif", QwtMml::SansSerifMV }, { "bold-sans-serif", QwtMml::BoldMV | QwtMml::SansSerifMV }, { "sans-serif-italic", QwtMml::SansSerifMV | QwtMml::ItalicMV }, { "sans-serif-bold-italic", QwtMml::SansSerifMV | QwtMml::ItalicMV | QwtMml::BoldMV }, { "monospace", QwtMml::MonospaceMV }, { 0, 0 } }; const MathVariantValue *v = g_mv_data; for ( ; v->value != 0; ++v ) { if ( value == v->value ) { if ( ok != 0 ) *ok = true; return v->mv; } } if ( ok != 0 ) *ok = false; qWarning( "interpretMathVariant(): could not parse value: \"%s\"", value.toLatin1().data() ); return QwtMml::NormalMV; } static QwtMml::FormType interpretForm( const QString &value, bool *ok ) { if ( ok != 0 ) *ok = true; if ( value == "prefix" ) return QwtMml::PrefixForm; if ( value == "infix" ) return QwtMml::InfixForm; if ( value == "postfix" ) return QwtMml::PostfixForm; if ( ok != 0 ) *ok = false; qWarning( "interpretForm(): could not parse value \"%s\"", value.toLatin1().data() ); return QwtMml::InfixForm; } static QwtMml::ColAlign interpretColAlign( const QString &value_list, uint colnum, bool *ok ) { QString value = interpretListAttr( value_list, colnum, "center" ); if ( ok != 0 ) *ok = true; if ( value == "left" ) return QwtMml::ColAlignLeft; if ( value == "right" ) return QwtMml::ColAlignRight; if ( value == "center" ) return QwtMml::ColAlignCenter; if ( ok != 0 ) *ok = false; qWarning( "interpretColAlign(): could not parse value \"%s\"", value.toLatin1().data() ); return QwtMml::ColAlignCenter; } static QwtMml::RowAlign interpretRowAlign( const QString &value_list, uint rownum, bool *ok ) { QString value = interpretListAttr( value_list, rownum, "axis" ); if ( ok != 0 ) *ok = true; if ( value == "top" ) return QwtMml::RowAlignTop; if ( value == "center" ) return QwtMml::RowAlignCenter; if ( value == "bottom" ) return QwtMml::RowAlignBottom; if ( value == "baseline" ) return QwtMml::RowAlignBaseline; if ( value == "axis" ) return QwtMml::RowAlignAxis; if ( ok != 0 ) *ok = false; qWarning( "interpretRowAlign(): could not parse value \"%s\"", value.toLatin1().data() ); return QwtMml::RowAlignAxis; } static QString interpretListAttr( const QString &value_list, int idx, const QString &def ) { QStringList l = value_list.split( ' ' ); if ( l.count() == 0 ) return def; if ( l.count() <= idx ) return l[l.count() - 1]; else return l[idx]; } static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok ) { if ( ok != 0 ) *ok = true; QString value = interpretListAttr( value_list, idx, "none" ); if ( value == "none" ) return QwtMml::FrameNone; if ( value == "solid" ) return QwtMml::FrameSolid; if ( value == "dashed" ) return QwtMml::FrameDashed; if ( ok != 0 ) *ok = false; qWarning( "interpretFrameType(): could not parse value \"%s\"", value.toLatin1().data() ); return QwtMml::FrameNone; } static QwtMml::FrameSpacing interpretFrameSpacing( const QString &value_list, int em, int ex, bool *ok ) { QwtMml::FrameSpacing fs; QStringList l = value_list.split( ' ' ); if ( l.count() != 2 ) { qWarning( "interpretFrameSpacing: could not parse value \"%s\"", value_list.toLatin1().data() ); if ( ok != 0 ) *ok = false; return QwtMml::FrameSpacing( ( int )( 0.4 * em ), ( int )( 0.5 * ex ) ); } bool hor_ok, ver_ok; fs.m_hor = interpretSpacing( l[0], em, ex, &hor_ok ); fs.m_ver = interpretSpacing( l[1], em, ex, &ver_ok ); if ( ok != 0 ) *ok = hor_ok && ver_ok; return fs; } static QFont interpretDepreciatedFontAttr( const QwtMmlAttributeMap &font_attr, QFont &fn, int em, int ex ) { if ( font_attr.contains( "fontsize" ) ) { QString value = font_attr["fontsize"]; for ( ;; ) { bool ok; int ptsize = interpretPointSize( value, &ok ); if ( ok ) { fn.setPointSize( ptsize ); break; } ptsize = interpretPercentSpacing( value, fn.pointSize(), &ok ); if ( ok ) { fn.setPointSize( ptsize ); break; } int size = interpretSpacing( value, em, ex, &ok ); if ( ok ) { fn.setPixelSize( size ); break; } break; } } if ( font_attr.contains( "fontweight" ) ) { QString value = font_attr["fontweight"]; if ( value == "normal" ) fn.setBold( false ); else if ( value == "bold" ) fn.setBold( true ); else qWarning( "interpretDepreciatedFontAttr(): could not parse fontweight \"%s\"", value.toLatin1().data() ); } if ( font_attr.contains( "fontstyle" ) ) { QString value = font_attr["fontstyle"]; if ( value == "normal" ) fn.setItalic( false ); else if ( value == "italic" ) fn.setItalic( true ); else qWarning( "interpretDepreciatedFontAttr(): could not parse fontstyle \"%s\"", value.toLatin1().data() ); } if ( font_attr.contains( "fontfamily" ) ) { QString value = font_attr["fontfamily"]; fn.setFamily( value ); } return fn; } static QFont interpretMathSize( QString value, QFont &fn, int em, int ex, bool *ok ) { if ( ok != 0 ) *ok = true; if ( value == "small" ) { fn.setPointSize( ( int )( fn.pointSize() * 0.7 ) ); return fn; } if ( value == "normal" ) return fn; if ( value == "big" ) { fn.setPointSize( ( int )( fn.pointSize() * 1.5 ) ); return fn; } bool size_ok; int ptsize = interpretPointSize( value, &size_ok ); if ( size_ok ) { fn.setPointSize( ptsize ); return fn; } int size = interpretSpacing( value, em, ex, &size_ok ); if ( size_ok ) { fn.setPixelSize( size ); return fn; } if ( ok != 0 ) *ok = false; qWarning( "interpretMathSize(): could not parse mathsize \"%s\"", value.toLatin1().data() ); return fn; } /*! \class QwtMathMLDocument \brief The QwtMathMLDocument class renders mathematical formulas written in MathML 2.0. */ /*! Constructs an empty MML document. */ QwtMathMLDocument::QwtMathMLDocument() { m_doc = new QwtMmlDocument; } /*! Destroys the MML document. */ QwtMathMLDocument::~QwtMathMLDocument() { delete m_doc; } /*! Clears the contents of this MML document. */ void QwtMathMLDocument::clear() { m_doc->clear(); } /*! Sets the MathML expression to be rendered. The expression is given in the string \a text. If the expression is successfully parsed, this method returns true; otherwise it returns false. If an error occured \a errorMsg is set to a diagnostic message, while \a errorLine and \a errorColumn contain the location of the error. Any of \a errorMsg, \a errorLine and \a errorColumn may be 0, in which case they are not set. \a text should contain MathML 2.0 presentation markup elements enclosed in a element. */ bool QwtMathMLDocument::setContent( QString text, QString *errorMsg, int *errorLine, int *errorColumn ) { return m_doc->setContent( text, errorMsg, errorLine, errorColumn ); } /*! Renders this MML document with the painter \a p at position \a pos. */ void QwtMathMLDocument::paint( QPainter *p, const QPoint &pos ) const { m_doc->paint( p, pos ); } /*! Returns the size of this MML document, as rendered, in pixels. */ QSize QwtMathMLDocument::size() const { return m_doc->size(); } /*! Returns the name of the font used to render the font \a type. \sa setFontName() setBaseFontPointSize() baseFontPointSize() QwtMathMLDocument::MmlFont */ QString QwtMathMLDocument::fontName( QwtMathMLDocument::MmlFont type ) const { return m_doc->fontName( type ); } /*! Sets the name of the font used to render the font \a type to \a name. \sa fontName() setBaseFontPointSize() baseFontPointSize() QwtMathMLDocument::MmlFont */ void QwtMathMLDocument::setFontName( QwtMathMLDocument::MmlFont type, const QString &name ) { m_doc->setFontName( type, name ); } /*! Returns the point size of the font used to render expressions whose scriptlevel is 0. \sa setBaseFontPointSize() fontName() setFontName() */ int QwtMathMLDocument::baseFontPointSize() const { return m_doc->baseFontPointSize(); } /*! Sets the point \a size of the font used to render expressions whose scriptlevel is 0. \sa baseFontPointSize() fontName() setFontName() */ void QwtMathMLDocument::setBaseFontPointSize( int size ) { m_doc->setBaseFontPointSize( size ); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_scale_map.cpp�����������������������������������������������������������000644 �001750 �001750 �00000012751 12151666703 021373� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_map.h" #include "qwt_math.h" #include #include /*! \brief Constructor The scale and paint device intervals are both set to [0,1]. */ QwtScaleMap::QwtScaleMap(): d_s1( 0.0 ), d_s2( 1.0 ), d_p1( 0.0 ), d_p2( 1.0 ), d_cnv( 1.0 ), d_ts1( 0.0 ), d_transform( NULL ) { } //! Copy constructor QwtScaleMap::QwtScaleMap( const QwtScaleMap& other ): d_s1( other.d_s1 ), d_s2( other.d_s2 ), d_p1( other.d_p1 ), d_p2( other.d_p2 ), d_cnv( other.d_cnv ), d_ts1( other.d_ts1 ), d_transform( NULL ) { if ( other.d_transform ) d_transform = other.d_transform->copy(); } /*! Destructor */ QwtScaleMap::~QwtScaleMap() { delete d_transform; } //! Assignment operator QwtScaleMap &QwtScaleMap::operator=( const QwtScaleMap & other ) { d_s1 = other.d_s1; d_s2 = other.d_s2; d_p1 = other.d_p1; d_p2 = other.d_p2; d_cnv = other.d_cnv; d_ts1 = other.d_ts1; delete d_transform; d_transform = NULL; if ( other.d_transform ) d_transform = other.d_transform->copy(); return *this; } /*! Initialize the map with a transformation */ void QwtScaleMap::setTransformation( QwtTransform *transform ) { if ( transform != d_transform ) { delete d_transform; d_transform = transform; } setScaleInterval( d_s1, d_s2 ); } //! Get the transformation const QwtTransform *QwtScaleMap::transformation() const { return d_transform; } /*! \brief Specify the borders of the scale interval \param s1 first border \param s2 second border \warning scales might be aligned to transformation depending boundaries */ void QwtScaleMap::setScaleInterval( double s1, double s2 ) { d_s1 = s1; d_s2 = s2; if ( d_transform ) { d_s1 = d_transform->bounded( d_s1 ); d_s2 = d_transform->bounded( d_s2 ); } updateFactor(); } /*! \brief Specify the borders of the paint device interval \param p1 first border \param p2 second border */ void QwtScaleMap::setPaintInterval( double p1, double p2 ) { d_p1 = p1; d_p2 = p2; updateFactor(); } void QwtScaleMap::updateFactor() { d_ts1 = d_s1; double ts2 = d_s2; if ( d_transform ) { d_ts1 = d_transform->transform( d_ts1 ); ts2 = d_transform->transform( ts2 ); } d_cnv = 1.0; if ( d_ts1 != ts2 ) d_cnv = ( d_p2 - d_p1 ) / ( ts2 - d_ts1 ); } /*! Transform a rectangle from scale to paint coordinates \param xMap X map \param yMap Y map \param rect Rectangle in scale coordinates \return Rectangle in paint coordinates \sa invTransform() */ QRectF QwtScaleMap::transform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) { double x1 = xMap.transform( rect.left() ); double x2 = xMap.transform( rect.right() ); double y1 = yMap.transform( rect.top() ); double y2 = yMap.transform( rect.bottom() ); if ( x2 < x1 ) qSwap( x1, x2 ); if ( y2 < y1 ) qSwap( y1, y2 ); if ( qwtFuzzyCompare( x1, 0.0, x2 - x1 ) == 0 ) x1 = 0.0; if ( qwtFuzzyCompare( x2, 0.0, x2 - x1 ) == 0 ) x2 = 0.0; if ( qwtFuzzyCompare( y1, 0.0, y2 - y1 ) == 0 ) y1 = 0.0; if ( qwtFuzzyCompare( y2, 0.0, y2 - y1 ) == 0 ) y2 = 0.0; return QRectF( x1, y1, x2 - x1 + 1, y2 - y1 + 1 ); } /*! Transform a rectangle from paint to scale coordinates \param xMap X map \param yMap Y map \param pos Position in paint coordinates \return Position in scale coordinates \sa transform() */ QPointF QwtScaleMap::invTransform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QPointF &pos ) { return QPointF( xMap.invTransform( pos.x() ), yMap.invTransform( pos.y() ) ); } /*! Transform a point from scale to paint coordinates \param xMap X map \param yMap Y map \param pos Position in scale coordinates \return Position in paint coordinates \sa invTransform() */ QPointF QwtScaleMap::transform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QPointF &pos ) { return QPointF( xMap.transform( pos.x() ), yMap.transform( pos.y() ) ); } /*! Transform a rectangle from paint to scale coordinates \param xMap X map \param yMap Y map \param rect Rectangle in paint coordinates \return Rectangle in scale coordinates \sa transform() */ QRectF QwtScaleMap::invTransform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) { const double x1 = xMap.invTransform( rect.left() ); const double x2 = xMap.invTransform( rect.right() - 1 ); const double y1 = yMap.invTransform( rect.top() ); const double y2 = yMap.invTransform( rect.bottom() - 1 ); const QRectF r( x1, y1, x2 - x1, y2 - y1 ); return r.normalized(); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtScaleMap &map ) { debug.nospace() << "QwtScaleMap(" << map.transformation() << ", s:" << map.s1() << "->" << map.s2() << ", p:" << map.p1() << "->" << map.p2() << ")"; return debug.space(); } #endif �����������������������linssid-2.7/qwt-lib/src/qwt_abstract_slider.h�������������������������������������������������������000644 �001750 �001750 �00000010463 12151666701 022255� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SLIDER_H #define QWT_ABSTRACT_SLIDER_H #include "qwt_global.h" #include "qwt_abstract_scale.h" /*! \brief An abstract base class for slider widgets with a scale A slider widget displays a value according to a scale. The class is designed as a common super class for widgets like QwtKnob, QwtDial and QwtSlider. When the slider is nor readOnly() its value can be modified by keyboard, mouse and wheel inputs. The range of the slider is divided into a number of steps from which the value increments according to user inputs depend. Only for linear scales the number of steps correspond with a fixed step size. */ class QWT_EXPORT QwtAbstractSlider: public QwtAbstractScale { Q_OBJECT Q_PROPERTY( double value READ value WRITE setValue ) Q_PROPERTY( uint totalSteps READ totalSteps WRITE setTotalSteps ) Q_PROPERTY( uint singleSteps READ singleSteps WRITE setSingleSteps ) Q_PROPERTY( uint pageSteps READ pageSteps WRITE setPageSteps ) Q_PROPERTY( bool stepAlignment READ stepAlignment WRITE setStepAlignment ) Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly ) Q_PROPERTY( bool tracking READ isTracking WRITE setTracking ) Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping ) Q_PROPERTY( bool invertedControls READ invertedControls WRITE setInvertedControls ) public: explicit QwtAbstractSlider( QWidget *parent = NULL ); virtual ~QwtAbstractSlider(); void setValid( bool ); bool isValid() const; double value() const; void setWrapping( bool ); bool wrapping() const; void setTotalSteps( uint ); uint totalSteps() const; void setSingleSteps( uint ); uint singleSteps() const; void setPageSteps( uint ); uint pageSteps() const; void setStepAlignment( bool ); bool stepAlignment() const; void setTracking( bool ); bool isTracking() const; void setReadOnly( bool ); bool isReadOnly() const; void setInvertedControls( bool ); bool invertedControls() const; public Q_SLOTS: void setValue( double val ); Q_SIGNALS: /*! \brief Notify a change of value. When tracking is enabled (default setting), this signal will be emitted every time the value changes. \param value New value \sa setTracking(), sliderMoved() */ void valueChanged( double value ); /*! This signal is emitted when the user presses the movable part of the slider. */ void sliderPressed(); /*! This signal is emitted when the user releases the movable part of the slider. */ void sliderReleased(); /*! This signal is emitted when the user moves the slider with the mouse. \param value New value \sa valueChanged() */ void sliderMoved( double value ); protected: virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void mouseMoveEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void wheelEvent( QWheelEvent * ); /*! \brief Determine what to do when the user presses a mouse button. \param pos Mouse position \retval True, when pos is a valid scroll position \sa scrolledTo() */ virtual bool isScrollPosition( const QPoint &pos ) const = 0; /*! \brief Determine the value for a new position of the movable part of the slider \param pos Mouse position \return Value for the mouse position \sa isScrollPosition() */ virtual double scrolledTo( const QPoint &pos ) const = 0; void incrementValue( int numSteps ); virtual void scaleChange(); protected: virtual void sliderChange(); double incrementedValue( double value, int stepCount ) const; private: double alignedValue( double ) const; double boundedValue( double ) const; class PrivateData; PrivateData *d_data; }; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_matrix_raster_data.cpp��������������������������������������������������000644 �001750 �001750 �00000017477 12151666703 023336� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_matrix_raster_data.h" #include #include class QwtMatrixRasterData::PrivateData { public: PrivateData(): resampleMode(QwtMatrixRasterData::NearestNeighbour), numColumns(0) { } inline double value(int row, int col) const { return values.data()[ row * numColumns + col ]; } QwtMatrixRasterData::ResampleMode resampleMode; QVector values; int numColumns; int numRows; double dx; double dy; }; //! Constructor QwtMatrixRasterData::QwtMatrixRasterData() { d_data = new PrivateData(); update(); } //! Destructor QwtMatrixRasterData::~QwtMatrixRasterData() { delete d_data; } /*! \brief Set the resampling algorithm \param mode Resampling mode \sa resampleMode(), value() */ void QwtMatrixRasterData::setResampleMode( ResampleMode mode ) { d_data->resampleMode = mode; } /*! \return resampling algorithm \sa setResampleMode(), value() */ QwtMatrixRasterData::ResampleMode QwtMatrixRasterData::resampleMode() const { return d_data->resampleMode; } /*! \brief Assign the bounding interval for an axis Setting the bounding intervals for the X/Y axis is mandatory to define the positions for the values of the value matrix. The interval in Z direction defines the possible range for the values in the matrix, what is f.e used by QwtPlotSpectrogram to map values to colors. The Z-interval might be the bounding interval of the values in the matrix, but usually it isn't. ( f.e a interval of 0.0-100.0 for values in percentage ) \param axis X, Y or Z axis \param interval Interval \sa QwtRasterData::interval(), setValueMatrix() */ void QwtMatrixRasterData::setInterval( Qt::Axis axis, const QwtInterval &interval ) { QwtRasterData::setInterval( axis, interval ); update(); } /*! \brief Assign a value matrix The positions of the values are calculated by dividing the bounding rectangle of the X/Y intervals into equidistant rectangles ( pixels ). Each value corresponds to the center of a pixel. \param values Vector of values \param numColumns Number of columns \sa valueMatrix(), numColumns(), numRows(), setInterval()() */ void QwtMatrixRasterData::setValueMatrix( const QVector &values, int numColumns ) { d_data->values = values; d_data->numColumns = qMax( numColumns, 0 ); update(); } /*! \return Value matrix \sa setValueMatrix(), numColumns(), numRows(), setInterval() */ const QVector QwtMatrixRasterData::valueMatrix() const { return d_data->values; } /*! \brief Change a single value in the matrix \param row Row index \param col Column index \param value New value \sa value(), setValueMatrix() */ void QwtMatrixRasterData::setValue( int row, int col, double value ) { if ( row >= 0 && row < d_data->numRows && col >= 0 && col < d_data->numColumns ) { const int index = row * d_data->numColumns + col; d_data->values.data()[ index ] = value; } } /*! \return Number of columns of the value matrix \sa valueMatrix(), numRows(), setValueMatrix() */ int QwtMatrixRasterData::numColumns() const { return d_data->numColumns; } /*! \return Number of rows of the value matrix \sa valueMatrix(), numColumns(), setValueMatrix() */ int QwtMatrixRasterData::numRows() const { return d_data->numRows; } /*! \brief Calculate the pixel hint pixelHint() returns the geometry of a pixel, that can be used to calculate the resolution and alignment of the plot item, that is representing the data. - NearestNeighbour\n pixelHint() returns the surrounding pixel of the top left value in the matrix. - BilinearInterpolation\n Returns an empty rectangle recommending to render in target device ( f.e. screen ) resolution. \param area Requested area, ignored \return Calculated hint \sa ResampleMode, setMatrix(), setInterval() */ QRectF QwtMatrixRasterData::pixelHint( const QRectF &area ) const { Q_UNUSED( area ) QRectF rect; if ( d_data->resampleMode == NearestNeighbour ) { const QwtInterval intervalX = interval( Qt::XAxis ); const QwtInterval intervalY = interval( Qt::YAxis ); if ( intervalX.isValid() && intervalY.isValid() ) { rect = QRectF( intervalX.minValue(), intervalY.minValue(), d_data->dx, d_data->dy ); } } return rect; } /*! \return the value at a raster position \param x X value in plot coordinates \param y Y value in plot coordinates \sa ResampleMode */ double QwtMatrixRasterData::value( double x, double y ) const { const QwtInterval xInterval = interval( Qt::XAxis ); const QwtInterval yInterval = interval( Qt::YAxis ); if ( !( xInterval.contains(x) && yInterval.contains(y) ) ) return qQNaN(); double value; switch( d_data->resampleMode ) { case BilinearInterpolation: { int col1 = qRound( (x - xInterval.minValue() ) / d_data->dx ) - 1; int row1 = qRound( (y - yInterval.minValue() ) / d_data->dy ) - 1; int col2 = col1 + 1; int row2 = row1 + 1; if ( col1 < 0 ) col1 = col2; else if ( col2 >= static_cast( d_data->numColumns ) ) col2 = col1; if ( row1 < 0 ) row1 = row2; else if ( row2 >= static_cast( d_data->numRows ) ) row2 = row1; const double v11 = d_data->value( row1, col1 ); const double v21 = d_data->value( row1, col2 ); const double v12 = d_data->value( row2, col1 ); const double v22 = d_data->value( row2, col2 ); const double x2 = xInterval.minValue() + ( col2 + 0.5 ) * d_data->dx; const double y2 = yInterval.minValue() + ( row2 + 0.5 ) * d_data->dy; const double rx = ( x2 - x ) / d_data->dx; const double ry = ( y2 - y ) / d_data->dy; const double vr1 = rx * v11 + ( 1.0 - rx ) * v21; const double vr2 = rx * v12 + ( 1.0 - rx ) * v22; value = ry * vr1 + ( 1.0 - ry ) * vr2; break; } case NearestNeighbour: default: { int row = int( (y - yInterval.minValue() ) / d_data->dy ); int col = int( (x - xInterval.minValue() ) / d_data->dx ); // In case of intervals, where the maximum is included // we get out of bound for row/col, when the value for the // maximum is requested. Instead we return the value // from the last row/col if ( row >= d_data->numRows ) row = d_data->numRows - 1; if ( col >= d_data->numColumns ) col = d_data->numColumns - 1; value = d_data->value( row, col ); } } return value; } void QwtMatrixRasterData::update() { d_data->numRows = 0; d_data->dx = 0.0; d_data->dy = 0.0; if ( d_data->numColumns > 0 ) { d_data->numRows = d_data->values.size() / d_data->numColumns; const QwtInterval xInterval = interval( Qt::XAxis ); const QwtInterval yInterval = interval( Qt::YAxis ); if ( xInterval.isValid() ) d_data->dx = xInterval.width() / d_data->numColumns; if ( yInterval.isValid() ) d_data->dy = yInterval.width() / d_data->numRows; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������linssid-2.7/qwt-lib/src/qwt_round_scale_draw.cpp����������������������������������������������������000644 �001750 �001750 �00000020151 12151666703 022753� 0����������������������������������������������������������������������������������������������������ustar�00warren��������������������������warren��������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_round_scale_draw.h" #include "qwt_painter.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include #include #include #include class QwtRoundScaleDraw::PrivateData { public: PrivateData(): center( 50.0, 50.0 ), radius( 50.0 ), startAngle( -135.0 ), endAngle( 135.0 ) { } QPointF center; double radius; double startAngle; double endAngle; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The center is set to (50, 50) with a radius of 50. The angle range is set to [-135, 135]. */ QwtRoundScaleDraw::QwtRoundScaleDraw() { d_data = new QwtRoundScaleDraw::PrivateData; setRadius( 50 ); scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle ); } //! Destructor QwtRoundScaleDraw::~QwtRoundScaleDraw() { delete d_data; } /*! Change of radius the scale Radius is the radius of the backbone without ticks and labels. \param radius New Radius \sa moveCenter() */ void QwtRoundScaleDraw::setRadius( double radius ) { d_data->radius = radius; } /*! Get the radius Radius is the radius of the backbone without ticks and labels. \return Radius of the scale \sa setRadius(), extent() */ double QwtRoundScaleDraw::radius() const { return d_data->radius; } /*! Move the center of the scale draw, leaving the radius unchanged \param center New center \sa setRadius() */ void QwtRoundScaleDraw::moveCenter( const QPointF ¢er ) { d_data->center = center; } //! Get the center of the scale QPointF QwtRoundScaleDraw::center() const { return d_data->center; } /*! \brief Adjust the baseline circle segment for round scales. The baseline will be drawn from min(angle1,angle2) to max(angle1, angle2). The default setting is [ -135, 135 ]. An angle of 0 degrees corresponds to the 12 o'clock position, and positive angles count in a clockwise direction. \param angle1 \param angle2 boundaries of the angle interval in degrees. \warning
  • The angle range is limited to [-360, 360] degrees. Angles exceeding this range will be clipped.
  • For angles more or equal than 360 degrees above or below min(angle1, angle2), scale marks will not be drawn.
  • If you need a counterclockwise scale, use QwtScaleDiv::setInterval()
*/ void QwtRoundScaleDraw::setAngleRange( double angle1, double angle2 ) { #if 0 angle1 = qBound( -360.0, angle1, 360.0 ); angle2 = qBound( -360.0, angle2, 360.0 ); #endif d_data->startAngle = angle1; d_data->endAngle = angle2; if ( d_data->startAngle == d_data->endAngle ) { d_data->startAngle -= 1; d_data->endAngle += 1; } scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle ); } /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone() */ void QwtRoundScaleDraw::drawLabel( QPainter *painter, double value ) const { const QwtText label = tickLabel( painter->font(), value ); if ( label.isEmpty() ) return; const double tval = scaleMap().transform( value ); if ( ( tval >= d_data->startAngle + 360.0 ) || ( tval <= d_data->startAngle - 360.0 ) ) { return; } double radius = d_data->radius; if ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) { radius += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) radius += tickLength( QwtScaleDiv::MajorTick ); const QSizeF sz = label.textSize( painter->font() ); const double arc = qwtRadians( tval ); const double x = d_data->center.x() + ( radius + sz.width() / 2.0 ) * qSin( arc ); const double y = d_data->center.y() - ( radius + sz.height() / 2.0 ) * qCos( arc ); const QRectF r( x - sz.width() / 2, y - sz.height() / 2, sz.width(), sz.height() ); label.draw( painter, r ); } /*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ void QwtRoundScaleDraw::drawTick( QPainter *painter, double value, double len ) const { if ( len <= 0 ) return; const double tval = scaleMap().transform( value ); const double cx = d_data->center.x(); const double cy = d_data->center.y(); const double radius = d_data->radius; if ( ( tval < d_data->startAngle + 360.0 ) || ( tval > d_data->startAngle - 360.0 ) ) { const double arc = qwtRadians( tval ); const double sinArc = qSin( arc ); const double cosArc = qCos( arc ); const double x1 = cx + radius * sinArc; const double x2 = cx + ( radius + len ) * sinArc; const double y1 = cy - radius * cosArc; const double y2 = cy - ( radius + len ) * cosArc; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); } } /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ void QwtRoundScaleDraw::drawBackbone( QPainter *painter ) const { const double deg1 = scaleMap().p1(); const double deg2 = scaleMap().p2(); const int a1 = qRound( qMin( deg1, deg2 ) - 90 ); const int a2 = qRound( qMax( deg1, deg2 ) - 90 ); const double radius = d_data->radius; const double x = d_data->center.x() - radius; const double y = d_data->center.y() - radius; painter->drawArc( QRectF( x, y, 2 * radius, 2 * radius ), -a2 * 16, ( a2 - a1 + 1 ) * 16 ); // counterclockwise } /*! Calculate the extent of the scale The extent is the distance between the baseline to the outermost pixel of the scale draw. radius() + extent() is an upper limit for the radius of the bounding circle. \param font Font used for painting the labels \return Calculated extent \sa setMinimumExtent(), minimumExtent() \warning The implemented algorithm is not too smart and calculates only an upper limit, that might be a few pixels too large */ double QwtRoundScaleDraw::extent( const QFont &font ) const { double d = 0.0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { const QwtScaleDiv &sd = scaleDiv(); const QList &ticks = sd.ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.count(); i++ ) { const double value = ticks[i]; if ( !sd.contains( value ) ) continue; const QwtText label = tickLabel( font, value ); if ( label.isEmpty() ) continue; const double tval = scaleMap().transform( value ); if ( ( tval < d_data->startAngle + 360 ) && ( tval > d_data->startAngle - 360 ) ) { const double arc = qwtRadians( tval ); const QSizeF sz = label.textSize( font ); const double off = qMax( sz.width(), sz.height() ); double x = off * qSin( arc ); double y = off * qCos( arc ); const double dist = qSqrt( x * x + y * y ); if ( dist > d ) d = dist; } } } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += maxTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // pen width can be zero d += pw; } if ( hasComponent( QwtAbstractScaleDraw::Labels ) && ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) ) { d += spacing(); } d = qMax( d, minimumExtent() ); return d; } linssid-2.7/qwt-lib/src/qwt_plot_svgitem.cpp000644 001750 001750 00000011575 12151666703 022166 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_svgitem.h" #include "qwt_scale_map.h" #include "qwt_painter.h" #include #include class QwtPlotSvgItem::PrivateData { public: PrivateData() { } QRectF boundingRect; QSvgRenderer renderer; }; /*! \brief Constructor Sets the following item attributes: - QwtPlotItem::AutoScale: true - QwtPlotItem::Legend: false \param title Title */ QwtPlotSvgItem::QwtPlotSvgItem( const QString& title ): QwtPlotItem( QwtText( title ) ) { init(); } /*! \brief Constructor Sets the following item attributes: - QwtPlotItem::AutoScale: true - QwtPlotItem::Legend: false \param title Title */ QwtPlotSvgItem::QwtPlotSvgItem( const QwtText& title ): QwtPlotItem( title ) { init(); } //! Destructor QwtPlotSvgItem::~QwtPlotSvgItem() { delete d_data; } void QwtPlotSvgItem::init() { d_data = new PrivateData(); d_data->boundingRect = QwtPlotItem::boundingRect(); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 8.0 ); } //! \return QwtPlotItem::Rtti_PlotSVG int QwtPlotSvgItem::rtti() const { return QwtPlotItem::Rtti_PlotSVG; } /*! Load a SVG file \param rect Bounding rectangle \param fileName SVG file name \return true, if the SVG file could be loaded */ bool QwtPlotSvgItem::loadFile( const QRectF &rect, const QString &fileName ) { d_data->boundingRect = rect; const bool ok = d_data->renderer.load( fileName ); legendChanged(); itemChanged(); return ok; } /*! Load SVG data \param rect Bounding rectangle \param data in SVG format \return true, if the SVG data could be loaded */ bool QwtPlotSvgItem::loadData( const QRectF &rect, const QByteArray &data ) { d_data->boundingRect = rect; const bool ok = d_data->renderer.load( data ); legendChanged(); itemChanged(); return ok; } //! Bounding rectangle of the item QRectF QwtPlotSvgItem::boundingRect() const { return d_data->boundingRect; } //! \return Renderer used to render the SVG data const QSvgRenderer &QwtPlotSvgItem::renderer() const { return d_data->renderer; } //! \return Renderer used to render the SVG data QSvgRenderer &QwtPlotSvgItem::renderer() { return d_data->renderer; } /*! Draw the SVG item \param painter Painter \param xMap X-Scale Map \param yMap Y-Scale Map \param canvasRect Contents rect of the plot canvas */ void QwtPlotSvgItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { const QRectF cRect = QwtScaleMap::invTransform( xMap, yMap, canvasRect.toRect() ); const QRectF bRect = boundingRect(); if ( bRect.isValid() && cRect.isValid() ) { QRectF rect = bRect; if ( bRect.contains( cRect ) ) rect = cRect; const QRectF r = QwtScaleMap::transform( xMap, yMap, rect ); render( painter, viewBox( rect ), r ); } } /*! Render the SVG data \param painter Painter \param viewBox View Box, see QSvgRenderer::viewBox() \param rect Target rectangle on the paint device */ void QwtPlotSvgItem::render( QPainter *painter, const QRectF &viewBox, const QRectF &rect ) const { if ( !viewBox.isValid() ) return; QRectF r = rect; if ( QwtPainter::roundingAlignment( painter ) ) { r.setLeft ( qRound( r.left() ) ); r.setRight ( qRound( r.right() ) ); r.setTop ( qRound( r.top() ) ); r.setBottom ( qRound( r.bottom() ) ); } d_data->renderer.setViewBox( viewBox ); d_data->renderer.render( painter, r ); } /*! Calculate the view box from rect and boundingRect(). \param rect Rectangle in scale coordinates \return View box, see QSvgRenderer::viewBox() */ QRectF QwtPlotSvgItem::viewBox( const QRectF &rect ) const { const QSize sz = d_data->renderer.defaultSize(); const QRectF br = boundingRect(); if ( !rect.isValid() || !br.isValid() || sz.isNull() ) return QRectF(); QwtScaleMap xMap; xMap.setScaleInterval( br.left(), br.right() ); xMap.setPaintInterval( 0, sz.width() ); QwtScaleMap yMap; yMap.setScaleInterval( br.top(), br.bottom() ); yMap.setPaintInterval( sz.height(), 0 ); const double x1 = xMap.transform( rect.left() ); const double x2 = xMap.transform( rect.right() ); const double y1 = yMap.transform( rect.bottom() ); const double y2 = yMap.transform( rect.top() ); return QRectF( x1, y1, x2 - x1, y2 - y1 ); } linssid-2.7/linssid-app/passBox.cpp000664 001750 001750 00000001645 12355414341 020245 0ustar00warrenwarren000000 000000 /* * File: passBox.cpp * Author: warren * * Created on December 2, 2012, 9:57 AM */ #include "passBox.h" extern std::string password; extern passStatus pwStatus; using namespace std; passBox::passBox() { widget.setupUi(this); connect( widget.passBtnBox, SIGNAL(accepted()), this, SLOT(passBtnAccept())); connect( widget.passBtnBox, SIGNAL(rejected()), this, SLOT(passBtnReject())); pwStatus = CANCELLED; } passBox::~passBox() { } void passBox::passBtnAccept() { password = passBox::widget.passEntry->text().toStdString(); // test it with system call to sudo string cmdLine = "echo '" + password + "' | sudo -kSv -p \"\""; int rc = system(cmdLine.c_str()); if (rc == 0) pwStatus = GOOD; else pwStatus = BAD; } void passBox::passBtnReject() { pwStatus = CANCELLED; } void passBox::setPassPrompt(string passPrompt) { passBox::widget.passLabel->setText(passPrompt.c_str()); } linssid-2.7/qwt-lib/src/qwt_widget_overlay.h000644 001750 001750 00000007761 12151666701 022143 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_WIDGET_OVERLAY_H #define QWT_WIDGET_OVERLAY_H #include "qwt_global.h" #include #include class QPainter; /*! \brief An overlay for a widget The main use case of an widget overlay is to avoid heavy repaint operation of the widget below. F.e. in combination with the plot canvas an overlay avoid replots as the content of the canvas can be restored from its backing store. QwtWidgetOverlay is an abstract base class. Deriving classes are supposed to reimplement the following methods: - drawOverlay() - maskHint() Internally QwtPlotPicker uses overlays for displaying the rubber band and the tracker text. \sa QwtPlotCanvas::BackingStore */ class QWT_EXPORT QwtWidgetOverlay: public QWidget { public: /*! \brief Mask mode When using masks the widget below gets paint events for the masked regions of the overlay only. Otherwise Qt triggers full repaints. On less powerful hardware ( f.e embedded systems ) - or when using the raster paint engine on a remote desktop - bit blitting is a noticeable operation, that needs to be avoided. If and how to mask depends on how expensive the calculation of the mask is and how many pixels can be excluded by the mask. The default setting is MaskHint. \sa setMaskMode(), maskMode() */ enum MaskMode { //! Don't use a mask. NoMask, /*! \brief Use maskHint() as mask For many situations a fast approximation is good enough and it is not necessary to build a more detailed mask ( f.e the bounding rectangle of a text ). */ MaskHint, /*! \brief Calculate a mask by checking the alpha values Sometimes it is not possible to give a fast approximation and the mask needs to be calculated by drawing the overlay and testing the result. When a valid maskHint() is available only pixels inside this approximation are checked. */ AlphaMask }; /*! \brief Render mode For calculating the alpha mask the overlay has already been painted to a temporary QImage. Instead of rendering the overlay twice this buffer can be copied for drawing the overlay. On graphic systems using the raster paint engine ( QWS, Windows ) it means usually copying some memory only. On X11 it results in an expensive operation building a pixmap and for simple overlays it might not be recommended. \note The render mode has no effect, when maskMode() != AlphaMask. */ enum RenderMode { //! Copy the buffer, when using the raster paint engine. AutoRenderMode, //! Always copy the buffer CopyAlphaMask, //! Never copy the buffer DrawOverlay }; QwtWidgetOverlay( QWidget* ); virtual ~QwtWidgetOverlay(); void setMaskMode( MaskMode ); MaskMode maskMode() const; void setRenderMode( RenderMode ); RenderMode renderMode() const; void updateOverlay(); virtual bool eventFilter( QObject *, QEvent *); protected: virtual void paintEvent( QPaintEvent* event ); virtual void resizeEvent( QResizeEvent* event ); virtual QRegion maskHint() const; /*! Draw the widget overlay \param painter Painter */ virtual void drawOverlay( QPainter *painter ) const = 0; private: void updateMask(); void draw( QPainter * ) const; private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_abstract_legend.h000644 001750 001750 00000003763 12151666701 022236 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_LEGEND_H #define QWT_ABSTRACT_LEGEND_H #include "qwt_global.h" #include "qwt_legend_data.h" #include #include class QVariant; /*! \brief Abstract base class for legend widgets Legends, that need to be under control of the QwtPlot layout system need to be derived from QwtAbstractLegend. \note Other type of legends can be implemented by connecting to the QwtPlot::legendDataChanged() signal. But as these legends are unknown to the plot layout system the layout code ( on screen and for QwtPlotRenderer ) need to be organized in application code. \sa QwtLegend */ class QWT_EXPORT QwtAbstractLegend : public QFrame { Q_OBJECT public: explicit QwtAbstractLegend( QWidget *parent = NULL ); virtual ~QwtAbstractLegend(); /*! Render the legend into a given rectangle. \param painter Painter \param rect Bounding rectangle \param fillBackground When true, fill rect with the widget background \sa renderLegend() is used by QwtPlotRenderer */ virtual void renderLegend( QPainter *painter, const QRectF &rect, bool fillBackground ) const = 0; //! \return True, when no plot item is inserted virtual bool isEmpty() const = 0; virtual int scrollExtent( Qt::Orientation ) const; public Q_SLOTS: /*! \brief Update the entries for a plot item \param itemInfo Info about an item \param data List of legend entry attributes for the item */ virtual void updateLegend( const QVariant &itemInfo, const QList &data ) = 0; }; #endif linssid-2.7/qwt-lib/src/qwt_legend_label.h000644 001750 001750 00000003660 12151666701 021506 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_LABEL_H #define QWT_LEGEND_LABEL_H #include "qwt_global.h" #include "qwt_legend_data.h" #include "qwt_text.h" #include "qwt_text_label.h" #include class QwtLegendData; /*! \brief A widget representing something on a QwtLegend. */ class QWT_EXPORT QwtLegendLabel: public QwtTextLabel { Q_OBJECT public: explicit QwtLegendLabel( QWidget *parent = 0 ); virtual ~QwtLegendLabel(); void setData( const QwtLegendData & ); const QwtLegendData &data() const; void setItemMode( QwtLegendData::Mode ); QwtLegendData::Mode itemMode() const; void setSpacing( int spacing ); int spacing() const; virtual void setText( const QwtText & ); void setIcon( const QPixmap & ); QPixmap icon() const; virtual QSize sizeHint() const; bool isChecked() const; public Q_SLOTS: void setChecked( bool on ); Q_SIGNALS: //! Signal, when the legend item has been clicked void clicked(); //! Signal, when the legend item has been pressed void pressed(); //! Signal, when the legend item has been released void released(); //! Signal, when the legend item has been toggled void checked( bool ); protected: void setDown( bool ); bool isDown() const; virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void keyReleaseEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_scale_widget.cpp000644 001750 001750 00000054200 12151666703 022074 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_widget.h" #include "qwt_painter.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include "qwt_scale_div.h" #include "qwt_text.h" #include "qwt_scale_engine.h" #include #include #include #include #include class QwtScaleWidget::PrivateData { public: PrivateData(): scaleDraw( NULL ) { colorBar.colorMap = NULL; } ~PrivateData() { delete scaleDraw; delete colorBar.colorMap; } QwtScaleDraw *scaleDraw; int borderDist[2]; int minBorderDist[2]; int scaleLength; int margin; int titleOffset; int spacing; QwtText title; QwtScaleWidget::LayoutFlags layoutFlags; struct t_colorBar { bool isEnabled; int width; QwtInterval interval; QwtColorMap *colorMap; } colorBar; }; /*! \brief Create a scale with the position QwtScaleWidget::Left \param parent Parent widget */ QwtScaleWidget::QwtScaleWidget( QWidget *parent ): QWidget( parent ) { initScale( QwtScaleDraw::LeftScale ); } /*! \brief Constructor \param align Alignment. \param parent Parent widget */ QwtScaleWidget::QwtScaleWidget( QwtScaleDraw::Alignment align, QWidget *parent ): QWidget( parent ) { initScale( align ); } //! Destructor QwtScaleWidget::~QwtScaleWidget() { delete d_data; } //! Initialize the scale void QwtScaleWidget::initScale( QwtScaleDraw::Alignment align ) { d_data = new PrivateData; d_data->layoutFlags = 0; if ( align == QwtScaleDraw::RightScale ) d_data->layoutFlags |= TitleInverted; d_data->borderDist[0] = 0; d_data->borderDist[1] = 0; d_data->minBorderDist[0] = 0; d_data->minBorderDist[1] = 0; d_data->margin = 4; d_data->titleOffset = 0; d_data->spacing = 2; d_data->scaleDraw = new QwtScaleDraw; d_data->scaleDraw->setAlignment( align ); d_data->scaleDraw->setLength( 10 ); d_data->scaleDraw->setScaleDiv( QwtLinearScaleEngine().divideScale( 0.0, 100.0, 10, 5 ) ); d_data->colorBar.colorMap = new QwtLinearColorMap(); d_data->colorBar.isEnabled = false; d_data->colorBar.width = 10; const int flags = Qt::AlignHCenter | Qt::TextExpandTabs | Qt::TextWordWrap; d_data->title.setRenderFlags( flags ); d_data->title.setFont( font() ); QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->scaleDraw->orientation() == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } /*! Toggle an layout flag \param flag Layout flag \param on true/false \sa testLayoutFlag(), LayoutFlag */ void QwtScaleWidget::setLayoutFlag( LayoutFlag flag, bool on ) { if ( ( ( d_data->layoutFlags & flag ) != 0 ) != on ) { if ( on ) d_data->layoutFlags |= flag; else d_data->layoutFlags &= ~flag; } } /*! Test a layout flag \param flag Layout flag \return true/false \sa setLayoutFlag(), LayoutFlag */ bool QwtScaleWidget::testLayoutFlag( LayoutFlag flag ) const { return ( d_data->layoutFlags & flag ); } /*! Give title new text contents \param title New title \sa title(), setTitle(const QwtText &); */ void QwtScaleWidget::setTitle( const QString &title ) { if ( d_data->title.text() != title ) { d_data->title.setText( title ); layoutScale(); } } /*! Give title new text contents \param title New title \sa title() \warning The title flags are interpreted in direction of the label, AlignTop, AlignBottom can't be set as the title will always be aligned to the scale. */ void QwtScaleWidget::setTitle( const QwtText &title ) { QwtText t = title; const int flags = title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom ); t.setRenderFlags( flags ); if ( t != d_data->title ) { d_data->title = t; layoutScale(); } } /*! Change the alignment \param alignment New alignment \sa alignment() */ void QwtScaleWidget::setAlignment( QwtScaleDraw::Alignment alignment ) { if ( d_data->scaleDraw ) d_data->scaleDraw->setAlignment( alignment ); if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->scaleDraw->orientation() == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } layoutScale(); } /*! \return position \sa setPosition() */ QwtScaleDraw::Alignment QwtScaleWidget::alignment() const { if ( !scaleDraw() ) return QwtScaleDraw::LeftScale; return scaleDraw()->alignment(); } /*! Specify distances of the scale's endpoints from the widget's borders. The actual borders will never be less than minimum border distance. \param dist1 Left or top Distance \param dist2 Right or bottom distance \sa borderDist() */ void QwtScaleWidget::setBorderDist( int dist1, int dist2 ) { if ( dist1 != d_data->borderDist[0] || dist2 != d_data->borderDist[1] ) { d_data->borderDist[0] = dist1; d_data->borderDist[1] = dist2; layoutScale(); } } /*! \brief Specify the margin to the colorBar/base line. \param margin Margin \sa margin() */ void QwtScaleWidget::setMargin( int margin ) { margin = qMax( 0, margin ); if ( margin != d_data->margin ) { d_data->margin = margin; layoutScale(); } } /*! \brief Specify the distance between color bar, scale and title \param spacing Spacing \sa spacing() */ void QwtScaleWidget::setSpacing( int spacing ) { spacing = qMax( 0, spacing ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; layoutScale(); } } /*! \brief Change the alignment for the labels. \sa QwtScaleDraw::setLabelAlignment(), setLabelRotation() */ void QwtScaleWidget::setLabelAlignment( Qt::Alignment alignment ) { d_data->scaleDraw->setLabelAlignment( alignment ); layoutScale(); } /*! \brief Change the rotation for the labels. See QwtScaleDraw::setLabelRotation(). \param rotation Rotation \sa QwtScaleDraw::setLabelRotation(), setLabelFlags() */ void QwtScaleWidget::setLabelRotation( double rotation ) { d_data->scaleDraw->setLabelRotation( rotation ); layoutScale(); } /*! Set a scale draw scaleDraw has to be created with new and will be deleted in ~QwtScaleWidget() or the next call of setScaleDraw(). scaleDraw will be initialized with the attributes of the previous scaleDraw object. \param scaleDraw ScaleDraw object \sa scaleDraw() */ void QwtScaleWidget::setScaleDraw( QwtScaleDraw *scaleDraw ) { if ( ( scaleDraw == NULL ) || ( scaleDraw == d_data->scaleDraw ) ) return; const QwtScaleDraw* sd = d_data->scaleDraw; if ( sd ) { scaleDraw->setAlignment( sd->alignment() ); scaleDraw->setScaleDiv( sd->scaleDiv() ); QwtTransform *transform = NULL; if ( sd->scaleMap().transformation() ) transform = sd->scaleMap().transformation()->copy(); scaleDraw->setTransformation( transform ); } delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; layoutScale(); } /*! \return scaleDraw of this scale \sa setScaleDraw(), QwtScaleDraw::setScaleDraw() */ const QwtScaleDraw *QwtScaleWidget::scaleDraw() const { return d_data->scaleDraw; } /*! \return scaleDraw of this scale \sa QwtScaleDraw::setScaleDraw() */ QwtScaleDraw *QwtScaleWidget::scaleDraw() { return d_data->scaleDraw; } /*! \return title \sa setTitle() */ QwtText QwtScaleWidget::title() const { return d_data->title; } /*! \return start border distance \sa setBorderDist() */ int QwtScaleWidget::startBorderDist() const { return d_data->borderDist[0]; } /*! \return end border distance \sa setBorderDist() */ int QwtScaleWidget::endBorderDist() const { return d_data->borderDist[1]; } /*! \return margin \sa setMargin() */ int QwtScaleWidget::margin() const { return d_data->margin; } /*! \return distance between scale and title \sa setMargin() */ int QwtScaleWidget::spacing() const { return d_data->spacing; } /*! \brief paintEvent */ void QwtScaleWidget::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); QStyleOption opt; opt.init(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); draw( &painter ); } /*! \brief draw the scale */ void QwtScaleWidget::draw( QPainter *painter ) const { d_data->scaleDraw->draw( painter, palette() ); if ( d_data->colorBar.isEnabled && d_data->colorBar.width > 0 && d_data->colorBar.interval.isValid() ) { drawColorBar( painter, colorBarRect( contentsRect() ) ); } QRect r = contentsRect(); if ( d_data->scaleDraw->orientation() == Qt::Horizontal ) { r.setLeft( r.left() + d_data->borderDist[0] ); r.setWidth( r.width() - d_data->borderDist[1] ); } else { r.setTop( r.top() + d_data->borderDist[0] ); r.setHeight( r.height() - d_data->borderDist[1] ); } if ( !d_data->title.isEmpty() ) drawTitle( painter, d_data->scaleDraw->alignment(), r ); } /*! Calculate the the rectangle for the color bar \param rect Bounding rectangle for all components of the scale \return Rectangle for the color bar */ QRectF QwtScaleWidget::colorBarRect( const QRectF& rect ) const { QRectF cr = rect; if ( d_data->scaleDraw->orientation() == Qt::Horizontal ) { cr.setLeft( cr.left() + d_data->borderDist[0] ); cr.setWidth( cr.width() - d_data->borderDist[1] + 1 ); } else { cr.setTop( cr.top() + d_data->borderDist[0] ); cr.setHeight( cr.height() - d_data->borderDist[1] + 1 ); } switch ( d_data->scaleDraw->alignment() ) { case QwtScaleDraw::LeftScale: { cr.setLeft( cr.right() - d_data->margin - d_data->colorBar.width ); cr.setWidth( d_data->colorBar.width ); break; } case QwtScaleDraw::RightScale: { cr.setLeft( cr.left() + d_data->margin ); cr.setWidth( d_data->colorBar.width ); break; } case QwtScaleDraw::BottomScale: { cr.setTop( cr.top() + d_data->margin ); cr.setHeight( d_data->colorBar.width ); break; } case QwtScaleDraw::TopScale: { cr.setTop( cr.bottom() - d_data->margin - d_data->colorBar.width ); cr.setHeight( d_data->colorBar.width ); break; } } return cr; } /*! Event handler for resize events \param event Resize event */ void QwtScaleWidget::resizeEvent( QResizeEvent *event ) { Q_UNUSED( event ); layoutScale( false ); } /*! Recalculate the scale's geometry and layout based on the current geometry and fonts. \param update_geometry Notify the layout system and call update to redraw the scale */ void QwtScaleWidget::layoutScale( bool update_geometry ) { int bd0, bd1; getBorderDistHint( bd0, bd1 ); if ( d_data->borderDist[0] > bd0 ) bd0 = d_data->borderDist[0]; if ( d_data->borderDist[1] > bd1 ) bd1 = d_data->borderDist[1]; int colorBarWidth = 0; if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() ) colorBarWidth = d_data->colorBar.width + d_data->spacing; const QRectF r = contentsRect(); double x, y, length; if ( d_data->scaleDraw->orientation() == Qt::Vertical ) { y = r.top() + bd0; length = r.height() - ( bd0 + bd1 ); if ( d_data->scaleDraw->alignment() == QwtScaleDraw::LeftScale ) x = r.right() - 1.0 - d_data->margin - colorBarWidth; else x = r.left() + d_data->margin + colorBarWidth; } else { x = r.left() + bd0; length = r.width() - ( bd0 + bd1 ); if ( d_data->scaleDraw->alignment() == QwtScaleDraw::BottomScale ) y = r.top() + d_data->margin + colorBarWidth; else y = r.bottom() - 1.0 - d_data->margin - colorBarWidth; } d_data->scaleDraw->move( x, y ); d_data->scaleDraw->setLength( length ); const int extent = qCeil( d_data->scaleDraw->extent( font() ) ); d_data->titleOffset = d_data->margin + d_data->spacing + colorBarWidth + extent; if ( update_geometry ) { updateGeometry(); update(); } } /*! Draw the color bar of the scale widget \param painter Painter \param rect Bounding rectangle for the color bar \sa setColorBarEnabled() */ void QwtScaleWidget::drawColorBar( QPainter *painter, const QRectF& rect ) const { if ( !d_data->colorBar.interval.isValid() ) return; const QwtScaleDraw* sd = d_data->scaleDraw; QwtPainter::drawColorBar( painter, *d_data->colorBar.colorMap, d_data->colorBar.interval.normalized(), sd->scaleMap(), sd->orientation(), rect ); } /*! Rotate and paint a title according to its position into a given rectangle. \param painter Painter \param align Alignment \param rect Bounding rectangle */ void QwtScaleWidget::drawTitle( QPainter *painter, QwtScaleDraw::Alignment align, const QRectF &rect ) const { QRectF r = rect; double angle; int flags = d_data->title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom | Qt::AlignVCenter ); switch ( align ) { case QwtScaleDraw::LeftScale: angle = -90.0; flags |= Qt::AlignTop; r.setRect( r.left(), r.bottom(), r.height(), r.width() - d_data->titleOffset ); break; case QwtScaleDraw::RightScale: angle = -90.0; flags |= Qt::AlignTop; r.setRect( r.left() + d_data->titleOffset, r.bottom(), r.height(), r.width() - d_data->titleOffset ); break; case QwtScaleDraw::BottomScale: angle = 0.0; flags |= Qt::AlignBottom; r.setTop( r.top() + d_data->titleOffset ); break; case QwtScaleDraw::TopScale: default: angle = 0.0; flags |= Qt::AlignTop; r.setBottom( r.bottom() - d_data->titleOffset ); break; } if ( d_data->layoutFlags & TitleInverted ) { if ( align == QwtScaleDraw::LeftScale || align == QwtScaleDraw::RightScale ) { angle = -angle; r.setRect( r.x() + r.height(), r.y() - r.width(), r.width(), r.height() ); } } painter->save(); painter->setFont( font() ); painter->setPen( palette().color( QPalette::Text ) ); painter->translate( r.x(), r.y() ); if ( angle != 0.0 ) painter->rotate( angle ); QwtText title = d_data->title; title.setRenderFlags( flags ); title.draw( painter, QRectF( 0.0, 0.0, r.width(), r.height() ) ); painter->restore(); } /*! \brief Notify a change of the scale This virtual function can be overloaded by derived classes. The default implementation updates the geometry and repaints the widget. */ void QwtScaleWidget::scaleChange() { layoutScale(); } /*! \return a size hint */ QSize QwtScaleWidget::sizeHint() const { return minimumSizeHint(); } /*! \return a minimum size hint */ QSize QwtScaleWidget::minimumSizeHint() const { const Qt::Orientation o = d_data->scaleDraw->orientation(); // Border Distance cannot be less than the scale borderDistHint // Note, the borderDistHint is already included in minHeight/minWidth int length = 0; int mbd1, mbd2; getBorderDistHint( mbd1, mbd2 ); length += qMax( 0, d_data->borderDist[0] - mbd1 ); length += qMax( 0, d_data->borderDist[1] - mbd2 ); length += d_data->scaleDraw->minLength( font() ); int dim = dimForLength( length, font() ); if ( length < dim ) { // compensate for long titles length = dim; dim = dimForLength( length, font() ); } QSize size( length + 2, dim ); if ( o == Qt::Vertical ) size.transpose(); int left, right, top, bottom; getContentsMargins( &left, &top, &right, &bottom ); return size + QSize( left + right, top + bottom ); } /*! \brief Find the height of the title for a given width. \param width Width \return height Height */ int QwtScaleWidget::titleHeightForWidth( int width ) const { return qCeil( d_data->title.heightForWidth( width, font() ) ); } /*! \brief Find the minimum dimension for a given length. dim is the height, length the width seen in direction of the title. \param length width for horizontal, height for vertical scales \param scaleFont Font of the scale \return height for horizontal, width for vertical scales */ int QwtScaleWidget::dimForLength( int length, const QFont &scaleFont ) const { const int extent = qCeil( d_data->scaleDraw->extent( scaleFont ) ); int dim = d_data->margin + extent + 1; if ( !d_data->title.isEmpty() ) dim += titleHeightForWidth( length ) + d_data->spacing; if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() ) dim += d_data->colorBar.width + d_data->spacing; return dim; } /*! \brief Calculate a hint for the border distances. This member function calculates the distance of the scale's endpoints from the widget borders which is required for the mark labels to fit into the widget. The maximum of this distance an the minimum border distance is returned. \param start Return parameter for the border width at the beginning of the scale \param end Return parameter for the border width at the end of the scale \warning
  • The minimum border distance depends on the font.
\sa setMinBorderDist(), getMinBorderDist(), setBorderDist() */ void QwtScaleWidget::getBorderDistHint( int &start, int &end ) const { d_data->scaleDraw->getBorderDistHint( font(), start, end ); if ( start < d_data->minBorderDist[0] ) start = d_data->minBorderDist[0]; if ( end < d_data->minBorderDist[1] ) end = d_data->minBorderDist[1]; } /*! Set a minimum value for the distances of the scale's endpoints from the widget borders. This is useful to avoid that the scales are "jumping", when the tick labels or their positions change often. \param start Minimum for the start border \param end Minimum for the end border \sa getMinBorderDist(), getBorderDistHint() */ void QwtScaleWidget::setMinBorderDist( int start, int end ) { d_data->minBorderDist[0] = start; d_data->minBorderDist[1] = end; } /*! Get the minimum value for the distances of the scale's endpoints from the widget borders. \param start Return parameter for the border width at the beginning of the scale \param end Return parameter for the border width at the end of the scale \sa setMinBorderDist(), getBorderDistHint() */ void QwtScaleWidget::getMinBorderDist( int &start, int &end ) const { start = d_data->minBorderDist[0]; end = d_data->minBorderDist[1]; } /*! \brief Assign a scale division The scale division determines where to set the tick marks. \param scaleDiv Scale Division \sa For more information about scale divisions, see QwtScaleDiv. */ void QwtScaleWidget::setScaleDiv( const QwtScaleDiv &scaleDiv ) { QwtScaleDraw *sd = d_data->scaleDraw; if ( sd->scaleDiv() != scaleDiv ) { sd->setScaleDiv( scaleDiv ); layoutScale(); Q_EMIT scaleDivChanged(); } } /*! Set the transformation \param transformation Transformation \sa QwtAbstractScaleDraw::scaleDraw(), QwtScaleMap */ void QwtScaleWidget::setTransformation( QwtTransform *transformation ) { d_data->scaleDraw->setTransformation( transformation ); layoutScale(); } /*! En/disable a color bar associated to the scale \sa isColorBarEnabled(), setColorBarWidth() */ void QwtScaleWidget::setColorBarEnabled( bool on ) { if ( on != d_data->colorBar.isEnabled ) { d_data->colorBar.isEnabled = on; layoutScale(); } } /*! \return true, when the color bar is enabled \sa setColorBarEnabled(), setColorBarWidth() */ bool QwtScaleWidget::isColorBarEnabled() const { return d_data->colorBar.isEnabled; } /*! Set the width of the color bar \param width Width \sa colorBarWidth(), setColorBarEnabled() */ void QwtScaleWidget::setColorBarWidth( int width ) { if ( width != d_data->colorBar.width ) { d_data->colorBar.width = width; if ( isColorBarEnabled() ) layoutScale(); } } /*! \return Width of the color bar \sa setColorBarEnabled(), setColorBarEnabled() */ int QwtScaleWidget::colorBarWidth() const { return d_data->colorBar.width; } /*! \return Value interval for the color bar \sa setColorMap(), colorMap() */ QwtInterval QwtScaleWidget::colorBarInterval() const { return d_data->colorBar.interval; } /*! Set the color map and value interval, that are used for displaying the color bar. \param interval Value interval \param colorMap Color map \sa colorMap(), colorBarInterval() */ void QwtScaleWidget::setColorMap( const QwtInterval &interval, QwtColorMap *colorMap ) { d_data->colorBar.interval = interval; if ( colorMap != d_data->colorBar.colorMap ) { delete d_data->colorBar.colorMap; d_data->colorBar.colorMap = colorMap; } if ( isColorBarEnabled() ) layoutScale(); } /*! \return Color map \sa setColorMap(), colorBarInterval() */ const QwtColorMap *QwtScaleWidget::colorMap() const { return d_data->colorBar.colorMap; } linssid-2.7/qwt-lib/textengines/mathml/qwtmathml.prf000644 001750 001750 00000001660 12151666676 023635 0ustar00warrenwarren000000 000000 ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################ include ( ./qwtconfig.pri ) contains(QWT_CONFIG, QwtDll) { DEFINES *= QWT_DLL } QT *= xml contains(QWT_CONFIG, QwtFramework) { INCLUDEPATH *= $${QWT_INSTALL_LIBS}/qwtmathml.framework/Headers LIBS *= -F$${QWT_INSTALL_LIBS} } else { INCLUDEPATH *= $${QWT_INSTALL_HEADERS} LIBS *= -L$${QWT_INSTALL_LIBS} } INCLUDEPATH_QWTMATHML = $${INCLUDEPATH} qtAddLibrary(qwtmathml) # we don't want qtAddLibrary to expand the # include path, with directories, that might # conflict with other installations of qwt INCLUDEPATH = $${INCLUDEPATH_QWTMATHML} linssid-2.7/qwt-lib/src/qwt_knob.h000644 001750 001750 00000011240 12151666701 020033 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_KNOB_H #define QWT_KNOB_H #include "qwt_global.h" #include "qwt_abstract_slider.h" class QwtRoundScaleDraw; /*! \brief The Knob Widget The QwtKnob widget imitates look and behavior of a volume knob on a radio. It looks similar to QDial - not to QwtDial. The value range of a knob might be divided into several turns. The layout of the knob depends on the knobWidth(). - width > 0 The diameter of the knob is fixed and the knob is aligned according to the alignment() flags inside of the contentsRect(). - width <= 0 The knob is extended to the minimum of width/height of the contentsRect() and aligned in the other direction according to alignment(). Setting a fixed knobWidth() is helpful to align several knobs with different scale labels. \image html knob.png */ class QWT_EXPORT QwtKnob: public QwtAbstractSlider { Q_OBJECT Q_ENUMS ( KnobStyle MarkerStyle ) Q_PROPERTY( KnobStyle knobStyle READ knobStyle WRITE setKnobStyle ) Q_PROPERTY( int knobWidth READ knobWidth WRITE setKnobWidth ) Q_PROPERTY( Qt::Alignment alignment READ alignment WRITE setAlignment ) Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle ) Q_PROPERTY( int numTurns READ numTurns WRITE setNumTurns ) Q_PROPERTY( MarkerStyle markerStyle READ markerStyle WRITE setMarkerStyle ) Q_PROPERTY( int markerSize READ markerSize WRITE setMarkerSize ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) public: /*! \brief Style of the knob surface Depending on the KnobStyle the surface of the knob is filled from the brushes of the widget palette(). \sa setKnobStyle(), knobStyle() */ enum KnobStyle { //! Fill the knob with a brush from QPalette::Button. Flat, //! Build a gradient from QPalette::Midlight and QPalette::Button Raised, /*! Build a gradient from QPalette::Midlight, QPalette::Button and QPalette::Midlight */ Sunken, /*! Build a radial gradient from QPalette::Button like it is used for QDial in various Qt styles. */ Styled }; /*! \brief Marker type The marker indicates the current value on the knob The default setting is a Notch marker. \sa setMarkerStyle(), setMarkerSize() */ enum MarkerStyle { //! Don't paint any marker NoMarker = -1, //! Paint a single tick in QPalette::ButtonText color Tick, //! Paint a triangle in QPalette::ButtonText color Triangle, //! Paint a circle in QPalette::ButtonText color Dot, /*! Draw a raised ellipse with a gradient build from QPalette::Light and QPalette::Mid */ Nub, /*! Draw a sunken ellipse with a gradient build from QPalette::Light and QPalette::Mid */ Notch }; explicit QwtKnob( QWidget* parent = NULL ); virtual ~QwtKnob(); void setAlignment( Qt::Alignment ); Qt::Alignment alignment() const; void setKnobWidth( int ); int knobWidth() const; void setNumTurns( int ); int numTurns() const; void setTotalAngle ( double angle ); double totalAngle() const; void setKnobStyle( KnobStyle ); KnobStyle knobStyle() const; void setBorderWidth( int bw ); int borderWidth() const; void setMarkerStyle( MarkerStyle ); MarkerStyle markerStyle() const; void setMarkerSize( int ); int markerSize() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtRoundScaleDraw * ); const QwtRoundScaleDraw *scaleDraw() const; QwtRoundScaleDraw *scaleDraw(); QRect knobRect() const; protected: virtual void paintEvent( QPaintEvent * ); virtual void changeEvent( QEvent * ); virtual void drawKnob( QPainter *, const QRectF & ) const; virtual void drawFocusIndicator( QPainter * ) const; virtual void drawMarker( QPainter *, const QRectF &, double arc ) const; virtual double scrolledTo( const QPoint & ) const; virtual bool isScrollPosition( const QPoint & ) const; private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_curve_fitter.h000644 001750 001750 00000007270 12151666701 021613 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_CURVE_FITTER_H #define QWT_CURVE_FITTER_H #include "qwt_global.h" #include #include class QwtSpline; /*! \brief Abstract base class for a curve fitter */ class QWT_EXPORT QwtCurveFitter { public: virtual ~QwtCurveFitter(); /*! Find a curve which has the best fit to a series of data points \param polygon Series of data points \return Curve points */ virtual QPolygonF fitCurve( const QPolygonF &polygon ) const = 0; protected: QwtCurveFitter(); private: QwtCurveFitter( const QwtCurveFitter & ); QwtCurveFitter &operator=( const QwtCurveFitter & ); }; /*! \brief A curve fitter using cubic splines */ class QWT_EXPORT QwtSplineCurveFitter: public QwtCurveFitter { public: /*! Spline type The default setting is Auto \sa setFitMode(), FitMode() */ enum FitMode { /*! Use the default spline algorithm for polygons with increasing x values ( p[i-1] < p[i] ), otherwise use a parametric spline algorithm. */ Auto, //! Use a default spline algorithm Spline, //! Use a parametric spline algorithm ParametricSpline }; QwtSplineCurveFitter(); virtual ~QwtSplineCurveFitter(); void setFitMode( FitMode ); FitMode fitMode() const; void setSpline( const QwtSpline& ); const QwtSpline &spline() const; QwtSpline &spline(); void setSplineSize( int size ); int splineSize() const; virtual QPolygonF fitCurve( const QPolygonF & ) const; private: QPolygonF fitSpline( const QPolygonF & ) const; QPolygonF fitParametric( const QPolygonF & ) const; class PrivateData; PrivateData *d_data; }; /*! \brief A curve fitter implementing Douglas and Peucker algorithm The purpose of the Douglas and Peucker algorithm is that given a 'curve' composed of line segments to find a curve not too dissimilar but that has fewer points. The algorithm defines 'too dissimilar' based on the maximum distance (tolerance) between the original curve and the smoothed curve. The runtime of the algorithm increases non linear ( worst case O( n*n ) ) and might be very slow for huge polygons. To avoid performance issues it might be useful to split the polygon ( setChunkSize() ) and to run the algorithm for these smaller parts. The disadvantage of having no interpolation at the borders is for most use cases irrelevant. The smoothed curve consists of a subset of the points that defined the original curve. In opposite to QwtSplineCurveFitter the Douglas and Peucker algorithm reduces the number of points. By adjusting the tolerance parameter according to the axis scales QwtSplineCurveFitter can be used to implement different level of details to speed up painting of curves of many points. */ class QWT_EXPORT QwtWeedingCurveFitter: public QwtCurveFitter { public: QwtWeedingCurveFitter( double tolerance = 1.0 ); virtual ~QwtWeedingCurveFitter(); void setTolerance( double ); double tolerance() const; void setChunkSize( uint ); uint chunkSize() const; virtual QPolygonF fitCurve( const QPolygonF & ) const; private: virtual QPolygonF simplify( const QPolygonF & ) const; class Line; class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_scale_draw.h000644 001750 001750 00000006132 12151666701 021212 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_DRAW_H #define QWT_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_abstract_scale_draw.h" #include #include #include /*! \brief A class for drawing scales QwtScaleDraw can be used to draw linear or logarithmic scales. A scale has a position, an alignment and a length, which can be specified . The labels can be rotated and aligned to the ticks using setLabelRotation() and setLabelAlignment(). After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtScaleDraw: public QwtAbstractScaleDraw { public: /*! Alignment of the scale draw \sa setAlignment(), alignment() */ enum Alignment { //! The scale is below BottomScale, //! The scale is above TopScale, //! The scale is left LeftScale, //! The scale is right RightScale }; QwtScaleDraw(); virtual ~QwtScaleDraw(); void getBorderDistHint( const QFont &, int &start, int &end ) const; int minLabelDist( const QFont & ) const; int minLength( const QFont & ) const; virtual double extent( const QFont & ) const; void move( double x, double y ); void move( const QPointF & ); void setLength( double length ); Alignment alignment() const; void setAlignment( Alignment ); Qt::Orientation orientation() const; QPointF pos() const; double length() const; void setLabelAlignment( Qt::Alignment ); Qt::Alignment labelAlignment() const; void setLabelRotation( double rotation ); double labelRotation() const; int maxLabelHeight( const QFont & ) const; int maxLabelWidth( const QFont & ) const; QPointF labelPosition( double val ) const; QRectF labelRect( const QFont &, double val ) const; QSizeF labelSize( const QFont &, double val ) const; QRect boundingLabelRect( const QFont &, double val ) const; protected: QTransform labelTransformation( const QPointF &, const QSizeF & ) const; virtual void drawTick( QPainter *, double val, double len ) const; virtual void drawBackbone( QPainter * ) const; virtual void drawLabel( QPainter *, double val ) const; private: QwtScaleDraw( const QwtScaleDraw & ); QwtScaleDraw &operator=( const QwtScaleDraw &other ); void updateMap(); class PrivateData; PrivateData *d_data; }; /*! Move the position of the scale \param x X coordinate \param y Y coordinate \sa move(const QPointF &) */ inline void QwtScaleDraw::move( double x, double y ) { move( QPointF( x, y ) ); } #endif linssid-2.7/linssid-app/license.txt000664 001750 001750 00000243454 12355414341 020313 0ustar00warrenwarren000000 000000 Copyright: 2012-2014 Warren Severin License: The original portions of LinSSID are licensed under the terms of GPL version 3, as below. Please, I didn't write this and it's necessary to use a common accepted license in order to post the software on most distribution websites. . GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . . . That said, portions of linssid make use of libraries which have their own licenses written in gloriously arcane legalese. The boost library license: Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Also, linssid is developed based on Qt which is available under the LGPL 2.1 license: TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. . . linssid also links to the wonderful Qwt library. It has its own license, here: . Qwt License Version 1.0, January 1, 2003 The Qwt library and included programs are provided under the terms of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) with the following exceptions: 1. Widgets that are subclassed from Qwt widgets do not constitute a derivative work. 2. Static linking of applications and widgets to the Qwt library does not constitute a derivative work and does not require the author to provide source code for the application or widget, use the shared Qwt libraries, or link their applications or widgets against a user-supplied version of Qwt. If you link the application or widget to a modified version of Qwt, then the changes to Qwt must be provided under the terms of the LGPL in sections 1, 2, and 4. 3. You do not have to provide a copy of the Qwt license with programs that are linked to the Qwt library, nor do you have to identify the Qwt license in your program or documentation as required by section 6 of the LGPL. However, programs must still identify their use of Qwt. The following example statement can be included in user documentation to satisfy this requirement: [program/widget] is based in part on the work of the Qwt project (http://qwt.sf.net). ---------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! linssid-2.7/qwt-lib/src/qwt_plot_histogram.cpp000644 001750 001750 00000043417 12151666703 022505 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_histogram.h" #include "qwt_plot.h" #include "qwt_painter.h" #include "qwt_column_symbol.h" #include "qwt_scale_map.h" #include #include static inline bool qwtIsCombinable( const QwtInterval &d1, const QwtInterval &d2 ) { if ( d1.isValid() && d2.isValid() ) { if ( d1.maxValue() == d2.minValue() ) { if ( !( d1.borderFlags() & QwtInterval::ExcludeMaximum && d2.borderFlags() & QwtInterval::ExcludeMinimum ) ) { return true; } } } return false; } class QwtPlotHistogram::PrivateData { public: PrivateData(): baseline( 0.0 ), style( Columns ), symbol( NULL ) { } ~PrivateData() { delete symbol; } double baseline; QPen pen; QBrush brush; QwtPlotHistogram::HistogramStyle style; const QwtColumnSymbol *symbol; }; /*! Constructor \param title Title of the histogram. */ QwtPlotHistogram::QwtPlotHistogram( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the histogram. */ QwtPlotHistogram::QwtPlotHistogram( const QString &title ): QwtPlotSeriesItem( title ) { init(); } //! Destructor QwtPlotHistogram::~QwtPlotHistogram() { delete d_data; } //! Initialize data members void QwtPlotHistogram::init() { d_data = new PrivateData(); setData( new QwtIntervalSeriesData() ); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Legend, true ); setZ( 20.0 ); } /*! Set the histogram's drawing style \param style Histogram style \sa HistogramStyle, style() */ void QwtPlotHistogram::setStyle( HistogramStyle style ) { if ( style != d_data->style ) { d_data->style = style; legendChanged(); itemChanged(); } } /*! \return Style of the histogram \sa HistogramStyle, setStyle() */ QwtPlotHistogram::HistogramStyle QwtPlotHistogram::style() const { return d_data->style; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotHistogram::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! Assign a pen, that is used in a style() depending way. \param pen New pen \sa pen(), brush() */ void QwtPlotHistogram::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; legendChanged(); itemChanged(); } } /*! \return Pen used in a style() depending way. \sa setPen(), brush() */ const QPen &QwtPlotHistogram::pen() const { return d_data->pen; } /*! Assign a brush, that is used in a style() depending way. \param brush New brush \sa pen(), brush() */ void QwtPlotHistogram::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; legendChanged(); itemChanged(); } } /*! \return Brush used in a style() depending way. \sa setPen(), brush() */ const QBrush &QwtPlotHistogram::brush() const { return d_data->brush; } /*! \brief Assign a symbol In Column style an optional symbol can be assigned, that is responsible for displaying the rectangle that is defined by the interval and the distance between baseline() and value. When no symbol has been defined the area is displayed as plain rectangle using pen() and brush(). \sa style(), symbol(), drawColumn(), pen(), brush() \note In applications, where different intervals need to be displayed in a different way ( f.e different colors or even using different symbols) it is recommended to overload drawColumn(). */ void QwtPlotHistogram::setSymbol( const QwtColumnSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; legendChanged(); itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtColumnSymbol *QwtPlotHistogram::symbol() const { return d_data->symbol; } /*! \brief Set the value of the baseline Each column representing an QwtIntervalSample is defined by its interval and the interval between baseline and the value of the sample. The default value of the baseline is 0.0. \param value Value of the baseline \sa baseline() */ void QwtPlotHistogram::setBaseline( double value ) { if ( d_data->baseline != value ) { d_data->baseline = value; itemChanged(); } } /*! \return Value of the baseline \sa setBaseline() */ double QwtPlotHistogram::baseline() const { return d_data->baseline; } /*! \return Bounding rectangle of all samples. For an empty series the rectangle is invalid. */ QRectF QwtPlotHistogram::boundingRect() const { QRectF rect = data()->boundingRect(); if ( !rect.isValid() ) return rect; if ( orientation() == Qt::Horizontal ) { rect = QRectF( rect.y(), rect.x(), rect.height(), rect.width() ); if ( rect.left() > d_data->baseline ) rect.setLeft( d_data->baseline ); else if ( rect.right() < d_data->baseline ) rect.setRight( d_data->baseline ); } else { if ( rect.bottom() < d_data->baseline ) rect.setBottom( d_data->baseline ); else if ( rect.top() > d_data->baseline ) rect.setTop( d_data->baseline ); } return rect; } //! \return QwtPlotItem::Rtti_PlotHistogram int QwtPlotHistogram::rtti() const { return QwtPlotItem::Rtti_PlotHistogram; } /*! Initialize data with an array of samples. \param samples Vector of points */ void QwtPlotHistogram::setSamples( const QVector &samples ) { setData( new QwtIntervalSeriesData( samples ) ); } /*! Assign a series of samples setSamples() is just a wrapper for setData() without any additional value - beside that it is easier to find for the developer. \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ void QwtPlotHistogram::setSamples( QwtSeriesData *data ) { setData( data ); } /*! Draw a subset of the histogram samples \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the series will be painted to its last sample. \sa drawOutline(), drawLines(), drawColumns */ void QwtPlotHistogram::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &, int from, int to ) const { if ( !painter || dataSize() <= 0 ) return; if ( to < 0 ) to = dataSize() - 1; switch ( d_data->style ) { case Outline: drawOutline( painter, xMap, yMap, from, to ); break; case Lines: drawLines( painter, xMap, yMap, from, to ); break; case Columns: drawColumns( painter, xMap, yMap, from, to ); break; default: break; } } /*! Draw a histogram in Outline style() \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the histogram will be painted to its last point. \sa setStyle(), style() \warning The outline style requires, that the intervals are in increasing order and not overlapping. */ void QwtPlotHistogram::drawOutline( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); double v0 = ( orientation() == Qt::Horizontal ) ? xMap.transform( baseline() ) : yMap.transform( baseline() ); if ( doAlign ) v0 = qRound( v0 ); QwtIntervalSample previous; QPolygonF polygon; for ( int i = from; i <= to; i++ ) { const QwtIntervalSample sample = this->sample( i ); if ( !sample.interval.isValid() ) { flushPolygon( painter, v0, polygon ); previous = sample; continue; } if ( previous.interval.isValid() ) { if ( !qwtIsCombinable( previous.interval, sample.interval ) ) flushPolygon( painter, v0, polygon ); } if ( orientation() == Qt::Vertical ) { double x1 = xMap.transform( sample.interval.minValue() ); double x2 = xMap.transform( sample.interval.maxValue() ); double y = yMap.transform( sample.value ); if ( doAlign ) { x1 = qRound( x1 ); x2 = qRound( x2 ); y = qRound( y ); } if ( polygon.size() == 0 ) polygon += QPointF( x1, v0 ); polygon += QPointF( x1, y ); polygon += QPointF( x2, y ); } else { double y1 = yMap.transform( sample.interval.minValue() ); double y2 = yMap.transform( sample.interval.maxValue() ); double x = xMap.transform( sample.value ); if ( doAlign ) { y1 = qRound( y1 ); y2 = qRound( y2 ); x = qRound( x ); } if ( polygon.size() == 0 ) polygon += QPointF( v0, y1 ); polygon += QPointF( x, y1 ); polygon += QPointF( x, y2 ); } previous = sample; } flushPolygon( painter, v0, polygon ); } /*! Draw a histogram in Columns style() \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the histogram will be painted to its last point. \sa setStyle(), style(), setSymbol(), drawColumn() */ void QwtPlotHistogram::drawColumns( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const { painter->setPen( d_data->pen ); painter->setBrush( d_data->brush ); const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QwtIntervalSample sample = series->sample( i ); if ( !sample.interval.isNull() ) { const QwtColumnRect rect = columnRect( sample, xMap, yMap ); drawColumn( painter, rect, sample ); } } } /*! Draw a histogram in Lines style() \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param from Index of the first sample to be painted \param to Index of the last sample to be painted. If to < 0 the histogram will be painted to its last point. \sa setStyle(), style(), setPen() */ void QwtPlotHistogram::drawLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); painter->setPen( d_data->pen ); painter->setBrush( Qt::NoBrush ); const QwtSeriesData *series = data(); for ( int i = from; i <= to; i++ ) { const QwtIntervalSample sample = series->sample( i ); if ( !sample.interval.isNull() ) { const QwtColumnRect rect = columnRect( sample, xMap, yMap ); QRectF r = rect.toRect(); if ( doAlign ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } switch ( rect.direction ) { case QwtColumnRect::LeftToRight: { QwtPainter::drawLine( painter, r.topRight(), r.bottomRight() ); break; } case QwtColumnRect::RightToLeft: { QwtPainter::drawLine( painter, r.topLeft(), r.bottomLeft() ); break; } case QwtColumnRect::TopToBottom: { QwtPainter::drawLine( painter, r.bottomRight(), r.bottomLeft() ); break; } case QwtColumnRect::BottomToTop: { QwtPainter::drawLine( painter, r.topRight(), r.topLeft() ); break; } } } } } //! Internal, used by the Outline style. void QwtPlotHistogram::flushPolygon( QPainter *painter, double baseLine, QPolygonF &polygon ) const { if ( polygon.size() == 0 ) return; if ( orientation() == Qt::Horizontal ) polygon += QPointF( baseLine, polygon.last().y() ); else polygon += QPointF( polygon.last().x(), baseLine ); if ( d_data->brush.style() != Qt::NoBrush ) { painter->setPen( Qt::NoPen ); painter->setBrush( d_data->brush ); if ( orientation() == Qt::Horizontal ) { polygon += QPointF( polygon.last().x(), baseLine ); polygon += QPointF( polygon.first().x(), baseLine ); } else { polygon += QPointF( baseLine, polygon.last().y() ); polygon += QPointF( baseLine, polygon.first().y() ); } QwtPainter::drawPolygon( painter, polygon ); polygon.pop_back(); polygon.pop_back(); } if ( d_data->pen.style() != Qt::NoPen ) { painter->setBrush( Qt::NoBrush ); painter->setPen( d_data->pen ); QwtPainter::drawPolyline( painter, polygon ); } polygon.clear(); } /*! Calculate the area that is covered by a sample \param sample Sample \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \return Rectangle, that is covered by a sample */ QwtColumnRect QwtPlotHistogram::columnRect( const QwtIntervalSample &sample, const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { QwtColumnRect rect; const QwtInterval &iv = sample.interval; if ( !iv.isValid() ) return rect; if ( orientation() == Qt::Horizontal ) { const double x0 = xMap.transform( baseline() ); const double x = xMap.transform( sample.value ); const double y1 = yMap.transform( iv.minValue() ); const double y2 = yMap.transform( iv.maxValue() ); rect.hInterval.setInterval( x0, x ); rect.vInterval.setInterval( y1, y2, iv.borderFlags() ); rect.direction = ( x < x0 ) ? QwtColumnRect::RightToLeft : QwtColumnRect::LeftToRight; } else { const double x1 = xMap.transform( iv.minValue() ); const double x2 = xMap.transform( iv.maxValue() ); const double y0 = yMap.transform( baseline() ); const double y = yMap.transform( sample.value ); rect.hInterval.setInterval( x1, x2, iv.borderFlags() ); rect.vInterval.setInterval( y0, y ); rect.direction = ( y < y0 ) ? QwtColumnRect::BottomToTop : QwtColumnRect::TopToBottom; } return rect; } /*! Draw a column for a sample in Columns style(). When a symbol() has been set the symbol is used otherwise the column is displayed as plain rectangle using pen() and brush(). \param painter Painter \param rect Rectangle where to paint the column in paint device coordinates \param sample Sample to be displayed \note In applications, where different intervals need to be displayed in a different way ( f.e different colors or even using different symbols) it is recommended to overload drawColumn(). */ void QwtPlotHistogram::drawColumn( QPainter *painter, const QwtColumnRect &rect, const QwtIntervalSample &sample ) const { Q_UNUSED( sample ); if ( d_data->symbol && ( d_data->symbol->style() != QwtColumnSymbol::NoStyle ) ) { d_data->symbol->draw( painter, rect ); } else { QRectF r = rect.toRect(); if ( QwtPainter::roundingAlignment( painter ) ) { r.setLeft( qRound( r.left() ) ); r.setRight( qRound( r.right() ) ); r.setTop( qRound( r.top() ) ); r.setBottom( qRound( r.bottom() ) ); } QwtPainter::drawRect( painter, r ); } } /*! A plain rectangle without pen using the brush() \param index Index of the legend entry ( ignored as there is only one ) \param size Icon size \return A graphic displaying the icon \sa QwtPlotItem::setLegendIconSize(), QwtPlotItem::legendData() */ QwtGraphic QwtPlotHistogram::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); return defaultIcon( d_data->brush, size ); } linssid-2.7/linssid-app/passBox.h000664 001750 001750 00000001006 12355414341 017701 0ustar00warrenwarren000000 000000 /* * File: passBox.h * Author: warren * * Created on December 2, 2012, 9:57 AM */ #ifndef _PASSBOX_H #define _PASSBOX_H #include #include "ui_passBox.h" #include "Custom.h" extern std::string password; extern passStatus pwStatus; class passBox : public QDialog { Q_OBJECT public: passBox(); virtual ~passBox(); void setPassPrompt(std::string); public slots: void passBtnAccept(); void passBtnReject(); private: Ui::passBox widget; }; #endif /* _PASSBOX_H */ linssid-2.7/qwt-lib/src/qwt_color_map.cpp000644 001750 001750 00000023662 12151666703 021425 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_color_map.h" #include "qwt_math.h" #include "qwt_interval.h" #include class QwtLinearColorMap::ColorStops { public: ColorStops() { _stops.reserve( 256 ); } void insert( double pos, const QColor &color ); QRgb rgb( QwtLinearColorMap::Mode, double pos ) const; QVector stops() const; private: class ColorStop { public: ColorStop(): pos( 0.0 ), rgb( 0 ) { }; ColorStop( double p, const QColor &c ): pos( p ), rgb( c.rgb() ) { r = qRed( rgb ); g = qGreen( rgb ); b = qBlue( rgb ); } double pos; QRgb rgb; int r, g, b; }; inline int findUpper( double pos ) const; QVector _stops; }; void QwtLinearColorMap::ColorStops::insert( double pos, const QColor &color ) { // Lookups need to be very fast, insertions are not so important. // Anyway, a balanced tree is what we need here. TODO ... if ( pos < 0.0 || pos > 1.0 ) return; int index; if ( _stops.size() == 0 ) { index = 0; _stops.resize( 1 ); } else { index = findUpper( pos ); if ( index == _stops.size() || qAbs( _stops[index].pos - pos ) >= 0.001 ) { _stops.resize( _stops.size() + 1 ); for ( int i = _stops.size() - 1; i > index; i-- ) _stops[i] = _stops[i-1]; } } _stops[index] = ColorStop( pos, color ); } inline QVector QwtLinearColorMap::ColorStops::stops() const { QVector positions( _stops.size() ); for ( int i = 0; i < _stops.size(); i++ ) positions[i] = _stops[i].pos; return positions; } inline int QwtLinearColorMap::ColorStops::findUpper( double pos ) const { int index = 0; int n = _stops.size(); const ColorStop *stops = _stops.data(); while ( n > 0 ) { const int half = n >> 1; const int middle = index + half; if ( stops[middle].pos <= pos ) { index = middle + 1; n -= half + 1; } else n = half; } return index; } inline QRgb QwtLinearColorMap::ColorStops::rgb( QwtLinearColorMap::Mode mode, double pos ) const { if ( pos <= 0.0 ) return _stops[0].rgb; if ( pos >= 1.0 ) return _stops[ _stops.size() - 1 ].rgb; const int index = findUpper( pos ); if ( mode == FixedColors ) { return _stops[index-1].rgb; } else { const ColorStop &s1 = _stops[index-1]; const ColorStop &s2 = _stops[index]; const double ratio = ( pos - s1.pos ) / ( s2.pos - s1.pos ); const int r = s1.r + qRound( ratio * ( s2.r - s1.r ) ); const int g = s1.g + qRound( ratio * ( s2.g - s1.g ) ); const int b = s1.b + qRound( ratio * ( s2.b - s1.b ) ); return qRgb( r, g, b ); } } //! Constructor QwtColorMap::QwtColorMap( Format format ): d_format( format ) { } //! Destructor QwtColorMap::~QwtColorMap() { } /*! Build and return a color map of 256 colors The color table is needed for rendering indexed images in combination with using colorIndex(). \param interval Range for the values \return A color table, that can be used for a QImage */ QVector QwtColorMap::colorTable( const QwtInterval &interval ) const { QVector table( 256 ); if ( interval.isValid() ) { const double step = interval.width() / ( table.size() - 1 ); for ( int i = 0; i < table.size(); i++ ) table[i] = rgb( interval, interval.minValue() + step * i ); } return table; } class QwtLinearColorMap::PrivateData { public: ColorStops colorStops; QwtLinearColorMap::Mode mode; }; /*! Build a color map with two stops at 0.0 and 1.0. The color at 0.0 is Qt::blue, at 1.0 it is Qt::yellow. \param format Preferred format of the color map */ QwtLinearColorMap::QwtLinearColorMap( QwtColorMap::Format format ): QwtColorMap( format ) { d_data = new PrivateData; d_data->mode = ScaledColors; setColorInterval( Qt::blue, Qt::yellow ); } /*! Build a color map with two stops at 0.0 and 1.0. \param color1 Color used for the minimum value of the value interval \param color2 Color used for the maximum value of the value interval \param format Preferred format for the color map */ QwtLinearColorMap::QwtLinearColorMap( const QColor &color1, const QColor &color2, QwtColorMap::Format format ): QwtColorMap( format ) { d_data = new PrivateData; d_data->mode = ScaledColors; setColorInterval( color1, color2 ); } //! Destructor QwtLinearColorMap::~QwtLinearColorMap() { delete d_data; } /*! \brief Set the mode of the color map FixedColors means the color is calculated from the next lower color stop. ScaledColors means the color is calculated by interpolating the colors of the adjacent stops. \sa mode() */ void QwtLinearColorMap::setMode( Mode mode ) { d_data->mode = mode; } /*! \return Mode of the color map \sa setMode() */ QwtLinearColorMap::Mode QwtLinearColorMap::mode() const { return d_data->mode; } /*! Set the color range Add stops at 0.0 and 1.0. \param color1 Color used for the minimum value of the value interval \param color2 Color used for the maximum value of the value interval \sa color1(), color2() */ void QwtLinearColorMap::setColorInterval( const QColor &color1, const QColor &color2 ) { d_data->colorStops = ColorStops(); d_data->colorStops.insert( 0.0, color1 ); d_data->colorStops.insert( 1.0, color2 ); } /*! Add a color stop The value has to be in the range [0.0, 1.0]. F.e. a stop at position 17.0 for a range [10.0,20.0] must be passed as: (17.0 - 10.0) / (20.0 - 10.0) \param value Value between [0.0, 1.0] \param color Color stop */ void QwtLinearColorMap::addColorStop( double value, const QColor& color ) { if ( value >= 0.0 && value <= 1.0 ) d_data->colorStops.insert( value, color ); } /*! \return Positions of color stops in increasing order */ QVector QwtLinearColorMap::colorStops() const { return d_data->colorStops.stops(); } /*! \return the first color of the color range \sa setColorInterval() */ QColor QwtLinearColorMap::color1() const { return QColor( d_data->colorStops.rgb( d_data->mode, 0.0 ) ); } /*! \return the second color of the color range \sa setColorInterval() */ QColor QwtLinearColorMap::color2() const { return QColor( d_data->colorStops.rgb( d_data->mode, 1.0 ) ); } /*! Map a value of a given interval into a RGB value \param interval Range for all values \param value Value to map into a RGB value \return RGB value for value */ QRgb QwtLinearColorMap::rgb( const QwtInterval &interval, double value ) const { if ( qIsNaN(value) ) return qRgba(0, 0, 0, 0); const double width = interval.width(); double ratio = 0.0; if ( width > 0.0 ) ratio = ( value - interval.minValue() ) / width; return d_data->colorStops.rgb( d_data->mode, ratio ); } /*! \brief Map a value of a given interval into a color index \param interval Range for all values \param value Value to map into a color index \return Index, between 0 and 255 */ unsigned char QwtLinearColorMap::colorIndex( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( qIsNaN(value) || width <= 0.0 || value <= interval.minValue() ) return 0; if ( value >= interval.maxValue() ) return 255; const double ratio = ( value - interval.minValue() ) / width; unsigned char index; if ( d_data->mode == FixedColors ) index = static_cast( ratio * 255 ); // always floor else index = static_cast( qRound( ratio * 255 ) ); return index; } class QwtAlphaColorMap::PrivateData { public: QColor color; QRgb rgb; }; /*! Constructor \param color Color of the map */ QwtAlphaColorMap::QwtAlphaColorMap( const QColor &color ): QwtColorMap( QwtColorMap::RGB ) { d_data = new PrivateData; d_data->color = color; d_data->rgb = color.rgb() & qRgba( 255, 255, 255, 0 ); } //! Destructor QwtAlphaColorMap::~QwtAlphaColorMap() { delete d_data; } /*! Set the color \param color Color \sa color() */ void QwtAlphaColorMap::setColor( const QColor &color ) { d_data->color = color; d_data->rgb = color.rgb(); } /*! \return the color \sa setColor() */ QColor QwtAlphaColorMap::color() const { return d_data->color; } /*! \brief Map a value of a given interval into a alpha value alpha := (value - interval.minValue()) / interval.width(); \param interval Range for all values \param value Value to map into a RGB value \return RGB value, with an alpha value */ QRgb QwtAlphaColorMap::rgb( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( !qIsNaN(value) && width >= 0.0 ) { const double ratio = ( value - interval.minValue() ) / width; int alpha = qRound( 255 * ratio ); if ( alpha < 0 ) alpha = 0; if ( alpha > 255 ) alpha = 255; return d_data->rgb | ( alpha << 24 ); } return d_data->rgb; } /*! Dummy function, needed to be implemented as it is pure virtual in QwtColorMap. Color indices make no sense in combination with an alpha channel. \return Always 0 */ unsigned char QwtAlphaColorMap::colorIndex( const QwtInterval &, double ) const { return 0; } linssid-2.7/linssid-app/oui.datb000664 001750 001750 00002031322 12366756326 017565 0ustar00warrenwarren000000 000000 19642 93 000000XEROX CORPORATION 000001XEROX CORPORATION 000002XEROX CORPORATION 000003XEROX CORPORATION 000004XEROX CORPORATION 000005XEROX CORPORATION 000006XEROX CORPORATION 000007XEROX CORPORATION 000008XEROX CORPORATION 000009XEROX CORPORATION 00000AOMRON TATEISI ELECTRONICS CO 00000BMATRIX CORPORATION 00000CCISCO SYSTEMS, INC 00000DFIBRONICS LTD 00000EFUJITSU LIMITED 00000FNEXT, INC 000010SYTEK INC 000011NORMEREL SYSTEMES 000012INFORMATION TECHNOLOGY LIMITED 000013CAMEX 000014NETRONIX 000015DATAPOINT CORPORATION 000016DU PONT PIXEL SYSTEMS 000017Oracle 000018WEBSTER COMPUTER CORPORATION 000019APPLIED DYNAMICS INTERNATIONAL 00001AADVANCED MICRO DEVICES 00001BNOVELL INC 00001CBELL TECHNOLOGIES 00001DCABLETRON SYSTEMS, INC 00001ETELSIST INDUSTRIA ELECTRONICA 00001FTelco Systems, Inc 000020DATAINDUSTRIER DIAB AB 000021SUREMAN COMP. & COMMUN. CORP 000022VISUAL TECHNOLOGY INC 000023ABB INDUSTRIAL SYSTEMS AB 000024CONNECT AS 000025RAMTEK CORP 000026SHA-KEN CO., LTD 000027JAPAN RADIO COMPANY 000028PRODIGY SYSTEMS CORPORATION 000029IMC NETWORKS CORP 00002ATRW - SEDD/INP 00002BCRISP AUTOMATION, INC 00002CAUTOTOTE LIMITED 00002DCHROMATICS INC 00002ESOCIETE EVIRA 00002FTIMEPLEX INC 000030VG LABORATORY SYSTEMS LTD 000031QPSX COMMUNICATIONS PTY LTD 000032Marconi plc 000033EGAN MACHINERY COMPANY 000034NETWORK RESOURCES CORPORATION 000035SPECTRAGRAPHICS CORPORATION 000036ATARI CORPORATION 000037OXFORD METRICS LIMITED 000038CSS LABS 000039TOSHIBA CORPORATION 00003ACHYRON CORPORATION 00003Bi Controls, Inc 00003CAUSPEX SYSTEMS INC 00003DUNISYS 00003ESIMPACT 00003FSYNTREX, INC 000040APPLICON, INC 000041ICE CORPORATION 000042METIER MANAGEMENT SYSTEMS LTD 000043MICRO TECHNOLOGY 000044CASTELLE CORPORATION 000045FORD AEROSPACE & COMM. CORP 000046OLIVETTI NORTH AMERICA 000047NICOLET INSTRUMENTS CORP 000048SEIKO EPSON CORPORATION 000049APRICOT COMPUTERS, LTD 00004AADC CODENOLL TECHNOLOGY CORP 00004BICL DATA OY 00004CNEC CORPORATION 00004DDCI CORPORATION 00004EAMPEX CORPORATION 00004FLOGICRAFT, INC 000050RADISYS CORPORATION 000051HOB ELECTRONIC GMBH & CO. KG 000052Intrusion.com, Inc 000053COMPUCORP 000054Schnieder Electric 000055COMMISSARIAT A L`ENERGIE ATOM 000056DR. B. STRUCK 000057SCITEX CORPORATION LTD 000058RACORE COMPUTER PRODUCTS INC 000059HELLIGE GMBH 00005ASysKonnect GmbH 00005BELTEC ELEKTRONIK AG 00005CTELEMATICS INTERNATIONAL INC 00005DCS TELECOM 00005EICANN, IANA Department 00005FSUMITOMO ELECTRIC IND., LTD 000060KONTRON ELEKTRONIK GMBH 000061GATEWAY COMMUNICATIONS 000062BULL HN INFORMATION SYSTEMS 000063BARCO CONTROL ROOMS GMBH 000064Yokogawa Electric Corporation 000065Network General Corporation 000066TALARIS SYSTEMS, INC 000067SOFT * RITE, INC 000068ROSEMOUNT CONTROLS 000069CONCORD COMMUNICATIONS INC 00006ACOMPUTER CONSOLES INC 00006BSILICON GRAPHICS INC./MIPS 00006C 00006DCRAY COMMUNICATIONS, LTD 00006EARTISOFT, INC 00006FMadge Ltd 000070HCL LIMITED 000071ADRA SYSTEMS INC 000072MINIWARE TECHNOLOGY 000073SIECOR CORPORATION 000074RICOH COMPANY LTD 000075Nortel Networks 000076ABEKAS VIDEO SYSTEM 000077INTERPHASE CORPORATION 000078LABTAM LIMITED 000079NETWORTH INCORPORATED 00007ADANA COMPUTER INC 00007BRESEARCH MACHINES 00007CAMPERE INCORPORATED 00007DOracle Corporation 00007ECLUSTRIX CORPORATION 00007FLINOTYPE-HELL AG 000080CRAY COMMUNICATIONS A/S 000081BAY NETWORKS 000082LECTRA SYSTEMES SA 000083TADPOLE TECHNOLOGY PLC 000084SUPERNET 000085CANON INC 000086MEGAHERTZ CORPORATION 000087HITACHI, LTD 000088Brocade Communications Systems, Inc 000089CAYMAN SYSTEMS INC 00008ADATAHOUSE INFORMATION SYSTEMS 00008BINFOTRON 00008CAlloy Computer Products (Australia) Pty Ltd 00008DCryptek Inc 00008ESOLBOURNE COMPUTER, INC 00008FRaytheon 000090MICROCOM 000091ANRITSU CORPORATION 000092COGENT DATA TECHNOLOGIES 000093PROTEON INC 000094ASANTE TECHNOLOGIES 000095SONY TEKTRONIX CORP 000096MARCONI ELECTRONICS LTD 000097EMC Corporation 000098CROSSCOMM CORPORATION 000099MTX, INC 00009ARC COMPUTER A/S 00009BINFORMATION INTERNATIONAL, INC 00009CROLM MIL-SPEC COMPUTERS 00009DLOCUS COMPUTING CORPORATION 00009EMARLI S.A 00009FAMERISTAR TECHNOLOGIES INC 0000A0SANYO Electric Co., Ltd 0000A1MARQUETTE ELECTRIC CO 0000A2BAY NETWORKS 0000A3NETWORK APPLICATION TECHNOLOGY 0000A4ACORN COMPUTERS LIMITED 0000A5Tattile SRL 0000A6NETWORK GENERAL CORPORATION 0000A7NETWORK COMPUTING DEVICES INC 0000A8STRATUS COMPUTER INC 0000A9NETWORK SYSTEMS CORP 0000AAXEROX CORPORATION 0000ABLOGIC MODELING CORPORATION 0000ACCONWARE COMPUTER CONSULTING 0000ADBRUKER INSTRUMENTS INC 0000AEDASSAULT ELECTRONIQUE 0000AFNUCLEAR DATA INSTRUMENTATION 0000B0RND-RAD NETWORK DEVICES 0000B1ALPHA MICROSYSTEMS INC 0000B2TELEVIDEO SYSTEMS, INC 0000B3CIMLINC INCORPORATED 0000B4EDIMAX COMPUTER COMPANY 0000B5DATABILITY SOFTWARE SYS. INC 0000B6MICRO-MATIC RESEARCH 0000B7DOVE COMPUTER CORPORATION 0000B8SEIKOSHA CO., LTD 0000B9MCDONNELL DOUGLAS COMPUTER SYS 0000BASIIG, INC 0000BBTRI-DATA 0000BCRockwell Automation 0000BDMITSUBISHI CABLE COMPANY 0000BETHE NTI GROUP 0000BFSYMMETRIC COMPUTER SYSTEMS 0000C0WESTERN DIGITAL CORPORATION 0000C1Madge Ltd 0000C2INFORMATION PRESENTATION TECH 0000C3HARRIS CORP COMPUTER SYS DIV 0000C4WATERS DIV. OF MILLIPORE 0000C5FARALLON COMPUTING/NETOPIA 0000C6EON SYSTEMS 0000C7ARIX CORPORATION 0000C8ALTOS COMPUTER SYSTEMS 0000C9Emulex Corporation 0000CAARRIS International 0000CBCOMPU-SHACK ELECTRONIC GMBH 0000CCDENSAN CO., LTD 0000CDAllied Telesis Labs Ltd 0000CEMEGADATA CORP 0000CFHAYES MICROCOMPUTER PRODUCTS 0000D0DEVELCON ELECTRONICS LTD 0000D1ADAPTEC INCORPORATED 0000D2SBE, INC 0000D3WANG LABORATORIES INC 0000D4PURE DATA LTD 0000D5MICROGNOSIS INTERNATIONAL 0000D6PUNCH LINE HOLDING 0000D7DARTMOUTH COLLEGE 0000D8NOVELL, INC 0000D9NIPPON TELEGRAPH & TELEPHONE 0000DAATEX 0000DBBritish Telecommunications plc 0000DCHAYES MICROCOMPUTER PRODUCTS 0000DDTCL INCORPORATED 0000DECETIA 0000DFBELL & HOWELL PUB SYS DIV 0000E0QUADRAM CORP 0000E1GRID SYSTEMS 0000E2ACER TECHNOLOGIES CORP 0000E3INTEGRATED MICRO PRODUCTS LTD 0000E4IN2 GROUPE INTERTECHNIQUE 0000E5SIGMEX LTD 0000E6APTOR PRODUITS DE COMM INDUST 0000E7STAR GATE TECHNOLOGIES 0000E8ACCTON TECHNOLOGY CORP 0000E9ISICAD, INC 0000EAUPNOD AB 0000EBMATSUSHITA COMM. IND. CO. LTD 0000ECMICROPROCESS 0000EDAPRIL 0000EENETWORK DESIGNERS, LTD 0000EFKTI 0000F0SAMSUNG ELECTRONICS CO., LTD 0000F1MAGNA COMPUTER CORPORATION 0000F2SPIDER COMMUNICATIONS 0000F3GANDALF DATA LIMITED 0000F4Allied Telesis 0000F5DIAMOND SALES LIMITED 0000F6APPLIED MICROSYSTEMS CORP 0000F7YOUTH KEEP ENTERPRISE CO LTD 0000F8DIGITAL EQUIPMENT CORPORATION 0000F9QUOTRON SYSTEMS INC 0000FAMICROSAGE COMPUTER SYSTEMS INC 0000FBRECHNER ZUR KOMMUNIKATION 0000FCMEIKO 0000FDHIGH LEVEL HARDWARE 0000FEANNAPOLIS MICRO SYSTEMS 0000FFCAMTEC ELECTRONICS LTD 000100EQUIP'TRANS 000101 0001023COM CORPORATION 0001033COM CORPORATION 000104DVICO Co., Ltd 000105Beckhoff Automation GmbH 000106Tews Datentechnik GmbH 000107Leiser GmbH 000108AVLAB Technology, Inc 000109Nagano Japan Radio Co., Ltd 00010ACIS TECHNOLOGY INC 00010BSpace CyberLink, Inc 00010CSystem Talks Inc 00010DCORECO, INC 00010EBri-Link Technologies Co., Ltd 00010FBrocade Communications Systems, Inc 000110Gotham Networks 000111iDigm Inc 000112Shark Multimedia Inc 000113OLYMPUS CORPORATION 000114KANDA TSUSHIN KOGYO CO., LTD 000115EXTRATECH CORPORATION 000116Netspect Technologies, Inc 000117CANAL + 000118EZ Digital Co., Ltd 000119RTUnet (Australia) 00011AHoffmann und Burmeister GbR 00011BUnizone Technologies, Inc 00011CUniversal Talkware Corporation 00011DCentillium Communications 00011EPrecidia Technologies, Inc 00011FRC Networks, Inc 000120OSCILLOQUARTZ S.A 000121Watchguard Technologies, Inc 000122Trend Communications, Ltd 000123DIGITAL ELECTRONICS CORP 000124Acer Incorporated 000125YAESU MUSEN CO., LTD 000126PAC Labs 000127OPEN Networks Pty Ltd 000128EnjoyWeb, Inc 000129DFI Inc 00012ATelematica Sistems Inteligente 00012BTELENET Co., Ltd 00012CAravox Technologies, Inc 00012DKomodo Technology 00012EPC Partner Ltd 00012FTwinhead International Corp 000130Extreme Networks 000131Bosch Security Systems, Inc 000132Dranetz - BMI 000133KYOWA Electronic Instruments C 000134Selectron Systems AG 000135KDC Corp 000136CyberTAN Technology, Inc 000137IT Farm Corporation 000138XAVi Technologies Corp 000139Point Multimedia Systems 00013ASHELCAD COMMUNICATIONS, LTD 00013BBNA SYSTEMS 00013CTIW SYSTEMS 00013DRiscStation Ltd 00013EAscom Tateco AB 00013FNeighbor World Co., Ltd 000140Sendtek Corporation 000141CABLE PRINT 000142CISCO SYSTEMS, INC 000143CISCO SYSTEMS, INC 000144EMC Corporation 000145WINSYSTEMS, INC 000146Tesco Controls, Inc 000147Zhone Technologies 000148X-traWeb Inc 000149T.D.T. Transfer Data Test GmbH 00014ASony Corporation 00014BEnnovate Networks, Inc 00014CBerkeley Process Control 00014DShin Kin Enterprises Co., Ltd 00014EWIN Enterprises, Inc 00014FADTRAN INC 000150GILAT COMMUNICATIONS, LTD 000151Ensemble Communications 000152CHROMATEK INC 000153ARCHTEK TELECOM CORPORATION 000154G3M Corporation 000155Promise Technology, Inc 000156FIREWIREDIRECT.COM, INC 000157SYSWAVE CO., LTD 000158Electro Industries/Gauge Tech 000159S1 Corporation 00015ADigital Video Broadcasting 00015BITALTEL S.p.A/RF-UP-I 00015CCADANT INC 00015DOracle Corporation 00015EBEST TECHNOLOGY CO., LTD 00015FDIGITAL DESIGN GmbH 000160ELMEX Co., LTD 000161Meta Machine Technology 000162Cygnet Technologies, Inc 000163CISCO SYSTEMS, INC 000164CISCO SYSTEMS, INC 000165AirSwitch Corporation 000166TC GROUP A/S 000167HIOKI E.E. CORPORATION 000168VITANA CORPORATION 000169Celestix Networks Pte Ltd 00016AALITEC 00016BLightChip, Inc 00016CFOXCONN 00016DCarrierComm Inc 00016EConklin Corporation 00016FInkel Corp 000170ESE Embedded System Engineer'g 000171Allied Data Technologies 000172TechnoLand Co., LTD 000173AMCC 000174CyberOptics Corporation 000175Radiant Communications Corp 000176Orient Silver Enterprises 000177EDSL 000178MARGI Systems, Inc 000179WIRELESS TECHNOLOGY, INC 00017AChengdu Maipu Electric Industrial Co., Ltd 00017BHeidelberger Druckmaschinen AG 00017CAG-E GmbH 00017DThermoQuest 00017EADTEK System Science Co., Ltd 00017FExperience Music Project 000180AOpen, Inc 000181Nortel Networks 000182DICA TECHNOLOGIES AG 000183ANITE TELECOMS 000184SIEB & MEYER AG 000185Hitachi Aloka Medical, Ltd 000186Uwe Disch 000187I2SE GmbH 000188LXCO Technologies ag 000189Refraction Technology, Inc 00018AROI COMPUTER AG 00018BNetLinks Co., Ltd 00018CMega Vision 00018DAudeSi Technologies 00018ELogitec Corporation 00018FKenetec, Inc 000190SMK-M 000191SYRED Data Systems 000192Texas Digital Systems 000193Hanbyul Telecom Co., Ltd 000194Capital Equipment Corporation 000195Sena Technologies, Inc 000196CISCO SYSTEMS, INC 000197CISCO SYSTEMS, INC 000198Darim Vision 000199HeiSei Electronics 00019ALEUNIG GmbH 00019BKyoto Microcomputer Co., Ltd 00019CJDS Uniphase Inc 00019DE-Control Systems, Inc 00019EESS Technology, Inc 00019FReadyNet 0001A0Infinilink Corporation 0001A1Mag-Tek, Inc 0001A2Logical Co., Ltd 0001A3GENESYS LOGIC, INC 0001A4Microlink Corporation 0001A5Nextcomm, Inc 0001A6Scientific-Atlanta Arcodan A/S 0001A7UNEX TECHNOLOGY CORPORATION 0001A8Welltech Computer Co., Ltd 0001A9BMW AG 0001AAAirspan Communications, Ltd 0001ABMain Street Networks 0001ACSitara Networks, Inc 0001ADCoach Master International d.b.a. CMI Worldwide, Inc 0001AETrex Enterprises 0001AFArtesyn Embedded Technologies 0001B0Fulltek Technology Co., Ltd 0001B1General Bandwidth 0001B2Digital Processing Systems, Inc 0001B3Precision Electronic Manufacturing 0001B4Wayport, Inc 0001B5Turin Networks, Inc 0001B6SAEJIN T&M Co., Ltd 0001B7Centos, Inc 0001B8Netsensity, Inc 0001B9SKF Condition Monitoring 0001BAIC-Net, Inc 0001BBFrequentis 0001BCBrains Corporation 0001BDPeterson Electro-Musical Products, Inc 0001BEGigalink Co., Ltd 0001BFTeleforce Co., Ltd 0001C0CompuLab, Ltd 0001C1Vitesse Semiconductor Corporation 0001C2ARK Research Corp 0001C3Acromag, Inc 0001C4NeoWave, Inc 0001C5Simpler Networks 0001C6Quarry Technologies 0001C7CISCO SYSTEMS, INC 0001C8THOMAS CONRAD CORP 0001C8CONRAD CORP 0001C9CISCO SYSTEMS, INC 0001CAGeocast Network Systems, Inc 0001CBEVR 0001CCJapan Total Design Communication Co., Ltd 0001CDARtem 0001CECustom Micro Products, Ltd 0001CFAlpha Data Parallel Systems, Ltd 0001D0VitalPoint, Inc 0001D1CoNet Communications, Inc 0001D2inXtron, Inc 0001D3PAXCOMM, Inc 0001D4Leisure Time, Inc 0001D5HAEDONG INFO & COMM CO., LTD 0001D6manroland AG 0001D7F5 Networks, Inc 0001D8Teltronics, Inc 0001D9Sigma, Inc 0001DAWINCOMM Corporation 0001DBFreecom Technologies GmbH 0001DCActivetelco 0001DDAvail Networks 0001DETrango Systems, Inc 0001DFISDN Communications, Ltd 0001E0Fast Systems, Inc 0001E1Kinpo Electronics, Inc 0001E2Ando Electric Corporation 0001E3Siemens AG 0001E4Sitera, Inc 0001E5Supernet, Inc 0001E6Hewlett-Packard Company 0001E7Hewlett-Packard Company 0001E8Force10 Networks, Inc 0001E9Litton Marine Systems B.V 0001EACirilium Corp 0001EBC-COM Corporation 0001ECEricsson Group 0001EDSETA Corp 0001EEComtrol Europe, Ltd 0001EFCamtel Technology Corp 0001F0Tridium, Inc 0001F1Innovative Concepts, Inc 0001F2Mark of the Unicorn, Inc 0001F3QPS, Inc 0001F4Enterasys Networks 0001F5ERIM S.A 0001F6Association of Musical Electronics Industry 0001F7Image Display Systems, Inc 0001F8Texio Technology Corporation 0001F9TeraGlobal Communications Corp 0001FAHOROSCAS 0001FBDoTop Technology, Inc 0001FCKeyence Corporation 0001FDDigital Voice Systems, Inc 0001FEDIGITAL EQUIPMENT CORPORATION 0001FFData Direct Networks, Inc 000200Net & Sys Co., Ltd 000201IFM Electronic gmbh 000202Amino Communications, Ltd 000203Woonsang Telecom, Inc 000204Bodmann Industries Elektronik GmbH 000205Hitachi Denshi, Ltd 000206Telital R&D Denmark A/S 000207VisionGlobal Network Corp 000208Unify Networks, Inc 000209Shenzhen SED Information Technology Co., Ltd 00020AGefran Spa 00020BNative Networks, Inc 00020CMetro-Optix 00020DMicronpc.com 00020EECI Telecom, Ltd 00020FAATR 000210Fenecom 000211Nature Worldwide Technology Corp 000212SierraCom 000213S.D.E.L 000214DTVRO 000215Cotas Computer Technology A/B 000216CISCO SYSTEMS, INC 000217CISCO SYSTEMS, INC 000218Advanced Scientific Corp 000219Paralon Technologies 00021AZuma Networks 00021BKollmorgen-Servotronix 00021CNetwork Elements, Inc 00021DData General Communication Ltd 00021ESIMTEL S.R.L 00021FAculab PLC 000220CANON FINETECH INC 000221DSP Application, Ltd 000222Chromisys, Inc 000223ClickTV 000224C-COR 000225One Stop Systems 000226XESystems, Inc 000227ESD Electronic System Design GmbH 000228Necsom, Ltd 000229Adtec Corporation 00022AAsound Electronic 00022BSAXA, Inc 00022CABB Bomem, Inc 00022DAgere Systems 00022ETEAC Corp. R& D 00022FP-Cube, Ltd 000230Intersoft Electronics 000231Ingersoll-Rand 000232Avision, Inc 000233Mantra Communications, Inc 000234Imperial Technology, Inc 000235Paragon Networks International 000236INIT GmbH 000237Cosmo Research Corp 000238Serome Technology, Inc 000239Visicom 00023AZSK Stickmaschinen GmbH 00023BEricsson 00023CCreative Technology, Ltd 00023DCisco Systems, Inc 00023ESelta Telematica S.p.a 00023FCompal Electronics, Inc 000240Seedek Co., Ltd 000241Amer.com 000242Videoframe Systems 000243Raysis Co., Ltd 000244SURECOM Technology Co 000245Lampus Co, Ltd 000246All-Win Tech Co., Ltd 000247Great Dragon Information Technology (Group) Co., Ltd 000248Pilz GmbH & Co 000249Aviv Infocom Co, Ltd 00024ACISCO SYSTEMS, INC 00024BCISCO SYSTEMS, INC 00024CSiByte, Inc 00024DMannesman Dematic Colby Pty. Ltd 00024EDatacard Group 00024FIPM Datacom S.R.L 000250Geyser Networks, Inc 000251Soma Networks, Inc 000252Carrier Corporation 000253Televideo, Inc 000254WorldGate 000255IBM Corp 000256Alpha Processor, Inc 000257Microcom Corp 000258Flying Packets Communications 000259Tsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group 00025ACatena Networks 00025BCambridge Silicon Radio 00025CSCI Systems (Kunshan) Co., Ltd 00025DCalix Networks 00025EHigh Technology Ltd 00025FNortel Networks 000260Accordion Networks, Inc 000261Tilgin AB 000262Soyo Group Soyo Com Tech Co., Ltd 000263UPS Manufacturing SRL 000264AudioRamp.com 000265Virditech Co. Ltd 000266Thermalogic Corporation 000267NODE RUNNER, INC 000268Harris Government Communications 000269Nadatel Co., Ltd 00026ACocess Telecom Co., Ltd 00026BBCM Computers Co., Ltd 00026CPhilips CFT 00026DAdept Telecom 00026ENeGeN Access, Inc 00026FSenao International Co., Ltd 000270Crewave Co., Ltd 000271Zhone Technologies 000272CC&C Technologies, Inc 000273Coriolis Networks 000274Tommy Technologies Corp 000275SMART Technologies, Inc 000276Primax Electronics Ltd 000277Cash Systemes Industrie 000278Samsung Electro-Mechanics Co., Ltd 000279Control Applications, Ltd 00027AIOI Technology Corporation 00027BAmplify Net, Inc 00027CTrilithic, Inc 00027DCISCO SYSTEMS, INC 00027ECISCO SYSTEMS, INC 00027Fask-technologies.com 000280Mu Net, Inc 000281Madge Ltd 000282ViaClix, Inc 000283Spectrum Controls, Inc 000284AREVA T&D 000285Riverstone Networks 000286Occam Networks 000287Adapcom 000288GLOBAL VILLAGE COMMUNICATION 000289DNE Technologies 00028AAmbit Microsystems Corporation 00028BVDSL Systems OY 00028CMicrel-Synergy Semiconductor 00028DMovita Technologies, Inc 00028ERapid 5 Networks, Inc 00028FGlobetek, Inc 000290Woorigisool, Inc 000291Open Network Co., Ltd 000292Logic Innovations, Inc 000293Solid Data Systems 000294Tokyo Sokushin Co., Ltd 000295IP.Access Limited 000296Lectron Co,. Ltd 000297C-COR.net 000298Broadframe Corporation 000299Apex, Inc 00029AStorage Apps 00029BKreatel Communications AB 00029C3COM 00029DMerix Corp 00029EInformation Equipment Co., Ltd 00029FL-3 Communication Aviation Recorders 0002A0Flatstack Ltd 0002A1World Wide Packets 0002A2Hilscher GmbH 0002A3ABB Switzerland Ltd, Power Systems 0002A4AddPac Technology Co., Ltd 0002A5Hewlett-Packard Company 0002A6Effinet Systems Co., Ltd 0002A7Vivace Networks 0002A8Air Link Technology 0002A9RACOM, s.r.o 0002AAPLcom Co., Ltd 0002ABCTC Union Technologies Co., Ltd 0002AC3PAR data 0002ADHOYA Corporation 0002AEScannex Electronics Ltd 0002AFTeleCruz Technology, Inc 0002B0Hokubu Communication & Industrial Co., Ltd 0002B1Anritsu, Ltd 0002B2Cablevision 0002B3Intel Corporation 0002B4DAPHNE 0002B5Avnet, Inc 0002B6Acrosser Technology Co., Ltd 0002B7Watanabe Electric Industry Co., Ltd 0002B8WHI KONSULT AB 0002B9CISCO SYSTEMS, INC 0002BACISCO SYSTEMS, INC 0002BBContinuous Computing Corp 0002BCLVL 7 Systems, Inc 0002BDBionet Co., Ltd 0002BETotsu Engineering, Inc 0002BFdotRocket, Inc 0002C0Bencent Tzeng Industry Co., Ltd 0002C1Innovative Electronic Designs, Inc 0002C2Net Vision Telecom 0002C3Arelnet Ltd 0002C4Vector International BVBA 0002C5Evertz Microsystems Ltd 0002C6Data Track Technology PLC 0002C7ALPS ELECTRIC Co., Ltd 0002C8Technocom Communications Technology (pte) Ltd 0002C9Mellanox Technologies 0002CAEndPoints, Inc 0002CBTriState Ltd 0002CCM.C.C.I 0002CDTeleDream, Inc 0002CEFoxJet, Inc 0002CFZyGate Communications, Inc 0002D0Comdial Corporation 0002D1Vivotek, Inc 0002D2Workstation AG 0002D3NetBotz, Inc 0002D4PDA Peripherals, Inc 0002D5ACR 0002D6NICE Systems 0002D7EMPEG Ltd 0002D8BRECIS Communications Corporation 0002D9Reliable Controls 0002DAExiO Communications, Inc 0002DBNETSEC 0002DCFujitsu General Limited 0002DDBromax Communications, Ltd 0002DEAstrodesign, Inc 0002DFNet Com Systems, Inc 0002E0ETAS GmbH 0002E1Integrated Network Corporation 0002E2NDC Infared Engineering 0002E3LITE-ON Communications, Inc 0002E4JC HYUN Systems, Inc 0002E5Timeware Ltd 0002E6Gould Instrument Systems, Inc 0002E7CAB GmbH & Co KG 0002E8E.D.&A 0002E9CS Systemes De Securite - C3S 0002EAFocus Enhancements 0002EBPico Communications 0002ECMaschoff Design Engineering 0002EDDXO Telecom Co., Ltd 0002EENokia Danmark A/S 0002EFCCC Network Systems Group Ltd 0002F0AME Optimedia Technology Co., Ltd 0002F1Pinetron Co., Ltd 0002F2eDevice, Inc 0002F3Media Serve Co., Ltd 0002F4PCTEL, Inc 0002F5VIVE Synergies, Inc 0002F6Equipe Communications 0002F7ARM 0002F8SEAKR Engineering, Inc 0002F9MIMOS Berhad 0002FADX Antenna Co., Ltd 0002FBBaumuller Aulugen-Systemtechnik GmbH 0002FCCISCO SYSTEMS, INC 0002FDCISCO SYSTEMS, INC 0002FEViditec, Inc 0002FFHandan BroadInfoCom 000300Barracuda Networks, Inc 000301EXFO 000302Charles Industries, Ltd 000303JAMA Electronics Co., Ltd 000304Pacific Broadband Communications 000305MSC Vertriebs GmbH 000306Fusion In Tech Co., Ltd 000307Secure Works, Inc 000308AM Communications, Inc 000309Texcel Technology PLC 00030AArgus Technologies 00030BHunter Technology, Inc 00030CTelesoft Technologies Ltd 00030DUniwill Computer Corp 00030ECore Communications Co., Ltd 00030FDigital China (Shanghai) Networks Ltd 000310E-Globaledge Corporation 000311Micro Technology Co., Ltd 000312TR-Systemtechnik GmbH 000313Access Media SPA 000314Teleware Network Systems 000315Cidco Incorporated 000316Nobell Communications, Inc 000317Merlin Systems, Inc 000318Cyras Systems, Inc 000319Infineon AG 00031ABeijing Broad Telecom Ltd., China 00031BCellvision Systems, Inc 00031CSvenska Hardvarufabriken AB 00031DTaiwan Commate Computer, Inc 00031EOptranet, Inc 00031FCondev Ltd 000320Xpeed, Inc 000321Reco Research Co., Ltd 000322IDIS Co., Ltd 000323Cornet Technology, Inc 000324SANYO Consumer Electronics Co., Ltd 000325Arima Computer Corp 000326Iwasaki Information Systems Co., Ltd 000327ACT'L 000328Mace Group, Inc 000329F3, Inc 00032AUniData Communication Systems, Inc 00032BGAI Datenfunksysteme GmbH 00032CABB Switzerland Ltd 00032DIBASE Technology, Inc 00032EScope Information Management, Ltd 00032FGlobal Sun Technology, Inc 000330Imagenics, Co., Ltd 000331CISCO SYSTEMS, INC 000332CISCO SYSTEMS, INC 000333Digitel Co., Ltd 000334Newport Electronics 000335Mirae Technology 000336Zetes Technologies 000337Vaone, Inc 000338Oak Technology 000339Eurologic Systems, Ltd 00033ASilicon Wave, Inc 00033BTAMI Tech Co., Ltd 00033CDaiden Co., Ltd 00033DILSHin Lab 00033ETateyama System Laboratory Co., Ltd 00033FBigBand Networks, Ltd 000340Floware Wireless Systems, Ltd 000341Axon Digital Design 000342Nortel Networks 000343Martin Professional A/S 000344Tietech.Co., Ltd 000345Routrek Networks Corporation 000346Hitachi Kokusai Electric, Inc 000347Intel Corporation 000348Norscan Instruments, Ltd 000349Vidicode Datacommunicatie B.V 00034ARIAS Corporation 00034BNortel Networks 00034CShanghai DigiVision Technology Co., Ltd 00034DChiaro Networks, Ltd 00034EPos Data Company, Ltd 00034FSur-Gard Security 000350BTICINO SPA 000351Diebold, Inc 000352Colubris Networks 000353Mitac, Inc 000354Fiber Logic Communications 000355TeraBeam Internet Systems 000356Wincor Nixdorf International GmbH 000357Intervoice-Brite, Inc 000358Hanyang Digitech Co., Ltd 000359DigitalSis 00035APhotron Limited 00035BBridgeWave Communications 00035CSaint Song Corp 00035DBosung Hi-Net Co., Ltd 00035EMetropolitan Area Networks, Inc 00035FPrüftechnik Condition Monitoring GmbH & Co. KG 000360PAC Interactive Technology, Inc 000361Widcomm, Inc 000362Vodtel Communications, Inc 000363Miraesys Co., Ltd 000364Scenix Semiconductor, Inc 000365Kira Information & Communications, Ltd 000366ASM Pacific Technology 000367Jasmine Networks, Inc 000368Embedone Co., Ltd 000369Nippon Antenna Co., Ltd 00036AMainnet, Ltd 00036BCISCO SYSTEMS, INC 00036CCISCO SYSTEMS, INC 00036DRuntop, Inc 00036ENicon Systems (Pty) Limited 00036FTelsey SPA 000370NXTV, Inc 000371Acomz Networks Corp 000372ULAN 000373Aselsan A.S 000374Control Microsystems 000375NetMedia, Inc 000376Graphtec Technology, Inc 000377Gigabit Wireless 000378HUMAX Co., Ltd 000379Proscend Communications, Inc 00037ATaiyo Yuden Co., Ltd 00037BIDEC IZUMI Corporation 00037CCoax Media 00037DStellcom 00037EPORTech Communications, Inc 00037FAtheros Communications, Inc 000380SSH Communications Security Corp 000381Ingenico International 000382A-One Co., Ltd 000383Metera Networks, Inc 000384AETA 000385Actelis Networks, Inc 000386Ho Net, Inc 000387Blaze Network Products 000388Fastfame Technology Co., Ltd 000389Plantronics 00038AAmerica Online, Inc 00038BPLUS-ONE I&T, Inc 00038CTotal Impact 00038DPCS Revenue Control Systems, Inc 00038EAtoga Systems, Inc 00038FWeinschel Corporation 000390Digital Video Communications, Inc 000391Advanced Digital Broadcast, Ltd 000392Hyundai Teletek Co., Ltd 000393Apple 000394Connect One 000395California Amplifier 000396EZ Cast Co., Ltd 000397Watchfront Limited 000398WISI 000399Dongju Informations & Communications Co., Ltd 00039ASiConnect 00039BNetChip Technology, Inc 00039COptiMight Communications, Inc 00039DQisda Corporation 00039ETera System Co., Ltd 00039FCISCO SYSTEMS, INC 0003A0CISCO SYSTEMS, INC 0003A1HIPER Information & Communication, Inc 0003A2Catapult Communications 0003A3MAVIX, Ltd 0003A4Imation Corp 0003A5Medea Corporation 0003A6Traxit Technology, Inc 0003A7Unixtar Technology, Inc 0003A8IDOT Computers, Inc 0003A9AXCENT Media AG 0003AAWatlow 0003ABBridge Information Systems 0003ACFronius Schweissmaschinen 0003ADEmerson Energy Systems AB 0003AEAllied Advanced Manufacturing Pte, Ltd 0003AFParagea Communications 0003B0Xsense Technology Corp 0003B1Hospira Inc 0003B2Radware 0003B3IA Link Systems Co., Ltd 0003B4Macrotek International Corp 0003B5Entra Technology Co 0003B6QSI Corporation 0003B7ZACCESS Systems 0003B8NetKit Solutions, LLC 0003B9Hualong Telecom Co., Ltd 0003BAOracle Corporation 0003BBSignal Communications Limited 0003BCCOT GmbH 0003BDOmniCluster Technologies, Inc 0003BENetility 0003BFCenterpoint Broadband Technologies, Inc 0003C0RFTNC Co., Ltd 0003C1Packet Dynamics Ltd 0003C2Solphone K.K 0003C3Micronik Multimedia 0003C4Tomra Systems ASA 0003C5Mobotix AG 0003C6ICUE Systems, Inc 0003C7hopf Elektronik GmbH 0003C8CML Emergency Services 0003C9TECOM Co., Ltd 0003CAMTS Systems Corp 0003CBNippon Systems Development Co., Ltd 0003CCMomentum Computer, Inc 0003CDClovertech, Inc 0003CEETEN Technologies, Inc 0003CFMuxcom, Inc 0003D0KOANKEISO Co., Ltd 0003D1Takaya Corporation 0003D2Crossbeam Systems, Inc 0003D3Internet Energy Systems, Inc 0003D4Alloptic, Inc 0003D5Advanced Communications Co., Ltd 0003D6RADVision, Ltd 0003D7NextNet Wireless, Inc 0003D8iMPath Networks, Inc 0003D9Secheron SA 0003DATakamisawa Cybernetics Co., Ltd 0003DBApogee Electronics Corp 0003DCLexar Media, Inc 0003DDComark Corp 0003DEOTC Wireless 0003DFDesana Systems 0003E0ARRIS Group, Inc 0003E1Winmate Communication, Inc 0003E2Comspace Corporation 0003E3CISCO SYSTEMS, INC 0003E4CISCO SYSTEMS, INC 0003E5Hermstedt SG 0003E6Entone, Inc 0003E7Logostek Co. Ltd 0003E8Wavelength Digital Limited 0003E9Akara Canada, Inc 0003EAMega System Technologies, Inc 0003EBAtrica 0003ECICG Research, Inc 0003EDShinkawa Electric Co., Ltd 0003EEMKNet Corporation 0003EFOneline AG 0003F0Redfern Broadband Networks 0003F1Cicada Semiconductor, Inc 0003F2Seneca Networks 0003F3Dazzle Multimedia, Inc 0003F4NetBurner 0003F5Chip2Chip 0003F6Allegro Networks, Inc 0003F7Plast-Control GmbH 0003F8SanCastle Technologies, Inc 0003F9Pleiades Communications, Inc 0003FATiMetra Networks 0003FBENEGATE Co.,Ltd 0003FCIntertex Data AB 0003FDCISCO SYSTEMS, INC 0003FECISCO SYSTEMS, INC 0003FFMicrosoft Corporation 000400LEXMARK INTERNATIONAL, INC 000401Osaki Electric Co., Ltd 000402Nexsan Technologies, Ltd 000403Nexsi Corporation 000404Makino Milling Machine Co., Ltd 000405ACN Technologies 000406Fa. Metabox AG 000407Topcon Positioning Systems, Inc 000408Sanko Electronics Co., Ltd 000409Cratos Networks 00040ASage Systems 00040B3com Europe Ltd 00040CKanno Works, Ltd 00040DAvaya, Inc 00040EAVM GmbH 00040FAsus Network Technologies, Inc 000410Spinnaker Networks, Inc 000411Inkra Networks, Inc 000412WaveSmith Networks, Inc 000413SNOM Technology AG 000414Umezawa Musen Denki Co., Ltd 000415Rasteme Systems Co., Ltd 000416Parks S/A Comunicacoes Digitais 000417ELAU AG 000418Teltronic S.A.U 000419Fibercycle Networks, Inc 00041AInes Test and Measurement GmbH & CoKG 00041BBridgeworks Ltd 00041CipDialog, Inc 00041DCorega of America 00041EShikoku Instrumentation Co., Ltd 00041FSony Computer Entertainment, Inc 000420Slim Devices, Inc 000421Ocular Networks 000422Gordon Kapes, Inc 000423Intel Corporation 000424TMC s.r.l 000425Atmel Corporation 000426Autosys 000427CISCO SYSTEMS, INC 000428CISCO SYSTEMS, INC 000429Pixord Corporation 00042AWireless Networks, Inc 00042BIT Access Co., Ltd 00042CMinet, Inc 00042DSarian Systems, Ltd 00042ENetous Technologies, Ltd 00042FInternational Communications Products, Inc 000430Netgem 000431GlobalStreams, Inc 000432Voyetra Turtle Beach, Inc 000433Cyberboard A/S 000434Accelent Systems, Inc 000435Comptek International, Inc 000436ELANsat Technologies, Inc 000437Powin Information Technology, Inc 000438Nortel Networks 000439Rosco Entertainment Technology, Inc 00043AIntelligent Telecommunications, Inc 00043BLava Computer Mfg., Inc 00043CSONOS Co., Ltd 00043DINDEL AG 00043ETelencomm 00043FESTeem Wireless Modems, Inc 000440cyberPIXIE, Inc 000441Half Dome Systems, Inc 000442NACT 000443Agilent Technologies, Inc 000444Western Multiplex Corporation 000445LMS Skalar Instruments GmbH 000446CYZENTECH Co., Ltd 000447Acrowave Systems Co., Ltd 000448Polaroid Corporation 000449Mapletree Networks 00044AiPolicy Networks, Inc 00044BNVIDIA 00044CJENOPTIK 00044DCISCO SYSTEMS, INC 00044ECISCO SYSTEMS, INC 00044FLeukhardt Systemelektronik GmbH 000450DMD Computers SRL 000451Medrad, Inc 000452RocketLogix, Inc 000453YottaYotta, Inc 000454Quadriga UK 000455ANTARA.net 000456Cambium Networks Limited 000457Universal Access Technology, Inc 000458Fusion X Co., Ltd 000459Veristar Corporation 00045AThe Linksys Group, Inc 00045BTechsan Electronics Co., Ltd 00045CMobiwave Pte Ltd 00045DBEKA Elektronik 00045EPolyTrax Information Technology AG 00045FAvalue Technology, Inc 000460Knilink Technology, Inc 000461EPOX Computer Co., Ltd 000462DAKOS Data & Communication Co., Ltd 000463Bosch Security Systems 000464Pulse-Link Inc 000465i.s.t isdn-support technik GmbH 000466ARMITEL Co 000467Wuhan Research Institute of MII 000468Vivity, Inc 000469Innocom, Inc 00046ANavini Networks 00046BPalm Wireless, Inc 00046CCyber Technology Co., Ltd 00046DCISCO SYSTEMS, INC 00046ECISCO SYSTEMS, INC 00046FDigitel S/A Industria Eletronica 000470ipUnplugged AB 000471IPrad 000472Telelynx, Inc 000473Photonex Corporation 000474LEGRAND 0004753 Com Corporation 0004763 Com Corporation 000477Scalant Systems, Inc 000478G. Star Technology Corporation 000479Radius Co., Ltd 00047AAXXESSIT ASA 00047BSchlumberger 00047CSkidata AG 00047DPelco 00047ESiqura B.V 00047FChr. Mayr GmbH & Co. KG 000480Brocade Communications Systems, Inc 000481Econolite Control Products, Inc 000482Medialogic Corp 000483Deltron Technology, Inc 000484Amann GmbH 000485PicoLight 000486ITTC, University of Kansas 000487Cogency Semiconductor, Inc 000488Eurotherm Controls 000489YAFO Networks, Inc 00048ATemia Vertriebs GmbH 00048BPoscon Corporation 00048CNayna Networks, Inc 00048DTone Commander Systems, Inc 00048EOhm Tech Labs, Inc 00048FTD Systems Corporation 000490Optical Access 000491Technovision, Inc 000492Hive Internet, Ltd 000493Tsinghua Unisplendour Co., Ltd 000494Breezecom, Ltd 000495Tejas Networks India Limited 000496Extreme Networks 000497MacroSystem Digital Video AG 000498Mahi Networks 000499Chino Corporation 00049ACISCO SYSTEMS, INC 00049BCISCO SYSTEMS, INC 00049CSurgient Networks, Inc 00049DIpanema Technologies 00049EWirelink Co., Ltd 00049FFreescale Semiconductor 0004A0Verity Instruments, Inc 0004A1Pathway Connectivity 0004A2L.S.I. Japan Co., Ltd 0004A3Microchip Technology, Inc 0004A4NetEnabled, Inc 0004A5Barco Projection Systems NV 0004A6SAF Tehnika Ltd 0004A7FabiaTech Corporation 0004A8Broadmax Technologies, Inc 0004A9SandStream Technologies, Inc 0004AAJetstream Communications 0004ABComverse Network Systems, Inc 0004ACIBM Corp 0004ADMalibu Networks 0004AESullair Corporation 0004AFDigital Fountain, Inc 0004B0ELESIGN Co., Ltd 0004B1Signal Technology, Inc 0004B2ESSEGI SRL 0004B3Videotek, Inc 0004B4CIAC 0004B5Equitrac Corporation 0004B6Stratex Networks, Inc 0004B7AMB i.t. Holding 0004B8Kumahira Co., Ltd 0004B9S.I. Soubou, Inc 0004BAKDD Media Will Corporation 0004BBBardac Corporation 0004BCGiantec, Inc 0004BDARRIS Group, Inc 0004BEOptXCon, Inc 0004BFVersaLogic Corp 0004C0CISCO SYSTEMS, INC 0004C1CISCO SYSTEMS, INC 0004C2Magnipix, Inc 0004C3CASTOR Informatique 0004C4Allen & Heath Limited 0004C5ASE Technologies, USA 0004C6Yamaha Motor Co., Ltd 0004C7NetMount 0004C8LIBA Maschinenfabrik GmbH 0004C9Micro Electron Co., Ltd 0004CAFreeMs Corp 0004CBTdsoft Communication, Ltd 0004CCPeek Traffic B.V 0004CDExtenway Solutions Inc 0004CEPatria Ailon 0004CFSeagate Technology 0004D0Softlink s.r.o 0004D1Drew Technologies, Inc 0004D2Adcon Telemetry GmbH 0004D3Toyokeiki Co., Ltd 0004D4Proview Electronics Co., Ltd 0004D5Hitachi Information & Communication Engineering, Ltd 0004D6Takagi Industrial Co., Ltd 0004D7Omitec Instrumentation Ltd 0004D8IPWireless, Inc 0004D9Titan Electronics, Inc 0004DARelax Technology, Inc 0004DBTellus Group Corp 0004DCNortel Networks 0004DDCISCO SYSTEMS, INC 0004DECISCO SYSTEMS, INC 0004DFTeracom Telematica Ltda 0004E0Procket Networks 0004E1Infinior Microsystems 0004E2SMC Networks, Inc 0004E3Accton Technology Corp 0004E4Daeryung Ind., Inc 0004E5Glonet Systems, Inc 0004E6Banyan Network Private Limited 0004E7Lightpointe Communications, Inc 0004E8IER, Inc 0004E9Infiniswitch Corporation 0004EAHewlett-Packard Company 0004EBPaxonet Communications, Inc 0004ECMemobox SA 0004EDBillion Electric Co., Ltd 0004EELincoln Electric Company 0004EFPolestar Corp 0004F0International Computers, Ltd 0004F1WhereNet 0004F2Polycom 0004F3FS FORTH-SYSTEME GmbH 0004F4Infinite Electronics Inc 0004F5SnowShore Networks, Inc 0004F6Amphus 0004F7Omega Band, Inc 0004F8QUALICABLE TV Industria E Com., Ltda 0004F9Xtera Communications, Inc 0004FANBS Technologies Inc 0004FBCommtech, Inc 0004FCStratus Computer (DE), Inc 0004FDJapan Control Engineering Co., Ltd 0004FEPelago Networks 0004FFAcronet Co., Ltd 000500CISCO SYSTEMS, INC 000501CISCO SYSTEMS, INC 000502Apple 000503ICONAG 000504Naray Information & Communication Enterprise 000505Systems Integration Solutions, Inc 000506Reddo Networks AB 000507Fine Appliance Corp 000508Inetcam, Inc 000509AVOC Nishimura Ltd 00050AICS Spa 00050BSICOM Systems, Inc 00050CNetwork Photonics, Inc 00050DMidstream Technologies, Inc 00050E3ware, Inc 00050FTanaka S/S Ltd 000510Infinite Shanghai Communication Terminals Ltd 000511Complementary Technologies Ltd 000512MeshNetworks, Inc 000513VTLinx Multimedia Systems, Inc 000514KDT Systems Co., Ltd 000515Nuark Co., Ltd 000516SMART Modular Technologies 000517Shellcomm, Inc 000518Jupiters Technology 000519Siemens Building Technologies AG, 00051A3Com Europe Ltd 00051BMagic Control Technology Corporation 00051CXnet Technology Corp 00051DAirocon, Inc 00051EBrocade Communications Systems, Inc 00051FTaijin Media Co., Ltd 000520Smartronix, Inc 000521Control Microsystems 000522LEA*D Corporation, Inc 000523AVL List GmbH 000524BTL System (HK) Limited 000525Puretek Industrial Co., Ltd 000526IPAS GmbH 000527SJ Tek Co. Ltd 000528New Focus, Inc 000529Shanghai Broadan Communication Technology Co., Ltd 00052AIkegami Tsushinki Co., Ltd 00052BHORIBA, Ltd 00052CSupreme Magic Corporation 00052DZoltrix International Limited 00052ECinta Networks 00052FLeviton Network Solutions 000530Andiamo Systems, Inc 000531CISCO SYSTEMS, INC 000532CISCO SYSTEMS, INC 000533Brocade Communications Systems, Inc 000534Northstar Engineering Ltd 000535Chip PC Ltd 000536Danam Communications, Inc 000537Nets Technology Co., Ltd 000538Merilus, Inc 000539A Brand New World in Sweden AB 00053AWillowglen Services Pte Ltd 00053BHarbour Networks Ltd., Co. Beijing 00053CXircom 00053DAgere Systems 00053EKID Systeme GmbH 00053FVisionTek, Inc 000540FAST Corporation 000541Advanced Systems Co., Ltd 000542Otari, Inc 000543IQ Wireless GmbH 000544Valley Technologies, Inc 000545Internet Photonics 000546KDDI Network & Solultions Inc 000547Starent Networks 000548Disco Corporation 000549Salira Optical Network Systems 00054AArio Data Networks, Inc 00054BEaton Automation AG 00054CRF Innovations Pty Ltd 00054DBrans Technologies, Inc 00054EPhilips 00054F 000550Vcomms Connect Limited 000551F & S Elektronik Systeme GmbH 000552Xycotec Computer GmbH 000553DVC Company, Inc 000554Rangestar Wireless 000555Japan Cash Machine Co., Ltd 000556360 Systems 000557Agile TV Corporation 000558Synchronous, Inc 000559Intracom S.A 00055APower Dsine Ltd 00055BCharles Industries, Ltd 00055CKowa Company, Ltd 00055DD-Link Systems, Inc 00055ECISCO SYSTEMS, INC 00055FCISCO SYSTEMS, INC 000560LEADER COMM.CO., LTD 000561nac Image Technology, Inc 000562Digital View Limited 000563J-Works, Inc 000564Tsinghua Bitway Co., Ltd 000565Tailyn Communication Company Ltd 000566Secui.com Corporation 000567Etymonic Design, Inc 000568Piltofish Networks AB 000569VMware, Inc 00056AHeuft Systemtechnik GmbH 00056BC.P. Technology Co., Ltd 00056CHung Chang Co., Ltd 00056DPacific Corporation 00056ENational Enhance Technology, Inc 00056FInnomedia Technologies Pvt. Ltd 000570Baydel Ltd 000571Seiwa Electronics Co 000572Deonet Co., Ltd 000573CISCO SYSTEMS, INC 000574CISCO SYSTEMS, INC 000575CDS-Electronics BV 000576NSM Technology Ltd 000577SM Information & Communication 000578 000579Universal Control Solution Corp 00057AOverture Networks 00057BChung Nam Electronic Co., Ltd 00057CRCO Security AB 00057DSun Communications, Inc 00057EEckelmann Steuerungstechnik GmbH 00057FAcqis Technology 000580FibroLAN Ltd 000581Snell 000582ClearCube Technology 000583ImageCom Limited 000584AbsoluteValue Systems, Inc 000585Juniper Networks, Inc 000586Lucent Technologies 000587Locus, Incorporated 000588Sensoria Corp 000589National Datacomputer 00058ANetcom Co., Ltd 00058BIPmental, Inc 00058COpentech Inc 00058DLynx Photonic Networks, Inc 00058EFlextronics International GmbH & Co. Nfg. KG 00058FCLCsoft co 000590Swissvoice Ltd 000591Active Silicon Ltd 000592Pultek Corp 000593Grammar Engine Inc 000594IXXAT Automation GmbH 000595Alesis Corporation 000596Genotech Co., Ltd 000597Eagle Traffic Control Systems 000598CRONOS S.r.l 000599DRS Test and Energy Management or DRS-TEM 00059ACISCO SYSTEMS, INC 00059BCISCO SYSTEMS, INC 00059CKleinknecht GmbH, Ing. Büro 00059DDaniel Computing Systems, Inc 00059EZinwell Corporation 00059FYotta Networks, Inc 0005A0MOBILINE Kft 0005A1Zenocom 0005A2CELOX Networks 0005A3QEI, Inc 0005A4Lucid Voice Ltd 0005A5KOTT 0005A6Extron Electronics 0005A7Hyperchip, Inc 0005A8WYLE ELECTRONICS 0005A9Princeton Networks, Inc 0005AAMoore Industries International Inc 0005ABCyber Fone, Inc 0005ACNorthern Digital, Inc 0005ADTopspin Communications, Inc 0005AEMediaport USA 0005AFInnoScan Computing A/S 0005B0Korea Computer Technology Co., Ltd 0005B1ASB Technology BV 0005B2Medison Co., Ltd 0005B3Asahi-Engineering Co., Ltd 0005B4Aceex Corporation 0005B5Broadcom Technologies 0005B6INSYS Microelectronics GmbH 0005B7Arbor Technology Corp 0005B8Electronic Design Associates, Inc 0005B9Airvana, Inc 0005BAArea Netwoeks, Inc 0005BBMyspace AB 0005BCResource Data Management Ltd 0005BDROAX BV 0005BEKongsberg Seatex AS 0005BFJustEzy Technology, Inc 0005C0Digital Network Alacarte Co., Ltd 0005C1A-Kyung Motion, Inc 0005C2Soronti, Inc 0005C3Pacific Instruments, Inc 0005C4Telect, Inc 0005C5Flaga HF 0005C6Triz Communications 0005C7I/F-COM A/S 0005C8VERYTECH 0005C9LG Innotek Co., Ltd 0005CAHitron Technology, Inc 0005CBROIS Technologies, Inc 0005CCSumtel Communications, Inc 0005CDDenon, Ltd 0005CEProlink Microsystems Corporation 0005CFThunder River Technologies, Inc 0005D0Solinet Systems 0005D1Metavector Technologies 0005D2DAP Technologies 0005D3eProduction Solutions, Inc 0005D4FutureSmart Networks, Inc 0005D5Speedcom Wireless 0005D6L-3 Linkabit 0005D7Vista Imaging, Inc 0005D8Arescom, Inc 0005D9Techno Valley, Inc 0005DAApex Automationstechnik 0005DBPSI Nentec GmbH 0005DCCISCO SYSTEMS, INC 0005DDCISCO SYSTEMS, INC 0005DEGi Fone Korea, Inc 0005DFElectronic Innovation, Inc 0005E0Empirix Corp 0005E1Trellis Photonics, Ltd 0005E2Creativ Network Technologies 0005E3LightSand Communications, Inc 0005E4Red Lion Controls Inc 0005E5Renishaw PLC 0005E6Egenera, Inc 0005E7Netrake an AudioCodes Company 0005E8TurboWave, Inc 0005E9Unicess Network, Inc 0005EARednix 0005EBBlue Ridge Networks, Inc 0005ECMosaic Systems Inc 0005EDTechnikum Joanneum GmbH 0005EESiemens AB, Infrastructure & Cities, Building Technologies Division, IC BT SSP SP BA PR 0005EFADOIR Digital Technology 0005F0SATEC 0005F1Vrcom, Inc 0005F2Power R, Inc 0005F3Webyn 0005F4System Base Co., Ltd 0005F5Geospace Technologies 0005F6Young Chang Co. Ltd 0005F7Analog Devices, Inc 0005F8Real Time Access, Inc 0005F9TOA Corporation 0005FAIPOptical, Inc 0005FBShareGate, Inc 0005FCSchenck Pegasus Corp 0005FDPacketLight Networks Ltd 0005FETraficon N.V 0005FFSNS Solutions, Inc 000600Toshiba Teli Corporation 000601Otanikeiki Co., Ltd 000602Cirkitech Electronics Co 000603Baker Hughes Inc 000604@Track Communications, Inc 000605Inncom International, Inc 000606RapidWAN, Inc 000607Omni Directional Control Technology Inc 000608At-Sky SAS 000609Crossport Systems 00060ABlue2space 00060BArtesyn Embedded Technologies 00060CMelco Industries, Inc 00060DWave7 Optics 00060EIGYS Systems, Inc 00060FNarad Networks Inc 000610Abeona Networks Inc 000611Zeus Wireless, Inc 000612Accusys, Inc 000613Kawasaki Microelectronics Incorporated 000614Prism Holdings 000615Kimoto Electric Co., Ltd 000616Tel Net Co., Ltd 000617Redswitch Inc 000618DigiPower Manufacturing Inc 000619Connection Technology Systems 00061AZetari Inc 00061BNotebook Development Lab. Lenovo Japan Ltd 00061CHoshino Metal Industries, Ltd 00061DMIP Telecom, Inc 00061EMaxan Systems 00061FVision Components GmbH 000620Serial System Ltd 000621Hinox, Co., Ltd 000622Chung Fu Chen Yeh Enterprise Corp 000623MGE UPS Systems France 000624Gentner Communications Corp 000625The Linksys Group, Inc 000626MWE GmbH 000627Uniwide Technologies, Inc 000628CISCO SYSTEMS, INC 000629IBM Corp 00062ACISCO SYSTEMS, INC 00062BINTRASERVER TECHNOLOGY 00062CBivio Networks 00062DTouchStar Technologies, L.L.C 00062EAristos Logic Corp 00062FPivotech Systems Inc 000630Adtranz Sweden 000631Calix 000632Mesco Engineering GmbH 000633Cross Match Technologies GmbH 000634GTE Airfone Inc 000635PacketAir Networks, Inc 000636Jedai Broadband Networks 000637Toptrend-Meta Information (ShenZhen) Inc 000638Sungjin C&C Co., Ltd 000639Newtec 00063ADura Micro, Inc 00063BArcturus Networks Inc 00063CIntrinsyc Software International Inc 00063DMicrowave Data Systems Inc 00063EOpthos Inc 00063FEverex Communications Inc 000640White Rock Networks 000641ITCN 000642Genetel Systems Inc 000643SONO Computer Co., Ltd 000644Neix,Inc 000645Meisei Electric Co. Ltd 000646ShenZhen XunBao Network Technology Co Ltd 000647Etrali S.A 000648Seedsware, Inc 0006493M Deutschland GmbH 00064AHoneywell Co., Ltd. (KOREA) 00064BAlexon Co., Ltd 00064CInvicta Networks, Inc 00064DSencore 00064EBroad Net Technology Inc 00064FPRO-NETS Technology Corporation 000650Tiburon Networks, Inc 000651Aspen Networks Inc 000652CISCO SYSTEMS, INC 000653CISCO SYSTEMS, INC 000654Winpresa Building Automation Technologies GmbH 000655Yipee, Inc 000656Tactel AB 000657Market Central, Inc 000658Helmut Fischer GmbH Institut für Elektronik und Messtechnik 000659EAL (Apeldoorn) B.V 00065AStrix Systems 00065BDell Computer Corp 00065CMalachite Technologies, Inc 00065DHeidelberg Web Systems 00065EPhoturis, Inc 00065FECI Telecom - NGTS Ltd 000660NADEX Co., Ltd 000661NIA Home Technologies Corp 000662MBM Technology Ltd 000663Human Technology Co., Ltd 000664Fostex Corporation 000665Sunny Giken, Inc 000666Roving Networks 000667Tripp Lite 000668Vicon Industries Inc 000669Datasound Laboratories Ltd 00066AInfiniCon Systems, Inc 00066BSysmex Corporation 00066CRobinson Corporation 00066DCompuprint S.P.A 00066EDelta Electronics, Inc 00066FKorea Data Systems 000670Upponetti Oy 000671Softing AG 000672Netezza 000673TKH Security Solutions USA 000674Spectrum Control, Inc 000675Banderacom, Inc 000676Novra Technologies Inc 000677SICK AG 000678Marantz Brand Company 000679Konami Corporation 00067AJMP Systems 00067BToplink C&C Corporation 00067CCISCO SYSTEMS, INC 00067DTakasago Ltd 00067EWinCom Systems, Inc 00067FDigeo, Inc 000680Card Access, Inc 000681Goepel Electronic GmbH 000682Convedia 000683Bravara Communications, Inc 000684Biacore AB 000685NetNearU Corporation 000686ZARDCOM Co., Ltd 000687Omnitron Systems Technology, Inc 000688Telways Communication Co., Ltd 000689yLez Technologies Pte Ltd 00068ANeuronNet Co. Ltd. R&D Center 00068BAirRunner Technologies, Inc 00068C3Com Corporation 00068DSEPATON, Inc 00068EHID Corporation 00068FTelemonitor, Inc 000690Euracom Communication GmbH 000691PT Inovacao 000692Intruvert Networks, Inc 000693Flexus Computer Technology, Inc 000694Mobillian Corporation 000695Ensure Technologies, Inc 000696Advent Networks 000697R & D Center 000698egnite GmbH 000699Vida Design Co 00069Ae & Tel 00069BAVT Audio Video Technologies GmbH 00069CTransmode Systems AB 00069DPetards Ltd 00069EUNIQA, Inc 00069FKuokoa Networks 0006A0Mx Imaging 0006A1Celsian Technologies, Inc 0006A2Microtune, Inc 0006A3Bitran Corporation 0006A4INNOWELL Corp 0006A5PINON Corp 0006A6Artistic Licence Engineering Ltd 0006A7Primarion 0006A8KC Technology, Inc 0006A9Universal Instruments Corp 0006AAVT Miltope 0006ABW-Link Systems, Inc 0006ACIntersoft Co 0006ADKB Electronics Ltd 0006AEHimachal Futuristic Communications Ltd 0006AFXalted Networks 0006B0Comtech EF Data Corp 0006B1Sonicwall 0006B2Linxtek Co 0006B3Diagraph Corporation 0006B4Vorne Industries, Inc 0006B5Source Photonics, Inc 0006B6Nir-Or Israel Ltd 0006B7TELEM GmbH 0006B8Bandspeed Pty Ltd 0006B9A5TEK Corp 0006BAWestwave Communications 0006BBATI Technologies Inc 0006BCMacrolink, Inc 0006BDBNTECHNOLOGY Co., Ltd 0006BEBaumer Optronic GmbH 0006BFAccella Technologies Co., Ltd 0006C0United Internetworks, Inc 0006C1CISCO SYSTEMS, INC 0006C2Smartmatic Corporation 0006C3Schindler Elevator Ltd 0006C4Piolink Inc 0006C5INNOVI Technologies Limited 0006C6lesswire AG 0006C7RFNET Technologies Pte Ltd (S) 0006C8Sumitomo Metal Micro Devices, Inc 0006C9Technical Marketing Research, Inc 0006CAAmerican Computer & Digital Components, Inc. (ACDC) 0006CBJotron Electronics A/S 0006CCJMI Electronics Co., Ltd 0006CDLeaf Imaging Ltd 0006CEDATENO 0006CFThales Avionics In-Flight Systems, LLC 0006D0Elgar Electronics Corp 0006D1Tahoe Networks, Inc 0006D2Tundra Semiconductor Corp 0006D3Alpha Telecom, Inc. U.S.A 0006D4Interactive Objects, Inc 0006D5Diamond Systems Corp 0006D6CISCO SYSTEMS, INC 0006D7CISCO SYSTEMS, INC 0006D8Maple Optical Systems 0006D9IPM-Net S.p.A 0006DAITRAN Communications Ltd 0006DBICHIPS Co., Ltd 0006DCSyabas Technology (Amquest) 0006DDAT & T Laboratories - Cambridge Ltd 0006DEFlash Technology 0006DFAIDONIC Corporation 0006E0MAT Co., Ltd 0006E1Techno Trade s.a 0006E2Ceemax Technology Co., Ltd 0006E3Quantitative Imaging Corporation 0006E4Citel Technologies Ltd 0006E5Fujian Newland Computer Ltd. Co 0006E6DongYang Telecom Co., Ltd 0006E7Bit Blitz Communications Inc 0006E8Optical Network Testing, Inc 0006E9Intime Corp 0006EAELZET80 Mikrocomputer GmbH&Co. KG 0006EBGlobal Data 0006ECHarris Corporation 0006EDInara Networks 0006EEShenyang Neu-era Information & Technology Stock Co., Ltd 0006EFMaxxan Systems, Inc 0006F0Digeo, Inc 0006F1Optillion 0006F2Platys Communications 0006F3AcceLight Networks 0006F4Prime Electronics & Satellitics Inc 0006F5ALPS Co,. Ltd 0006F6CISCO SYSTEMS, INC 0006F7ALPS Co,. Ltd 0006F8The Boeing Company 0006F9Mitsui Zosen Systems Research Inc 0006FAIP SQUARE Co, Ltd 0006FBHitachi Printing Solutions, Ltd 0006FCFnet Co., Ltd 0006FDComjet Information Systems Corp 0006FEAmbrado, Inc 0006FFSheba Systems Co., Ltd 000700Zettamedia Korea 000701RACAL-DATACOM 000702Varian Medical Systems 000703CSEE Transport 000704ALPS Co,. Ltd 000705Endress & Hauser GmbH & Co 000706Sanritz Corporation 000707Interalia Inc 000708Bitrage Inc 000709Westerstrand Urfabrik AB 00070AUnicom Automation Co., Ltd 00070BNovabase SGPS, SA 00070CSVA-Intrusion.com Co. Ltd 00070DCISCO SYSTEMS, INC 00070ECISCO SYSTEMS, INC 00070FFujant, Inc 000710Adax, Inc 000711Acterna 000712JAL Information Technology 000713IP One, Inc 000714Brightcom 000715General Research of Electronics, Inc 000716J & S Marine Ltd 000717Wieland Electric GmbH 000718iCanTek Co., Ltd 000719Mobiis Co., Ltd 00071AFinedigital Inc 00071BCDVI Americas Ltd 00071CAT&T Fixed Wireless Services 00071DSatelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A 00071ETri-M Engineering / Nupak Dev. Corp 00071FEuropean Systems Integration 000720Trutzschler GmbH & Co. KG 000721Formac Elektronik GmbH 000722The Nielsen Company 000723ELCON Systemtechnik GmbH 000724Telemax Co., Ltd 000725Bematech International Corp 000726Shenzhen Gongjin Electronics Co., Ltd 000727Zi Corporation (HK) Ltd 000728Neo Telecom 000729Kistler Instrumente AG 00072AInnovance Networks 00072BJung Myung Telecom Co., Ltd 00072CFabricom 00072DCNSystems 00072ENorth Node AB 00072FIntransa, Inc 000730Hutchison OPTEL Telecom Technology Co., Ltd 000731Ophir-Spiricon LLC 000732AAEON Technology Inc 000733DANCONTROL Engineering 000734ONStor, Inc 000735Flarion Technologies, Inc 000736Data Video Technologies Co., Ltd 000737Soriya Co. Ltd 000738Young Technology Co., Ltd 000739Scotty Group Austria Gmbh 00073AInventel Systemes 00073BTenovis GmbH & Co KG 00073CTelecom Design 00073DNanjing Postel Telecommunications Co., Ltd 00073EChina Great-Wall Computer Shenzhen Co., Ltd 00073FWoojyun Systec Co., Ltd 000740Buffalo Inc 000741Sierra Automated Systems 000742Current Technologies, LLC 000743Chelsio Communications 000744Unico, Inc 000745Radlan Computer Communications Ltd 000746TURCK, Inc 000747Mecalc 000748The Imaging Source Europe 000749CENiX Inc 00074ACarl Valentin GmbH 00074BDaihen Corporation 00074CBeicom Inc 00074DZebra Technologies Corp 00074EIPFRONT Inc 00074FCISCO SYSTEMS, INC 000750CISCO SYSTEMS, INC 000751m-u-t AG 000752Rhythm Watch Co., Ltd 000753Beijing Qxcomm Technology Co., Ltd 000754Xyterra Computing, Inc 000755Lafon 000756Juyoung Telecom 000757Topcall International AG 000758Dragonwave 000759Boris Manufacturing Corp 00075AAir Products and Chemicals, Inc 00075BGibson Guitars 00075CEastman Kodak Company 00075DCelleritas Inc 00075EAmetek Power Instruments 00075FVCS Video Communication Systems AG 000760TOMIS Information & Telecom Corp 000761Logitech Europe SA 000762Group Sense Limited 000763Sunniwell Cyber Tech. Co., Ltd 000764YoungWoo Telecom Co. Ltd 000765Jade Quantum Technologies, Inc 000766Chou Chin Industrial Co., Ltd 000767Yuxing Electronics Company Limited 000768Danfoss A/S 000769Italiana Macchi SpA 00076ANEXTEYE Co., Ltd 00076BStralfors AB 00076CDaehanet, Inc 00076DFlexlight Networks 00076ESinetica Corporation Limited 00076FSynoptics Limited 000770Ubiquoss Inc 000771Embedded System Corporation 000772Alcatel Shanghai Bell Co., Ltd 000773Ascom Powerline Communications Ltd 000774GuangZhou Thinker Technology Co. Ltd 000775Valence Semiconductor, Inc 000776Federal APD 000777Motah Ltd 000778GERSTEL GmbH & Co. KG 000779Sungil Telecom Co., Ltd 00077AInfoware System Co., Ltd 00077BMillimetrix Broadband Networks 00077CWestermo Teleindustri AB 00077DCISCO SYSTEMS, INC 00077EElrest GmbH 00077FJ Communications Co., Ltd 000780Bluegiga Technologies OY 000781Itron Inc 000782Oracle Corporation 000783SynCom Network, Inc 000784CISCO SYSTEMS, INC 000785CISCO SYSTEMS, INC 000786Wireless Networks Inc 000787Idea System Co., Ltd 000788Clipcomm, Inc 000789DONGWON SYSTEMS 00078AMentor Data System Inc 00078BWegener Communications, Inc 00078CElektronikspecialisten i Borlange AB 00078DNetEngines Ltd 00078EGarz & Friche GmbH 00078FEmkay Innovative Products 000790Tri-M Technologies (s) Limited 000791International Data Communications, Inc 000792Sütron Electronic GmbH 000793Shin Satellite Public Company Limited 000794Simple Devices, Inc 000795Elitegroup Computer System Co. (ECS) 000796LSI Systems, Inc 000797Netpower Co., Ltd 000798Selea SRL 000799Tipping Point Technologies, Inc 00079AVerint Systems Inc 00079BAurora Networks 00079CGolden Electronics Technology Co., Ltd 00079DMusashi Co., Ltd 00079EIlinx Co., Ltd 00079FAction Digital Inc 0007A0e-Watch Inc 0007A1VIASYS Healthcare GmbH 0007A2Opteon Corporation 0007A3Ositis Software, Inc 0007A4GN Netcom Ltd 0007A5Y.D.K Co. Ltd 0007A6Home Automation, Inc 0007A7A-Z Inc 0007A8Haier Group Technologies Ltd 0007A9Novasonics 0007AAQuantum Data Inc 0007ABSamsung Electronics Co.,Ltd 0007ACEolring 0007ADPentacon GmbH Foto-und Feinwerktechnik 0007AEBritestream Networks, Inc 0007AFN-TRON Corporation 0007B0Office Details, Inc 0007B1Equator Technologies 0007B2Transaccess S.A 0007B3CISCO SYSTEMS, INC 0007B4CISCO SYSTEMS, INC 0007B5Any One Wireless Ltd 0007B6Telecom Technology Ltd 0007B7Samurai Ind. Prods Eletronicos Ltda 0007B8Corvalent Corporation 0007B9Ginganet Corporation 0007BAUTStarcom, Inc 0007BBCandera Inc 0007BCIdentix Inc 0007BDRadionet Ltd 0007BEDataLogic SpA 0007BFArmillaire Technologies, Inc 0007C0NetZerver Inc 0007C1Overture Networks, Inc 0007C2Netsys Telecom 0007C3Thomson 0007C4JEAN Co. Ltd 0007C5Gcom, Inc 0007C6VDS Vosskuhler GmbH 0007C7Synectics Systems Limited 0007C8Brain21, Inc 0007C9Technol Seven Co., Ltd 0007CACreatix Polymedia Ges Fur Kommunikaitonssysteme 0007CBFreebox SA 0007CCKaba Benzing GmbH 0007CDKumoh Electronic Co, Ltd 0007CECabletime Limited 0007CFAnoto AB 0007D0Automat Engenharia de Automação Ltda 0007D1Spectrum Signal Processing Inc 0007D2Logopak Systeme GmbH & Co. KG 0007D3SPGPrints B.V 0007D4Zhejiang Yutong Network Communication Co Ltd 0007D53e Technologies Int;., Inc 0007D6Commil Ltd 0007D7Caporis Networks AG 0007D8Hitron Systems Inc 0007D9Splicecom 0007DANeuro Telecom Co., Ltd 0007DBKirana Networks, Inc 0007DCAtek Co, Ltd 0007DDCradle Technologies 0007DEeCopilt AB 0007DFVbrick Systems Inc 0007E0Palm Inc 0007E1WIS Communications Co. Ltd 0007E2Bitworks, Inc 0007E3Navcom Technology, Inc 0007E4SoftRadio Co., Ltd 0007E5Coup Corporation 0007E6edgeflow Canada Inc 0007E7FreeWave Technologies 0007E8EdgeWave 0007E9Intel Corporation 0007EAMassana, Inc 0007EBCISCO SYSTEMS, INC 0007ECCISCO SYSTEMS, INC 0007EDAltera Corporation 0007EEtelco Informationssysteme GmbH 0007EFLockheed Martin Tactical Systems 0007F0LogiSync LLC 0007F1TeraBurst Networks Inc 0007F2IOA Corporation 0007F3Thinkengine Networks 0007F4Eletex Co., Ltd 0007F5Bridgeco Co AG 0007F6Qqest Software Systems 0007F7Galtronics 0007F8ITDevices, Inc 0007F9Sensaphone 0007FAITT Co., Ltd 0007FBGiga Stream UMTS Technologies GmbH 0007FCAdept Systems Inc 0007FDLANergy Ltd 0007FERigaku Corporation 0007FFGluon Networks 000800MULTITECH SYSTEMS, INC 000801HighSpeed Surfing Inc 000802Hewlett-Packard Company 000803Cos Tron 000804ICA Inc 000805Techno-Holon Corporation 000806Raonet Systems, Inc 000807Access Devices Limited 000808PPT Vision, Inc 000809Systemonic AG 00080AEspera-Werke GmbH 00080BBirka BPA Informationssystem AB 00080CVDA Elettronica spa 00080DToshiba 00080EARRIS Group, Inc 00080FProximion Fiber Optics AB 000810Key Technology, Inc 000811VOIX Corporation 000812GM-2 Corporation 000813Diskbank, Inc 000814TIL Technologies 000815CATS Co., Ltd 000816Bluelon ApS 000817EmergeCore Networks LLC 000818Pixelworks, Inc 000819Banksys 00081ASanrad Intelligence Storage Communications (2000) Ltd 00081BWindigo Systems 00081C@pos.com 00081DIpsil, Incorporated 00081ERepeatit AB 00081FPou Yuen Tech Corp. Ltd 000820CISCO SYSTEMS, INC 000821CISCO SYSTEMS, INC 000822InPro Comm 000823Texa Corp 000824Nuance Document Imaging 000825Acme Packet 000826Colorado Med Tech 000827ADB Broadband Italia 000828Koei Engineering Ltd 000829Aval Nagasaki Corporation 00082APowerwallz Network Security 00082BWooksung Electronics, Inc 00082CHomag AG 00082DIndus Teqsite Private Limited 00082EMultitone Electronics PLC 00082FCISCO SYSTEMS, INC 000830CISCO SYSTEMS, INC 000831CISCO SYSTEMS, INC 000832Cisco 00084EDivergeNet, Inc 00084FQualstar Corporation 000850Arizona Instrument Corp 000851Canadian Bank Note Company, Ltd 000852Davolink Co. Inc 000853Schleicher GmbH & Co. Relaiswerke KG 000854Netronix, Inc 000855NASA-Goddard Space Flight Center 000856Gamatronic Electronic Industries Ltd 000857Polaris Networks, Inc 000858Novatechnology Inc 000859ShenZhen Unitone Electronics Co., Ltd 00085AIntiGate Inc 00085BHanbit Electronics Co., Ltd 00085CShanghai Dare Technologies Co. Ltd 00085DAastra 00085EPCO AG 00085FPicanol N.V 000860LodgeNet Entertainment Corp 000861SoftEnergy Co., Ltd 000862NEC Eluminant Technologies, Inc 000863Entrisphere Inc 000864Fasy S.p.A 000865JASCOM CO., LTD 000866DSX Access Systems, Inc 000867Uptime Devices 000868PurOptix 000869Command-e Technology Co.,Ltd 00086ASecuriton Gmbh 00086BMIPSYS 00086CPlasmon LMS 00086DMissouri FreeNet 00086EHyglo AB 00086FResources Computer Network Ltd 000870Rasvia Systems, Inc 000871NORTHDATA Co., Ltd 000872Sorenson Communications 000873DapTechnology B.V 000874Dell Computer Corp 000875Acorp Electronics Corp 000876SDSystem 000877Liebert-Hiross Spa 000878Benchmark Storage Innovations 000879CEM Corporation 00087AWipotec GmbH 00087BRTX Telecom A/S 00087CCISCO SYSTEMS, INC 00087DCISCO SYSTEMS, INC 00087EBon Electro-Telecom Inc 00087FSPAUN electronic GmbH & Co. KG 000880BroadTel Canada Communications inc 000881DIGITAL HANDS CO.,LTD 000882SIGMA CORPORATION 000883Hewlett-Packard Company 000884Index Braille AB 000885EMS Dr. Thomas Wünsche 000886Hansung Teliann, Inc 000887Maschinenfabrik Reinhausen GmbH 000888OULLIM Information Technology Inc, 000889Echostar Technologies Corp 00088AMinds@Work 00088BTropic Networks Inc 00088CQuanta Network Systems Inc 00088DSigma-Links Inc 00088ENihon Computer Co., Ltd 00088FADVANCED DIGITAL TECHNOLOGY 000890AVILINKS SA 000891Lyan Inc 000892EM Solutions 000893LE INFORMATION COMMUNICATION INC 000894InnoVISION Multimedia Ltd 000895DIRC Technologie GmbH & Co.KG 000896Printronix, Inc 000897Quake Technologies 000898Gigabit Optics Corporation 000899Netbind, Inc 00089AAlcatel Microelectronics 00089BICP Electronics Inc 00089CElecs Industry Co., Ltd 00089DUHD-Elektronik 00089EBeijing Enter-Net co.LTD 00089FEFM Networks 0008A0Stotz Feinmesstechnik GmbH 0008A1CNet Technology Inc 0008A2ADI Engineering, Inc 0008A3CISCO SYSTEMS, INC 0008A4CISCO SYSTEMS, INC 0008A5Peninsula Systems Inc 0008A6Multiware & Image Co., Ltd 0008A7iLogic Inc 0008A8Systec Co., Ltd 0008A9SangSang Technology, Inc 0008AAKARAM 0008ABEnerLinx.com, Inc 0008ACEltromat GmbH 0008ADToyo-Linx Co., Ltd 0008AEPacketFront Network Products AB 0008AFNovatec Corporation 0008B0BKtel communications GmbH 0008B1ProQuent Systems 0008B2SHENZHEN COMPASS TECHNOLOGY DEVELOPMENT CO.,LTD 0008B3Fastwel 0008B4SYSPOL 0008B5TAI GUEN ENTERPRISE CO., LTD 0008B6RouteFree, Inc 0008B7HIT Incorporated 0008B8E.F. Johnson 0008B9KAON MEDIA Co., Ltd 0008BAErskine Systems Ltd 0008BBNetExcell 0008BCIlevo AB 0008BDTEPG-US 0008BEXENPAK MSA Group 0008BFAptus Elektronik AB 0008C0ASA SYSTEMS 0008C1Avistar Communications Corporation 0008C2CISCO SYSTEMS, INC 0008C3Contex A/S 0008C4Hikari Co.,Ltd 0008C5Liontech Co., Ltd 0008C6Philips Consumer Communications 0008C7Hewlett-Packard Company 0008C8Soneticom, Inc 0008C9TechniSat Digital GmbH 0008CATwinHan Technology Co.,Ltd 0008CBZeta Broadband Inc 0008CCRemotec, Inc 0008CDWith-Net Inc 0008CEIPMobileNet Inc 0008CFNippon Koei Power Systems Co., Ltd 0008D0Musashi Engineering Co., LTD 0008D1KAREL INC 0008D2ZOOM Networks Inc 0008D3Hercules Technologies S.A.S 0008D4IneoQuest Technologies, Inc 0008D5Vanguard Networks Solutions, LLC 0008D6HASSNET Inc 0008D7HOW CORPORATION 0008D8Dowkey Microwave 0008D9Mitadenshi Co.,LTD 0008DASofaWare Technologies Ltd 0008DBCorrigent Systems 0008DCWiznet 0008DDTelena Communications, Inc 0008DE3UP Systems 0008DFAlistel Inc 0008E0ATO Technology Ltd 0008E1Barix AG 0008E2CISCO SYSTEMS, INC 0008E3CISCO SYSTEMS, INC 0008E4Envenergy Inc 0008E5IDK Corporation 0008E6Littlefeet 0008E7SHI ControlSystems,Ltd 0008E8Excel Master Ltd 0008E9NextGig 0008EAMotion Control Engineering, Inc 0008EBROMWin Co.,Ltd 0008ECOptical Zonu Corporation 0008EDST&T Instrument Corp 0008EELogic Product Development 0008EFDIBAL,S.A 0008F0Next Generation Systems, Inc 0008F1Voltaire 0008F2C&S Technology 0008F3WANY 0008F4Bluetake Technology Co., Ltd 0008F5YESTECHNOLOGY Co.,Ltd 0008F6Sumitomo Electric System Solutions Co., Ltd 0008F7Hitachi Ltd, Semiconductor & Integrated Circuits Gr 0008F8UTC CCS 0008F9Artesyn Embedded Technologies 0008FAKarl E.Brinkmann GmbH 0008FBSonoSite, Inc 0008FCGigaphoton Inc 0008FDBlueKorea Co., Ltd 0008FEUNIK C&C Co.,Ltd 0008FFTrilogy Communications Ltd 000900TMT 000901Shenzhen Shixuntong Information & Technoligy Co 000902Redline Communications Inc 000903Panasas, Inc 000904MONDIAL electronic 000905iTEC Technologies Ltd 000906Esteem Networks 000907Chrysalis Development 000908VTech Technology Corp 000909Telenor Connect A/S 00090ASnedFar Technology Co., Ltd 00090BMTL Instruments PLC 00090CMayekawa Mfg. Co. Ltd 00090DLEADER ELECTRONICS CORP 00090EHelix Technology Inc 00090FFortinet Inc 000910Simple Access Inc 000911CISCO SYSTEMS, INC 000912CISCO SYSTEMS, INC 000913SystemK Corporation 000914COMPUTROLS INC 000915CAS Corp 000916Listman Home Technologies, Inc 000917WEM Technology Inc 000918SAMSUNG TECHWIN CO.,LTD 000919MDS Gateways 00091AMacat Optics & Electronics Co., Ltd 00091BDigital Generation Inc 00091CCacheVision, Inc 00091DProteam Computer Corporation 00091EFirstech Technology Corp 00091FA&D Co., Ltd 000920EpoX COMPUTER CO.,LTD 000921Planmeca Oy 000922TST Biometrics GmbH 000923Heaman System Co., Ltd 000924Telebau GmbH 000925VSN Systemen BV 000926YODA COMMUNICATIONS, INC 000927TOYOKEIKI CO.,LTD 000928Telecore 000929Sanyo Industries (UK) Limited 00092AMYTECS Co.,Ltd 00092BiQstor Networks, Inc 00092CHitpoint Inc 00092DHTC Corporation 00092EB&Tech System Inc 00092FAkom Technology Corporation 000930AeroConcierge Inc 000931Future Internet, Inc 000932Omnilux 000933Ophit Co.Ltd 000934Dream-Multimedia-Tv GmbH 000935Sandvine Incorporated 000936Ipetronik GmbH & Co. KG 000937Inventec Appliance Corp 000938Allot Communications 000939ShibaSoku Co.,Ltd 00093AMolex Fiber Optics 00093BHYUNDAI NETWORKS INC 00093CJacques Technologies P/L 00093DNewisys,Inc 00093EC&I Technologies 00093FDouble-Win Enterpirse CO., LTD 000940AGFEO GmbH & Co. KG 000941Allied Telesis K.K 000942Wireless Technologies, Inc 000943CISCO SYSTEMS, INC 000944CISCO SYSTEMS, INC 000945Palmmicro Communications Inc 000946Cluster Labs GmbH 000947Aztek, Inc 000948Vista Control Systems, Corp 000949Glyph Technologies Inc 00094AHomenet Communications 00094BFillFactory NV 00094CCommunication Weaver Co.,Ltd 00094DBraintree Communications Pty Ltd 00094EBARTECH SYSTEMS INTERNATIONAL, INC 00094Felmegt GmbH & Co. KG 000950Independent Storage Corporation 000951Apogee Imaging Systems 000952Auerswald GmbH & Co. KG 000953Linkage System Integration Co.Ltd 000954AMiT spol. s. r. o 000955Young Generation International Corp 000956Network Systems Group, Ltd. (NSG) 000957Supercaller, Inc 000958INTELNET S.A 000959Sitecsoft 00095ARACEWOOD TECHNOLOGY 00095BNetgear, Inc 00095CPhilips Medical Systems - Cardiac and Monitoring Systems (CM 00095DDialogue Technology Corp 00095EMasstech Group Inc 00095FTelebyte, Inc 000960YOZAN Inc 000961Switchgear and Instrumentation Ltd 000962Sonitor Technologies AS 000963Dominion Lasercom Inc 000964Hi-Techniques, Inc 000965HyunJu Computer Co., Ltd 000966Thales Navigation 000967Tachyon, Inc 000968TECHNOVENTURE, INC 000969Meret Optical Communications 00096ACloverleaf Communications Inc 00096BIBM Corp 00096CImedia Semiconductor Corp 00096DPowernet Technologies Corp 00096EGIANT ELECTRONICS LTD 00096FBeijing Zhongqing Elegant Tech. Corp.,Limited 000970Vibration Research Corporation 000971Time Management, Inc 000972Securebase,Inc 000973Lenten Technology Co., Ltd 000974Innopia Technologies, Inc 000975fSONA Communications Corporation 000976Datasoft ISDN Systems GmbH 000977Brunner Elektronik AG 000978AIJI System Co., Ltd 000979Advanced Television Systems Committee, Inc 00097ALouis Design Labs 00097BCISCO SYSTEMS, INC 00097CCISCO SYSTEMS, INC 00097DSecWell Networks Oy 00097EIMI TECHNOLOGY CO., LTD 00097FVsecure 2000 LTD 000980Power Zenith Inc 000981Newport Networks 000982Loewe Opta GmbH 000983GlobalTop Technology, Inc 000984MyCasa Network Inc 000985Auto Telecom Company 000986Metalink LTD 000987NISHI NIPPON ELECTRIC WIRE & CABLE CO.,LTD 000988Nudian Electron Co., Ltd 000989VividLogic Inc 00098AEqualLogic Inc 00098BEntropic Communications, Inc 00098COption Wireless Sweden 00098DVelocity Semiconductor 00098Eipcas GmbH 00098FCetacean Networks 000990ACKSYS Communications & systems 000991GE Fanuc Automation Manufacturing, Inc 000992InterEpoch Technology,INC 000993Visteon Corporation 000994Cronyx Engineering 000995Castle Technology Ltd 000996RDI 000997Nortel Networks 000998Capinfo Company Limited 000999CP GEORGES RENAULT 00099AELMO COMPANY, LIMITED 00099BWestern Telematic Inc 00099CNaval Research Laboratory 00099DHaliplex Communications 00099ETestech, Inc 00099FVIDEX INC 0009A0Microtechno Corporation 0009A1Telewise Communications, Inc 0009A2Interface Co., Ltd 0009A3Leadfly Techologies Corp. Ltd 0009A4HARTEC Corporation 0009A5HANSUNG ELETRONIC INDUSTRIES DEVELOPMENT CO., LTD 0009A6Ignis Optics, Inc 0009A7Bang & Olufsen A/S 0009A8Eastmode Pte Ltd 0009A9Ikanos Communications 0009AAData Comm for Business, Inc 0009ABNetcontrol Oy 0009ACLANVOICE 0009ADHYUNDAI SYSCOMM, INC 0009AEOKANO ELECTRIC CO.,LTD 0009AFe-generis 0009B0Onkyo Corporation 0009B1Kanematsu Electronics, Ltd 0009B2L&F Inc 0009B3MCM Systems Ltd 0009B4KISAN TELECOM CO., LTD 0009B53J Tech. Co., Ltd 0009B6CISCO SYSTEMS, INC 0009B7CISCO SYSTEMS, INC 0009B8Entise Systems 0009B9Action Imaging Solutions 0009BAMAKU Informationstechik GmbH 0009BBMathStar, Inc 0009BCDigital Safety Technologies, Inc 0009BDEpygi Technologies, Ltd 0009BEMamiya-OP Co.,Ltd 0009BFNintendo Co., Ltd 0009C06WIND 0009C1PROCES-DATA A/S 0009C2Onity, Inc 0009C3NETAS 0009C4Medicore Co., Ltd 0009C5KINGENE Technology Corporation 0009C6Visionics Corporation 0009C7Movistec 0009C8SINAGAWA TSUSHIN KEISOU SERVICE 0009C9BlueWINC Co., Ltd 0009CAiMaxNetworks(Shenzhen)Limited 0009CBHBrain 0009CCMoog GmbH 0009CDHUDSON SOFT CO.,LTD 0009CESpaceBridge Semiconductor Corp 0009CFiAd GmbH 0009D0Solacom Technologies Inc 0009D1SERANOA NETWORKS INC 0009D2Mai Logic Inc 0009D3Western DataCom Co., Inc 0009D4Transtech Networks 0009D5Signal Communication, Inc 0009D6KNC One GmbH 0009D7DC Security Products 0009D8Fält Communications AB 0009D9Neoscale Systems, Inc 0009DAControl Module Inc 0009DBeSpace 0009DCGalaxis Technology AG 0009DDMavin Technology Inc 0009DESamjin Information & Communications Co., Ltd 0009DFVestel Komunikasyon Sanayi ve Ticaret A.S 0009E0XEMICS S.A 0009E1Gemtek Technology Co., Ltd 0009E2Sinbon Electronics Co., Ltd 0009E3Angel Iglesias S.A 0009E4K Tech Infosystem Inc 0009E5Hottinger Baldwin Messtechnik GmbH 0009E6Cyber Switching Inc 0009E7ADC Techonology 0009E8CISCO SYSTEMS, INC 0009E9CISCO SYSTEMS, INC 0009EAYEM Inc 0009EBHuMANDATA LTD 0009ECDaktronics, Inc 0009EDCipherOptics 0009EEMEIKYO ELECTRIC CO.,LTD 0009EFVocera Communications 0009F0Shimizu Technology Inc 0009F1Yamaki Electric Corporation 0009F2Cohu, Inc., Electronics Division 0009F3WELL Communication Corp 0009F4Alcon Laboratories, Inc 0009F5Emerson Network Power Co.,Ltd 0009F6Shenzhen Eastern Digital Tech Ltd 0009F7SED, a division of Calian 0009F8UNIMO TECHNOLOGY CO., LTD 0009F9ART JAPAN CO., LTD 0009FBPhilips Patient Monitoring 0009FCIPFLEX Inc 0009FDUbinetics Limited 0009FEDaisy Technologies, Inc 0009FFX.net 2000 GmbH 000A00Mediatek Corp 000A01SOHOware, Inc 000A02ANNSO CO., LTD 000A03ENDESA SERVICIOS, S.L 000A043Com Ltd 000A05Widax Corp 000A06Teledex LLC 000A07WebWayOne Ltd 000A08ALPINE ELECTRONICS, INC 000A09TaraCom Integrated Products, Inc 000A0ASUNIX Co., Ltd 000A0BSealevel Systems, Inc 000A0CScientific Research Corporation 000A0DFCI Deutschland GmbH 000A0EInvivo Research Inc 000A0FIlryung Telesys, Inc 000A10FAST media integrations AG 000A11ExPet Technologies, Inc 000A12Azylex Technology, Inc 000A13Honeywell Video Systems 000A14TECO a.s 000A15Silicon Data, Inc 000A16Lassen Research 000A17NESTAR COMMUNICATIONS, INC 000A18Vichel Inc 000A19Valere Power, Inc 000A1AImerge Ltd 000A1BStream Labs 000A1CBridge Information Co., Ltd 000A1DOptical Communications Products Inc 000A1ERed-M Products Limited 000A1FART WARE Telecommunication Co., Ltd 000A20SVA Networks, Inc 000A21Integra Telecom Co. Ltd 000A22Amperion Inc 000A23Parama Networks Inc 000A24Octave Communications 000A25CERAGON NETWORKS 000A26CEIA S.p.A 000A27Apple 000A28Motorola 000A29Pan Dacom Networking AG 000A2AQSI Systems Inc 000A2BEtherstuff 000A2CActive Tchnology Corporation 000A2DCabot Communications Limited 000A2EMAPLE NETWORKS CO., LTD 000A2FArtnix Inc 000A30Johnson Controls-ASG 000A31HCV Consulting 000A32Xsido Corporation 000A33Emulex Corporation 000A34Identicard Systems Incorporated 000A35Xilinx 000A36Synelec Telecom Multimedia 000A37Procera Networks, Inc 000A38Apani Networks 000A39LoPA Information Technology 000A3AJ-THREE INTERNATIONAL Holding Co., Ltd 000A3BGCT Semiconductor, Inc 000A3CEnerpoint Ltd 000A3DElo Sistemas Eletronicos S.A 000A3EEADS Telecom 000A3FData East Corporation 000A40Crown Audio -- Harmanm International 000A41CISCO SYSTEMS, INC 000A42CISCO SYSTEMS, INC 000A43Chunghwa Telecom Co., Ltd 000A44Avery Dennison Deutschland GmbH 000A45Audio-Technica Corp 000A46ARO WELDING TECHNOLOGIES SAS 000A47Allied Vision Technologies 000A48Albatron Technology 000A49F5 Networks, Inc 000A4ATarga Systems Ltd 000A4BDataPower Technology, Inc 000A4CMolecular Devices Corporation 000A4DNoritz Corporation 000A4EUNITEK Electronics INC 000A4FBrain Boxes Limited 000A50REMOTEK CORPORATION 000A51GyroSignal Technology Co., Ltd 000A52AsiaRF Ltd 000A53Intronics, Incorporated 000A54Laguna Hills, Inc 000A55MARKEM Corporation 000A56HITACHI Maxell Ltd 000A57Hewlett-Packard Company - Standards 000A58Freyer & Siegel Elektronik GmbH & Co. KG 000A59HW server 000A5AGreenNET Technologies Co.,Ltd 000A5BPower-One as 000A5CCarel s.p.a 000A5DFingerTec Worldwide Sdn Bhd 000A5E3COM Corporation 000A5Falmedio inc 000A60Autostar Technology Pte Ltd 000A61Cellinx Systems Inc 000A62Crinis Networks, Inc 000A63DHD GmbH 000A64Eracom Technologies 000A65GentechMedia.co.,ltd 000A66MITSUBISHI ELECTRIC SYSTEM & SERVICE CO.,LTD 000A67OngCorp 000A68SolarFlare Communications, Inc 000A69SUNNY bell Technology Co., Ltd 000A6ASVM Microwaves s.r.o 000A6BTadiran Telecom Business Systems LTD 000A6CWalchem Corporation 000A6DEKS Elektronikservice GmbH 000A6EHarmonic, Inc 000A6FZyFLEX Technologies Inc 000A70MPLS Forum 000A71Avrio Technologies, Inc 000A72STEC, INC 000A73Scientific Atlanta 000A74Manticom Networks Inc 000A75Caterpillar, Inc 000A76Beida Jade Bird Huaguang Technology Co.,Ltd 000A77Bluewire Technologies LLC 000A78OLITEC 000A79corega K.K 000A7AKyoritsu Electric Co., Ltd 000A7BCornelius Consult 000A7CTecton Ltd 000A7DValo, Inc 000A7EThe Advantage Group 000A7FTeradon Industries, Inc 000A80Telkonet Inc 000A81TEIMA Audiotex S.L 000A82TATSUTA SYSTEM ELECTRONICS CO.,LTD 000A83SALTO SYSTEMS S.L 000A84Rainsun Enterprise Co., Ltd 000A85PLAT'C2,Inc 000A86Lenze 000A87Integrated Micromachines Inc 000A88InCypher S.A 000A89Creval Systems, Inc 000A8ACISCO SYSTEMS, INC 000A8BCISCO SYSTEMS, INC 000A8CGuardware Systems Ltd 000A8DEUROTHERM LIMITED 000A8EInvacom Ltd 000A8FAska International Inc 000A90Bayside Interactive, Inc 000A91HemoCue AB 000A92Presonus Corporation 000A93W2 Networks, Inc 000A94ShangHai cellink CO., LTD 000A95Apple 000A96MEWTEL TECHNOLOGY INC 000A97SONICblue, Inc 000A98M+F Gwinner GmbH & Co 000A99Calamp Wireless Networks Inc 000A9AAiptek International Inc 000A9BTB Group Inc 000A9CServer Technology, Inc 000A9DKing Young Technology Co. Ltd 000A9EBroadWeb Corportation 000A9FPannaway Technologies, Inc 000AA0Cedar Point Communications 000AA1V V S Limited 000AA2SYSTEK INC 000AA3SHIMAFUJI ELECTRIC CO.,LTD 000AA4SHANGHAI SURVEILLANCE TECHNOLOGY CO,LTD 000AA5MAXLINK INDUSTRIES LIMITED 000AA6Hochiki Corporation 000AA7FEI Electron Optics 000AA8ePipe Pty. Ltd 000AA9Brooks Automation GmbH 000AAAAltiGen Communications Inc 000AABToyota Technical Development Corporation 000AACTerraTec Electronic GmbH 000AADStargames Corporation 000AAERosemount Process Analytical 000AAFPipal Systems 000AB0LOYTEC electronics GmbH 000AB1GENETEC Corporation 000AB2Fresnel Wireless Systems 000AB3Fa. GIRA 000AB4ETIC Telecommunications 000AB5Digital Electronic Network 000AB6COMPUNETIX, INC 000AB7CISCO SYSTEMS, INC 000AB8CISCO SYSTEMS, INC 000AB9Astera Technologies Corp 000ABAArcon Technology Limited 000ABBTaiwan Secom Co,. Ltd 000ABCSeabridge Ltd 000ABDRupprecht & Patashnick Co 000ABEOPNET Technologies CO., LTD 000ABFHIROTA SS 000AC0Fuyoh Video Industry CO., LTD 000AC1Futuretel 000AC2FiberHome Telecommunication Technologies CO.,LTD 000AC3eM Technics Co., Ltd 000AC4Daewoo Teletech Co., Ltd 000AC5Color Kinetics 000AC6Overture Networks 000AC7Unication Group 000AC8ZPSYS CO.,LTD. (Planning&Management) 000AC9Zambeel Inc 000ACAYOKOYAMA SHOKAI CO.,Ltd 000ACBXPAK MSA Group 000ACCWinnow Networks, Inc 000ACDSunrich Technology Limited 000ACERADIANTECH, INC 000ACFPROVIDEO Multimedia Co. Ltd 000AD0Niigata Develoment Center, F.I.T. Co., Ltd 000AD1MWS 000AD2JEPICO Corporation 000AD3INITECH Co., Ltd 000AD4CoreBell Systems Inc 000AD5Brainchild Electronic Co., Ltd 000AD6BeamReach Networks 000AD7Origin ELECTRIC CO.,LTD 000AD8IPCserv Technology Corp 000AD9Sony Ericsson Mobile Communications AB 000ADAVindicator Technologies 000ADBSkyPilot Network, Inc 000ADCRuggedCom Inc 000ADDAllworx Corp 000ADEHappy Communication Co., Ltd 000ADFGennum Corporation 000AE0Fujitsu Softek 000AE1EG Technology 000AE2Binatone Electronics International, Ltd 000AE3YANG MEI TECHNOLOGY CO., LTD 000AE4Wistron Corp 000AE5ScottCare Corporation 000AE6Elitegroup Computer System Co. (ECS) 000AE7ELIOP S.A 000AE8Cathay Roxus Information Technology Co. LTD 000AE9AirVast Technology Inc 000AEAADAM ELEKTRONIK LTD. ŞTI 000AEBShenzhen Tp-Link Technology Co; Ltd 000AECKoatsu Gas Kogyo Co., Ltd 000AEDHARTING Systems GmbH & Co KG 000AEEGCD Hard- & Software GmbH 000AEFOTRUM ASA 000AF0SHIN-OH ELECTRONICS CO., LTD. R&D 000AF1Clarity Design, Inc 000AF2NeoAxiom Corp 000AF3CISCO SYSTEMS, INC 000AF4CISCO SYSTEMS, INC 000AF5Airgo Networks, Inc 000AF6Emerson Climate Technologies Retail Solutions, Inc 000AF7Broadcom Corp 000AF8American Telecare Inc 000AF9HiConnect, Inc 000AFATraverse Technologies Australia 000AFBAmbri Limited 000AFCCore Tec Communications, LLC 000AFDViking Electronic Services 000AFENovaPal Ltd 000AFFKilchherr Elektronik AG 000B00FUJIAN START COMPUTER EQUIPMENT CO.,LTD 000B01DAIICHI ELECTRONICS CO., LTD 000B02Dallmeier electronic 000B03Taekwang Industrial Co., Ltd 000B04Volktek Corporation 000B05Pacific Broadband Networks 000B06ARRIS Group, Inc 000B07Voxpath Networks 000B08Pillar Data Systems 000B09Ifoundry Systems Singapore 000B0AdBm Optics 000B0BCorrent Corporation 000B0CAgile Systems Inc 000B0DAir2U, Inc 000B0ETrapeze Networks 000B0FBosch Rexroth 000B1011wave Technonlogy Co.,Ltd 000B11HIMEJI ABC TRADING CO.,LTD 000B12NURI Telecom Co., Ltd 000B13ZETRON INC 000B14ViewSonic Corporation 000B15Platypus Technology 000B16Communication Machinery Corporation 000B17MKS Instruments 000B18 000B19Vernier Networks, Inc 000B1AIndustrial Defender, Inc 000B1BSystronix, Inc 000B1CSIBCO bv 000B1DLayerZero Power Systems, Inc 000B1EKAPPA opto-electronics GmbH 000B1FI CON Computer Co 000B20Hirata corporation 000B21G-Star Communications Inc 000B22Environmental Systems and Services 000B23Siemens Subscriber Networks 000B24AirLogic 000B25Aeluros 000B26Wetek Corporation 000B27Scion Corporation 000B28Quatech Inc 000B29LS(LG) Industrial Systems co.,Ltd 000B2AHOWTEL Co., Ltd 000B2BHOSTNET CORPORATION 000B2CEiki Industrial Co. Ltd 000B2DDanfoss Inc 000B2ECal-Comp Electronics (Thailand) Public Company Limited Taipe 000B2Fbplan GmbH 000B30Beijing Gongye Science & Technology Co.,Ltd 000B31Yantai ZhiYang Scientific and technology industry CO., LTD 000B32VORMETRIC, INC 000B33Vivato Technologies 000B34ShangHai Broadband Technologies CO.LTD 000B35Quad Bit System co., Ltd 000B36Productivity Systems, Inc 000B37MANUFACTURE DES MONTRES ROLEX SA 000B38Knürr GmbH 000B39Keisoku Giken Co.,Ltd 000B3AQuStream Corporation 000B3Bdevolo AG 000B3CCygnal Integrated Products, Inc 000B3DCONTAL OK Ltd 000B3EBittWare, Inc 000B3FAnthology Solutions Inc 000B40Oclaro 000B41Ing. Büro Dr. Beutlhauser 000B42commax Co., Ltd 000B43Microscan Systems, Inc 000B44Concord IDea Corp 000B45CISCO SYSTEMS, INC 000B46CISCO SYSTEMS, INC 000B47Advanced Energy 000B48sofrel 000B49RF-Link System Inc 000B4AVisimetrics (UK) Ltd 000B4BVISIOWAVE SA 000B4CClarion (M) Sdn Bhd 000B4DEmuzed 000B4EVertexRSI, General Dynamics SatCOM Technologies, Inc 000B4FVerifone, INC 000B50Oxygnet 000B51Micetek International Inc 000B52JOYMAX ELECTRONICS CO. LTD 000B53INITIUM Co., Ltd 000B54BiTMICRO Networks, Inc 000B55ADInstruments 000B56Cybernetics 000B57Silicon Laboratories 000B58Astronautics C.A LTD 000B59ScriptPro, LLC 000B5AHyperEdge 000B5BRincon Research Corporation 000B5CNewtech Co.,Ltd 000B5DFUJITSU LIMITED 000B5EAudio Engineering Society Inc 000B5FCISCO SYSTEMS, INC 000B60CISCO SYSTEMS, INC 000B61Friedrich Lütze GmbH & Co. KG 000B62ib-mohnen KG 000B63Kaleidescape 000B64Kieback & Peter GmbH & Co KG 000B65Sy.A.C. srl 000B66Teralink Communications 000B67Topview Technology Corporation 000B68Addvalue Communications Pte Ltd 000B69Franke Finland Oy 000B6AAsiarock Incorporation 000B6BWistron Neweb Corp 000B6CSychip Inc 000B6DSOLECTRON JAPAN NAKANIIDA 000B6ENeff Instrument Corp 000B6FMedia Streaming Networks Inc 000B70Load Technology, Inc 000B71Litchfield Communications Inc 000B72Lawo AG 000B73Kodeos Communications 000B74Kingwave Technology Co., Ltd 000B75Iosoft Ltd 000B76ET&T Technology Co. Ltd 000B77Cogent Systems, Inc 000B78TAIFATECH INC 000B79X-COM, Inc 000B7AL-3 Linkabit 000B7BTest-Um Inc 000B7CTelex Communications 000B7DSOLOMON EXTREME INTERNATIONAL LTD 000B7ESAGINOMIYA Seisakusho Inc 000B7FAlign Engineering LLC 000B80Lycium Networks 000B81Kaparel Corporation 000B82Grandstream Networks, Inc 000B83DATAWATT B.V 000B84BODET 000B85CISCO SYSTEMS, INC 000B86Aruba Networks 000B87American Reliance Inc 000B88Vidisco ltd 000B89Top Global Technology, Ltd 000B8AMITEQ Inc 000B8BKERAJET, S.A 000B8CFlextronics 000B8DAvvio Networks 000B8EAscent Corporation 000B8FAKITA ELECTRONICS SYSTEMS CO.,LTD 000B90ADVA Optical Networking Ltd 000B91Aglaia Gesellschaft für Bildverarbeitung und Kommunikation mbH 000B92Ascom Danmark A/S 000B93Ritter Elektronik 000B94Digital Monitoring Products, Inc 000B95eBet Gaming Systems Pty Ltd 000B96Innotrac Diagnostics Oy 000B97Matsushita Electric Industrial Co.,Ltd 000B98NiceTechVision 000B99SensAble Technologies, Inc 000B9AShanghai Ulink Telecom Equipment Co. Ltd 000B9BSirius System Co, Ltd 000B9CTriBeam Technologies, Inc 000B9DTwinMOS Technologies Inc 000B9EYasing Technology Corp 000B9FNeue ELSA GmbH 000BA0T&L Information Inc 000BA1SYSCOM Ltd 000BA2Sumitomo Electric Networks, Inc 000BA3Siemens AG, I&S 000BA4Shiron Satellite Communications Ltd. (1996) 000BA5Quasar Cipta Mandiri, PT 000BA6Miyakawa Electric Works Ltd 000BA7Maranti Networks 000BA8HANBACK ELECTRONICS CO., LTD 000BA9CloudShield Technologies, Inc 000BAAAiphone co.,Ltd 000BABAdvantech Technology (CHINA) Co., Ltd 000BAC3Com Ltd 000BADPC-PoS Inc 000BAEVitals System Inc 000BAFWOOJU COMMUNICATIONS Co,.Ltd 000BB0Sysnet Telematica srl 000BB1Super Star Technology Co., Ltd 000BB2SMALLBIG TECHNOLOGY 000BB3RiT technologies Ltd 000BB4RDC Semiconductor Inc., 000BB5nStor Technologies, Inc 000BB6Metalligence Technology Corp 000BB7Micro Systems Co.,Ltd 000BB8Kihoku Electronic Co 000BB9Imsys AB 000BBAHarmonic, Inc 000BBBEtin Systems Co., Ltd 000BBCEn Garde Systems, Inc 000BBDConnexionz Limited 000BBECISCO SYSTEMS, INC 000BBFCISCO SYSTEMS, INC 000BC0China IWNComm Co., Ltd 000BC1Bay Microsystems, Inc 000BC2Corinex Communication Corp 000BC3Multiplex, Inc 000BC4BIOTRONIK GmbH & Co 000BC5SMC Networks, Inc 000BC6ISAC, Inc 000BC7ICET S.p.A 000BC8AirFlow Networks 000BC9Electroline Equipment 000BCADATAVAN International Corporation 000BCBFagor Automation , S. Coop 000BCCJUSAN, S.A 000BCDHewlett-Packard Company 000BCEFree2move AB 000BCFAGFA NDT INC 000BD0XiMeta Technology Americas Inc 000BD1Aeronix, Inc 000BD2Remopro Technology Inc 000BD3cd3o 000BD4Beijing Wise Technology & Science Development Co.Ltd 000BD5Nvergence, Inc 000BD6Paxton Access Ltd 000BD7DORMA Time + Access GmbH 000BD8Industrial Scientific Corp 000BD9General Hydrogen 000BDAEyeCross Co.,Inc 000BDBDell Inc 000BDCAKCP 000BDDTOHOKU RICOH Co., LTD 000BDETELDIX GmbH 000BDFShenzhen RouterD Networks Limited 000BE0SercoNet Ltd 000BE1Nokia NET Product Operations 000BE2Lumenera Corporation 000BE3Key Stream Co., Ltd 000BE4Hosiden Corporation 000BE5HIMS International Corporation 000BE6Datel Electronics 000BE7COMFLUX TECHNOLOGY INC 000BE8AOIP 000BE9Actel Corporation 000BEAZultys Technologies 000BEBSystegra AG 000BECNIPPON ELECTRIC INSTRUMENT, INC 000BEDELM Inc 000BEEinc.jet, Incorporated 000BEFCode Corporation 000BF0MoTEX Products Co., Ltd 000BF1LAP Laser Applikations 000BF2Chih-Kan Technology Co., Ltd 000BF3BAE SYSTEMS 000BF4 000BF5Shanghai Sibo Telecom Technology Co.,Ltd 000BF6Nitgen Co., Ltd 000BF7NIDEK CO.,LTD 000BF8Infinera 000BF9Gemstone communications, Inc 000BFAEXEMYS SRL 000BFBD-NET International Corporation 000BFCCISCO SYSTEMS, INC 000BFDCISCO SYSTEMS, INC 000BFECASTEL Broadband Limited 000BFFBerkeley Camera Engineering 000C00BEB Industrie-Elektronik AG 000C01Abatron AG 000C02ABB Oy 000C03HDMI Licensing, LLC 000C04Tecnova 000C05RPA Reserch Co., Ltd 000C06Nixvue Systems Pte Ltd 000C07Iftest AG 000C08HUMEX Technologies Corp 000C09Hitachi IE Systems Co., Ltd 000C0AGuangdong Province Electronic Technology Research Institute 000C0BBroadbus Technologies 000C0CAPPRO TECHNOLOGY INC 000C0DCommunications & Power Industries / Satcom Division 000C0EXtremeSpectrum, Inc 000C0FTechno-One Co., Ltd 000C10PNI Corporation 000C11NIPPON DEMPA CO.,LTD 000C12Micro-Optronic-Messtechnik GmbH 000C13MediaQ 000C14Diagnostic Instruments, Inc 000C15CyberPower Systems, Inc 000C16Concorde Microsystems Inc 000C17AJA Video Systems Inc 000C18Zenisu Keisoku Inc 000C19Telio Communications GmbH 000C1AQuest Technical Solutions Inc 000C1BORACOM Co, Ltd 000C1CMicroWeb Co., Ltd 000C1DMettler & Fuchs AG 000C1EGlobal Cache 000C1FGlimmerglass Networks 000C20Fi WIn, Inc 000C21Faculty of Science and Technology, Keio University 000C22Double D Electronics Ltd 000C23Beijing Lanchuan Tech. Co., Ltd 000C24ANATOR 000C25Allied Telesis Labs, Inc 000C26Weintek Labs. Inc 000C27Sammy Corporation 000C28RIFATRON 000C29VMware, Inc 000C2AOCTTEL Communication Co., Ltd 000C2BELIAS Technology, Inc 000C2CEnwiser Inc 000C2DFullWave Technology Co., Ltd 000C2EOpenet information technology(shenzhen) Co., Ltd 000C2FSeorimTechnology Co.,Ltd 000C30CISCO SYSTEMS, INC 000C31CISCO SYSTEMS, INC 000C32Avionic Design Development GmbH 000C33Compucase Enterprise Co. Ltd 000C34Vixen Co., Ltd 000C35KaVo Dental GmbH & Co. KG 000C36SHARP TAKAYA ELECTRONICS INDUSTRY CO.,LTD 000C37Geomation, Inc 000C38TelcoBridges Inc 000C39Sentinel Wireless Inc 000C3AOxance 000C3BOrion Electric Co., Ltd 000C3CMediaChorus, Inc 000C3DGlsystech Co., Ltd 000C3ECrest Audio 000C3FCogent Defence & Security Networks, 000C40Altech Controls 000C41Cisco-Linksys 000C42Routerboard.com 000C43Ralink Technology, Corp 000C44Automated Interfaces, Inc 000C45Animation Technologies Inc 000C46Allied Telesyn Inc 000C47SK Teletech(R&D Planning Team) 000C48QoStek Corporation 000C49Dangaard Telecom RTC Division A/S 000C4ACygnus Microsystems (P) Limited 000C4BCheops Elektronik 000C4CArcor AG&Co 000C4DCurtiss-Wright Controls Avionics & Electronics 000C4EWinbest Technology CO,LT 000C4FUDTech Japan Corporation 000C50Seagate Technology 000C51Scientific Technologies Inc 000C52Roll Systems Inc 000C53 000C54Pedestal Networks, Inc 000C55Microlink Communications Inc 000C56Megatel Computer (1986) Corp 000C57MACKIE Engineering Services Belgium BVBA 000C58M&S Systems 000C59Indyme Electronics, Inc 000C5AIBSmm Embedded Electronics Consulting 000C5BHANWANG TECHNOLOGY CO.,LTD 000C5CGTN Systems B.V 000C5DCHIC TECHNOLOGY (CHINA) CORP 000C5ECalypso Medical 000C5FAvtec, Inc 000C60ACM Systems 000C61AC Tech corporation DBA Advanced Digital 000C62ABB AB, Cewe-Control 000C63Zenith Electronics Corporation 000C64X2 MSA Group 000C65Sunin Telecom 000C66Pronto Networks Inc 000C67OYO ELECTRIC CO.,LTD 000C68SigmaTel, Inc 000C69National Radio Astronomy Observatory 000C6AMBARI 000C6BKurz Industrie-Elektronik GmbH 000C6CElgato Systems LLC 000C6DEdwards Ltd 000C6EASUSTEK COMPUTER INC 000C6FAmtek system co.,LTD 000C70ACC GmbH 000C71Wybron, Inc 000C72Tempearl Industrial Co., Ltd 000C73TELSON ELECTRONICS CO., LTD 000C74RIVERTEC CORPORATION 000C75Oriental integrated electronics. LTD 000C76MICRO-STAR INTERNATIONAL CO., LTD 000C77Life Racing Ltd 000C78In-Tech Electronics Limited 000C79Extel Communications P/L 000C7ADaTARIUS Technologies GmbH 000C7BALPHA PROJECT Co.,Ltd 000C7CInternet Information Image Inc 000C7DTEIKOKU ELECTRIC MFG. CO., LTD 000C7ETellium Incorporated 000C7Fsynertronixx GmbH 000C80Opelcomm Inc 000C81Schneider Electric (Australia) 000C82NETWORK TECHNOLOGIES INC 000C83Logical Solutions 000C84Eazix, Inc 000C85CISCO SYSTEMS, INC 000C86CISCO SYSTEMS, INC 000C87AMD 000C88Apache Micro Peripherals, Inc 000C89AC Electric Vehicles, Ltd 000C8ABose Corporation 000C8BConnect Tech Inc 000C8CKODICOM CO.,LTD 000C8DMATRIX VISION GmbH 000C8EMentor Engineering Inc 000C8FNergal s.r.l 000C90Octasic Inc 000C91Riverhead Networks Inc 000C92WolfVision Gmbh 000C93Xeline Co., Ltd 000C94United Electronic Industries, Inc. (EUI) 000C95PrimeNet 000C96OQO, Inc 000C97NV ADB TTV Technologies SA 000C98LETEK Communications Inc 000C99HITEL LINK Co.,Ltd 000C9AHitech Electronics Corp 000C9BEE Solutions, Inc 000C9CChongho information & communications 000C9DUbeeAirWalk, Inc 000C9EMemoryLink Corp 000C9FNKE Corporation 000CA0StorCase Technology, Inc 000CA1SIGMACOM Co., LTD 000CA2Harmonic Video Network 000CA3Rancho Technology, Inc 000CA4Prompttec Product Management GmbH 000CA5Naman NZ LTd 000CA6Mintera Corporation 000CA7Metro (Suzhou) Technologies Co., Ltd 000CA8Garuda Networks Corporation 000CA9Ebtron Inc 000CAACubic Transportation Systems Inc 000CABCOMMEND International 000CACCitizen Watch Co., Ltd 000CADBTU International 000CAEAilocom Oy 000CAFTRI TERM CO.,LTD 000CB0Star Semiconductor Corporation 000CB1Salland Engineering (Europe) BV 000CB2UNION co., ltd 000CB3ROUND Co.,Ltd 000CB4AutoCell Laboratories, Inc 000CB5Premier Technolgies, Inc 000CB6NANJING SEU MOBILE & INTERNET TECHNOLOGY CO.,LTD 000CB7Nanjing Huazhuo Electronics Co., Ltd 000CB8MEDION AG 000CB9LEA 000CBAJamex, Inc 000CBBISKRAEMECO 000CBCIscutum 000CBDInterface Masters, Inc 000CBEInnominate Security Technologies AG 000CBFHoly Stone Ent. Co., Ltd 000CC0Genera Oy 000CC1Cooper Industries Inc 000CC2ControlNet (India) Private Limited 000CC3BeWAN systems 000CC4Tiptel AG 000CC5Nextlink Co., Ltd 000CC6Ka-Ro electronics GmbH 000CC7Intelligent Computer Solutions Inc 000CC8Xytronix Research & Design, Inc 000CC9ILWOO DATA & TECHNOLOGY CO.,LTD 000CCAHGST a Western Digital Company 000CCBDesign Combus Ltd 000CCCAeroscout Ltd 000CCDIEC - TC57 000CCECISCO SYSTEMS, INC 000CCFCISCO SYSTEMS, INC 000CD0Symetrix 000CD1SFOM Technology Corp 000CD2Schaffner EMV AG 000CD3Prettl Elektronik Radeberg GmbH 000CD4Positron Public Safety Systems inc 000CD5Passave Inc 000CD6PARTNER TECH 000CD7Nallatech Ltd 000CD8M. K. Juchheim GmbH & Co 000CD9Itcare Co., Ltd 000CDAFreeHand Systems, Inc 000CDBBrocade Communications Systems, Inc 000CDCBECS Technology, Inc 000CDDAOS Technologies AG 000CDEABB STOTZ-KONTAKT GmbH 000CDFPULNiX America, Inc 000CE0Trek Diagnostics Inc 000CE1The Open Group 000CE2Rolls-Royce 000CE3Option International N.V 000CE4NeuroCom International, Inc 000CE5ARRIS Group, Inc 000CE6Meru Networks Inc 000CE7MediaTek Inc 000CE8GuangZhou AnJuBao Co., Ltd 000CE9BLOOMBERG L.P 000CEAaphona Kommunikationssysteme 000CEBCNMP Networks, Inc 000CECSpectracom Corp 000CEDReal Digital Media 000CEEjp-embedded 000CEFOpen Networks Engineering Ltd 000CF0M & N GmbH 000CF1Intel Corporation 000CF2GAMESA Eólica 000CF3CALL IMAGE SA 000CF4AKATSUKI ELECTRIC MFG.CO.,LTD 000CF5InfoExpress 000CF6Sitecom Europe BV 000CF7Nortel Networks 000CF8Nortel Networks 000CF9Xylem Water Solutions 000CFADigital Systems Corp 000CFBKorea Network Systems 000CFCS2io Technologies Corp 000CFDHyundai ImageQuest Co.,Ltd 000CFEGrand Electronic Co., Ltd 000CFFMRO-TEK LIMITED 000D00Seaway Networks Inc 000D01P&E Microcomputer Systems, Inc 000D02NEC Platforms, Ltd 000D03Matrics, Inc 000D04Foxboro Eckardt Development GmbH 000D05cybernet manufacturing inc 000D06Compulogic Limited 000D07Calrec Audio Ltd 000D08AboveCable, Inc 000D09Yuehua(Zhuhai) Electronic CO. LTD 000D0AProjectiondesign as 000D0BBuffalo Inc 000D0CMDI Security Systems 000D0DITSupported, LLC 000D0EInqnet Systems, Inc 000D0FFinlux Ltd 000D10Embedtronics Oy 000D11DENTSPLY - Gendex 000D12AXELL Corporation 000D13Wilhelm Rutenbeck GmbH&Co.KG 000D14Vtech Innovation LP dba Advanced American Telephones 000D15Voipac s.r.o 000D16UHS Systems Pty Ltd 000D17Turbo Networks Co.Ltd 000D18Mega-Trend Electronics CO., LTD 000D19ROBE Show lighting 000D1AMustek System Inc 000D1BKyoto Electronics Manufacturing Co., Ltd 000D1CAmesys Defense 000D1DHIGH-TEK HARNESS ENT. CO., LTD 000D1EControl Techniques 000D1FAV Digital 000D20ASAHIKASEI TECHNOSYSTEM CO.,LTD 000D21WISCORE Inc 000D22Unitronics LTD 000D23Smart Solution, Inc 000D24SENTEC E&E CO., LTD 000D25SANDEN CORPORATION 000D26Primagraphics Limited 000D27MICROPLEX Printware AG 000D28CISCO SYSTEMS, INC 000D29CISCO SYSTEMS, INC 000D2AScanmatic AS 000D2BRacal Instruments 000D2CPatapsco Designs Ltd 000D2DNCT Deutschland GmbH 000D2EMatsushita Avionics Systems Corporation 000D2FAIN Comm.Tech.Co., LTD 000D30IceFyre Semiconductor 000D31Compellent Technologies, Inc 000D32DispenseSource, Inc 000D33Prediwave Corp 000D34Shell International Exploration and Production, Inc 000D35PAC International Ltd 000D36Wu Han Routon Electronic Co., Ltd 000D37WIPLUG 000D38NISSIN INC 000D39Network Electronics 000D3AMicrosoft Corp 000D3BMicroelectronics Technology Inc 000D3Ci.Tech Dynamic Ltd 000D3DHammerhead Systems, Inc 000D3EAPLUX Communications Ltd 000D3FVTI Instruments Corporation 000D40Verint Loronix Video Solutions 000D41Siemens AG ICM MP UC RD IT KLF1 000D42Newbest Development Limited 000D43DRS Tactical Systems Inc 000D44Audio BU - Logitech 000D45Tottori SANYO Electric Co., Ltd 000D46Parker SSD Drives 000D47Collex 000D48AEWIN Technologies Co., Ltd 000D49Triton Systems of Delaware, Inc 000D4ASteag ETA-Optik 000D4BRoku, LLC 000D4COutline Electronics Ltd 000D4DNinelanes 000D4ENDR Co.,LTD 000D4FKenwood Corporation 000D50Galazar Networks 000D51DIVR Systems, Inc 000D52Comart system 000D53Beijing 5w Communication Corp 000D543Com Ltd 000D55SANYCOM Technology Co.,Ltd 000D56Dell Inc 000D57Fujitsu I-Network Systems Limited 000D58 000D59Amity Systems, Inc 000D5ATiesse SpA 000D5BSmart Empire Investments Limited 000D5CRobert Bosch GmbH, VT-ATMO 000D5DRaritan Computer, Inc 000D5ENEC Personal Products 000D5FMinds Inc 000D60IBM Corp 000D61Giga-Byte Technology Co., Ltd 000D62Funkwerk Dabendorf GmbH 000D63DENT Instruments, Inc 000D64COMAG Handels AG 000D65CISCO SYSTEMS, INC 000D66CISCO SYSTEMS, INC 000D67Ericsson 000D68Vinci Systems, Inc 000D69TMT&D Corporation 000D6ARedwood Technologies LTD 000D6BMita-Teknik A/S 000D6CM-Audio 000D6DK-Tech Devices Corp 000D6EK-Patents Oy 000D6FEmber Corporation 000D70Datamax Corporation 000D71boca systems 000D722Wire, Inc 000D73Technical Support, Inc 000D74Sand Network Systems, Inc 000D75Kobian Pte Ltd - Taiwan Branch 000D76Hokuto Denshi Co,. Ltd 000D77FalconStor Software 000D78Engineering & Security 000D79Dynamic Solutions Co,.Ltd 000D7ADiGATTO Asia Pacific Pte Ltd 000D7BConsensys Computers Inc 000D7CCodian Ltd 000D7DAfco Systems 000D7EAxiowave Networks, Inc 000D7FMIDAS COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch) 000D80Online Development Inc 000D81Pepperl+Fuchs GmbH 000D82PHS srl 000D83Sanmina-SCI Hungary Ltd 000D84Makus Inc 000D85Tapwave, Inc 000D86Huber + Suhner AG 000D87Elitegroup Computer System Co. (ECS) 000D88D-Link Corporation 000D89Bils Technology Inc 000D8AWinners Electronics Co., Ltd 000D8BT&D Corporation 000D8CShanghai Wedone Digital Ltd. CO 000D8DProsoft Technology, Inc 000D8EKoden Electronics Co., Ltd 000D8FKing Tsushin Kogyo Co., LTD 000D90Factum Electronics AB 000D91Eclipse (HQ Espana) S.L 000D92Arima Communication Corporation 000D93Apple 000D94AFAR Communications,Inc 000D95Opti-cell, Inc 000D96Vtera Technology Inc 000D97Tropos Networks, Inc 000D98S.W.A.C. Schmitt-Walter Automation Consult GmbH 000D99Orbital Sciences Corp.; Launch Systems Group 000D9AINFOTEC LTD 000D9BHeraeus Electro-Nite International N.V 000D9CElan GmbH & Co KG 000D9DHewlett-Packard Company 000D9ETOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd 000D9FRF Micro Devices 000DA0NEDAP N.V 000DA1MIRAE ITS Co.,LTD 000DA2Infrant Technologies, Inc 000DA3Emerging Technologies Limited 000DA4DOSCH & AMAND SYSTEMS AG 000DA5Fabric7 Systems, Inc 000DA6Universal Switching Corporation 000DA7 000DA8Teletronics Technology Corporation 000DA9T.E.A.M. S.L 000DAAS.A.Tehnology co.,Ltd 000DABParker Hannifin GmbH Electromechanical Division Europe 000DACJapan CBM Corporation 000DADDataprobe, Inc 000DAESAMSUNG HEAVY INDUSTRIES CO., LTD 000DAFPlexus Corp (UK) Ltd 000DB0Olym-tech Co.,Ltd 000DB1Japan Network Service Co., Ltd 000DB2Ammasso, Inc 000DB3SDO Communication Corperation 000DB4NETASQ 000DB5GLOBALSAT TECHNOLOGY CORPORATION 000DB6Broadcom Corporation 000DB7SANKO ELECTRIC CO,.LTD 000DB8SCHILLER AG 000DB9PC Engines GmbH 000DBAOcé Document Technologies GmbH 000DBBNippon Dentsu Co.,Ltd 000DBCCISCO SYSTEMS, INC 000DBDCISCO SYSTEMS, INC 000DBEBel Fuse Europe Ltd.,UK 000DBFTekTone Sound & Signal Mfg., Inc 000DC0Spagat AS 000DC1SafeWeb Inc 000DC2 000DC3First Communication, Inc 000DC4Emcore Corporation 000DC5EchoStar Global B.V 000DC6DigiRose Technology Co., Ltd 000DC7COSMIC ENGINEERING INC 000DC8AirMagnet, Inc 000DC9THALES Elektronik Systeme GmbH 000DCATait Electronics 000DCBPetcomkorea Co., Ltd 000DCCNEOSMART Corp 000DCDGROUPE TXCOM 000DCEDynavac Technology Pte Ltd 000DCFCidra Corp 000DD0TetraTec Instruments GmbH 000DD1Stryker Corporation 000DD2Simrad Optronics ASA 000DD3SAMWOO Telecommunication Co.,Ltd 000DD4Symantec Corporation 000DD5O'RITE TECHNOLOGY CO.,LTD 000DD6ITI LTD 000DD7Bright 000DD8BBN 000DD9Anton Paar GmbH 000DDAALLIED TELESIS K.K 000DDBAIRWAVE TECHNOLOGIES INC 000DDCVAC 000DDDProfilo Telra Elektronik Sanayi ve Ticaret. A.Ş 000DDEJoyteck Co., Ltd 000DDFJapan Image & Network Inc 000DE0ICPDAS Co.,LTD 000DE1Control Products, Inc 000DE2CMZ Sistemi Elettronici 000DE3AT Sweden AB 000DE4DIGINICS, Inc 000DE5Samsung Thales 000DE6YOUNGBO ENGINEERING CO.,LTD 000DE7Snap-on OEM Group 000DE8Nasaco Electronics Pte. Ltd 000DE9Napatech Aps 000DEAKingtel Telecommunication Corp 000DEBCompXs Limited 000DECCISCO SYSTEMS, INC 000DEDCISCO SYSTEMS, INC 000DEEAndrew RF Power Amplifier Group 000DEFSoc. Coop. Bilanciai 000DF0QCOM TECHNOLOGY INC 000DF1IONIX INC 000DF2 000DF3Asmax Solutions 000DF4Watertek Co 000DF5Teletronics International Inc 000DF6Technology Thesaurus Corp 000DF7Space Dynamics Lab 000DF8ORGA Kartensysteme GmbH 000DF9NDS Limited 000DFAMicro Control Systems Ltd 000DFBKomax AG 000DFCITFOR Inc 000DFDHuges Hi-Tech Inc., 000DFEHauppauge Computer Works, Inc 000DFFCHENMING MOLD INDUSTRY CORP 000E00Atrie 000E01ASIP Technologies Inc 000E02Advantech AMT Inc 000E03Emulex Corporation 000E04CMA/Microdialysis AB 000E05WIRELESS MATRIX CORP 000E06Team Simoco Ltd 000E07Sony Ericsson Mobile Communications AB 000E08Cisco Linksys LLC 000E09Shenzhen Coship Software Co.,LTD 000E0ASAKUMA DESIGN OFFICE 000E0BNetac Technology Co., Ltd 000E0CIntel Corporation 000E0DHesch Schröder GmbH 000E0EESA elettronica S.P.A 000E0FERMME 000E10C-guys, Inc 000E11BDT Büro und Datentechnik GmbH & Co.KG 000E12Adaptive Micro Systems Inc 000E13Accu-Sort Systems inc 000E14Visionary Solutions, Inc 000E15Tadlys LTD 000E16SouthWing S.L 000E17 000E18MyA Technology 000E19LogicaCMG Pty Ltd 000E1AJPS Communications 000E1BIAV GmbH 000E1CHach Company 000E1DARION Technology Inc 000E1EQLogic Corporation 000E1FTCL Networks Equipment Co., Ltd 000E20ACCESS Systems Americas, Inc 000E21MTU Friedrichshafen GmbH 000E22 000E23Incipient, Inc 000E24Huwell Technology Inc 000E25Hannae Technology Co., Ltd 000E26Gincom Technology Corp 000E27Crere Networks, Inc 000E28Dynamic Ratings P/L 000E29Shester Communications Inc 000E2A 000E2BSafari Technologies 000E2CNetcodec co 000E2DHyundai Digital Technology Co.,Ltd 000E2EEdimax Technology Co., Ltd 000E2FRoche Diagnostics GmbH 000E30AERAS Networks, Inc 000E31Olympus Soft Imaging Solutions GmbH 000E32Kontron Medical 000E33Shuko Electronics Co.,Ltd 000E34NexGen City, LP 000E35Intel Corp 000E36HEINESYS, Inc 000E37Harms & Wende GmbH & Co.KG 000E38CISCO SYSTEMS, INC 000E39CISCO SYSTEMS, INC 000E3ACirrus Logic 000E3BHawking Technologies, Inc 000E3CTransact Technologies Inc 000E3DTelevic N.V 000E3ESun Optronics Inc 000E3FSoronti, Inc 000E40Nortel Networks 000E41NIHON MECHATRONICS CO.,LTD 000E42Motic Incoporation Ltd 000E43G-Tek Electronics Sdn. Bhd 000E44Digital 5, Inc 000E45Beijing Newtry Electronic Technology Ltd 000E46Niigata Seimitsu Co.,Ltd 000E47NCI System Co.,Ltd 000E48Lipman TransAction Solutions 000E49Forsway Scandinavia AB 000E4AChangchun Huayu WEBPAD Co.,LTD 000E4Batrium c and i 000E4CBermai Inc 000E4DNumesa Inc 000E4EWaveplus Technology Co., Ltd 000E4FTrajet GmbH 000E50Thomson Telecom Belgium 000E51tecna elettronica srl 000E52Optium Corporation 000E53AV TECH CORPORATION 000E54AlphaCell Wireless Ltd 000E55AUVITRAN 000E564G Systems GmbH & Co. KG 000E57Iworld Networking, Inc 000E58Sonos, Inc 000E59SAGEM SA 000E5ATELEFIELD inc 000E5BParkerVision - Direct2Data 000E5CARRIS Group, Inc 000E5DTriple Play Technologies A/S 000E5ERaisecom Technology 000E5Factiv-net GmbH & Co. KG 000E60360SUN Digital Broadband Corporation 000E61MICROTROL LIMITED 000E62Nortel Networks 000E63Lemke Diagnostics GmbH 000E64Elphel, Inc 000E65TransCore 000E66Hitachi Industry & Control Solutions, Ltd 000E67Eltis Microelectronics Ltd 000E68E-TOP Network Technology Inc 000E69China Electric Power Research Institute 000E6A3Com Ltd 000E6BJanitza electronics GmbH 000E6CDevice Drivers Limited 000E6DMurata Manufacturing Co., Ltd 000E6EMAT S.A. (Mircrelec Advanced Technology) 000E6FIRIS Corporation Berhad 000E70in2 Networks 000E71Gemstar Technology Development Ltd 000E72CTS electronics 000E73Tpack A/S 000E74Solar Telecom. Tech 000E75New York Air Brake Corp 000E76GEMSOC INNOVISION INC 000E77Decru, Inc 000E78Amtelco 000E79Ample Communications Inc 000E7AGemWon Communications Co., Ltd 000E7BToshiba 000E7CTeleves S.A 000E7DElectronics Line 3000 Ltd 000E7EionSign Oy 000E7FHewlett-Packard Company 000E80Thomson Technology Inc 000E81Devicescape Software, Inc 000E82Commtech Wireless 000E83CISCO SYSTEMS, INC 000E84CISCO SYSTEMS, INC 000E85Catalyst Enterprises, Inc 000E86Alcatel North America 000E87adp Gauselmann GmbH 000E88VIDEOTRON CORP 000E89CLEMATIC 000E8AAvara Technologies Pty. Ltd 000E8BAstarte Technology Co, Ltd 000E8CSiemens AG A&D ET 000E8DSystems in Progress Holding GmbH 000E8ESparkLAN Communications, Inc 000E8FSercomm Corp 000E90PONICO CORP 000E91Navico Auckland Ltd 000E92Open Telecom 000E93Milénio 3 Sistemas Electrónicos, Lda 000E94Maas International BV 000E95Fujiya Denki Seisakusho Co.,Ltd 000E96Cubic Defense Applications, Inc 000E97Ultracker Technology CO., Inc 000E98HME Clear-Com LTD 000E99Spectrum Digital, Inc 000E9ABOE TECHNOLOGY GROUP CO.,LTD 000E9BAmbit Microsystems Corporation 000E9CBenchmark Electronics 000E9DTiscali UK Ltd 000E9ETopfield Co., Ltd 000E9FTEMIC SDS GmbH 000EA0NetKlass Technology Inc 000EA1Formosa Teletek Corporation 000EA2McAfee, Inc 000EA3CNCR-IT CO.,LTD,HangZhou P.R.CHINA 000EA4Certance Inc 000EA5BLIP Systems 000EA6ASUSTEK COMPUTER INC 000EA7Endace Technology 000EA8United Technologists Europe Limited 000EA9Shanghai Xun Shi Communications Equipment Ltd. Co 000EAAScalent Systems, Inc 000EABCray Inc 000EACMINTRON ENTERPRISE CO., LTD 000EADMetanoia Technologies, Inc 000EAEGAWELL TECHNOLOGIES CORP 000EAFCASTEL 000EB0Solutions Radio BV 000EB1Newcotech,Ltd 000EB2Micro-Research Finland Oy 000EB3Hewlett-Packard 000EB4GUANGZHOU GAOKE COMMUNICATIONS TECHNOLOGY CO.LTD 000EB5Ecastle Electronics Co., Ltd 000EB6Riverbed Technology, Inc 000EB7Knovative, Inc 000EB8Iiga co.,Ltd 000EB9HASHIMOTO Electronics Industry Co.,Ltd 000EBAHANMI SEMICONDUCTOR CO., LTD 000EBBEverbee Networks 000EBCParagon Fidelity GmbH 000EBDBurdick, a Quinton Compny 000EBEB&B Electronics Manufacturing Co 000EBFRemsdaq Limited 000EC0Nortel Networks 000EC1MYNAH Technologies 000EC2Lowrance Electronics, Inc 000EC3Logic Controls, Inc 000EC4Iskra Transmission d.d 000EC5Digital Multitools Inc 000EC6ASIX ELECTRONICS CORP 000EC7Motorola Korea 000EC8Zoran Corporation 000EC9YOKO Technology Corp 000ECAWTSS Inc 000ECBVineSys Technology 000ECCTableau, LLC 000ECDSKOV A/S 000ECES.I.T.T.I. S.p.A 000ECFPROFIBUS Nutzerorganisation e.V 000ED0Privaris, Inc 000ED1Osaka Micro Computer 000ED2Filtronic plc 000ED3Epicenter, Inc 000ED4CRESITT INDUSTRIE 000ED5COPAN Systems Inc 000ED6CISCO SYSTEMS, INC 000ED7CISCO SYSTEMS, INC 000ED8Aktino, Inc 000ED9Aksys, Ltd 000EDAC-TECH UNITED CORP 000EDBXiNCOM Corp 000EDCTellion INC 000EDDSHURE INCORPORATED 000EDEREMEC, Inc 000EDFPLX Technology 000EE0Mcharge 000EE1ExtremeSpeed Inc 000EE2Custom Engineering 000EE3Chiyu Technology Co.,Ltd 000EE4BOE TECHNOLOGY GROUP CO.,LTD 000EE5bitWallet, Inc 000EE6Adimos Systems LTD 000EE7AAC ELECTRONICS CORP 000EE8zioncom 000EE9WayTech Development, Inc 000EEAShadong Luneng Jicheng Electronics,Co.,Ltd 000EEBSandmartin(zhong shan)Electronics Co.,Ltd 000EECOrban 000EEDNokia Danmark A/S 000EEEMuco Industrie BV 000EEF 000EF0Festo AG & Co. KG 000EF1EZQUEST INC 000EF2Infinico Corporation 000EF3Smarthome 000EF4Kasda Digital Technology Co.,Ltd 000EF5iPAC Technology Co., Ltd 000EF6E-TEN Information Systems Co., Ltd 000EF7Vulcan Portals Inc 000EF8SBC ASI 000EF9REA Elektronik GmbH 000EFAOptoway Technology Incorporation 000EFBMacey Enterprises 000EFCJTAG Technologies B.V 000EFDFUJINON CORPORATION 000EFEEndRun Technologies LLC 000EFFMegasolution,Inc 000F00Legra Systems, Inc 000F01DIGITALKS INC 000F02Digicube Technology Co., Ltd 000F03COM&C CO., LTD 000F04cim-usa inc 000F053B SYSTEM INC 000F06Nortel Networks 000F07Mangrove Systems, Inc 000F08Indagon Oy 000F09 000F0AClear Edge Networks 000F0BKentima Technologies AB 000F0CSYNCHRONIC ENGINEERING 000F0DHunt Electronic Co., Ltd 000F0EWaveSplitter Technologies, Inc 000F0FReal ID Technology Co., Ltd 000F10RDM Corporation 000F11Prodrive B.V 000F12Panasonic Europe Ltd 000F13Nisca corporation 000F14Mindray Co., Ltd 000F15Kjaerulff1 A/S 000F16JAY HOW TECHNOLOGY CO., 000F17Insta Elektro GmbH 000F18Industrial Control Systems 000F19Boston Scientific 000F1AGaming Support B.V 000F1BEgo Systems Inc 000F1CDigitAll World Co., Ltd 000F1DCosmo Techs Co., Ltd 000F1EChengdu KT Electric Co.of High & New Technology 000F1FDell Inc 000F20Hewlett-Packard Company 000F21Scientific Atlanta, Inc 000F22Helius, Inc 000F23CISCO SYSTEMS, INC 000F24CISCO SYSTEMS, INC 000F25AimValley B.V 000F26WorldAccxx LLC 000F27TEAL Electronics, Inc 000F28Itronix Corporation 000F29Augmentix Corporation 000F2ACableware Electronics 000F2BGREENBELL SYSTEMS 000F2CUplogix, Inc 000F2DCHUNG-HSIN ELECTRIC & MACHINERY MFG.CORP 000F2EMegapower International Corp 000F2FW-LINX TECHNOLOGY CO., LTD 000F30Raza Microelectronics Inc 000F31Allied Vision Technologies Canada Inc 000F32Lootom Telcovideo Network Wuxi Co Ltd 000F33DUALi Inc 000F34CISCO SYSTEMS, INC 000F35CISCO SYSTEMS, INC 000F36Accurate Techhnologies, Inc 000F37Xambala Incorporated 000F38Netstar 000F39IRIS SENSORS 000F3AHISHARP 000F3BFuji System Machines Co., Ltd 000F3CEndeleo Limited 000F3DD-Link Corporation 000F3ECardioNet, Inc 000F3FBig Bear Networks 000F40Optical Internetworking Forum 000F41Zipher Ltd 000F42Xalyo Systems 000F43Wasabi Systems Inc 000F44Tivella Inc 000F45Stretch, Inc 000F46SINAR AG 000F47ROBOX SPA 000F48Polypix Inc 000F49Northover Solutions Limited 000F4AKyushu-kyohan co.,ltd 000F4BOracle Corporation 000F4CElextech INC 000F4DTalkSwitch 000F4ECellink 000F4FCadmus Technology Ltd 000F50StreamScale Limited 000F51Azul Systems, Inc 000F52YORK Refrigeration, Marine & Controls 000F53Solarflare Communications Inc 000F54Entrelogic Corporation 000F55Datawire Communication Networks Inc 000F56Continuum Photonics Inc 000F57CABLELOGIC Co., Ltd 000F58Adder Technology Limited 000F59Phonak Communications AG 000F5APeribit Networks 000F5BDelta Information Systems, Inc 000F5CDay One Digital Media Limited 000F5DGenexis BV 000F5EVeo 000F5FNicety Technologies Inc. (NTS) 000F60Lifetron Co.,Ltd 000F61Hewlett-Packard Company 000F62Alcatel Bell Space N.V 000F63Obzerv Technologies 000F64D&R Electronica Weesp BV 000F65icube Corp 000F66Cisco-Linksys 000F67West Instruments 000F68Vavic Network Technology, Inc 000F69SEW Eurodrive GmbH & Co. KG 000F6ANortel Networks 000F6BGateWare Communications GmbH 000F6CADDI-DATA GmbH 000F6DMidas Engineering 000F6EBBox 000F6FFTA Communication Technologies 000F70Wintec Industries, inc 000F71Sanmei Electronics Co.,Ltd 000F72Sandburst 000F73RS Automation Co., Ltd 000F74Qamcom Technology AB 000F75First Silicon Solutions 000F76Digital Keystone, Inc 000F77DENTUM CO.,LTD 000F78Datacap Systems Inc 000F79Bluetooth Interest Group Inc 000F7ABeiJing NuQX Technology CO.,LTD 000F7BArce Sistemas, S.A 000F7CACTi Corporation 000F7DXirrus 000F7EAblerex Electronics Co., LTD 000F7FUBSTORAGE Co.,Ltd 000F80Trinity Security Systems,Inc 000F81PAL Pacific Inc 000F82Mortara Instrument, Inc 000F83Brainium Technologies Inc 000F84Astute Networks, Inc 000F85ADDO-Japan Corporation 000F86Research In Motion Limited 000F87Maxcess International 000F88AMETEK, Inc 000F89Winnertec System Co., Ltd 000F8AWideView 000F8BOrion MultiSystems Inc 000F8CGigawavetech Pte Ltd 000F8DFAST TV-Server AG 000F8EDONGYANG TELECOM CO.,LTD 000F8FCISCO SYSTEMS, INC 000F90CISCO SYSTEMS, INC 000F91Aerotelecom Co.,Ltd 000F92Microhard Systems Inc 000F93Landis+Gyr Ltd 000F94Genexis BV 000F95ELECOM Co.,LTD Laneed Division 000F96Telco Systems, Inc 000F97Avanex Corporation 000F98Avamax Co. Ltd 000F99APAC opto Electronics Inc 000F9ASynchrony, Inc 000F9BRoss Video Limited 000F9CPanduit Corp 000F9DDisplayLink (UK) Ltd 000F9EMurrelektronik GmbH 000F9FARRIS Group, Inc 000FA0CANON KOREA BUSINESS SOLUTIONS INC 000FA1Gigabit Systems Inc 000FA22xWireless 000FA3Alpha Networks Inc 000FA4Sprecher Automation GmbH 000FA5BWA Technology GmbH 000FA6S2 Security Corporation 000FA7Raptor Networks Technology 000FA8Photometrics, Inc 000FA9PC Fabrik 000FAANexus Technologies 000FABKyushu Electronics Systems Inc 000FACIEEE 802.11 000FADFMN communications GmbH 000FAEE2O Communications 000FAFDialog Inc 000FB0Compal Electronics,INC 000FB1Cognio Inc 000FB2Broadband Pacenet (India) Pvt. Ltd 000FB3Actiontec Electronics, Inc 000FB4Timespace Technology 000FB5NETGEAR Inc 000FB6Europlex Technologies 000FB7Cavium Networks 000FB8CallURL Inc 000FB9Adaptive Instruments 000FBATevebox AB 000FBBNokia Siemens Networks GmbH & Co. KG 000FBCOnkey Technologies, Inc 000FBDMRV Communications (Networks) LTD 000FBEe-w/you Inc 000FBFDGT Sp. z o.o 000FC0DELCOMp 000FC1WAVE Corporation 000FC2Uniwell Corporation 000FC3PalmPalm Technology, Inc 000FC4NST co.,LTD 000FC5KeyMed Ltd 000FC6Eurocom Industries A/S 000FC7Dionica R&D Ltd 000FC8Chantry Networks 000FC9Allnet GmbH 000FCAA-JIN TECHLINE CO, LTD 000FCB3Com Ltd 000FCCNetopia, Inc 000FCDNortel Networks 000FCEKikusui Electronics Corp 000FCFDatawind Research 000FD0ASTRI 000FD1Applied Wireless Identifications Group, Inc 000FD2EWA Technologies, Inc 000FD3Digium 000FD4Soundcraft 000FD5Schwechat - RISE 000FD6Sarotech Co., Ltd 000FD7Harman Music Group 000FD8Force, Inc 000FD9FlexDSL Telecommunications AG 000FDAYAZAKI CORPORATION 000FDBWestell Technologies 000FDCUeda Japan Radio Co., Ltd 000FDDSORDIN AB 000FDESony Ericsson Mobile Communications AB 000FDFSOLOMON Technology Corp 000FE0NComputing Co.,Ltd 000FE1ID DIGITAL CORPORATION 000FE2Hangzhou H3C Technologies Co., Ltd 000FE3Damm Cellular Systems A/S 000FE4Pantech Co.,Ltd 000FE5MERCURY SECURITY CORPORATION 000FE6MBTech Systems, Inc 000FE7Lutron Electronics Co., Inc 000FE8Lobos, Inc 000FE9GW TECHNOLOGIES CO.,LTD 000FEAGiga-Byte Technology Co.,LTD 000FEBCylon Controls 000FECARKUS Inc 000FEDAnam Electronics Co., Ltd 000FEEXTec, Incorporated 000FEFThales e-Transactions GmbH 000FF0Sunray Co. Ltd 000FF1nex-G Systems Pte.Ltd 000FF2Loud Technologies Inc 000FF3Jung Myoung Communications&Technology 000FF4Guntermann & Drunck GmbH 000FF5GN&S company 000FF6Darfon Electronics Corp 000FF7CISCO SYSTEMS, INC 000FF8CISCO SYSTEMS, INC 000FF9Valcretec, Inc 000FFAOptinel Systems, Inc 000FFBNippon Denso Industry Co., Ltd 000FFCMerit Li-Lin Ent 000FFDGlorytek Network Inc 000FFEG-PRO COMPUTER 000FFFControl4 001000CABLE TELEVISION LABORATORIES, INC 001001Citel 001002ACTIA 001003IMATRON, INC 001004THE BRANTLEY COILE COMPANY,INC 001005UEC COMMERCIAL 001006Thales Contact Solutions Ltd 001007CISCO SYSTEMS, INC 001008VIENNA SYSTEMS CORPORATION 001009HORO QUARTZ 00100AWILLIAMS COMMUNICATIONS GROUP 00100BCISCO SYSTEMS, INC 00100CITO CO., LTD 00100DCISCO SYSTEMS, INC 00100EMICRO LINEAR COPORATION 00100FINDUSTRIAL CPU SYSTEMS 001010INITIO CORPORATION 001011CISCO SYSTEMS, INC 001012PROCESSOR SYSTEMS (I) PVT LTD 001013Kontron America, Inc 001014CISCO SYSTEMS, INC 001015OOmon Inc 001016T.SQWARE 001017Bosch Access Systems GmbH 001018BROADCOM CORPORATION 001019SIRONA DENTAL SYSTEMS GmbH & Co. KG 00101APictureTel Corp 00101BCORNET TECHNOLOGY, INC 00101COHM TECHNOLOGIES INTL, LLC 00101DWINBOND ELECTRONICS CORP 00101EMATSUSHITA ELECTRONIC INSTRUMENTS CORP 00101FCISCO SYSTEMS, INC 001020Hand Held Products Inc 001021ENCANTO NETWORKS, INC 001022SatCom Media Corporation 001023Network Equipment Technologies 001024NAGOYA ELECTRIC WORKS CO., LTD 001025Grayhill, Inc 001026ACCELERATED NETWORKS, INC 001027L-3 COMMUNICATIONS EAST 001028COMPUTER TECHNICA, INC 001029CISCO SYSTEMS, INC 00102AZF MICROSYSTEMS, INC 00102BUMAX DATA SYSTEMS, INC 00102CLasat Networks A/S 00102DHITACHI SOFTWARE ENGINEERING 00102ENETWORK SYSTEMS & TECHNOLOGIES PVT. LTD 00102FCISCO SYSTEMS, INC 001030EION Inc 001031OBJECTIVE COMMUNICATIONS, INC 001032ALTA TECHNOLOGY 001033ACCESSLAN COMMUNICATIONS, INC 001034GNP Computers 001035ELITEGROUP COMPUTER SYSTEMS CO., LTD 001036INTER-TEL INTEGRATED SYSTEMS 001037CYQ've Technology Co., Ltd 001038MICRO RESEARCH INSTITUTE, INC 001039Vectron Systems AG 00103ADIAMOND NETWORK TECH 00103BHIPPI NETWORKING FORUM 00103CIC ENSEMBLE, INC 00103DPHASECOM, LTD 00103ENETSCHOOLS CORPORATION 00103FTOLLGRADE COMMUNICATIONS, INC 001040INTERMEC CORPORATION 001041BRISTOL BABCOCK, INC 001042Alacritech, Inc 001043A2 CORPORATION 001044InnoLabs Corporation 001045Nortel Networks 001046ALCORN MCBRIDE INC 001047ECHO ELETRIC CO. LTD 001048HTRC AUTOMATION, INC 001049ShoreTel, Inc 00104AThe Parvus Corporation 00104B3COM CORPORATION 00104CTeledyne LeCroy, Inc 00104DSURTEC INDUSTRIES, INC 00104ECEOLOGIC 00104FOracle Corporation 001050RION CO., LTD 001051CMICRO CORPORATION 001052METTLER-TOLEDO (ALBSTADT) GMBH 001053COMPUTER TECHNOLOGY CORP 001054CISCO SYSTEMS, INC 001055FUJITSU MICROELECTRONICS, INC 001056SODICK CO., LTD 001057Rebel.com, Inc 001058ArrowPoint Communications 001059DIABLO RESEARCH CO. LLC 00105A3COM CORPORATION 00105BNET INSIGHT AB 00105CQUANTUM DESIGNS (H.K.) LTD 00105DDraeger Medical 00105EHEKIMIAN LABORATORIES, INC 00105FZODIAC DATA SYSTEMS 001060BILLIONTON SYSTEMS, INC 001061HOSTLINK CORP 001062NX SERVER, ILNC 001063STARGUIDE DIGITAL NETWORKS 001064DNPG, LLC 001065RADYNE CORPORATION 001066ADVANCED CONTROL SYSTEMS, INC 001067Ericsson 001068COMOS TELECOM 001069HELIOSS COMMUNICATIONS, INC 00106ADIGITAL MICROWAVE CORPORATION 00106BSONUS NETWORKS, INC 00106CEDNT GmbH 00106DAxxcelera Broadband Wireless 00106ETADIRAN COM. LTD 00106FTRENTON TECHNOLOGY INC 001070CARADON TREND LTD 001071ADVANET INC 001072GVN TECHNOLOGIES, INC 001073Technobox, Inc 001074ATEN INTERNATIONAL CO., LTD 001075Segate Technology LLC 001076EUREM GmbH 001077SAF DRIVE SYSTEMS, LTD 001078NUERA COMMUNICATIONS, INC 001079CISCO SYSTEMS, INC 00107AAmbiCom, Inc 00107BCISCO SYSTEMS, INC 00107CP-COM, INC 00107DAURORA COMMUNICATIONS, LTD 00107EBACHMANN ELECTRONIC GmbH 00107FCRESTRON ELECTRONICS, INC 001080METAWAVE COMMUNICATIONS 001081DPS, INC 001082JNA TELECOMMUNICATIONS LIMITED 001083HEWLETT-PACKARD COMPANY 001084K-BOT COMMUNICATIONS 001085POLARIS COMMUNICATIONS, INC 001086ATTO Technology, Inc 001087Xstreamis PLC 001088AMERICAN NETWORKS INC 001089WebSonic 00108ATeraLogic, Inc 00108BLASERANIMATION SOLLINGER GmbH 00108CFUJITSU TELECOMMUNICATIONS EUROPE, LTD 00108DJohnson Controls, Inc 00108EHUGH SYMONS CONCEPT Technologies Ltd 00108FRAPTOR SYSTEMS 001090CIMETRICS, INC 001091NO WIRES NEEDED BV 001092NETCORE INC 001093CMS COMPUTERS, LTD 001094Performance Analysis Broadband, Spirent plc 001095Thomson Inc 001096TRACEWELL SYSTEMS, INC 001097WinNet Metropolitan Communications Systems, Inc 001098STARNET TECHNOLOGIES, INC 001099InnoMedia, Inc 00109ANETLINE 00109BEmulex Corporation 00109CM-SYSTEM CO., LTD 00109DCLARINET SYSTEMS, INC 00109EAWARE, INC 00109FPAVO, INC 0010A0INNOVEX TECHNOLOGIES, INC 0010A1KENDIN SEMICONDUCTOR, INC 0010A2TNS 0010A3OMNITRONIX, INC 0010A4XIRCOM 0010A5OXFORD INSTRUMENTS 0010A6CISCO SYSTEMS, INC 0010A7UNEX TECHNOLOGY CORPORATION 0010A8RELIANCE COMPUTER CORP 0010A9ADHOC TECHNOLOGIES 0010AAMEDIA4, INC 0010ABKOITO ELECTRIC INDUSTRIES, LTD 0010ACIMCI TECHNOLOGIES 0010ADSOFTRONICS USB, INC 0010AESHINKO ELECTRIC INDUSTRIES CO 0010AFTAC SYSTEMS, INC 0010B0MERIDIAN TECHNOLOGY CORP 0010B1FOR-A CO., LTD 0010B2COACTIVE AESTHETICS 0010B3NOKIA MULTIMEDIA TERMINALS 0010B4ATMOSPHERE NETWORKS 0010B5ACCTON TECHNOLOGY CORPORATION 0010B6ENTRATA COMMUNICATIONS CORP 0010B7COYOTE TECHNOLOGIES, LLC 0010B8ISHIGAKI COMPUTER SYSTEM CO 0010B9MAXTOR CORP 0010BAMARTINHO-DAVIS SYSTEMS, INC 0010BBDATA & INFORMATION TECHNOLOGY 0010BCAastra Telecom 0010BDTHE TELECOMMUNICATION TECHNOLOGY COMMITTEE (TTC) 0010BEMARCH NETWORKS CORPORATION 0010BFInterAir Wireless 0010C0ARMA, Inc 0010C1OI ELECTRIC CO., LTD 0010C2WILLNET, INC 0010C3CSI-CONTROL SYSTEMS 0010C4MEDIA LINKS CO., LTD 0010C5PROTOCOL TECHNOLOGIES, INC 0010C6Universal Global Scientific Industrial Co., Ltd 0010C7DATA TRANSMISSION NETWORK 0010C8COMMUNICATIONS ELECTRONICS SECURITY GROUP 0010C9MITSUBISHI ELECTRONICS LOGISTIC SUPPORT CO 0010CATelco Systems, Inc 0010CBFACIT K.K 0010CCCLP COMPUTER LOGISTIK PLANUNG GmbH 0010CDINTERFACE CONCEPT 0010CEVOLAMP, LTD 0010CFFIBERLANE COMMUNICATIONS 0010D0WITCOM, LTD 0010D1Top Layer Networks, Inc 0010D2NITTO TSUSHINKI CO., LTD 0010D3GRIPS ELECTRONIC GMBH 0010D4STORAGE COMPUTER CORPORATION 0010D5IMASDE CANARIAS, S.A 0010D6Exelis 0010D7ARGOSY RESEARCH INC 0010D8CALISTA 0010D9IBM JAPAN, FUJISAWA MT+D 0010DAKollmorgen Corp 0010DBJuniper Networks, Inc 0010DCMICRO-STAR INTERNATIONAL CO., LTD 0010DDENABLE SEMICONDUCTOR, INC 0010DEINTERNATIONAL DATACASTING CORPORATION 0010DFRISE COMPUTER INC 0010E0Oracle Corporation 0010E1S.I. TECH, INC 0010E2ArrayComm, Inc 0010E3Hewlett-Packard Company 0010E4NSI CORPORATION 0010E5SOLECTRON TEXAS 0010E6APPLIED INTELLIGENT SYSTEMS, INC 0010E7BreezeCom 0010E8TELOCITY, INCORPORATED 0010E9RAIDTEC LTD 0010EAADEPT TECHNOLOGY 0010EBSELSIUS SYSTEMS, INC 0010ECRPCG, LLC 0010EDSUNDANCE TECHNOLOGY, INC 0010EECTI PRODUCTS, INC 0010EFDBTEL INCORPORATED 0010F0RITTAL-WERK RUDOLF LOH GmbH & Co 0010F1I-O CORPORATION 0010F2ANTEC 0010F3Nexcom International Co., Ltd 0010F4Vertical Communications 0010F5AMHERST SYSTEMS, INC 0010F6CISCO SYSTEMS, INC 0010F7IRIICHI TECHNOLOGIES Inc 0010F8TEXIO TECHNOLOGY CORPORATION 0010F9UNIQUE SYSTEMS, INC 0010FAApple 0010FBZIDA TECHNOLOGIES LIMITED 0010FCBROADBAND NETWORKS, INC 0010FDCOCOM A/S 0010FEDIGITAL EQUIPMENT CORPORATION 0010FFCISCO SYSTEMS, INC 001100Schneider Electric 001101CET Technologies Pte Ltd 001102Aurora Multimedia Corp 001103kawamura electric inc 001104TELEXY 001105Sunplus Technology Co., Ltd 001106Siemens NV (Belgium) 001107RGB Networks Inc 001108Orbital Data Corporation 001109Micro-Star International 00110AHewlett-Packard Company 00110BFranklin Technology Systems 00110CAtmark Techno, Inc 00110DSANBlaze Technology, Inc 00110ETsurusaki Sealand Transportation Co. Ltd 00110Fnetplat,Inc 001110Maxanna Technology Co., Ltd 001111Intel Corporation 001112Honeywell CMSS 001113Fraunhofer FOKUS 001114EverFocus Electronics Corp 001115EPIN Technologies, Inc 001116COTEAU VERT CO., LTD 001117CESNET 001118BLX IC Design Corp., Ltd 001119Solteras, Inc 00111AARRIS Group, Inc 00111BTarga Systems Div L-3 Communications Canada 00111CPleora Technologies Inc 00111DHectrix Limited 00111EEPSG (Ethernet Powerlink Standardization Group) 00111FDoremi Labs, Inc 001120CISCO SYSTEMS, INC 001121CISCO SYSTEMS, INC 001122CIMSYS Inc 001123Appointech, Inc 001124Apple 001125IBM Corp 001126Venstar Inc 001127TASI, Inc 001128Streamit 001129Paradise Datacom Ltd 00112ANiko NV 00112BNetModule AG 00112CIZT GmbH 00112DiPulse Systems 00112ECEICOM 00112FASUSTek Computer Inc 001130Allied Telesis (Hong Kong) Ltd 001131UNATECH. CO.,LTD 001132Synology Incorporated 001133Siemens Austria SIMEA 001134MediaCell, Inc 001135Grandeye Ltd 001136Goodrich Sensor Systems 001137AICHI ELECTRIC CO., LTD 001138TAISHIN CO., LTD 001139STOEBER ANTRIEBSTECHNIK GmbH + Co. KG 00113ASHINBORAM 00113BMicronet Communications Inc 00113CMicronas GmbH 00113DKN SOLTEC CO.,LTD 00113EJL Corporation 00113FAlcatel DI 001140Nanometrics Inc 001141GoodMan Corporation 001142e-SMARTCOM INC 001143Dell Inc 001144Assurance Technology Corp 001145ValuePoint Networks 001146Telecard-Pribor Ltd 001147Secom-Industry co.LTD 001148Prolon Control Systems 001149Proliphix Inc 00114AKAYABA INDUSTRY Co,.Ltd 00114BFrancotyp-Postalia GmbH 00114Ccaffeina applied research ltd 00114DAtsumi Electric Co.,LTD 00114E690885 Ontario Inc 00114FUS Digital Television, Inc 001150Belkin Corporation 001151Mykotronx 001152Eidsvoll Electronics AS 001153Trident Tek, Inc 001154Webpro Technologies Inc 001155Sevis Systems 001156Pharos Systems NZ 001157OF Networks Co., Ltd 001158Nortel Networks 001159MATISSE NETWORKS INC 00115AIvoclar Vivadent AG 00115BElitegroup Computer System Co. (ECS) 00115CCISCO SYSTEMS, INC 00115DCISCO SYSTEMS, INC 00115EProMinent Dosiertechnik GmbH 00115FITX Security Co., Ltd 001160ARTDIO Company Co., LTD 001161NetStreams, LLC 001162STAR MICRONICS CO.,LTD 001163SYSTEM SPA DEPT. ELECTRONICS 001164ACARD Technology Corp 001165Znyx Networks 001166Taelim Electronics Co., Ltd 001167Integrated System Solution Corp 001168HomeLogic LLC 001169EMS Satcom 00116ADomo Ltd 00116BDigital Data Communications Asia Co.,Ltd 00116CNanwang Multimedia Inc.,Ltd 00116DAmerican Time and Signal 00116EPePLink Ltd 00116FNetforyou Co., LTD 001170GSC SRL 001171DEXTER Communications, Inc 001172COTRON CORPORATION 001173SMART Storage Systems 001174Wibhu Technologies, Inc 001175PathScale, Inc 001176Intellambda Systems, Inc 001177Coaxial Networks, Inc 001178Chiron Technology Ltd 001179Singular Technology Co. Ltd 00117ASingim International Corp 00117BBüchi Labortechnik AG 00117Ce-zy.net 00117DZMD America, Inc 00117EProgeny, A division of Midmark Corp 00117FNeotune Information Technology Corporation,.LTD 001180ARRIS Group, Inc 001181InterEnergy Co.Ltd, 001182IMI Norgren Ltd 001183Datalogic ADC, Inc 001184Humo Laboratory,Ltd 001185Hewlett-Packard Company 001186Prime Systems, Inc 001187Category Solutions, Inc 001188Enterasys 001189Aerotech Inc 00118AViewtran Technology Limited 00118BAlcatel-Lucent, Enterprise Business Group 00118CMissouri Department of Transportation 00118DHanchang System Corp 00118EHalytech Mace 00118FEUTECH INSTRUMENTS PTE. LTD 001190Digital Design Corporation 001191CTS-Clima Temperatur Systeme GmbH 001192CISCO SYSTEMS, INC 001193CISCO SYSTEMS, INC 001194Chi Mei Communication Systems, Inc 001195D-Link Corporation 001196Actuality Systems, Inc 001197Monitoring Technologies Limited 001198Prism Media Products Limited 0011992wcom Systems GmbH 00119AAlkeria srl 00119BTelesynergy Research Inc 00119CEP&T Energy 00119DDiginfo Technology Corporation 00119ESolectron Brazil 00119FNokia Danmark A/S 0011A0Vtech Engineering Canada Ltd 0011A1VISION NETWARE CO.,LTD 0011A2Manufacturing Technology Inc 0011A3LanReady Technologies Inc 0011A4JStream Technologies Inc 0011A5Fortuna Electronic Corp 0011A6Sypixx Networks 0011A7Infilco Degremont Inc 0011A8Quest Technologies 0011A9MOIMSTONE Co., LTD 0011AAUniclass Technology, Co., LTD 0011ABTRUSTABLE TECHNOLOGY CO.,LTD 0011ACSimtec Electronics 0011ADShanghai Ruijie Technology 0011AEARRIS Group, Inc 0011AFMedialink-i,Inc 0011B0Fortelink Inc 0011B1BlueExpert Technology Corp 0011B22001 Technology Inc 0011B3YOSHIMIYA CO.,LTD 0011B4Westermo Teleindustri AB 0011B5Shenzhen Powercom Co.,Ltd 0011B6Open Systems International 0011B7Octalix B.V 0011B8Liebherr - Elektronik GmbH 0011B9Inner Range Pty. Ltd 0011BAElexol Pty Ltd 0011BBCISCO SYSTEMS, INC 0011BCCISCO SYSTEMS, INC 0011BDBombardier Transportation 0011BEAGP Telecom Co. Ltd 0011BFAESYS S.p.A 0011C0Aday Technology Inc 0011C14P MOBILE DATA PROCESSING 0011C2United Fiber Optic Communication 0011C3Transceiving System Technology Corporation 0011C4Terminales de Telecomunicacion Terrestre, S.L 0011C5TEN Technology 0011C6Seagate Technology 0011C7Raymarine UK Ltd 0011C8Powercom Co., Ltd 0011C9MTT Corporation 0011CALong Range Systems, Inc 0011CBJacobsons AB 0011CCGuangzhou Jinpeng Group Co.,Ltd 0011CDAxsun Technologies 0011CEUbisense Limited 0011CFThrane & Thrane A/S 0011D0Tandberg Data ASA 0011D1Soft Imaging System GmbH 0011D2Perception Digital Ltd 0011D3NextGenTel Holding ASA 0011D4NetEnrich, Inc 0011D5Hangzhou Sunyard System Engineering Co.,Ltd 0011D6HandEra, Inc 0011D7eWerks Inc 0011D8ASUSTek Computer Inc 0011D9TiVo 0011DAVivaas Technology Inc 0011DBLand-Cellular Corporation 0011DCGlunz & Jensen 0011DDFROMUS TEC. Co., Ltd 0011DEEURILOGIC 0011DFCurrent Energy 0011E0U-MEDIA Communications, Inc 0011E1Arcelik A.S 0011E2Hua Jung Components Co., Ltd 0011E3Thomson, Inc 0011E4Danelec Electronics A/S 0011E5KCodes Corporation 0011E6Scientific Atlanta 0011E7WORLDSAT - Texas de France 0011E8Tixi.Com 0011E9STARNEX CO., LTD 0011EAIWICS Inc 0011EBInnovative Integration 0011ECAVIX INC 0011ED802 Global 0011EEEstari, Inc 0011EFConitec Datensysteme GmbH 0011F0Wideful Limited 0011F1QinetiQ Ltd 0011F2Institute of Network Technologies 0011F3NeoMedia Europe AG 0011F4woori-net 0011F5ASKEY COMPUTER CORP 0011F6Asia Pacific Microsystems , Inc 0011F7Shenzhen Forward Industry Co., Ltd 0011F8AIRAYA Corp 0011F9Nortel Networks 0011FARane Corporation 0011FBHeidelberg Engineering GmbH 0011FCHARTING Electric Gmbh & Co.KG 0011FDKORG INC 0011FEKeiyo System Research, Inc 0011FFDigitro Tecnologia Ltda 001200CISCO SYSTEMS, INC 001201CISCO SYSTEMS, INC 001202Decrane Aerospace - Audio International Inc 001203ActivNetworks 001204u10 Networks, Inc 001205Terrasat Communications, Inc 001206iQuest (NZ) Ltd 001207Head Strong International Limited 001208Gantner Instruments GmbH 001209Fastrax Ltd 00120AEmerson Climate Technologies GmbH 00120BChinasys Technologies Limited 00120CCE-Infosys Pte Ltd 00120DAdvanced Telecommunication Technologies, Inc 00120EAboCom 00120FIEEE 802.3 001210WideRay Corp 001211Protechna Herbst GmbH & Co. KG 001212PLUS Corporation 001213Metrohm AG 001214Koenig & Bauer AG 001215iStor Networks, Inc 001216ICP Internet Communication Payment AG 001217Cisco-Linksys, LLC 001218ARUZE Corporation 001219Ahead Communication Systems Inc 00121ATechno Soft Systemnics Inc 00121BSound Devices, LLC 00121CPARROT S.A 00121DNetfabric Corporation 00121EJuniper Networks, Inc 00121FHarding Instruments 001220Cadco Systems 001221B.Braun Melsungen AG 001222Skardin (UK) Ltd 001223Pixim 001224NexQL Corporation 001225ARRIS Group, Inc 001226Japan Direx Corporation 001227Franklin Electric Co., Inc 001228Data Ltd 001229BroadEasy Technologies Co.,Ltd 00122AVTech Telecommunications Ltd 00122BVirbiage Pty Ltd 00122CSoenen Controls N.V 00122DSiNett Corporation 00122ESignal Technology - AISD 00122FSanei Electric Inc 001230Picaso Infocommunication CO., LTD 001231Motion Control Systems, Inc 001232LeWiz Communications Inc 001233JRC TOKKI Co.,Ltd 001234Camille Bauer 001235Andrew Corporation 001236ConSentry Networks 001237Texas Instruments 001238SetaBox Technology Co., Ltd 001239S Net Systems Inc 00123APosystech Inc., Co 00123BKeRo Systems ApS 00123CSecond Rule LLC 00123DGES 00123EERUNE technology Co., Ltd 00123FDell Inc 001240AMOI ELECTRONICS CO.,LTD 001241a2i marketing center 001242Millennial Net 001243CISCO SYSTEMS, INC 001244CISCO SYSTEMS, INC 001245Zellweger Analytics, Inc 001246T.O.M TECHNOLOGY INC. 001247Samsung Electronics Co., Ltd 001248EMC Corporation (Kashya) 001249Delta Elettronica S.p.A 00124ADedicated Devices, Inc 00124BTexas Instruments 00124CBBWM Corporation 00124DInducon BV 00124EXAC AUTOMATION CORP 00124FPentair Thermal Management 001250Tokyo Aircaft Instrument Co., Ltd 001251SILINK 001252Citronix, LLC 001253AudioDev AB 001254Spectra Technologies Holdings Company Ltd 001255NetEffect Incorporated 001256LG INFORMATION & COMM 001257LeapComm Communication Technologies Inc 001258Activis Polska 001259THERMO ELECTRON KARLSRUHE 00125AMicrosoft Corporation 00125BKAIMEI ELECTRONI 00125CGreen Hills Software, Inc 00125DCyberNet Inc 00125ECAEN 00125FAWIND Inc 001260Stanton Magnetics,inc 001261Adaptix, Inc 001262Nokia Danmark A/S 001263Data Voice Technologies GmbH 001264daum electronic gmbh 001265Enerdyne Technologies, Inc 001266Swisscom Hospitality Services SA 001267Panasonic Corporation 001268IPS d.o.o 001269Value Electronics 00126AOPTOELECTRONICS Co., Ltd 00126BAscalade Communications Limited 00126CVisonic Ltd 00126DUniversity of California, Berkeley 00126ESeidel Elektronik GmbH Nfg.KG 00126FRayson Technology Co., Ltd 001270NGES Denro Systems 001271Measurement Computing Corp 001272Redux Communications Ltd 001273Stoke Inc 001274NIT lab 001275Sentilla Corporation 001276CG Power Systems Ireland Limited 001277Korenix Technologies Co., Ltd 001278International Bar Code 001279Hewlett-Packard Company 00127ASanyu Industry Co.,Ltd 00127BVIA Networking Technologies, Inc 00127CSWEGON AB 00127DMobileAria 00127EDigital Lifestyles Group, Inc 00127FCISCO SYSTEMS, INC 001280CISCO SYSTEMS, INC 001281March Networks S.p.A 001282Qovia 001283Nortel Networks 001284Lab33 Srl 001285Gizmondo Europe Ltd 001286ENDEVCO CORP 001287Digital Everywhere Unterhaltungselektronik GmbH 0012882Wire, Inc 001289Advance Sterilization Products 00128AARRIS Group, Inc 00128BSensory Networks Inc 00128CWoodward Governor 00128DSTB Datenservice GmbH 00128EQ-Free ASA 00128FMontilio 001290KYOWA Electric & Machinery Corp 001291KWS Computersysteme GmbH 001292Griffin Technology 001293GE Energy 001294SUMITOMO ELECTRIC DEVICE INNOVATIONS, INC 001295Aiware Inc 001296Addlogix 001297O2Micro, Inc 001298MICO ELECTRIC(SHENZHEN) LIMITED 001299Ktech Telecommunications Inc 00129AIRT Electronics Pty Ltd 00129BE2S Electronic Engineering Solutions, S.L 00129CYulinet 00129DFirst International Computer do Brasil 00129ESurf Communications Inc 00129FRAE Systems 0012A0NeoMeridian Sdn Bhd 0012A1BluePacket Communications Co., Ltd 0012A2VITA 0012A3Trust International B.V 0012A4ThingMagic, LLC 0012A5Stargen, Inc 0012A6Dolby Australia 0012A7ISR TECHNOLOGIES Inc 0012A8intec GmbH 0012A93Com Ltd 0012AAIEE, Inc 0012ABWiLife, Inc 0012ACONTIMETEK INC 0012ADIDS GmbH 0012AEHLS HARD-LINE Solutions Inc 0012AFELPRO Technologies 0012B0Efore Oyj (Plc) 0012B1Dai Nippon Printing Co., Ltd 0012B2AVOLITES LTD 0012B3Advance Wireless Technology Corp 0012B4Work Microwave GmbH 0012B5Vialta, Inc 0012B6Santa Barbara Infrared, Inc 0012B7PTW Freiburg 0012B8G2 Microsystems 0012B9Fusion Digital Technology 0012BAFSI Systems, Inc 0012BBTelecommunications Industry Association TR-41 Committee 0012BCEcholab LLC 0012BDAvantec Manufacturing Limited 0012BEAstek Corporation 0012BFArcadyan Technology Corporation 0012C0HotLava Systems, Inc 0012C1Check Point Software Technologies 0012C2Apex Electronics Factory 0012C3WIT S.A 0012C4Viseon, Inc 0012C5V-Show Technology (China) Co.,Ltd 0012C6TGC America, Inc 0012C7SECURAY Technologies Ltd.Co 0012C8Perfect tech 0012C9ARRIS Group, Inc 0012CAMechatronic Brick Aps 0012CBCSS Inc 0012CCBitatek CO., LTD 0012CDASEM SpA 0012CEAdvanced Cybernetics Group 0012CFAccton Technology Corporation 0012D0Gossen-Metrawatt-GmbH 0012D1Texas Instruments Inc 0012D2Texas Instruments 0012D3Zetta Systems, Inc 0012D4Princeton Technology, Ltd 0012D5Motion Reality Inc 0012D6Jiangsu Yitong High-Tech Co.,Ltd 0012D7Invento Networks, Inc 0012D8International Games System Co., Ltd 0012D9CISCO SYSTEMS, INC 0012DACISCO SYSTEMS, INC 0012DBZIEHL industrie-elektronik GmbH + Co KG 0012DCSunCorp Industrial Limited 0012DDShengqu Information Technology (Shanghai) Co., Ltd 0012DERadio Components Sweden AB 0012DFNovomatic AG 0012E0Codan Limited 0012E1Alliant Networks, Inc 0012E2ALAXALA Networks Corporation 0012E3Agat-RT, Ltd 0012E4ZIEHL industrie-electronik GmbH + Co KG 0012E5Time America, Inc 0012E6SPECTEC COMPUTER CO., LTD 0012E7Projectek Networking Electronics Corp 0012E8Fraunhofer IMS 0012E9Abbey Systems Ltd 0012EATrane 0012EBPDH Solutions, LLC 0012ECMovacolor b.v 0012EDAVG Advanced Technologies 0012EESony Ericsson Mobile Communications AB 0012EFOneAccess SA 0012F0Intel Corporate 0012F1IFOTEC 0012F2Brocade Communications Systems, Inc 0012F3connectBlue AB 0012F4Belco International Co.,Ltd 0012F5Imarda New Zealand Limited 0012F6MDK CO.,LTD 0012F7Xiamen Xinglian Electronics Co., Ltd 0012F8WNI Resources, LLC 0012F9URYU SEISAKU, LTD 0012FATHX LTD 0012FBSamsung Electronics 0012FCPLANET System Co.,LTD 0012FDOPTIMUS IC S.A 0012FELenovo Mobile Communication Technology Ltd 0012FFLely Industries N.V 001300IT-FACTORY, INC 001301IronGate S.L 001302Intel Corporate 001303GateConnect 001304Flaircomm Technologies Co. LTD 001305Epicom, Inc 001306Always On Wireless 001307Paravirtual Corporation 001308Nuvera Fuel Cells 001309Ocean Broadband Networks 00130ANortel 00130BMextal B.V 00130CHF System Corporation 00130DGALILEO AVIONICA 00130EFocusrite Audio Engineering Limited 00130FEGEMEN Bilgisayar Muh San ve Tic LTD STI 001310Cisco-Linksys, LLC 001311ARRIS International 001312Amedia Networks Inc 001313GuangZhou Post & Telecom Equipment ltd 001314Asiamajor Inc 001315SONY Computer Entertainment inc, 001316L-S-B Broadcast Technologies GmbH 001317GN Netcom as 001318DGSTATION Co., Ltd 001319CISCO SYSTEMS, INC 00131ACISCO SYSTEMS, INC 00131BBeCell Innovations Corp 00131CLiteTouch, Inc 00131DScanvaegt International A/S 00131EPeiker acustic GmbH & Co. KG 00131FNxtPhase T&D, Corp 001320Intel Corporate 001321Hewlett-Packard Company 001322DAQ Electronics, Inc 001323Cap Co., Ltd 001324Schneider Electric Ultra Terminal 001325Cortina Systems Inc 001326ECM Systems Ltd 001327Data Acquisitions limited 001328Westech Korea Inc., 001329VSST Co., LTD 00132ASitronics Telecom Solutions 00132BPhoenix Digital 00132CMAZ Brandenburg GmbH 00132DiWise Communications 00132EITian Coporation 00132FInteractek 001330EURO PROTECTION SURVEILLANCE 001331CellPoint Connect 001332Beijing Topsec Network Security Technology Co., Ltd 001333BaudTec Corporation 001334Arkados, Inc 001335VS Industry Berhad 001336Tianjin 712 Communication Broadcasting co., ltd 001337Orient Power Home Network Ltd 001338FRESENIUS-VIAL 001339CCV Deutschland GmbH 00133AVadaTech Inc 00133BSpeed Dragon Multimedia Limited 00133CQUINTRON SYSTEMS INC 00133DMicro Memory Curtiss Wright Co 00133EMetaSwitch 00133FEppendorf Instrumente GmbH 001340AD.EL s.r.l 001341Shandong New Beiyang Information Technology Co.,Ltd 001342Vision Research, Inc 001343Matsushita Electronic Components (Europe) GmbH 001344Fargo Electronics Inc 001345Eaton Corporation 001346D-Link Corporation 001347BlueTree Wireless Data Inc 001348Artila Electronics Co., Ltd 001349ZyXEL Communications Corporation 00134AEngim, Inc 00134BToGoldenNet Technology Inc 00134CYDT Technology International 00134DInepro BV 00134EValox Systems, Inc 00134FTranzeo Wireless Technologies Inc 001350Silver Spring Networks, Inc 001351Niles Audio Corporation 001352Naztec, Inc 001353HYDAC Filtertechnik GMBH 001354Zcomax Technologies, Inc 001355TOMEN Cyber-business Solutions, Inc 001356FLIR Radiation Inc 001357Soyal Technology Co., Ltd 001358Realm Systems, Inc 001359ProTelevision Technologies A/S 00135AProject T&E Limited 00135BPanelLink Cinema, LLC 00135COnSite Systems, Inc 00135DNTTPC Communications, Inc 00135EEAB/RWI/K 00135FCISCO SYSTEMS, INC 001360CISCO SYSTEMS, INC 001361Biospace Co., Ltd 001362ShinHeung Precision Co., Ltd 001363Verascape, Inc 001364Paradigm Technology Inc. 001365Nortel 001366Neturity Technologies Inc 001367Narayon. Co., Ltd 001368Saab Danmark A/S 001369Honda Electron Co., LED 00136AHach Lange Sarl 00136BE-TEC 00136CTomTom 00136DTentaculus AB 00136ETechmetro Corp 00136FPacketMotion, Inc 001370Nokia Danmark A/S 001371ARRIS Group, Inc 001372Dell Inc 001373BLwave Electronics Co., Ltd 001374Atheros Communications, Inc 001375American Security Products Co 001376Tabor Electronics Ltd 001377Samsung Electronics CO., LTD 001378Qsan Technology, Inc 001379PONDER INFORMATION INDUSTRIES LTD 00137ANetvox Technology Co., Ltd 00137BMovon Corporation 00137CKaicom co., Ltd 00137DDynalab, Inc 00137ECorEdge Networks, Inc 00137FCISCO SYSTEMS, INC 001380CISCO SYSTEMS, INC 001381CHIPS & Systems, Inc 001382Cetacea Networks Corporation 001383Application Technologies and Engineering Research Laboratory 001384Advanced Motion Controls 001385Add-On Technology Co., LTD 001386ABB Inc./Totalflow 00138727M Technologies AB 001388WiMedia Alliance 001389Redes de Telefonía Móvil S.A 00138AQINGDAO GOERTEK ELECTRONICS CO.,LTD 00138BPhantom Technologies LLC 00138CKumyoung.Co.Ltd 00138DKinghold 00138EFOAB Elektronik AB 00138FAsiarock Incorporation 001390Termtek Computer Co., Ltd 001391OUEN CO.,LTD 001392Ruckus Wireless 001393Panta Systems, Inc 001394Infohand Co.,Ltd 001395congatec AG 001396Acbel Polytech Inc 001397Oracle Corporation 001398TrafficSim Co.,Ltd 001399STAC Corporation 00139AK-ubique ID Corp 00139BioIMAGE Ltd 00139CExavera Technologies, Inc 00139DMarvell Hispana S.L 00139ECiara Technologies Inc 00139FElectronics Design Services, Co., Ltd 0013A0ALGOSYSTEM Co., Ltd 0013A1Crow Electronic Engeneering 0013A2MaxStream, Inc 0013A3Siemens Com CPE Devices 0013A4KeyEye Communications 0013A5General Solutions, LTD 0013A6Extricom Ltd 0013A7BATTELLE MEMORIAL INSTITUTE 0013A8Tanisys Technology 0013A9Sony Corporation 0013AAALS & TEC Ltd 0013ABTelemotive AG 0013ACSunmyung Electronics Co., LTD 0013ADSendo Ltd 0013AERadiance Technologies, Inc 0013AFNUMA Technology,Inc 0013B0Jablotron 0013B1Intelligent Control Systems (Asia) Pte Ltd 0013B2Carallon Limited 0013B3Ecom Communications Technology Co., Ltd 0013B4Appear TV 0013B5Wavesat 0013B6Sling Media, Inc 0013B7Scantech ID 0013B8RyCo Electronic Systems Limited 0013B9BM SPA 0013BAReadyLinks Inc 0013BBSmartvue Corporation 0013BCArtimi Ltd 0013BDHYMATOM SA 0013BEVirtual Conexions 0013BFMedia System Planning Corp 0013C0Trix Tecnologia Ltda 0013C1Asoka USA Corporation 0013C2WACOM Co.,Ltd 0013C3CISCO SYSTEMS, INC 0013C4CISCO SYSTEMS, INC 0013C5LIGHTRON FIBER-OPTIC DEVICES INC 0013C6OpenGear, Inc 0013C7IONOS Co.,Ltd 0013C8ADB Broadband Italia 0013C9Beyond Achieve Enterprises Ltd 0013CAPico Digital 0013CBZenitel Norway AS 0013CCTall Maple Systems 0013CDMTI co. LTD 0013CEIntel Corporate 0013CF4Access Communications 0013D0t+ Medical Ltd 0013D1KIRK telecom A/S 0013D2PAGE IBERICA, S.A 0013D3MICRO-STAR INTERNATIONAL CO., LTD 0013D4ASUSTek COMPUTER INC 0013D5RuggedCom 0013D6TII NETWORK TECHNOLOGIES, INC 0013D7SPIDCOM Technologies SA 0013D8Princeton Instruments 0013D9Matrix Product Development, Inc 0013DADiskware Co., Ltd 0013DBSHOEI Electric Co.,Ltd 0013DCIBTEK INC 0013DDAbbott Diagnostics 0013DEAdapt4, LLC 0013DFRyvor Corp 0013E0Murata Manufacturing Co., Ltd 0013E1Iprobe AB 0013E2GeoVision Inc 0013E3CoVi Technologies, Inc 0013E4YANGJAE SYSTEMS CORP 0013E5TENOSYS, INC 0013E6Technolution 0013E7Halcro 0013E8Intel Corporate 0013E9VeriWave, Inc 0013EAKamstrup A/S 0013EBSysmaster Corporation 0013ECSunbay Software AG 0013EDPSIA 0013EEJBX Designs Inc 0013EFKingjon Digital Technology Co.,Ltd 0013F0Wavefront Semiconductor 0013F1AMOD Technology Co., Ltd 0013F2Klas Ltd 0013F3Giga-byte Communications Inc 0013F4Psitek (Pty) Ltd 0013F5Akimbi Systems 0013F6Cintech 0013F7SMC Networks, Inc 0013F8Dex Security Solutions 0013F9Cavera Systems 0013FALifeSize Communications, Inc 0013FBRKC INSTRUMENT INC 0013FCSiCortex, Inc 0013FDNokia Danmark A/S 0013FEGRANDTEC ELECTRONIC CORP 0013FFDage-MTI of MC, Inc 001400MINERVA KOREA CO., LTD 001401Rivertree Networks Corp 001402kk-electronic a/s 001403Renasis, LLC 001404ARRIS Group, Inc 001405OpenIB, Inc 001406Go Networks 001407Sperian Protection Instrumentation 001408Eka Systems Inc 001409MAGNETI MARELLI S.E. S.p.A 00140AWEPIO Co., Ltd 00140BFIRST INTERNATIONAL COMPUTER, INC 00140CGKB CCTV CO., LTD 00140DNortel 00140ENortel 00140FFederal State Unitary Enterprise Leningrad R&D Institute of 001410Suzhou Keda Technology CO.,Ltd 001411Deutschmann Automation GmbH & Co. KG 001412S-TEC electronics AG 001413Trebing & Himstedt Prozeßautomation GmbH & Co. KG 001414Jumpnode Systems LLC 001415Intec Automation Inc 001416Scosche Industries, Inc 001417RSE Informations Technologie GmbH 001418C4Line 001419SIDSA 00141ADEICY CORPORATION 00141BCISCO SYSTEMS, INC 00141CCISCO SYSTEMS, INC 00141DLTi DRIVES GmbH 00141EP.A. Semi, Inc 00141FSunKwang Electronics Co., Ltd 001420G-Links networking company 001421Total Wireless Technologies Pte. Ltd 001422Dell Inc 001423J-S Co. NEUROCOM 001424Merry Electrics CO., LTD 001425Galactic Computing Corp 001426NL Technology 001427JazzMutant 001428Vocollect, Inc 001429V Center Technologies Co., Ltd 00142AElitegroup Computer System Co., Ltd 00142BEdata Communication Inc 00142CKoncept International, Inc 00142DToradex AG 00142E77 Elektronika Kft 00142FWildPackets 001430ViPowER, Inc 001431PDL Electronics Ltd 001432Tarallax Wireless, Inc 001433Empower Technologies(Canada) Inc 001434Keri Systems, Inc 001435CityCom Corp 001436Qwerty Elektronik AB 001437GSTeletech Co.,Ltd 001438Hewlett-Packard Company 001439Blonder Tongue Laboratories, Inc 00143ARAYTALK INTERNATIONAL SRL 00143BSensovation AG 00143CRheinmetall Canada Inc 00143DAevoe Inc 00143EAirLink Communications, Inc 00143FHotway Technology Corporation 001440ATOMIC Corporation 001441Innovation Sound Technology Co., LTD 001442ATTO CORPORATION 001443Consultronics Europe Ltd 001444Grundfos Holding 001445Telefon-Gradnja d.o.o 001446SuperVision Solutions LLC 001447BOAZ Inc 001448Inventec Multimedia & Telecom Corporation 001449Sichuan Changhong Electric Ltd 00144ATaiwan Thick-Film Ind. Corp 00144BHifn, Inc 00144CGeneral Meters Corp 00144DIntelligent Systems 00144ESRISA 00144FOracle Corporation 001450Heim Systems GmbH 001451Apple 001452CALCULEX,INC 001453ADVANTECH TECHNOLOGIES CO.,LTD 001454Symwave 001455Coder Electronics Corporation 001456Edge Products 001457T-VIPS AS 001458HS Automatic ApS 001459Moram Co., Ltd 00145ANeratec Solutions AG 00145BSeekerNet Inc 00145CIntronics B.V 00145DWJ Communications, Inc 00145EIBM Corp 00145FADITEC CO. LTD 001460Kyocera Wireless Corp 001461CORONA CORPORATION 001462Digiwell Technology, inc 001463IDCS N.V 001464Cryptosoft 001465Novo Nordisk A/S 001466Kleinhenz Elektronik GmbH 001467ArrowSpan Inc 001468CelPlan International, Inc 001469CISCO SYSTEMS, INC 00146ACISCO SYSTEMS, INC 00146BAnagran, Inc 00146CNetgear Inc 00146DRF Technologies 00146EH. Stoll GmbH & Co. KG 00146FKohler Co 001470Prokom Software SA 001471Eastern Asia Technology Limited 001472China Broadband Wireless IP Standard Group 001473Bookham Inc 001474K40 Electronics 001475Wiline Networks, Inc 001476MultiCom Industries Limited 001477Nertec Inc 001478ShenZhen TP-LINK Technologies Co., Ltd 001479NEC Magnus Communications,Ltd 00147AEubus GmbH 00147BIteris, Inc 00147C3Com Ltd 00147DAeon Digital International 00147EInnerWireless 00147FThomson Telecom Belgium 001480Hitachi-LG Data Storage Korea, Inc 001481Multilink Inc 001482Aurora Networks 001483eXS Inc 001484Cermate Technologies Inc 001485Giga-Byte 001486Echo Digital Audio Corporation 001487American Technology Integrators 001488Akorri 001489B15402100 - JANDEI, S.L 00148AElin Ebg Traction Gmbh 00148BGlobo Electronic GmbH & Co. KG 00148CFortress Technologies 00148DCubic Defense Simulation Systems 00148ETele Power Inc 00148FProtronic (Far East) Ltd 001490ASP Corporation 001491Daniels Electronics Ltd. dbo Codan Rado Communications 001492Liteon, Mobile Media Solution SBU 001493Systimax Solutions 001494ESU AG 0014952Wire, Inc 001496Phonic Corp 001497ZHIYUAN Eletronics co.,ltd 001498Viking Design Technology 001499Helicomm Inc 00149AARRIS Group, Inc 00149BNokota Communications, LLC 00149CHF Company 00149DSound ID Inc 00149EUbONE Co., Ltd 00149FSystem and Chips, Inc 0014A0Accsense, Inc 0014A1Synchronous Communication Corp 0014A2Core Micro Systems Inc 0014A3Vitelec BV 0014A4Hon Hai Precision Ind. Co., Ltd 0014A5Gemtek Technology Co., Ltd 0014A6Teranetics, Inc 0014A7Nokia Danmark A/S 0014A8CISCO SYSTEMS, INC 0014A9CISCO SYSTEMS, INC 0014AAAshly Audio, Inc 0014ABSenhai Electronic Technology Co., Ltd 0014ACBountiful WiFi 0014ADGassner Wiege- und Meßtechnik GmbH 0014AEWizlogics Co., Ltd 0014AFDatasym POS Inc 0014B0Naeil Community 0014B1Avitec AB 0014B2mCubelogics Corporation 0014B3CoreStar International Corp 0014B4General Dynamics United Kingdom Ltd 0014B5PHYSIOMETRIX,INC 0014B6Enswer Technology Inc 0014B7AR Infotek Inc 0014B8Hill-Rom 0014B9MSTAR SEMICONDUCTOR 0014BACarvers SA de CV 0014BBOpen Interface North America 0014BCSYNECTIC TELECOM EXPORTS PVT. LTD 0014BDincNETWORKS, Inc 0014BEWink communication technology CO.LTD 0014BFCisco-Linksys LLC 0014C0Symstream Technology Group Ltd 0014C1U.S. Robotics Corporation 0014C2Hewlett-Packard Company 0014C3Seagate Technology 0014C4Vitelcom Mobile Technology 0014C5Alive Technologies Pty Ltd 0014C6Quixant Ltd 0014C7Nortel 0014C8Contemporary Research Corp 0014C9Brocade Communications Systems, Inc 0014CAKey Radio Systems Limited 0014CBLifeSync Corporation 0014CCZetec, Inc 0014CDDigitalZone Co., Ltd 0014CENF CORPORATION 0014CFINVISIO Communications 0014D0BTI Systems Inc 0014D1TRENDnet 0014D2Kyuden Technosystems Corporation 0014D3SEPSA 0014D4K Technology Corporation 0014D5Datang Telecom Technology CO. , LCD,Optical Communication Br 0014D6Jeongmin Electronics Co.,Ltd 0014D7Datastore Technology Corp 0014D8bio-logic SA 0014D9IP Fabrics, Inc 0014DAHuntleigh Healthcare 0014DBElma Trenew Electronic GmbH 0014DCCommunication System Design & Manufacturing (CSDM) 0014DDCovergence Inc 0014DESage Instruments Inc 0014DFHI-P Tech Corporation 0014E0LET'S Corporation 0014E1Data Display AG 0014E2datacom systems inc 0014E3mm-lab GmbH 0014E4infinias, LLC 0014E5Alticast 0014E6AIM Infrarotmodule GmbH 0014E7Stolinx,. Inc 0014E8ARRIS Group, Inc 0014E9Nortech International 0014EAS Digm Inc. (Safe Paradigm Inc.) 0014EBAwarePoint Corporation 0014ECAcro Telecom 0014EDAirak, Inc 0014EEWestern Digital Technologies, Inc 0014EFTZero Technologies, Inc 0014F0Business Security OL AB 0014F1CISCO SYSTEMS, INC 0014F2CISCO SYSTEMS, INC 0014F3ViXS Systems Inc 0014F4DekTec Digital Video B.V 0014F5OSI Security Devices 0014F6Juniper Networks, Inc 0014F7CREVIS Co., LTD 0014F8Scientific Atlanta 0014F9Vantage Controls 0014FAAsGa S.A 0014FBTechnical Solutions Inc 0014FCExtandon, Inc 0014FDThecus Technology Corp 0014FEArtech Electronics 0014FFPrecise Automation, Inc 001500Intel Corporate 001501LexBox 001502BETA tech 001503PROFIcomms s.r.o 001504GAME PLUS CO., LTD 001505Actiontec Electronics, Inc 001506Neo Photonics 001507Renaissance Learning Inc 001508Global Target Enterprise Inc 001509Plus Technology Co., Ltd 00150ASonoa Systems, Inc 00150BSAGE INFOTECH LTD 00150CAVM GmbH 00150DHoana Medical, Inc 00150EOPENBRAIN TECHNOLOGIES CO., LTD 00150Fmingjong 001510Techsphere Co., Ltd 001511Data Center Systems 001512Zurich University of Applied Sciences 001513EFS sas 001514Hu Zhou NAVA Networks&Electronics Ltd 001515Leipold+Co.GmbH 001516URIEL SYSTEMS INC 001517Intel Corporate 001518Shenzhen 10MOONS Technology Development CO.,Ltd 001519StoreAge Networking Technologies 00151AHunter Engineering Company 00151BIsilon Systems Inc 00151CLENECO 00151DM2I CORPORATION 00151EEthernet Powerlink Standardization Group (EPSG) 00151FMultivision Intelligent Surveillance (Hong Kong) Ltd 001520Radiocrafts AS 001521Horoquartz 001522Dea Security 001523Meteor Communications Corporation 001524Numatics, Inc 001525Chamberlain Access Solutions 001526Remote Technologies Inc 001527Balboa Instruments 001528Beacon Medical Products LLC d.b.a. BeaconMedaes 001529N3 Corporation 00152ANokia GmbH 00152BCISCO SYSTEMS, INC 00152CCISCO SYSTEMS, INC 00152DTenX Networks, LLC 00152EPacketHop, Inc 00152FARRIS Group, Inc 001530EMC Corporation 001531KOCOM 001532Consumer Technologies Group, LLC 001533NADAM.CO.,LTD 001534A Beltrónica-Companhia de Comunicações, Lda 001535OTE Spa 001536Powertech co.,Ltd 001537Ventus Networks 001538RFID, Inc 001539Technodrive SRL 00153AShenzhen Syscan Technology Co.,Ltd 00153BEMH metering GmbH & Co. KG 00153CKprotech Co., Ltd 00153DELIM PRODUCT CO 00153EQ-Matic Sweden AB 00153FAlcatel Alenia Space Italia 001540Nortel 001541StrataLight Communications, Inc 001542MICROHARD S.R.L 001543Aberdeen Test Center 001544coM.s.a.t. AG 001545SEECODE Co., Ltd 001546ITG Worldwide Sdn Bhd 001547AiZen Solutions Inc 001548CUBE TECHNOLOGIES 001549Dixtal Biomedica Ind. Com. Ltda 00154AWANSHIH ELECTRONIC CO., LTD 00154BWonde Proud Technology Co., Ltd 00154CSaunders Electronics 00154DNetronome Systems, Inc 00154EIEC 00154Fone RF Technology 001550Nits Technology Inc 001551RadioPulse Inc 001552Wi-Gear Inc 001553Cytyc Corporation 001554Atalum Wireless S.A 001555DFM GmbH 001556SAGEM COMMUNICATION 001557Olivetti 001558FOXCONN 001559Securaplane Technologies, Inc 00155ADAINIPPON PHARMACEUTICAL CO., LTD 00155BSampo Corporation 00155CDresser Wayne 00155DMicrosoft Corporation 00155EMorgan Stanley 00155FGreenPeak Technologies 001560Hewlett-Packard Company 001561JJPlus Corporation 001562CISCO SYSTEMS, INC 001563CISCO SYSTEMS, INC 001564BEHRINGER Spezielle Studiotechnik GmbH 001565XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD 001566A-First Technology Co., Ltd 001567RADWIN Inc 001568Dilithium Networks 001569PECO II, Inc 00156ADG2L Technologies Pvt. Ltd 00156BPerfisans Networks Corp 00156CSANE SYSTEM CO., LTD 00156DUbiquiti Networks Inc 00156EA. W. Communication Systems Ltd 00156FXiranet Communications GmbH 001570Symbol TechnologiesWholly owned Subsidiary of Motorola 001571Nolan Systems 001572Red-Lemon 001573NewSoft Technology Corporation 001574Horizon Semiconductors Ltd 001575Nevis Networks Inc 001576LABiTec - Labor Biomedical Technologies GmbH 001577Allied Telesis 001578Audio / Video Innovations 001579Lunatone Industrielle Elektronik GmbH 00157ATelefin S.p.A 00157BLeuze electronic GmbH + Co. KG 00157CDave Networks, Inc 00157DPOSDATA CO., LTD 00157EWeidmüller Interface GmbH & Co. KG 00157FChuanG International Holding CO.,LTD 001580U-WAY CORPORATION 001581MAKUS Inc 001582Pulse Eight Limited 001583IVT corporation 001584Schenck Process GmbH 001585Aonvision Technolopy Corp 001586Xiamen Overseas Chinese Electronic Co., Ltd 001587Takenaka Seisakusho Co.,Ltd 001588Salutica Allied Solutions Sdn Bhd 001589D-MAX Technology Co.,Ltd 00158ASURECOM Technology Corp 00158BPark Air Systems Ltd 00158CLiab ApS 00158DJennic Ltd 00158EPlustek.INC 00158FNTT Advanced Technology Corporation 001590Hectronic GmbH 001591RLW Inc 001592Facom UK Ltd (Melksham) 001593U4EA Technologies Inc 001594BIXOLON CO.,LTD 001595Quester Tangent Corporation 001596ARRIS International 001597AETA AUDIO SYSTEMS 001598Kolektor group 001599Samsung Electronics Co., LTD 00159AARRIS Group, Inc 00159BNortel 00159CB-KYUNG SYSTEM Co.,Ltd 00159DTripp Lite 00159EMad Catz Interactive Inc 00159FTerascala, Inc 0015A0Nokia Danmark A/S 0015A1ECA-SINTERS 0015A2ARRIS International 0015A3ARRIS International 0015A4ARRIS International 0015A5DCI Co., Ltd 0015A6Digital Electronics Products Ltd 0015A7Robatech AG 0015A8ARRIS Group, Inc 0015A9KWANG WOO I&C CO.,LTD 0015AARextechnik International Co., 0015ABPRO CO SOUND INC 0015ACCapelon AB 0015ADAccedian Networks 0015AEkyung il 0015AFAzureWave Technologies, Inc 0015B0AUTOTELENET CO.,LTD 0015B1Ambient Corporation 0015B2Advanced Industrial Computer, Inc 0015B3Caretech AB 0015B4Polymap Wireless LLC 0015B5CI Network Corp 0015B6ShinMaywa Industries, Ltd 0015B7Toshiba 0015B8Tahoe 0015B9Samsung Electronics Co., Ltd 0015BAiba AG 0015BBSMA Solar Technology AG 0015BCDevelco 0015BDGroup 4 Technology Ltd 0015BEIqua Ltd 0015BFtechnicob 0015C0DIGITAL TELEMEDIA CO.,LTD 0015C1SONY Computer Entertainment inc, 0015C23M Germany 0015C3Ruf Telematik AG 0015C4FLOVEL CO., LTD 0015C5Dell Inc 0015C6CISCO SYSTEMS, INC 0015C7CISCO SYSTEMS, INC 0015C8FlexiPanel Ltd 0015C9Gumstix, Inc 0015CATeraRecon, Inc 0015CBSurf Communication Solutions Ltd 0015CCUQUEST, LTD 0015CDExartech International Corp 0015CEARRIS International 0015CFARRIS International 0015D0ARRIS International 0015D1ARRIS Group, Inc 0015D2Xantech Corporation 0015D3Pantech&Curitel Communications, Inc 0015D4Emitor AB 0015D5NICEVT 0015D6OSLiNK Sp. z o.o 0015D7Reti Corporation 0015D8Interlink Electronics 0015D9PKC Electronics Oy 0015DAIRITEL A.D 0015DBCanesta Inc 0015DCKT&C Co., Ltd 0015DDIP Control Systems Ltd 0015DENokia Danmark A/S 0015DFClivet S.p.A 0015E0Ericsson 0015E1Picochip Ltd 0015E2Dr.Ing. Herbert Knauer GmbH 0015E3Dream Technologies Corporation 0015E4Zimmer Elektromedizin 0015E5Cheertek Inc 0015E6MOBILE TECHNIKA Inc 0015E7Quantec Tontechnik 0015E8Nortel 0015E9D-Link Corporation 0015EATellumat (Pty) Ltd 0015EBZTE CORPORATION 0015ECBoca Devices LLC 0015EDFulcrum Microsystems, Inc 0015EEOmnex Control Systems 0015EFNEC TOKIN Corporation 0015F0EGO BV 0015F1KYLINK Communications Corp 0015F2ASUSTek COMPUTER INC 0015F3PELTOR AB 0015F4Eventide 0015F5Sustainable Energy Systems 0015F6SCIENCE AND ENGINEERING SERVICES, INC 0015F7Wintecronics Ltd 0015F8Kingtronics Industrial Co. Ltd 0015F9CISCO SYSTEMS, INC 0015FACISCO SYSTEMS, INC 0015FBsetex schermuly textile computer gmbh 0015FCLittelfuse Startco 0015FDComplete Media Systems 0015FESCHILLING ROBOTICS LLC 0015FFNovatel Wireless, Inc 001600CelleBrite Mobile Synchronization 001601Buffalo Inc 001602CEYON TECHNOLOGY CO.,LTD 001603COOLKSKY Co., LTD 001604Sigpro 001605YORKVILLE SOUND INC 001606Ideal Industries 001607Curves International Inc 001608Sequans Communications 001609Unitech electronics co., ltd 00160ASWEEX Europe BV 00160BTVWorks LLC 00160CLPL DEVELOPMENT S.A. DE C.V 00160DBe Here Corporation 00160EOptica Technologies Inc 00160FBADGER METER INC 001610Carina Technology 001611Altecon Srl 001612Otsuka Electronics Co., Ltd 001613LibreStream Technologies Inc 001614Picosecond Pulse Labs 001615Nittan Company, Limited 001616BROWAN COMMUNICATION INC 001617MSI 001618HIVION Co., Ltd 001619Lancelan Technologies S.L 00161ADametric AB 00161BMicronet Corporation 00161Ce:cue 00161DInnovative Wireless Technologies, Inc 00161EWoojinnet 00161FSUNWAVETEC Co., Ltd 001620Sony Ericsson Mobile Communications AB 001621Colorado Vnet 001622BBH SYSTEMS GMBH 001623Interval Media 001624Teneros, Inc 001625Impinj, Inc 001626ARRIS Group, Inc 001627embedded-logic DESIGN AND MORE GmbH 001628Ultra Electronics Manufacturing and Card Systems 001629Nivus GmbH 00162AAntik computers & communications s.r.o 00162BTogami Electric Mfg.co.,Ltd 00162CXanboo 00162DSTNet Co., Ltd 00162ESpace Shuttle Hi-Tech Co., Ltd 00162FGeutebrück GmbH 001630Vativ Technologies 001631Xteam 001632SAMSUNG ELECTRONICS CO., LTD 001633Oxford Diagnostics Ltd 001634Mathtech, Inc 001635Hewlett-Packard Company 001636Quanta Computer Inc 001637CITEL SpA 001638TECOM Co., Ltd 001639UBIQUAM Co.,Ltd 00163AYVES TECHNOLOGY CO., LTD 00163BVertexRSI/General Dynamics 00163CRebox B.V 00163DTsinghua Tongfang Legend Silicon Tech. Co., Ltd 00163EXensource, Inc 00163FCReTE SYSTEMS Inc 001640Asmobile Communication Inc 001641Universal Global Scientific Industrial Co., Ltd 001642Pangolin 001643Sunhillo Corporation 001644LITE-ON Technology Corp 001645Power Distribution, Inc 001646CISCO SYSTEMS, INC 001647CISCO SYSTEMS, INC 001648SSD Company Limited 001649SetOne GmbH 00164AVibration Technology Limited 00164BQuorion Data Systems GmbH 00164CPLANET INT Co., Ltd 00164DAlcatel North America IP Division 00164ENokia Danmark A/S 00164FWorld Ethnic Broadcastin Inc 001650Herley General Microwave Israel 001651Exeo Systems 001652Hoatech Technologies, Inc 001653LEGO System A/S IE Electronics Division 001654Flex-P Industries Sdn. Bhd 001655FUHO TECHNOLOGY Co., LTD 001656Nintendo Co., Ltd 001657Aegate Ltd 001658Fusiontech Technologies Inc 001659Z.M.P. RADWAG 00165AHarman Specialty Group 00165BGrip Audio 00165CTrackflow Ltd 00165DAirDefense, Inc 00165EPrecision I/O 00165FFairmount Automation 001660Nortel 001661Novatium Solutions (P) Ltd 001662Liyuh Technology Ltd 001663KBT Mobile 001664Prod-El SpA 001665Cellon France 001666Quantier Communication Inc 001667A-TEC Subsystem INC 001668Eishin Electronics 001669MRV Communication (Networks) LTD 00166ATPS 00166BSamsung Electronics 00166CSamsung Electonics Digital Video System Division 00166DYulong Computer Telecommunication Scientific(shenzhen)Co.,Lt 00166EArbitron Inc 00166FIntel Corporate 001670SKNET Corporation 001671Symphox Information Co 001672Zenway enterprise ltd 001673Bury GmbH & Co. KG 001674EuroCB (Phils.), Inc 001675ARRIS Group, Inc 001676Intel Corporate 001677Bihl + Wiedemann GmbH 001678SHENZHEN BAOAN GAOKE ELECTRONICS CO., LTD 001679eOn Communications 00167ASkyworth Overseas Dvelopment Ltd 00167BHaver&Boecker 00167CiRex Technologies BV 00167DSky-Line Information Co., Ltd 00167EDIBOSS.CO.,LTD 00167FBluebird Soft Inc 001680Bally Gaming + Systems 001681Vector Informatik GmbH 001682Pro Dex, Inc 001683WEBIO International Co.,.Ltd 001684Donjin Co.,Ltd 001685Elisa Oyj 001686Karl Storz Imaging 001687Chubb CSC-Vendor AP 001688ServerEngines LLC 001689Pilkor Electronics Co., Ltd 00168Aid-Confirm Inc 00168BParalan Corporation 00168CDSL Partner AS 00168DKORWIN CO., Ltd 00168EVimicro corporation 00168FGN Netcom as 001690J-TEK INCORPORATION 001691Moser-Baer AG 001692Scientific-Atlanta, Inc 001693PowerLink Technology Inc 001694Sennheiser Communications A/S 001695AVC Technology (International) Limited 001696QDI Technology (H.K.) Limited 001697NEC Corporation 001698T&A Mobile Phones 001699Tonic DVB Marketing Ltd 00169AQuadrics Ltd 00169BAlstom Transport 00169CCISCO SYSTEMS, INC 00169DCISCO SYSTEMS, INC 00169ETV One Ltd 00169FVimtron Electronics Co., Ltd 0016A0Auto-Maskin 0016A13Leaf Networks 0016A2CentraLite Systems, Inc 0016A3Ingeteam Transmission&Distribution, S.A 0016A4Ezurio Ltd 0016A5Tandberg Storage ASA 0016A6Dovado FZ-LLC 0016A7AWETA G&P 0016A8CWT CO., LTD 0016A92EI 0016AAKei Communication Technology Inc 0016ABDansensor A/S 0016ACToho Technology Corp 0016ADBT-Links Company Limited 0016AEINVENTEL 0016AFShenzhen Union Networks Equipment Co.,Ltd 0016B0VK Corporation 0016B1KBS 0016B2DriveCam Inc 0016B3Photonicbridges (China) Co., Ltd 0016B4 0016B5ARRIS Group, Inc 0016B6Cisco-Linksys 0016B7Seoul Commtech 0016B8Sony Ericsson Mobile Communications 0016B9ProCurve Networking 0016BAWEATHERNEWS INC 0016BBLaw-Chain Computer Technology Co Ltd 0016BCNokia Danmark A/S 0016BDATI Industrial Automation 0016BEINFRANET, Inc 0016BFPaloDEx Group Oy 0016C0Semtech Corporation 0016C1Eleksen Ltd 0016C2Avtec Systems Inc 0016C3BA Systems Inc 0016C4SiRF Technology, Inc 0016C5Shenzhen Xing Feng Industry Co.,Ltd 0016C6North Atlantic Industries 0016C7CISCO SYSTEMS, INC 0016C8CISCO SYSTEMS, INC 0016C9NAT Seattle, Inc 0016CANortel 0016CBApple 0016CCXcute Mobile Corp 0016CDHIJI HIGH-TECH CO., LTD 0016CEHon Hai Precision Ind. Co., Ltd 0016CFHon Hai Precision Ind. Co., Ltd 0016D0ATech elektronika d.o.o 0016D1ZAT a.s 0016D2Caspian 0016D3Wistron Corporation 0016D4Compal Communications, Inc 0016D5Synccom Co., Ltd 0016D6TDA Tech Pty Ltd 0016D7Sunways AG 0016D8Senea AB 0016D9NINGBO BIRD CO.,LTD 0016DAFutronic Technology Co. Ltd 0016DBSamsung Electronics Co., Ltd 0016DCARCHOS 0016DDGigabeam Corporation 0016DEFAST Inc 0016DFLundinova AB 0016E03Com Ltd 0016E1SiliconStor, Inc 0016E2American Fibertek, Inc 0016E3ASKEY COMPUTER CORP 0016E4VANGUARD SECURITY ENGINEERING CORP 0016E5FORDLEY DEVELOPMENT LIMITED 0016E6GIGA-BYTE TECHNOLOGY CO.,LTD 0016E7Dynamix Promotions Limited 0016E8Sigma Designs, Inc 0016E9Tiba Medical Inc 0016EAIntel Corporate 0016EBIntel Corporate 0016ECElitegroup Computer Systems Co., Ltd 0016EDDigital Safety Technologies, Inc 0016EERoyalDigital Inc 0016EFKoko Fitness, Inc 0016F0Dell 0016F1OmniSense, LLC 0016F2Dmobile System Co., Ltd 0016F3CAST Information Co., Ltd 0016F4Eidicom Co., Ltd 0016F5Dalian Golden Hualu Digital Technology Co.,Ltd 0016F6Video Products Group 0016F7L-3 Communications, Aviation Recorders 0016F8AVIQTECH TECHNOLOGY CO., LTD 0016F9CETRTA POT, d.o.o., Kranj 0016FAECI Telecom Ltd 0016FBSHENZHEN MTC CO.,LTD 0016FCTOHKEN CO.,LTD 0016FDJaty Electronics 0016FEAlps Electric Co., Ltd 0016FFWamin Optocomm Mfg Corp 001700ARRIS Group, Inc 001701KDE, Inc 001702Osung Midicom Co., Ltd 001703MOSDAN Internation Co.,Ltd 001704Shinco Electronics Group Co.,Ltd 001705Methode Electronics 001706Techfaith Wireless Communication Technology Limited 001707InGrid, Inc 001708Hewlett-Packard Company 001709Exalt Communications 00170AINEW DIGITAL COMPANY 00170BContela, Inc 00170CTwig Com Ltd 00170DDust Networks Inc 00170ECISCO SYSTEMS, INC 00170FCISCO SYSTEMS, INC 001710Casa Systems Inc 001711GE Healthcare Bio-Sciences AB 001712ISCO International 001713Tiger NetCom 001714BR Controls Nederland bv 001715Qstik 001716Qno Technology Inc 001717Leica Geosystems AG 001718Vansco Electronics Oy 001719AudioCodes USA, Inc 00171AWinegard Company 00171BInnovation Lab Corp 00171CNT MicroSystems, Inc 00171DDIGIT 00171ETheo Benning GmbH & Co. KG 00171FIMV Corporation 001720Image Sensing Systems, Inc 001721FITRE S.p.A 001722Hanazeder Electronic GmbH 001723Summit Data Communications 001724Studer Professional Audio GmbH 001725Liquid Computing 001726m2c Electronic Technology Ltd 001727Thermo Ramsey Italia s.r.l 001728Selex Communications 001729Ubicod Co.LTD 00172AProware Technology Corp.(By Unifosa) 00172BGlobal Technologies Inc 00172CTAEJIN INFOTECH 00172DAxcen Photonics Corporation 00172EFXC Inc 00172FNeuLion Incorporated 001730Automation Electronics 001731ASUSTek COMPUTER INC 001732Science-Technical Center "RISSA" 001733SFR 001734ADC Telecommunications 001735 001736iiTron Inc 001737Industrie Dial Face S.p.A 001738International Business Machines 001739Bright Headphone Electronics Company 00173AReach Systems Inc 00173BCisco Systems, Inc 00173CExtreme Engineering Solutions 00173DNeology 00173ELeucotronEquipamentos Ltda 00173FBelkin Corporation 001740Bluberi Gaming Technologies Inc 001741DEFIDEV 001742FUJITSU LIMITED 001743Deck Srl 001744Araneo Ltd 001745INNOTZ CO., Ltd 001746Freedom9 Inc 001747Trimble 001748Neokoros Brasil Ltda 001749HYUNDAE YONG-O-SA CO.,LTD 00174ASOCOMEC 00174BNokia Danmark A/S 00174CMillipore 00174DDYNAMIC NETWORK FACTORY, INC 00174EParama-tech Co.,Ltd 00174FiCatch Inc 001750GSI Group, MicroE Systems 001751Online Corporation 001752DAGS, Inc 001753nFore Technology Inc 001754Arkino HiTOP Corporation Limited 001755GE Security 001756Vinci Labs Oy 001757RIX TECHNOLOGY LIMITED 001758ThruVision Ltd 001759CISCO SYSTEMS, INC 00175ACISCO SYSTEMS, INC 00175BACS Solutions Switzerland Ltd 00175CSHARP CORPORATION 00175DDongseo system 00175EZed-3 00175FXENOLINK Communications Co., Ltd 001760Naito Densei Machida MFG.CO.,LTD 001761 001762Solar Technology, Inc 001763Essentia S.p.A 001764ATMedia GmbH 001765Nortel 001766Accense Technology, Inc 001767Earforce AS 001768Zinwave Ltd 001769Cymphonix Corp 00176AAvago Technologies 00176BKiyon, Inc 00176CPivot3, Inc 00176DCORE CORPORATION 00176EDUCATI SISTEMI 00176FPAX Computer Technology(Shenzhen) Ltd 001770Arti Industrial Electronics Ltd 001771APD Communications Ltd 001772ASTRO Strobel Kommunikationssysteme GmbH 001773Laketune Technologies Co. Ltd 001774Elesta GmbH 001775TTE Germany GmbH 001776Meso Scale Diagnostics, LLC 001777Obsidian Research Corporation 001778Central Music Co 001779QuickTel 00177AASSA ABLOY AB 00177BAzalea Networks inc 00177CSmartlink Network Systems Limited 00177DIDT International Limited 00177EMeshcom Technologies Inc 00177FWorldsmart Retech 001780Applied Biosystems B.V 001781Greystone Data System, Inc 001782LoBenn Inc 001783Texas Instruments 001784ARRIS Group, Inc 001785Sparr Electronics Ltd 001786wisembed 001787Brother, Brother & Sons ApS 001788Philips Lighting BV 001789Zenitron Corporation 00178ADARTS TECHNOLOGIES CORP 00178BTeledyne Technologies Incorporated 00178CIndependent Witness, Inc 00178DCheckpoint Systems, Inc 00178EGunnebo Cash Automation AB 00178FNINGBO YIDONG ELECTRONIC CO.,LTD 001790HYUNDAI DIGITECH Co, Ltd 001791LinTech GmbH 001792Falcom Wireless Comunications Gmbh 001793Tigi Corporation 001794CISCO SYSTEMS, INC 001795CISCO SYSTEMS, INC 001796Rittmeyer AG 001797Telsy Elettronica S.p.A 001798Azonic Technology Co., LTD 001799SmarTire Systems Inc 00179AD-Link Corporation 00179BChant Sincere CO., LTD 00179CDEPRAG SCHULZ GMBH u. CO 00179DKelman Limited 00179ESirit Inc 00179FApricorn 0017A0RoboTech srl 0017A13soft inc 0017A2Camrivox Ltd 0017A3MIX s.r.l 0017A4Hewlett-Packard Company 0017A5Ralink Technology Corp 0017A6YOSIN ELECTRONICS CO., LTD 0017A7Mobile Computing Promotion Consortium 0017A8EDM Corporation 0017A9Sentivision 0017AAelab-experience inc 0017ABNintendo Co., Ltd 0017ACO'Neil Product Development Inc 0017ADAceNet Corporation 0017AEGAI-Tronics 0017AFEnermet 0017B0Nokia Danmark A/S 0017B1ACIST Medical Systems, Inc 0017B2SK Telesys 0017B3Aftek Infosys Limited 0017B4Remote Security Systems, LLC 0017B5Peerless Systems Corporation 0017B6Aquantia 0017B7Tonze Technology Co 0017B8NOVATRON CO., LTD 0017B9Gambro Lundia AB 0017BASEDO CO., LTD 0017BBSyrinx Industrial Electronics 0017BCTouchtunes Music Corporation 0017BDTibetsystem 0017BETratec Telecom B.V 0017BFCoherent Research Limited 0017C0PureTech Systems, Inc 0017C1CM Precision Technology LTD 0017C2ADB Broadband Italia 0017C3KTF Technologies Inc 0017C4Quanta Microsystems, INC 0017C5SonicWALL 0017C6Cross Match Technologies Inc 0017C7MARA Systems Consulting AB 0017C8KYOCERA Document Solutions Inc 0017C9Samsung Electronics Co., Ltd 0017CAQisda Corporation 0017CBJuniper Networks 0017CCAlcatel-Lucent 0017CDCEC Wireless R&D Ltd 0017CEScreen Service Spa 0017CFiMCA-GmbH 0017D0Opticom Communications, LLC 0017D1Nortel 0017D2THINLINX PTY LTD 0017D3Etymotic Research, Inc 0017D4Monsoon Multimedia, Inc 0017D5Samsung Electronics Co., Ltd 0017D6Bluechips Microhouse Co.,Ltd 0017D7ION Geophysical Corporation Inc 0017D8Magnum Semiconductor, Inc 0017D9AAI Corporation 0017DASpans Logic 0017DBCANKO TECHNOLOGIES INC 0017DCDAEMYUNG ZERO1 0017DDClipsal Australia 0017DEAdvantage Six Ltd 0017DFCISCO SYSTEMS, INC 0017E0CISCO SYSTEMS, INC 0017E1DACOS Technologies Co., Ltd 0017E2ARRIS Group, Inc 0017E3Texas Instruments 0017E4Texas Instruments 0017E5Texas Instruments 0017E6Texas Instruments 0017E7Texas Instruments 0017E8Texas Instruments 0017E9Texas Instruments 0017EATexas Instruments 0017EBTexas Instruments 0017ECTexas Instruments 0017EDWooJooIT Ltd 0017EEARRIS Group, Inc 0017EFIBM Corp 0017F0SZCOM Broadband Network Technology Co.,Ltd 0017F1Renu Electronics Pvt Ltd 0017F2Apple 0017F3Harris Corparation 0017F4ZERON ALLIANCE 0017F5LIG NEOPTEK 0017F6Pyramid Meriden Inc 0017F7CEM Solutions Pvt Ltd 0017F8Motech Industries Inc 0017F9Forcom Sp. z o.o 0017FAMicrosoft Corporation 0017FBFA 0017FCSuprema Inc 0017FDAmulet Hotkey 0017FETALOS SYSTEM INC 0017FFPLAYLINE Co.,Ltd 001800UNIGRAND LTD 001801Actiontec Electronics, Inc 001802Alpha Networks Inc 001803ArcSoft Shanghai Co. LTD 001804E-TEK DIGITAL TECHNOLOGY LIMITED 001805Beijing InHand Networking Technology Co.,Ltd 001806Hokkei Industries Co., Ltd 001807Fanstel Corp 001808SightLogix, Inc 001809CRESYN 00180AMeraki, Inc 00180BBrilliant Telecommunications 00180COptelian Access Networks 00180DTerabytes Server Storage Tech Corp 00180EAvega Systems 00180FNokia Danmark A/S 001810IPTrade S.A 001811Neuros Technology International, LLC 001812Beijing Xinwei Telecom Technology Co., Ltd 001813Sony Ericsson Mobile Communications 001814Mitutoyo Corporation 001815GZ Technologies, Inc 001816Ubixon Co., Ltd 001817D. E. Shaw Research, LLC 001818CISCO SYSTEMS, INC 001819CISCO SYSTEMS, INC 00181AAVerMedia Information Inc 00181BTaiJin Metal Co., Ltd 00181CExterity Limited 00181DASIA ELECTRONICS CO.,LTD 00181EGDX Technologies Ltd 00181FPalmmicro Communications 001820w5networks 001821SINDORICOH 001822CEC TELECOM CO.,LTD 001823Delta Electronics, Inc 001824Kimaldi Electronics, S.L 001825 001826Cale Access AB 001827NEC UNIFIED SOLUTIONS NEDERLAND B.V 001828e2v technologies (UK) ltd 001829Gatsometer 00182ATaiwan Video & Monitor 00182BSoftier 00182CAscend Networks, Inc 00182DArtec Design 00182EXStreamHD, LLC 00182FTexas Instruments 001830Texas Instruments 001831Texas Instruments 001832Texas Instruments 001833Texas Instruments 001834Texas Instruments 001835Thoratec / ITC 001836Reliance Electric Limited 001837Universal ABIT Co., Ltd 001838PanAccess Communications,Inc 001839Cisco-Linksys LLC 00183AWestell Technologies 00183BCENITS Co., Ltd 00183CEncore Software Limited 00183DVertex Link Corporation 00183EDigilent, Inc 00183F2Wire, Inc 0018403 Phoenix, Inc 001841High Tech Computer Corp 001842Nokia Danmark A/S 001843Dawevision Ltd 001844Heads Up Technologies, Inc 001845Pulsar-Telecom LLC 001846Crypto S.A 001847AceNet Technology Inc 001848Vecima Networks Inc 001849Pigeon Point Systems LLC 00184ACatcher, Inc 00184BLas Vegas Gaming, Inc 00184CBogen Communications 00184DNetgear Inc 00184ELianhe Technologies, Inc 00184F8 Ways Technology Corp 001850Secfone Kft 001851SWsoft 001852StorLink Semiconductors, Inc 001853Atera Networks LTD 001854Argard Co., Ltd 001855Aeromaritime Systembau GmbH 001856EyeFi, Inc 001857Unilever R&D 001858TagMaster AB 001859Strawberry Linux Co.,Ltd 00185AuControl, Inc 00185BNetwork Chemistry, Inc 00185CEDS Lab Pte Ltd 00185DTAIGUEN TECHNOLOGY (SHEN-ZHEN) CO., LTD 00185ENexterm Inc 00185FTAC Inc 001860SIM Technology Group Shanghai Simcom Ltd., 001861Ooma, Inc 001862Seagate Technology 001863Veritech Electronics Limited 001864Eaton Corporation 001865Siemens Healthcare Diagnostics Manufacturing Ltd 001866Leutron Vision 001867Datalogic ADC 001868Scientific Atlanta, A Cisco Company 001869KINGJIM 00186AGlobal Link Digital Technology Co,.LTD 00186BSambu Communics CO., LTD 00186CNeonode AB 00186DZhenjiang Sapphire Electronic Industry CO 00186E3Com Ltd 00186FSetha Industria Eletronica LTDA 001870E28 Shanghai Limited 001871Hewlett-Packard Company 001872Expertise Engineering 001873CISCO SYSTEMS, INC 001874CISCO SYSTEMS, INC 001875AnaCise Testnology Pte Ltd 001876WowWee Ltd 001877Amplex A/S 001878Mackware GmbH 001879dSys 00187AWiremold 00187B4NSYS Co. Ltd 00187CINTERCROSS, LLC 00187DArmorlink shanghai Co. Ltd 00187ERGB Spectrum 00187FZODIANET 001880Maxim Integrated Products 001881Buyang Electronics Industrial Co., Ltd 001882Huawei Technologies Co., Ltd 001883FORMOSA21 INC 001884Fon Technology S.L 001885Avigilon Corporation 001886EL-TECH, INC 001887Metasystem SpA 001888GOTIVE a.s 001889WinNet Solutions Limited 00188AInfinova LLC 00188BDell Inc 00188CMobile Action Technology Inc 00188DNokia Danmark A/S 00188EEkahau, Inc 00188FMontgomery Technology, Inc 001890RadioCOM, s.r.o 001891Zhongshan General K-mate Electronics Co., Ltd 001892ads-tec GmbH 001893SHENZHEN PHOTON BROADBAND TECHNOLOGY CO.,LTD 001894NPCore, Inc 001895Hansun Technologies Inc 001896Great Well Electronic LTD 001897JESS-LINK PRODUCTS Co., LTD 001898KINGSTATE ELECTRONICS CORPORATION 001899ShenZhen jieshun Science&Technology Industry CO,LTD 00189AHANA Micron Inc 00189BThomson Inc 00189CWeldex Corporation 00189DNavcast Inc 00189EOMNIKEY GmbH 00189FLenntek Corporation 0018A0Cierma Ascenseurs 0018A1Tiqit Computers, Inc 0018A2XIP Technology AB 0018A3ZIPPY TECHNOLOGY CORP 0018A4ARRIS Group, Inc 0018A5ADigit Technologies Corp 0018A6Persistent Systems, LLC 0018A7Yoggie Security Systems LTD 0018A8AnNeal Technology Inc 0018A9Ethernet Direct Corporation 0018AAProtec Fire Detection plc 0018ABBEIJING LHWT MICROELECTRONICS INC 0018ACShanghai Jiao Da HISYS Technology Co. Ltd 0018ADNIDEC SANKYO CORPORATION 0018AETVT CO.,LTD 0018AFSamsung Electronics Co., Ltd 0018B0Nortel 0018B1IBM Corp 0018B2ADEUNIS RF 0018B3TEC WizHome Co., Ltd 0018B4Dawon Media Inc 0018B5Magna Carta 0018B6S3C, Inc 0018B7D3 LED, LLC 0018B8New Voice International AG 0018B9CISCO SYSTEMS, INC 0018BACISCO SYSTEMS, INC 0018BBEliwell Controls srl 0018BCZAO NVP Bolid 0018BDSHENZHEN DVBWORLD TECHNOLOGY CO., LTD 0018BEANSA Corporation 0018BFEssence Technology Solution, Inc 0018C0ARRIS Group, Inc 0018C1Almitec Informática e Comércio 0018C2Firetide, Inc 0018C3CS Corporation 0018C4Raba Technologies LLC 0018C5Nokia Danmark A/S 0018C6OPW Fuel Management Systems 0018C7Real Time Automation 0018C8ISONAS Inc 0018C9EOps Technology Limited 0018CAViprinet GmbH 0018CBTecobest Technology Limited 0018CCAXIOHM SAS 0018CDErae Electronics Industry Co., Ltd 0018CEDreamtech Co., Ltd 0018CFBaldor Electric Company 0018D0AtRoad, A Trimble Company 0018D1Siemens Home & Office Comm. Devices 0018D2High-Gain Antennas LLC 0018D3TEAMCAST 0018D4Unified Display Interface SIG 0018D5REIGNCOM 0018D6Swirlnet A/S 0018D7Javad Navigation Systems Inc 0018D8ARCH METER Corporation 0018D9Santosha Internatonal, Inc 0018DAAMBER wireless GmbH 0018DBEPL Technology Ltd 0018DCProstar Co., Ltd 0018DDSilicondust Engineering Ltd 0018DEIntel Corporate 0018DFThe Morey Corporation 0018E0ANAVEO 0018E1Verkerk Service Systemen 0018E2Topdata Sistemas de Automacao Ltda 0018E3Visualgate Systems, Inc 0018E4YIGUANG 0018E5Adhoco AG 0018E6Computer Hardware Design SIA 0018E7Cameo Communications, INC 0018E8Hacetron Corporation 0018E9Numata Corporation 0018EAAlltec GmbH 0018EBBroVis Wireless Networks 0018ECWelding Technology Corporation 0018EDAccutech Ultrasystems Co., Ltd 0018EEVideology Imaging Solutions, Inc 0018EFEscape Communications, Inc 0018F0JOYTOTO Co., Ltd 0018F1Chunichi Denshi Co.,LTD 0018F2Beijing Tianyu Communication Equipment Co., Ltd 0018F3ASUSTek COMPUTER INC 0018F4EO TECHNICS Co., Ltd 0018F5Shenzhen Streaming Video Technology Company Limited 0018F6Thomson Telecom Belgium 0018F7Kameleon Technologies 0018F8Cisco-Linksys LLC 0018F9VVOND, Inc 0018FAYushin Precision Equipment Co.,Ltd 0018FBCompro Technology 0018FCAltec Electronic AG 0018FDOptimal Technologies International Inc 0018FEHewlett-Packard Company 0018FFPowerQuattro Co 001900Intelliverese - DBA Voicecom 001901F1MEDIA 001902Cambridge Consultants Ltd 001903Bigfoot Networks Inc 001904WB Electronics Sp. z o.o 001905SCHRACK Seconet AG 001906CISCO SYSTEMS, INC 001907CISCO SYSTEMS, INC 001908Duaxes Corporation 001909DEVI - Danfoss A/S 00190AHASWARE INC 00190BSouthern Vision Systems, Inc 00190CEncore Electronics, Inc 00190DIEEE 1394c 00190EAtech Technology Co., Ltd 00190FAdvansus Corp 001910Knick Elektronische Messgeraete GmbH & Co. KG 001911Just In Mobile Information Technologies (Shanghai) Co., Ltd 001912Welcat Inc 001913Chuang-Yi Network Equipment Co.Ltd 001914Winix Co., Ltd 001915TECOM Co., Ltd 001916PayTec AG 001917Posiflex Inc 001918Interactive Wear AG 001919ASTEL Inc 00191AIRLINK 00191BSputnik Engineering AG 00191CSensicast Systems 00191DNintendo Co., Ltd 00191EBeyondwiz Co., Ltd 00191FMicrolink communications Inc 001920KUME electric Co.,Ltd 001921Elitegroup Computer System Co 001922CM Comandos Lineares 001923Phonex Korea Co., LTD 001924LBNL Engineering 001925Intelicis Corporation 001926BitsGen Co., Ltd 001927ImCoSys Ltd 001928Siemens AG, Transportation Systems 0019292M2B Montadora de Maquinas Bahia Brasil LTDA 00192AAntiope Associates 00192BAclara RF Systems Inc 00192CARRIS Group, Inc 00192DNokia Corporation 00192ESpectral Instruments, Inc 00192FCISCO SYSTEMS, INC 001930CISCO SYSTEMS, INC 001931Balluff GmbH 001932Gude Analog- und Digialsysteme GmbH 001933Strix Systems, Inc 001934TRENDON TOUCH TECHNOLOGY CORP 001935DUERR DENTAL AG 001936STERLITE OPTICAL TECHNOLOGIES LIMITED 001937CommerceGuard AB 001938UMB Communications Co., Ltd 001939Gigamips 00193AOESOLUTIONS 00193BWilibox Deliberant Group LLC 00193CHighPoint Technologies Incorporated 00193DGMC Guardian Mobility Corp 00193EADB Broadband Italia 00193FRDI technology(Shenzhen) Co.,LTD 001940Rackable Systems 001941Pitney Bowes, Inc 001942ON SOFTWARE INTERNATIONAL LIMITED 001943Belden 001944Fossil Partners, L.P 001945Ten-Tec Inc 001946Cianet Industria e Comercio S/A 001947Scientific Atlanta, A Cisco Company 001948AireSpider Networks 001949TENTEL COMTECH CO., LTD 00194ATESTO AG 00194BSAGEM COMMUNICATION 00194CFujian Stelcom information & Technology CO.,Ltd 00194DAvago Technologies Sdn Bhd 00194EUltra Electronics - TCS (Tactical Communication Systems) 00194FNokia Danmark A/S 001950Harman Multimedia 001951NETCONS, s.r.o 001952ACOGITO Co., Ltd 001953Chainleader Communications Corp 001954Leaf Corporation 001955CISCO SYSTEMS, INC 001956CISCO SYSTEMS, INC 001957Saafnet Canada Inc 001958Bluetooth SIG, Inc 001959Staccato Communications Inc 00195AJenaer Antriebstechnik GmbH 00195BD-Link Corporation 00195CInnotech Corporation 00195DShenZhen XinHuaTong Opto Electronics Co.,Ltd 00195EARRIS Group, Inc 00195FValemount Networks Corporation 001960DoCoMo Systems, Inc 001961Blaupunkt Embedded Systems GmbH 001962Commerciant, LP 001963Sony Ericsson Mobile Communications AB 001964Doorking Inc 001965YuHua TelTech (ShangHai) Co., Ltd 001966Asiarock Technology Limited 001967TELDAT Sp.J 001968Digital Video Networks(Shanghai) CO. LTD 001969Nortel 00196AMikroM GmbH 00196BDanpex Corporation 00196CETROVISION TECHNOLOGY 00196DRaybit Systems Korea, Inc 00196EMetacom (Pty) Ltd 00196FSensoPart GmbH 001970Z-Com, Inc 001971Guangzhou Unicomp Technology Co.,Ltd 001972Plexus (Xiamen) Co.,ltd 001973Zeugma Systems 001974AboCom Systems, Inc 001975Beijing Huisen networks technology Inc 001976Xipher Technologies, LLC 001977Aerohive Networks, Inc 001978Datum Systems, Inc 001979Nokia Danmark A/S 00197AMAZeT GmbH 00197BPicotest Corp 00197CRiedel Communications GmbH 00197DHon Hai Precision Ind. Co., Ltd 00197EHon Hai Precision Ind. Co., Ltd 00197FPLANTRONICS, INC 001980Gridpoint Systems 001981Vivox Inc 001982SmarDTV 001983CCT R&D Limited 001984ESTIC Corporation 001985IT Watchdogs, Inc 001986Cheng Hongjian 001987Panasonic Mobile Communications Co., Ltd 001988Wi2Wi, Inc 001989Sonitrol Corporation 00198ANorthrop Grumman Systems Corp 00198BNovera Optics Korea, Inc 00198CiXSea 00198DOcean Optics, Inc 00198EOticon A/S 00198FAlcatel Bell N.V 001990ELM DATA Co., Ltd 001991avinfo 001992ADTRAN INC 001993Changshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea 001994Jorjin Technologies Inc 001995Jurong Hi-Tech (Suzhou)Co.ltd 001996TurboChef Technologies Inc 001997Soft Device Sdn Bhd 001998SATO CORPORATION 001999Fujitsu Technology Solutions 00199AEDO-EVI 00199BDiversified Technical Systems, Inc 00199CCTRING 00199DVIZIO, Inc 00199ENifty 00199FDKT A/S 0019A0NIHON DATA SYSTENS, INC 0019A1LG INFORMATION & COMM 0019A2ORDYN TECHNOLOGIES 0019A3asteel electronique atlantique 0019A4Austar Technology (hang zhou) Co.,Ltd 0019A5RadarFind Corporation 0019A6ARRIS Group, Inc 0019A7ITU-T 0019A8WiQuest Communications 0019A9CISCO SYSTEMS, INC 0019AACISCO SYSTEMS, INC 0019ABRaycom CO., LTD 0019ACGSP SYSTEMS Inc 0019ADBOBST SA 0019AEHopling Technologies b.v 0019AFRigol Technologies, Inc 0019B0HanYang System 0019B1Arrow7 Corporation 0019B2XYnetsoft Co.,Ltd 0019B3Stanford Research Systems 0019B4VideoCast Ltd 0019B5Famar Fueguina S.A 0019B6Euro Emme s.r.l 0019B7Nokia Danmark A/S 0019B8Boundary Devices 0019B9Dell Inc 0019BAParadox Security Systems Ltd 0019BBHewlett-Packard Company 0019BCELECTRO CHANCE SRL 0019BDNew Media Life 0019BEAltai Technologies Limited 0019BFCitiway technology Co.,ltd 0019C0ARRIS Group, Inc 0019C1Alps Electric Co., Ltd 0019C2Equustek Solutions, Inc 0019C3Qualitrol 0019C4Infocrypt Inc 0019C5SONY Computer Entertainment inc, 0019C6ZTE Corporation 0019C7Cambridge Industries(Group) Co.,Ltd 0019C8AnyDATA Corporation 0019C9S&C ELECTRIC COMPANY 0019CABroadata Communications, Inc 0019CBZyXEL Communications Corporation 0019CCRCG (HK) Ltd 0019CDChengdu ethercom information technology Ltd 0019CEProgressive Gaming International 0019CFSALICRU, S.A 0019D0Cathexis 0019D1Intel Corporate 0019D2Intel Corporate 0019D3TRAK Microwave 0019D4ICX Technologies 0019D5IP Innovations, Inc 0019D6LS Cable and System Ltd 0019D7FORTUNETEK CO., LTD 0019D8MAXFOR 0019D9Zeutschel GmbH 0019DAWelltrans O&E Technology Co. , Ltd 0019DBMICRO-STAR INTERNATIONAL CO., LTD 0019DCENENSYS Technologies 0019DDFEI-Zyfer, Inc 0019DEMOBITEK 0019DFThomson Inc 0019E0TP-LINK Technologies Co., Ltd 0019E1Nortel 0019E2Juniper Networks 0019E3Apple 0019E42Wire, Inc 0019E5Lynx Studio Technology, Inc 0019E6TOYO MEDIC CO.,LTD 0019E7CISCO SYSTEMS, INC 0019E8CISCO SYSTEMS, INC 0019E9S-Information Technolgy, Co., Ltd 0019EATeraMage Technologies Co., Ltd 0019EBPyronix Ltd 0019ECSagamore Systems, Inc 0019EDAxesstel Inc 0019EECARLO GAVAZZI CONTROLS SPA-Controls Division 0019EFSHENZHEN LINNKING ELECTRONICS CO.,LTD 0019F0UNIONMAN TECHNOLOGY CO.,LTD 0019F1Star Communication Network Technology Co.,Ltd 0019F2Teradyne K.K 0019F3Cetis, Inc 0019F4Convergens Oy Ltd 0019F5Imagination Technologies Ltd 0019F6Acconet (PTE) Ltd 0019F7Onset Computer Corporation 0019F8Embedded Systems Design, Inc 0019F9TDK-Lambda 0019FACable Vision Electronics CO., LTD 0019FBBSkyB Ltd 0019FCPT. Ufoakses Sukses Luarbiasa 0019FDNintendo Co., Ltd 0019FESHENZHEN SEECOMM TECHNOLOGY CO.,LTD 0019FFFinnzymes 001A00MATRIX INC 001A01Smiths Medical 001A02SECURE CARE PRODUCTS, INC 001A03Angel Electronics Co., Ltd 001A04Interay Solutions BV 001A05OPTIBASE LTD 001A06OpVista, Inc 001A07Arecont Vision 001A08Simoco Ltd 001A09Wayfarer Transit Systems Ltd 001A0AAdaptive Micro-Ware Inc 001A0BBONA TECHNOLOGY INC 001A0CSwe-Dish Satellite Systems AB 001A0DHandHeld entertainment, Inc 001A0ECheng Uei Precision Industry Co.,Ltd 001A0FSistemas Avanzados de Control, S.A 001A10LUCENT TRANS ELECTRONICS CO.,LTD 001A11Google Inc 001A12Essilor 001A13Wanlida Group Co., LTD 001A14Xin Hua Control Engineering Co.,Ltd 001A15gemalto e-Payment 001A16Nokia Danmark A/S 001A17Teak Technologies, Inc 001A18Advanced Simulation Technology inc 001A19Computer Engineering Limited 001A1AGentex Corporation/Electro-Acoustic Products 001A1BARRIS Group, Inc 001A1CGT&T Engineering Pte Ltd 001A1DPChome Online Inc 001A1EAruba Networks 001A1FCoastal Environmental Systems 001A20CMOTECH Co. Ltd 001A21Indac B.V 001A22eQ-3 Entwicklung GmbH 001A23Ice Qube, Inc 001A24Galaxy Telecom Technologies Ltd 001A25DELTA DORE 001A26Deltanode Solutions AB 001A27Ubistar 001A28ASWT Co., LTD. Taiwan Branch H.K 001A29Johnson Outdoors Marine Electronics, Inc 001A2AArcadyan Technology Corporation 001A2BAyecom Technology Co., Ltd 001A2CSATEC Co.,LTD 001A2DThe Navvo Group 001A2EZiova Coporation 001A2FCISCO SYSTEMS, INC 001A30CISCO SYSTEMS, INC 001A31SCAN COIN Industries AB 001A32ACTIVA MULTIMEDIA 001A33ASI Communications, Inc 001A34Konka Group Co., Ltd 001A35BARTEC GmbH 001A36Aipermon GmbH & Co. KG 001A37Lear Corporation 001A38Sanmina-SCI 001A39Merten GmbH&CoKG 001A3ADongahelecomm 001A3BDoah Elecom Inc 001A3CTechnowave Ltd 001A3DAjin Vision Co.,Ltd 001A3EFaster Technology LLC 001A3Fintelbras 001A40A-FOUR TECH CO., LTD 001A41INOCOVA Co.,Ltd 001A42Techcity Technology co., Ltd 001A43Logical Link Communications 001A44JWTrading Co., Ltd 001A45GN Netcom as 001A46Digital Multimedia Technology Co., Ltd 001A47Agami Systems, Inc 001A48Takacom Corporation 001A49Micro Vision Co.,LTD 001A4AQumranet Inc 001A4BHewlett-Packard Company 001A4CCrossbow Technology, Inc 001A4DGIGA-BYTE TECHNOLOGY CO.,LTD 001A4ENTI AG / LinMot 001A4FAVM GmbH 001A50PheeNet Technology Corp 001A51Alfred Mann Foundation 001A52Meshlinx Wireless Inc 001A53Zylaya 001A54Hip Shing Electronics Ltd 001A55ACA-Digital Corporation 001A56ViewTel Co,. Ltd 001A57Matrix Design Group, LLC 001A58CCV Deutschland GmbH - Celectronic eHealth Div 001A59Ircona 001A5AKorea Electric Power Data Network (KDN) Co., Ltd 001A5BNetCare Service Co., Ltd 001A5CEuchner GmbH+Co. KG 001A5DMobinnova Corp 001A5EThincom Technology Co.,Ltd 001A5FKitWorks.fi Ltd 001A60Wave Electronics Co.,Ltd 001A61PacStar Corp 001A62Data Robotics, Incorporated 001A63Elster Solutions, LLC, 001A64IBM Corp 001A65Seluxit 001A66ARRIS Group, Inc 001A67Infinite QL Sdn Bhd 001A68Weltec Enterprise Co., Ltd 001A69Wuhan Yangtze Optical Technology CO.,Ltd 001A6ATranzas, Inc 001A6BUniversal Global Scientific Industrial Co., Ltd 001A6CCISCO SYSTEMS, INC 001A6DCISCO SYSTEMS, INC 001A6EImpro Technologies 001A6FMI.TEL s.r.l 001A70Cisco-Linksys, LLC 001A71Diostech Co., Ltd 001A72Mosart Semiconductor Corp 001A73Gemtek Technology Co., Ltd 001A74Procare International Co 001A75Sony Ericsson Mobile Communications 001A76SDT information Technology Co.,LTD 001A77ARRIS Group, Inc 001A78ubtos 001A79TELECOMUNICATION TECHNOLOGIES LTD 001A7ALismore Instruments Limited 001A7BTeleco, Inc 001A7CHirschmann Multimedia B.V 001A7Dcyber-blue(HK)Ltd 001A7ELN Srithai Comm Ltd 001A7FGCI Science&Technology Co.,Ltd 001A80Sony Corporation 001A81Zelax 001A82PROBA Building Automation Co.,LTD 001A83Pegasus Technologies Inc 001A84V One Multimedia Pte Ltd 001A85NV Michel Van de Wiele 001A86AdvancedIO Systems Inc 001A87Canhold International Limited 001A88Venergy,Co,Ltd 001A89Nokia Danmark A/S 001A8ASamsung Electronics Co., Ltd 001A8BCHUNIL ELECTRIC IND., CO 001A8CSophos Ltd 001A8DAVECS Bergen GmbH 001A8E3Way Networks Ltd 001A8FNortel 001A90Trópico Sistemas e Telecomunicações da Amazônia LTDA 001A91FusionDynamic Ltd 001A92ASUSTek COMPUTER INC 001A93ERCO Leuchten GmbH 001A94Votronic GmbH 001A95Hisense Mobile Communications Technoligy Co.,Ltd 001A96ECLER S.A 001A97fitivision technology Inc 001A98Asotel Communication Limited Taiwan Branch 001A99Smarty (HZ) Information Electronics Co., Ltd 001A9ASkyworth Digital technology(shenzhen)co.ltd 001A9BADEC & Parter AG 001A9CRightHand Technologies, Inc 001A9DSkipper Wireless, Inc 001A9EICON Digital International Limited 001A9FA-Link Ltd 001AA0Dell Inc 001AA1CISCO SYSTEMS, INC 001AA2CISCO SYSTEMS, INC 001AA3DELORME 001AA4Future University-Hakodate 001AA5BRN Phoenix 001AA6Telefunken Radio Communication Systems GmbH &CO.KG 001AA7Torian Wireless 001AA8Mamiya Digital Imaging Co., Ltd 001AA9FUJIAN STAR-NET COMMUNICATION CO.,LTD 001AAAAnalogic Corp 001AABeWings s.r.l 001AACCorelatus AB 001AADARRIS Group, Inc 001AAESavant Systems LLC 001AAFBLUSENS TECHNOLOGY 001AB0Signal Networks Pvt. Ltd., 001AB1Asia Pacific Satellite Industries Co., Ltd 001AB2Cyber Solutions Inc 001AB3VISIONITE INC 001AB4FFEI Ltd 001AB5Home Network System 001AB6Texas Instruments 001AB7Ethos Networks LTD 001AB8Anseri Corporation 001AB9PMC 001ABACaton Overseas Limited 001ABBFontal Technology Incorporation 001ABCU4EA Technologies Ltd 001ABDImpatica Inc 001ABECOMPUTER HI-TECH INC 001ABFTRUMPF Laser Marking Systems AG 001AC0JOYBIEN TECHNOLOGIES CO., LTD 001AC13Com Ltd 001AC2YEC Co.,Ltd 001AC3Scientific-Atlanta, Inc 001AC42Wire, Inc 001AC5BreakingPoint Systems, Inc 001AC6Micro Control Designs 001AC7UNIPOINT 001AC8ISL (Instrumentation Scientifique de Laboratoire) 001AC9SUZUKEN CO.,LTD 001ACATilera Corporation 001ACBAutocom Products Ltd 001ACCCelestial Semiconductor, Ltd 001ACDTidel Engineering LP 001ACEYUPITERU CORPORATION 001ACFC.T. ELETTRONICA 001AD0Albis Technologies AG 001AD1FARGO CO., LTD 001AD2Eletronica Nitron Ltda 001AD3Vamp Ltd 001AD4iPOX Technology Co., Ltd 001AD5KMC CHAIN INDUSTRIAL CO., LTD 001AD6JIAGNSU AETNA ELECTRIC CO.,LTD 001AD7Christie Digital Systems, Inc 001AD8AlsterAero GmbH 001AD9International Broadband Electric Communications, Inc 001ADABiz-2-Me Inc 001ADBARRIS Group, Inc 001ADCNokia Danmark A/S 001ADDPePWave Ltd 001ADEARRIS Group, Inc 001ADFInteractivetv Pty Limited 001AE0Mythology Tech Express Inc 001AE1EDGE ACCESS INC 001AE2CISCO SYSTEMS, INC 001AE3CISCO SYSTEMS, INC 001AE4Medicis Technologies Corporation 001AE5Mvox Technologies Inc 001AE6Atlanta Advanced Communications Holdings Limited 001AE7Aztek Networks, Inc 001AE8Unify GmbH and Co KG 001AE9Nintendo Co., Ltd 001AEARadio Terminal Systems Pty Ltd 001AEBAllied Telesis K.K 001AECKeumbee Electronics Co.,Ltd 001AEDINCOTEC GmbH 001AEEShenztech Ltd 001AEFLoopcomm Technology, Inc 001AF0Alcatel - IPD 001AF1Embedded Artists AB 001AF2Dynavisions Schweiz AG 001AF3Samyoung Electronics 001AF4Handreamnet 001AF5PENTAONE. CO., LTD 001AF6Woven Systems, Inc 001AF7dataschalt e+a GmbH 001AF8Copley Controls Corporation 001AF9AeroVIronment (AV Inc) 001AFAWelch Allyn, Inc 001AFBJoby Inc 001AFCModusLink Corporation 001AFDEVOLIS 001AFESOFACREAL 001AFFWizyoung Tech 001B00Neopost Technologies 001B01Applied Radio Technologies 001B02ED Co.Ltd 001B03Action Technology (SZ) Co., Ltd 001B04Affinity International S.p.a 001B05YMC AG 001B06Ateliers R. LAUMONIER 001B07Mendocino Software 001B08Danfoss Drives A/S 001B09Matrix Telecom Pvt. Ltd 001B0AIntelligent Distributed Controls Ltd 001B0BPhidgets Inc 001B0CCISCO SYSTEMS, INC 001B0DCISCO SYSTEMS, INC 001B0EInoTec GmbH Organisationssysteme 001B0FPetratec 001B10ShenZhen Kang Hui Technology Co.,ltd 001B11D-Link Corporation 001B12Apprion 001B13Icron Technologies Corporation 001B14Carex Lighting Equipment Factory 001B15Voxtel, Inc 001B16Celtro Ltd 001B17Palo Alto Networks 001B18Tsuken Electric Ind. Co.,Ltd 001B19IEEE I&M Society TC9 001B1Ae-trees Japan, Inc 001B1BSiemens AG, 001B1CCoherent 001B1DPhoenix International Co., Ltd 001B1EHART Communication Foundation 001B1FDELTA - Danish Electronics, Light & Acoustics 001B20TPine Technology 001B21Intel Corporate 001B22Palit Microsystems ( H.K.) Ltd 001B23SimpleComTools 001B24Quanta Computer Inc 001B25Nortel 001B26RON-Telecom ZAO 001B27Merlin CSI 001B28POLYGON, JSC 001B29Avantis.Co.,Ltd 001B2ACISCO SYSTEMS, INC 001B2BCISCO SYSTEMS, INC 001B2CATRON electronic GmbH 001B2DMed-Eng Systems Inc 001B2ESinkyo Electron Inc 001B2FNETGEAR Inc 001B30Solitech Inc 001B31Neural Image. Co. Ltd 001B32QLogic Corporation 001B33Nokia Danmark A/S 001B34Focus System Inc 001B35ChongQing JINOU Science & Technology Development CO.,Ltd 001B36Tsubata Engineering Co.,Ltd. (Head Office) 001B37Computec Oy 001B38COMPAL INFORMATION (KUNSHAN) CO., LTD 001B39Proxicast 001B3ASIMS Corp 001B3BYi-Qing CO., LTD 001B3CSoftware Technologies Group,Inc 001B3DEuroTel Spa 001B3ECurtis, Inc 001B3FProCurve Networking by HP 001B40Network Automation mxc AB 001B41General Infinity Co.,Ltd 001B42Wise & Blue 001B43Beijing DG Telecommunications equipment Co.,Ltd 001B44SanDisk Corporation 001B45ABB AS, Division Automation Products 001B46Blueone Technology Co.,Ltd 001B47Futarque A/S 001B48Shenzhen Lantech Electronics Co., Ltd 001B49Roberts Radio limited 001B4AW&W Communications, Inc 001B4BSANION Co., Ltd 001B4CSigntech 001B4DAreca Technology Corporation 001B4ENavman New Zealand 001B4FAvaya Inc 001B50Nizhny Novgorod Factory named after M.Frunze, FSUE (NZiF) 001B51Vector Technology Corp 001B52ARRIS Group, Inc 001B53CISCO SYSTEMS, INC 001B54CISCO SYSTEMS, INC 001B55Hurco Automation Ltd 001B56Tehuti Networks Ltd 001B57SEMINDIA SYSTEMS PRIVATE LIMITED 001B58ACE CAD Enterprise Co., Ltd 001B59Sony Ericsson Mobile Communications AB 001B5AApollo Imaging Technologies, Inc 001B5B2Wire, Inc 001B5CAzuretec Co., Ltd 001B5DVololink Pty Ltd 001B5EBPL Limited 001B5FAlien Technology 001B60NAVIGON AG 001B61Digital Acoustics, LLC 001B62JHT Optoelectronics Co.,Ltd 001B63Apple 001B64IsaacLandKorea Co., Ltd, 001B65China Gridcom Co., Ltd 001B66Sennheiser electronic GmbH & Co. KG 001B67Cisco Systems Inc 001B68Modnnet Co., Ltd 001B69Equaline Corporation 001B6APowerwave Technologies Sweden AB 001B6BSwyx Solutions AG 001B6CLookX Digital Media BV 001B6DMidtronics, Inc 001B6EAnue Systems, Inc 001B6FTeletrak Ltd 001B70IRI Ubiteq, INC 001B71Telular Corp 001B72Sicep s.p.a 001B73DTL Broadcast Ltd 001B74MiraLink Corporation 001B75Hypermedia Systems 001B76Ripcode, Inc 001B77Intel Corporate 001B78Hewlett-Packard Company 001B79FAIVELEY TRANSPORT 001B7ANintendo Co., Ltd 001B7BThe Tintometer Ltd 001B7CA & R Cambridge 001B7DCXR Anderson Jacobson 001B7EBeckmann GmbH 001B7FTMN Technologies Telecomunicacoes Ltda 001B80LORD Corporation 001B81DATAQ Instruments, Inc 001B82Taiwan Semiconductor Co., Ltd 001B83Finsoft Ltd 001B84Scan Engineering Telecom 001B85MAN Diesel SE 001B86Bosch Access Systems GmbH 001B87Deepsound Tech. Co., Ltd 001B88Divinet Access Technologies Ltd 001B89EMZA Visual Sense Ltd 001B8A2M Electronic A/S 001B8BNEC Platforms, Ltd 001B8CJMicron Technology Corp 001B8DElectronic Computer Systems, Inc 001B8EHulu Sweden AB 001B8FCISCO SYSTEMS, INC 001B90CISCO SYSTEMS, INC 001B91EFKON AG 001B92l-acoustics 001B93JC Decaux SA DNT 001B94T.E.M.A. S.p.A 001B95VIDEO SYSTEMS SRL 001B96General Sensing 001B97Violin Technologies 001B98Samsung Electronics Co., Ltd 001B99KS System GmbH 001B9AApollo Fire Detectors Ltd 001B9BHose-McCann Communications 001B9CSATEL sp. z o.o 001B9DNovus Security Sp. z o.o 001B9EASKEY COMPUTER CORP 001B9FCalyptech Pty Ltd 001BA0Awox 001BA1Åmic AB 001BA2IDS Imaging Development Systems GmbH 001BA3Flexit Group GmbH 001BA4S.A.E Afikim 001BA5MyungMin Systems, Inc 001BA6intotech inc 001BA7Lorica Solutions 001BA8UBI&MOBI,.Inc 001BA9BROTHER INDUSTRIES, LTD 001BAAXenICs nv 001BABTelchemy, Incorporated 001BACCurtiss Wright Controls Embedded Computing 001BADiControl Incorporated 001BAEMicro Control Systems, Inc 001BAFNokia Danmark A/S 001BB0BHARAT ELECTRONICS 001BB1Wistron Neweb Corp 001BB2Intellect International NV 001BB3Condalo GmbH 001BB4Airvod Limited 001BB5ZF Electronics GmbH 001BB6Bird Electronic Corp 001BB7Alta Heights Technology Corp 001BB8BLUEWAY ELECTRONIC CO;LTD 001BB9Elitegroup Computer System Co 001BBANortel 001BBBRFTech Co.,Ltd 001BBCSilver Peak Systems, Inc 001BBDFMC Kongsberg Subsea AS 001BBEICOP Digital 001BBFSAGEM COMMUNICATION 001BC0Juniper Networks 001BC1HOLUX Technology, Inc 001BC2Integrated Control Technology Limitied 001BC3Mobisolution Co.,Ltd 001BC4Ultratec, Inc 001BC5IEEE Registration Authority 001BC6Strato Rechenzentrum AG 001BC7StarVedia Technology Inc 001BC8MIURA CO.,LTD 001BC9FSN DISPLAY INC 001BCABeijing Run Technology LTD. Company 001BCBPEMPEK SYSTEMS PTY LTD 001BCCKINGTEK CCTV ALLIANCE CO., LTD 001BCDDAVISCOMMS (S) PTE LTD 001BCEMeasurement Devices Ltd 001BCFDataupia Corporation 001BD0IDENTEC SOLUTIONS 001BD1SOGESTMATIC 001BD2ULTRA-X ASIA PACIFIC Inc 001BD3Panasonic Corp. AVC Company 001BD4CISCO SYSTEMS, INC 001BD5CISCO SYSTEMS, INC 001BD6Kelvin Hughes Ltd 001BD7Scientific Atlanta, A Cisco Company 001BD8DVTel LTD 001BD9Edgewater Computer Systems 001BDAUTStarcom Inc 001BDBValeo VECS 001BDCVencer Co., Ltd 001BDDARRIS Group, Inc 001BDERenkus-Heinz, Inc 001BDFIskra Sistemi d.d 001BE0TELENOT ELECTRONIC GmbH 001BE1ViaLogy 001BE2AhnLab,Inc 001BE3Health Hero Network, Inc 001BE4TOWNET SRL 001BE5802automation Limited 001BE6VR AG 001BE7Postek Electronics Co., Ltd 001BE8Ultratronik GmbH 001BE9Broadcom Corporation 001BEANintendo Co., Ltd 001BEBDMP Electronics INC 001BECNetio Technologies Co., Ltd 001BEDBrocade Communications Systems, Inc 001BEENokia Danmark A/S 001BEFBlossoms Digital Technology Co.,Ltd 001BF0Value Platforms Limited 001BF1Nanjing SilverNet Software Co., Ltd 001BF2KWORLD COMPUTER CO., LTD 001BF3TRANSRADIO SenderSysteme Berlin AG 001BF4KENWIN INDUSTRIAL(HK) LTD 001BF5Tellink Sistemas de Telecomunicación S.L 001BF6CONWISE Technology Corporation Ltd 001BF7Lund IP Products AB 001BF8Digitrax Inc 001BF9Intellitect Water Ltd 001BFAG.i.N. mbH 001BFBAlps Electric Co., Ltd 001BFCASUSTek COMPUTER INC 001BFDDignsys Inc 001BFEZavio Inc 001BFFMillennia Media inc 001C00Entry Point, LLC 001C01ABB Oy Drives 001C02Pano Logic 001C03Betty TV Technology AG 001C04Airgain, Inc 001C05Nonin Medical Inc 001C06Siemens Numerical Control Ltd., Nanjing 001C07Cwlinux Limited 001C08Echo360, Inc 001C09SAE Electronic Co.,Ltd 001C0AShenzhen AEE Technology Co.,Ltd 001C0BSmartAnt Telecom 001C0CTANITA Corporation 001C0DG-Technology, Inc 001C0ECISCO SYSTEMS, INC 001C0FCISCO SYSTEMS, INC 001C10Cisco-Linksys, LLC 001C11ARRIS Group, Inc 001C12ARRIS Group, Inc 001C13OPTSYS TECHNOLOGY CO., LTD 001C14VMware, Inc 001C15iPhotonix LLC 001C16ThyssenKrupp Elevator 001C17Nortel 001C18Sicert S.r.L 001C19secunet Security Networks AG 001C1AThomas Instrumentation, Inc 001C1BHyperstone GmbH 001C1CCenter Communication Systems GmbH 001C1DCHENZHOU GOSPELL DIGITAL TECHNOLOGY CO.,LTD 001C1Eemtrion GmbH 001C1FQuest Retail Technology Pty Ltd 001C20CLB Benelux 001C21Nucsafe Inc 001C22Aeris Elettronica s.r.l 001C23Dell Inc 001C24Formosa Wireless Systems Corp 001C25Hon Hai Precision Ind. Co.,Ltd 001C26Hon Hai Precision Ind. Co.,Ltd 001C27Sunell Electronics Co 001C28Sphairon Technologies GmbH 001C29CORE DIGITAL ELECTRONICS CO., LTD 001C2AEnvisacor Technologies Inc 001C2BAlertme.com Limited 001C2CSynapse 001C2DFlexRadio Systems 001C2EHPN Supply Chain 001C2FPfister GmbH 001C30Mode Lighting (UK ) Ltd 001C31Mobile XP Technology Co., LTD 001C32Telian Corporation 001C33Sutron 001C34HUEY CHIAO INTERNATIONAL CO., LTD 001C35Nokia Danmark A/S 001C36iNEWiT NV 001C37Callpod, Inc 001C38Bio-Rad Laboratories, Inc 001C39S Netsystems Inc 001C3AElement Labs, Inc 001C3BAmRoad Technology Inc 001C3CSeon Design Inc 001C3DWaveStorm 001C3EECKey Corporation 001C3FInternational Police Technologies, Inc 001C40VDG-Security bv 001C41scemtec Transponder Technology GmbH 001C42Parallels, Inc 001C43Samsung Electronics Co.,Ltd 001C44Bosch Security Systems BV 001C45Chenbro Micom Co., Ltd 001C46QTUM 001C47Hangzhou Hollysys Automation Co., Ltd 001C48WiDeFi, Inc 001C49Zoltan Technology Inc 001C4AAVM GmbH 001C4BGener8, Inc 001C4CPetrotest Instruments 001C4DAplix IP Holdings Corporation 001C4ETASA International Limited 001C4FMACAB AB 001C50TCL Technoly Electronics(Huizhou)Co.,Ltd 001C51Celeno Communications 001C52VISIONEE SRL 001C53Synergy Lighting Controls 001C54Hillstone Networks Inc 001C55Shenzhen Kaifa Technology Co 001C56Pado Systems, Inc 001C57CISCO SYSTEMS, INC 001C58CISCO SYSTEMS, INC 001C59DEVON IT 001C5AAdvanced Relay Corporation 001C5BChubb Electronic Security Systems Ltd 001C5CIntegrated Medical Systems, Inc 001C5DLeica Microsystems 001C5EASTON France 001C5FWinland Electronics, Inc 001C60CSP Frontier Technologies,Inc 001C61Galaxy Microsystems LImited 001C62LG Electronics Inc 001C63TRUEN 001C64Landis+Gyr 001C65JoeScan, Inc 001C66UCAMP CO.,LTD 001C67Pumpkin Networks, Inc 001C68Anhui Sun Create Electronics Co., Ltd 001C69Packet Vision Ltd 001C6AWeiss Engineering Ltd 001C6BCOVAX Co. Ltd 001C6CJabil Circuit (Guangzhou) Limited 001C6DKYOHRITSU ELECTRONIC INDUSTRY CO., LTD 001C6ENewbury Networks, Inc 001C6FEmfit Ltd 001C70NOVACOMM LTDA 001C71Emergent Electronics 001C72Mayer & Cie GmbH & Co KG 001C73Arista Networks, Inc 001C74Syswan Technologies Inc 001C75Segnet Ltd 001C76The Wandsworth Group Ltd 001C77Prodys 001C78WYPLAY SAS 001C79Cohesive Financial Technologies LLC 001C7APerfectone Netware Company Ltd 001C7BCastlenet Technology Inc 001C7CPERQ SYSTEMS CORPORATION 001C7DExcelpoint Manufacturing Pte Ltd 001C7EToshiba 001C7FCheck Point Software Technologies 001C80New Business Division/Rhea-Information CO., LTD 001C81NextGen Venturi LTD 001C82Genew Technologies 001C83New Level Telecom Co., Ltd 001C84STL Solution Co.,Ltd 001C85Eunicorn 001C86Cranite Systems, Inc 001C87Uriver Inc 001C88TRANSYSTEM INC 001C89Force Communications, Inc 001C8ACirrascale Corporation 001C8BMJ Innovations Ltd 001C8CDIAL TECHNOLOGY LTD 001C8DMesa Imaging 001C8EAlcatel-Lucent IPD 001C8FAdvanced Electronic Design, Inc 001C90Empacket Corporation 001C91Gefen Inc 001C92Tervela 001C93ExaDigm Inc 001C94LI-COR Biosciences 001C95Opticomm Corporation 001C96Linkwise Technology Pte Ltd 001C97Enzytek Technology Inc., 001C98LUCKY TECHNOLOGY (HK) COMPANY LIMITED 001C99Shunra Software Ltd 001C9ANokia Danmark A/S 001C9BFEIG ELECTRONIC GmbH 001C9CNortel 001C9DLiecthi AG 001C9EDualtech IT AB 001C9FRazorstream, LLC 001CA0Production Resource Group, LLC 001CA1AKAMAI TECHNOLOGIES, INC 001CA2ADB Broadband Italia 001CA3Terra 001CA4Sony Ericsson Mobile Communications 001CA5Zygo Corporation 001CA6Win4NET 001CA7International Quartz Limited 001CA8AirTies Wireless Networks 001CA9Audiomatica Srl 001CAABellon Pty Ltd 001CABMeyer Sound Laboratories, Inc 001CACQniq Technology Corp 001CADWuhan Telecommunication Devices Co.,Ltd 001CAEWiChorus, Inc 001CAFPlato Networks Inc 001CB0CISCO SYSTEMS, INC 001CB1CISCO SYSTEMS, INC 001CB2BPT SPA 001CB3Apple 001CB4Iridium Satellite LLC 001CB5Neihua Network Technology Co.,LTD.(NHN) 001CB6Duzon CNT Co., Ltd 001CB7USC DigiArk Corporation 001CB8CBC Co., Ltd 001CB9KWANG SUNG ELECTRONICS CO., LTD 001CBAVerScient, Inc 001CBBMusicianLink 001CBCCastGrabber, LLC 001CBDEzze Mobile Tech., Inc 001CBENintendo Co., Ltd 001CBFIntel Corporate 001CC0Intel Corporate 001CC1ARRIS Group, Inc 001CC2Part II Research, Inc 001CC3Pace plc 001CC4Hewlett-Packard Company 001CC53COM LTD 001CC6ProStor Systems 001CC7Rembrandt Technologies, LLC d/b/a REMSTREAM 001CC8INDUSTRONIC Industrie-Electronic GmbH & Co. KG 001CC9Kaise Electronic Technology Co., Ltd 001CCAShanghai Gaozhi Science & Technology Development Co 001CCBForth Corporation Public Company Limited 001CCCResearch In Motion Limited 001CCDAlektrona Corporation 001CCEBy Techdesign 001CCFLIMETEK 001CD0Circleone Co.,Ltd 001CD1Waves Audio LTD 001CD2King Champion (Hong Kong) Limited 001CD3ZP Engineering SEL 001CD4Nokia Danmark A/S 001CD5ZeeVee, Inc 001CD6Nokia Danmark A/S 001CD7Harman/Becker Automotive Systems GmbH 001CD8BlueAnt Wireless 001CD9GlobalTop Technology Inc 001CDAExegin Technologies Limited 001CDBCARPOINT CO.,LTD 001CDCCustom Computer Services, Inc 001CDDCOWBELL ENGINEERING CO., LTD 001CDEInteractive Multimedia eXchange Inc 001CDFBelkin International Inc 001CE0DASAN TPS 001CE1INDRA SISTEMAS, S.A 001CE2Attero Tech, LLC 001CE3Optimedical Systems 001CE4EleSy JSC 001CE5MBS Electronic Systems GmbH 001CE6INNES 001CE7Rocon PLC Research Centre 001CE8Cummins Inc 001CE9Galaxy Technology Limited 001CEAScientific-Atlanta, Inc 001CEBNortel 001CECMobilesoft (Aust.) Pty Ltd 001CEDENVIRONNEMENT SA 001CEESHARP Corporation 001CEFPrimax Electronics LTD 001CF0D-Link Corporation 001CF1SUPoX Technology Co. , LTD 001CF2Tenlon Technology Co.,Ltd 001CF3EVS BROADCAST EQUIPMENT 001CF4Media Technology Systems Inc 001CF5Wiseblue Technology Limited 001CF6CISCO SYSTEMS, INC 001CF7AudioScience 001CF8Parade Technologies, Ltd 001CF9CISCO SYSTEMS, INC 001CFAAlarm.com 001CFBARRIS Group, Inc 001CFCSuminet Communication Technologies (Shanghai) Co., Ltd 001CFDUniversal Electronics 001CFEQuartics Inc 001CFFNapera Networks Inc 001D00Brivo Systems, LLC 001D01Neptune Digital 001D02Cybertech Telecom Development 001D03Design Solutions Inc 001D04Zipit Wireless, Inc 001D05iLight 001D06HM Electronics, Inc 001D07Shenzhen Sang Fei Consumer Communications Co.,Ltd 001D08JIANGSU YINHE ELECTRONICS CO., LTD 001D09Dell Inc 001D0ADavis Instruments, Inc 001D0BPower Standards Lab 001D0CMobileCompia 001D0DSony Computer Entertainment inc 001D0EAgapha Technology co., Ltd 001D0FTP-LINK Technologies Co., Ltd 001D10LightHaus Logic, Inc 001D11Analogue & Micro Ltd 001D12ROHM CO., LTD 001D13NextGTV 001D14SPERADTONE INFORMATION TECHNOLOGY LIMITED 001D15Shenzhen Dolphin Electronic Co., Ltd 001D16SFR 001D17Digital Sky Corporation 001D18Power Innovation GmbH 001D19Arcadyan Technology Corporation 001D1AOvisLink S.A 001D1BSangean Electronics Inc 001D1CGennet s.a 001D1DInter-M Corporation 001D1EKYUSHU TEN CO.,LTD 001D1FSiauliu Tauro Televizoriai, JSC 001D20COMTREND CO 001D21Alcad SL 001D22Foss Analytical A/S 001D23SENSUS 001D24Aclara Power-Line Systems Inc 001D25Samsung Electronics Co.,Ltd 001D26Rockridgesound Technology Co 001D27NAC-INTERCOM 001D28Sony Ericsson Mobile Communications AB 001D29Doro AB 001D2ASHENZHEN BUL-TECH CO.,LTD 001D2BWuhan Pont Technology CO. , LTD 001D2CWavetrend Technologies (Pty) Limited 001D2DPylone, Inc 001D2ERuckus Wireless 001D2FQuantumVision Corporation 001D30YX Wireless S.A 001D31HIGHPRO INTERNATIONAL R&D CO,.LTD 001D32Longkay Communication & Technology (Shanghai) Co. Ltd 001D33Maverick Systems Inc 001D34SYRIS Technology Corp 001D35Viconics Electronics Inc 001D36ELECTRONICS CORPORATION OF INDIA LIMITED 001D37Thales-Panda Transportation System 001D38Seagate Technology 001D39MOOHADIGITAL CO., LTD 001D3Amh acoustics LLC 001D3BNokia Danmark A/S 001D3CMuscle Corporation 001D3DAvidyne Corporation 001D3ESAKA TECHNO SCIENCE CO.,LTD 001D3FMitron Pty Ltd 001D40 Intel – GE Care Innovations LLC 001D41Hardy Instruments 001D42Nortel 001D43Shenzhen G-link Digital Technology Co., Ltd 001D44KROHNE Messtechnik GmbH 001D45CISCO SYSTEMS, INC 001D46CISCO SYSTEMS, INC 001D47Covote GmbH & Co KG 001D48Sensor-Technik Wiedemann GmbH 001D49Innovation Wireless Inc 001D4ACarestream Health, Inc 001D4BGrid Connect Inc 001D4CAlcatel-Lucent 001D4DAdaptive Recognition Hungary, Inc 001D4ETCM Mobile LLC 001D4FApple 001D50SPINETIX SA 001D51Babcock & Wilcox Power Generation Group, Inc 001D52Defzone B.V 001D53S&O Electronics (Malaysia) Sdn. Bhd 001D54Sunnic Technology & Merchandise INC 001D55ZANTAZ, Inc 001D56Kramer Electronics Ltd 001D57CAETEC Messtechnik 001D58CQ Inc 001D59Mitra Energy & Infrastructure 001D5A2Wire Inc 001D5BTecvan Informática Ltda 001D5CTom Communication Industrial Co.,Ltd 001D5DControl Dynamics Pty. Ltd 001D5ECOMING MEDIA CORP 001D5FOverSpeed SARL 001D60ASUSTek COMPUTER INC 001D61BIJ Corporation 001D62InPhase Technologies 001D63Miele & Cie. KG 001D64Adam Communications Systems Int Ltd 001D65Microwave Radio Communications 001D66Hyundai Telecom 001D67AMEC 001D68Thomson Telecom Belgium 001D69Knorr-Bremse IT-Services GmbH 001D6AAlpha Networks Inc 001D6BARRIS Group, Inc 001D6CClariPhy Communications, Inc 001D6DConfidant International LLC 001D6ENokia Danmark A/S 001D6FChainzone Technology Co., Ltd 001D70CISCO SYSTEMS, INC 001D71CISCO SYSTEMS, INC 001D72Wistron Corporation 001D73Buffalo Inc 001D74Tianjin China-Silicon Microelectronics Co., Ltd 001D75Radioscape PLC 001D76Eyeheight Ltd 001D77NSGate 001D78Invengo Information Technology Co.,Ltd 001D79SIGNAMAX LLC 001D7AWideband Semiconductor, Inc 001D7BIce Energy, Inc 001D7CABE Elettronica S.p.A 001D7DGIGA-BYTE TECHNOLOGY CO.,LTD 001D7ECisco-Linksys, LLC 001D7FTekron International Ltd 001D80Beijing Huahuan Eletronics Co.,Ltd 001D81GUANGZHOU GATEWAY ELECTRONICS CO., LTD 001D82GN A/S (GN Netcom A/S) 001D83Emitech Corporation 001D84Gateway, Inc 001D85Call Direct Cellular Solutions 001D86Shinwa Industries(China) Ltd 001D87VigTech Labs Sdn Bhd 001D88Clearwire 001D89VaultStor Corporation 001D8ATechTrex Inc 001D8BADB Broadband Italia 001D8CLa Crosse Technology LTD 001D8DRaytek GmbH 001D8EAlereon, Inc 001D8FPureWave Networks 001D90EMCO Flow Systems 001D91Digitize, Inc 001D92MICRO-STAR INT'L CO.,LTD 001D93Modacom 001D94Climax Technology Co., Ltd 001D95Flash, Inc 001D96WatchGuard Video 001D97Alertus Technologies LLC 001D98Nokia Danmark A/S 001D99Cyan Optic, Inc 001D9AGODEX INTERNATIONAL CO., LTD 001D9BHokuyo Automatic Co., Ltd 001D9CRockwell Automation 001D9DARTJOY INTERNATIONAL LIMITED 001D9EAXION TECHNOLOGIES 001D9FMATT R.P.Traczynscy Sp.J 001DA0Heng Yu Electronic Manufacturing Company Limited 001DA1CISCO SYSTEMS, INC 001DA2CISCO SYSTEMS, INC 001DA3SabiOso 001DA4Hangzhou System Technology CO., LTD 001DA5WB Electronics 001DA6Media Numerics Limited 001DA7Seamless Internet 001DA8Takahata Electronics Co.,Ltd 001DA9Castles Technology, Co., LTD 001DAADrayTek Corp 001DABSwissQual License AG 001DACGigamon Systems LLC 001DADSinotech Engineering Consultants, Inc. Geotechnical Enginee 001DAECHANG TSENG TECHNOLOGY CO., LTD 001DAFNortel 001DB0FuJian HengTong Information Technology Co.,Ltd 001DB1Crescendo Networks 001DB2HOKKAIDO ELECTRIC ENGINEERING CO.,LTD 001DB3HPN Supply Chain 001DB4KUMHO ENG CO.,LTD 001DB5Juniper networks 001DB6BestComm Networks, Inc 001DB7Tendril Networks, Inc 001DB8Intoto Inc 001DB9Wellspring Wireless 001DBASony Corporation 001DBBDynamic System Electronics Corp 001DBCNintendo Co., Ltd 001DBDVersamed Inc 001DBEARRIS Group, Inc 001DBFRadiient Technologies, Inc 001DC0Enphase Energy 001DC1Audinate Pty L 001DC2XORTEC OY 001DC3RIKOR TV, Ltd 001DC4AIOI Systems Co., Ltd 001DC5Beijing Jiaxun Feihong Electricial Co., Ltd 001DC6SNR Inc 001DC7L-3 Communications Geneva Aerospace 001DC8Navionics Research Inc., dba SCADAmetrics 001DC9GainSpan Corp 001DCAPAV Electronics Limited 001DCBExéns Development Oy 001DCCHetra Secure Solutions 001DCDARRIS Group, Inc 001DCEARRIS Group, Inc 001DCFARRIS Group, Inc 001DD0ARRIS Group, Inc 001DD1ARRIS Group, Inc 001DD2ARRIS Group, Inc 001DD3ARRIS Group, Inc 001DD4ARRIS Group, Inc 001DD5ARRIS Group, Inc 001DD6ARRIS Group, Inc 001DD7Algolith 001DD8Microsoft Corporation 001DD9Hon Hai Precision Ind.Co.,Ltd 001DDAMikroelektronika spol. s r. o 001DDBC-BEL Corporation 001DDCHangZhou DeChangLong Tech&Info Co.,Ltd 001DDDDAT H.K. LIMITED 001DDEZhejiang Broadcast&Television Technology Co.,Ltd 001DDFSunitec Enterprise Co., Ltd 001DE0Intel Corporate 001DE1Intel Corporate 001DE2Radionor Communications 001DE3Intuicom 001DE4Visioneered Image Systems 001DE5CISCO SYSTEMS, INC 001DE6CISCO SYSTEMS, INC 001DE7Marine Sonic Technology, Ltd 001DE8Nikko Denki Tsushin Corporation(NDTC) 001DE9Nokia Danmark A/S 001DEACommtest Instruments Ltd 001DEBDINEC International 001DECMarusys 001DEDGrid Net, Inc 001DEENEXTVISION SISTEMAS DIGITAIS DE TELEVISÃO LTDA 001DEFTRIMM, INC 001DF0Vidient Systems, Inc 001DF1Intego Systems, Inc 001DF2Netflix, Inc 001DF3SBS Science & Technology Co., Ltd 001DF4Magellan Technology Pty Limited 001DF5Sunshine Co,LTD 001DF6Samsung Electronics Co.,Ltd 001DF7R. STAHL Schaltgeräte GmbH 001DF8Webpro Vision Technology Corporation 001DF9Cybiotronics (Far East) Limited 001DFAFujian LANDI Commercial Equipment Co.,Ltd 001DFBNETCLEUS Systems Corporation 001DFCKSIC 001DFDNokia Danmark A/S 001DFEPalm, Inc 001DFFNetwork Critical Solutions Ltd 001E00Shantou Institute of Ultrasonic Instruments 001E01Renesas Technology Sales Co., Ltd 001E02Sougou Keikaku Kougyou Co.,Ltd 001E03LiComm Co., Ltd 001E04Hanson Research Corporation 001E05Xseed Technologies & Computing 001E06WIBRAIN 001E07Winy Technology Co., Ltd 001E08Centec Networks Inc 001E09ZEFATEK Co.,LTD 001E0ASyba Tech Limited 001E0BHewlett-Packard Company 001E0CSherwood Information Partners, Inc 001E0DMicran Ltd 001E0EMAXI VIEW HOLDINGS LIMITED 001E0FBriot International 001E10ShenZhen Huawei Communication Technologies Co.,Ltd 001E11ELELUX INTERNATIONAL LTD 001E12Ecolab 001E13CISCO SYSTEMS, INC 001E14CISCO SYSTEMS, INC 001E15Beech Hill Electronics 001E16Keytronix 001E17STN BV 001E18Radio Activity srl 001E19GTRI 001E1ABest Source Taiwan Inc 001E1BDigital Stream Technology, Inc 001E1CSWS Australia Pty Limited 001E1DEast Coast Datacom, Inc 001E1EHoneywell Life Safety 001E1FNortel 001E20Intertain Inc 001E21Qisda Co 001E22ARVOO Imaging Products BV 001E23Electronic Educational Devices, Inc 001E24Zhejiang Bell Technology Co.,ltd 001E25Intek Digital Inc 001E26Digifriends Co. Ltd 001E27SBN TECH Co.,Ltd 001E28Lumexis Corporation 001E29Hypertherm Inc 001E2ANetgear Inc 001E2BRadio Systems Design, Inc 001E2CCyVerse Corporation 001E2DSTIM 001E2ESIRTI S.p.A 001E2FDiMoto Pty Ltd 001E30Shireen Inc 001E31INFOMARK CO.,LTD 001E32Zensys 001E33Inventec Corporation 001E34CryptoMetrics 001E35Nintendo Co., Ltd 001E36IPTE 001E37Universal Global Scientific Industrial Co., Ltd 001E38Bluecard Software Technology Co., Ltd 001E39Comsys Communication Ltd 001E3ANokia Danmark A/S 001E3BNokia Danmark A/S 001E3CLyngbox Media AB 001E3DAlps Electric Co., Ltd 001E3EKMW Inc 001E3FTrellisWare Technologies, Inc 001E40Shanghai DareGlobal Technologies Co.,Ltd 001E41Microwave Communication & Component, Inc 001E42Teltonika 001E43AISIN AW CO.,LTD 001E44SANTEC 001E45Sony Ericsson Mobile Communications AB 001E46ARRIS Group, Inc 001E47PT. Hariff Daya Tunggal Engineering 001E48Wi-Links 001E49CISCO SYSTEMS, INC 001E4ACISCO SYSTEMS, INC 001E4BCity Theatrical 001E4CHon Hai Precision Ind.Co., Ltd 001E4DWelkin Sciences, LLC 001E4EDAKO EDV-Ingenieur- und Systemhaus GmbH 001E4FDell Inc 001E50BATTISTONI RESEARCH 001E51Converter Industry Srl 001E52Apple 001E53Further Tech Co., LTD 001E54TOYO ELECTRIC Corporation 001E55COWON SYSTEMS,Inc 001E56Bally Wulff Entertainment GmbH 001E57ALCOMA, spol. s r.o 001E58D-Link Corporation 001E59Silicon Turnkey Express, LLC 001E5AARRIS Group, Inc 001E5BUnitron Company, Inc 001E5CRB GeneralEkonomik 001E5DHolosys d.o.o 001E5ECOmputime Ltd 001E5FKwikByte, LLC 001E60Digital Lighting Systems, Inc 001E61ITEC GmbH 001E62Siemon 001E63Vibro-Meter SA 001E64Intel Corporate 001E65Intel Corporate 001E66RESOL Elektronische Regelungen GmbH 001E67Intel Corporate 001E68Quanta Computer 001E69Thomson Inc 001E6ABeijing Bluexon Technology Co.,Ltd 001E6BCisco SPVTG 001E6COpaque Systems 001E6DIT R&D Center 001E6EShenzhen First Mile Communications Ltd 001E6FMagna-Power Electronics, Inc 001E70Cobham Defence Communications Ltd 001E71MIrcom Group of Companies 001E72PCS 001E73ZTE CORPORATION 001E74SAGEM COMMUNICATION 001E75LG Electronics 001E76Thermo Fisher Scientific 001E77Air2App 001E78Owitek Technology Ltd., 001E79CISCO SYSTEMS, INC 001E7ACISCO SYSTEMS, INC 001E7BR.I.CO. S.r.l 001E7CTaiwick Limited 001E7DSamsung Electronics Co.,Ltd 001E7ENortel 001E7FCBM of America 001E80Last Mile Ltd 001E81CNB Technology Inc 001E82SanDisk Corporation 001E83LAN/MAN Standards Association (LMSC) 001E84Pika Technologies Inc 001E85Lagotek Corporation 001E86MEL Co.,Ltd 001E87Realease Limited 001E88ANDOR SYSTEM SUPPORT CO., LTD 001E89CRFS Limited 001E8AeCopy, Inc 001E8BInfra Access Korea Co., Ltd 001E8CASUSTek COMPUTER INC 001E8DARRIS Group, Inc 001E8EHunkeler AG 001E8FCANON INC 001E90Elitegroup Computer Systems Co 001E91KIMIN Electronic Co., Ltd 001E92JEULIN S.A 001E93CiriTech Systems Inc 001E94SUPERCOM TECHNOLOGY CORPORATION 001E95SIGMALINK 001E96Sepura Plc 001E97Medium Link System Technology CO., LTD, 001E98GreenLine Communications 001E99Vantanol Industrial Corporation 001E9AHAMILTON Bonaduz AG 001E9BSan-Eisha, Ltd 001E9CFidustron INC 001E9DRecall Technologies, Inc 001E9Eddm hopt + schuler Gmbh + Co. KG 001E9FVisioneering Systems, Inc 001EA0XLN-t 001EA1Brunata a/s 001EA2Symx Systems, Inc 001EA3Nokia Danmark A/S 001EA4Nokia Danmark A/S 001EA5ROBOTOUS, Inc 001EA6Best IT World (India) Pvt. Ltd 001EA7ActionTec Electronics, Inc 001EA8Datang Mobile Communications Equipment CO.,LTD 001EA9Nintendo Co., Ltd 001EAAE-Senza Technologies GmbH 001EABTeleWell Oy 001EACArmadeus Systems 001EADWingtech Group Limited 001EAEContinental Automotive Systems 001EAFOphir Optronics Ltd 001EB0ImesD Electronica S.L 001EB1Cryptsoft Pty Ltd 001EB2LG innotek 001EB3Primex Wireless 001EB4UNIFAT TECHNOLOGY LTD 001EB5Ever Sparkle Technologies Ltd 001EB6TAG Heuer SA 001EB7TBTech, Co., Ltd 001EB8Fortis, Inc 001EB9Sing Fai Technology Limited 001EBAHigh Density Devices AS 001EBBBLUELIGHT TECHNOLOGY INC 001EBCWINTECH AUTOMATION CO.,LTD 001EBDCISCO SYSTEMS, INC 001EBECISCO SYSTEMS, INC 001EBFHaas Automation Inc 001EC0Microchip Technology Inc 001EC13COM EUROPE LTD 001EC2Apple 001EC3Kozio, Inc 001EC4Celio Corp 001EC5Middle Atlantic Products Inc 001EC6Obvius Holdings LLC 001EC72Wire, Inc 001EC8Rapid Mobile (Pty) Ltd 001EC9Dell Inc 001ECANortel 001ECB"RPC "Energoautomatika" Ltd 001ECCCDVI 001ECDKYLAND Technology Co. LTD 001ECEBISA Technologies (Hong Kong) Limited 001ECFPHILIPS ELECTRONICS UK LTD 001ED0Ingespace 001ED1Keyprocessor B.V 001ED2Ray Shine Video Technology Inc 001ED3Dot Technology Int'l Co., Ltd 001ED4Doble Engineering 001ED5Tekon-Automatics 001ED6Alentec & Orion AB 001ED7H-Stream Wireless, Inc 001ED8Digital United Inc 001ED9Mitsubishi Precision Co.,LTd 001EDAWesemann Elektrotechniek B.V 001EDBGiken Trastem Co., Ltd 001EDCSony Ericsson Mobile Communications AB 001EDDWASKO S.A 001EDEBYD COMPANY LIMITED 001EDFMaster Industrialization Center Kista 001EE0Urmet Domus SpA 001EE1Samsung Electronics Co.,Ltd 001EE2Samsung Electronics Co.,Ltd 001EE3T&W Electronics (ShenZhen) Co.,Ltd 001EE4ACS Solutions France 001EE5Cisco-Linksys, LLC 001EE6Shenzhen Advanced Video Info-Tech Co., Ltd 001EE7Epic Systems Inc 001EE8Mytek 001EE9Stoneridge Electronics AB 001EEASensor Switch, Inc 001EEBTalk-A-Phone Co 001EECCOMPAL INFORMATION (KUNSHAN) CO., LTD 001EEDAdventiq Ltd 001EEEETL Systems Ltd 001EEFCantronic International Limited 001EF0Gigafin Networks 001EF1Servimat 001EF2Micro Motion Inc 001EF3From2 001EF4L-3 Communications Display Systems 001EF5Hitek Automated Inc 001EF6CISCO SYSTEMS, INC 001EF7CISCO SYSTEMS, INC 001EF8Emfinity Inc 001EF9Pascom Kommunikations systeme GmbH 001EFAPROTEI Ltd 001EFBTrio Motion Technology Ltd 001EFCJSC "MASSA-K" 001EFDMicrobit 2.0 AB 001EFELEVEL s.r.o 001EFFMueller-Elektronik GmbH & Co. KG 001F00Nokia Danmark A/S 001F01Nokia Danmark A/S 001F02Pixelmetrix Corporation Pte Ltd 001F03NUM AG 001F04Granch Ltd 001F05iTAS Technology Corp 001F06Integrated Dispatch Solutions 001F07AZTEQ Mobile 001F08RISCO LTD 001F09JASTEC CO., LTD 001F0ANortel 001F0BFederal State Unitary Enterprise Industrial Union"Electropribor" 001F0CIntelligent Digital Services GmbH 001F0DL3 Communications - Telemetry West 001F0EJapan Kyastem Co., Ltd 001F0FSelect Engineered Systems 001F10TOLEDO DO BRASIL INDUSTRIA DE BALANCAS LTDA 001F11OPENMOKO, INC 001F12Juniper Networks 001F13S.& A.S. Ltd 001F14NexG 001F15Bioscrypt Inc 001F16Wistron Corporation 001F17IDX Company, Ltd 001F18Hakusan.Mfg.Co,.Ltd 001F19BEN-RI ELECTRONICA S.A 001F1AProminvest 001F1BRoyalTek Company Ltd 001F1CKOBISHI ELECTRIC Co.,Ltd 001F1DAtlas Material Testing Technology LLC 001F1EAstec Technology Co., Ltd 001F1FEdimax Technology Co. Ltd 001F20Logitech Europe SA 001F21Inner Mongolia Yin An Science & Technology Development Co.,L 001F22Source Photonics, Inc 001F23Interacoustics 001F24DIGITVIEW TECHNOLOGY CO., LTD 001F25MBS GmbH 001F26CISCO SYSTEMS, INC 001F27CISCO SYSTEMS, INC 001F28HPN Supply Chain 001F29Hewlett-Packard Company 001F2AACCM 001F2BOrange Logic 001F2CStarbridge Networks 001F2DElectro-Optical Imaging, Inc 001F2ETriangle Research Int'l Pte Ltd 001F2FBerker GmbH & Co. KG 001F30Travelping 001F31Radiocomp 001F32Nintendo Co., Ltd 001F33Netgear Inc 001F34Lung Hwa Electronics Co., Ltd 001F35AIR802 LLC 001F36Bellwin Information Co. Ltd., 001F37Genesis I&C 001F38POSITRON 001F39Construcciones y Auxiliar de Ferrocarriles, S.A 001F3AHon Hai Precision Ind.Co., Ltd 001F3BIntel Corporate 001F3CIntel Corporate 001F3DQbit GmbH 001F3ERP-Technik e.K 001F3FAVM GmbH 001F40Speakercraft Inc 001F41Ruckus Wireless 001F42Etherstack plc 001F43ENTES ELEKTRONIK 001F44GE Transportation Systems 001F45Enterasys 001F46Nortel 001F47MCS Logic Inc 001F48Mojix Inc 001F49Eurosat Distribution Ltd 001F4AAlbentia Systems S.A 001F4BLineage Power 001F4CRoseman Engineering Ltd 001F4DSegnetics LLC 001F4EConMed Linvatec 001F4FThinkware Co. Ltd 001F50Swissdis AG 001F51HD Communications Corp 001F52UVT Unternehmensberatung fur Verkehr und Technik GmbH 001F53GEMAC Gesellschaft für Mikroelektronikanwendung Chemnitz mbH 001F54Lorex Technology Inc 001F55Honeywell Security (China) Co., Ltd 001F56DIGITAL FORECAST 001F57Phonik Innovation Co.,LTD 001F58EMH Energiemesstechnik GmbH 001F59Kronback Tracers 001F5ABeckwith Electric Co 001F5BApple 001F5CNokia Danmark A/S 001F5DNokia Danmark A/S 001F5EDyna Technology Co.,Ltd 001F5FBlatand GmbH 001F60COMPASS SYSTEMS CORP 001F61Talent Communication Networks Inc 001F62JSC "Stilsoft" 001F63JSC Goodwin-Europa 001F64Beijing Autelan Technology Inc 001F65KOREA ELECTRIC TERMINAL CO., LTD 001F66PLANAR LLC 001F67Hitachi,Ltd 001F68Martinsson Elektronik AB 001F69Pingood Technology Co., Ltd 001F6APacketFlux Technologies, Inc 001F6BLG Electronics 001F6CCISCO SYSTEMS, INC 001F6DCISCO SYSTEMS, INC 001F6EVtech Engineering Corporation 001F6FFujian Sunnada Communication Co.,Ltd 001F70Botik Technologies LTD 001F71xG Technology, Inc 001F72QingDao Hiphone Technology Co,.Ltd 001F73Teraview Technology Co., Ltd 001F74Eigen Development 001F75GiBahn Media 001F76AirLogic Systems Inc 001F77HEOL DESIGN 001F78Blue Fox Porini Textile 001F79Lodam Electronics A/S 001F7AWiWide Inc 001F7BTechNexion Ltd 001F7CWitelcom AS 001F7Dembedded wireless GmbH 001F7EARRIS Group, Inc 001F7FPhabrix Limited 001F80Lucas Holding bv 001F81Accel Semiconductor Corp 001F82Cal-Comp Electronics & Communications Co., Ltd 001F83Teleplan Technology Services Sdn Bhd 001F84Gigle Semiconductor 001F85Apriva ISS, LLC 001F86digEcor 001F87Skydigital Inc 001F88FMS Force Measuring Systems AG 001F89Signalion GmbH 001F8AEllion Digital Inc 001F8BCache IQ 001F8CCCS Inc 001F8DIngenieurbuero Stark GmbH und Ko. KG 001F8EMetris USA Inc 001F8FShanghai Bellmann Digital Source Co.,Ltd 001F90Actiontec Electronics, Inc 001F91DBS Lodging Technologies, LLC 001F92VideoIQ, Inc 001F93Xiotech Corporation 001F94Lascar Electronics Ltd 001F95SAGEM COMMUNICATION 001F96APROTECH CO.LTD 001F97BERTANA SRL 001F98DAIICHI-DENTSU LTD 001F99SERONICS co.ltd 001F9ANortel Networks 001F9BPOSBRO 001F9CLEDCO 001F9DCISCO SYSTEMS, INC 001F9ECISCO SYSTEMS, INC 001F9FThomson Telecom Belgium 001FA0A10 Networks 001FA1Gtran Inc 001FA2Datron World Communications, Inc 001FA3T&W Electronics(Shenzhen)Co.,Ltd 001FA4ShenZhen Gongjin Electronics Co.,Ltd 001FA5Blue-White Industries 001FA6Stilo srl 001FA7Sony Computer Entertainment Inc 001FA8Smart Energy Instruments Inc 001FA9Atlanta DTH, Inc 001FAATaseon, Inc 001FABI.S HIGH TECH.INC 001FACGoodmill Systems Ltd 001FADBrown Innovations, Inc 001FAEBlick South Africa (Pty) Ltd 001FAFNextIO, Inc 001FB0TimeIPS, Inc 001FB1Cybertech Inc 001FB2Sontheim Industrie Elektronik GmbH 001FB32Wire 001FB4SmartShare Systems 001FB5I/O Interconnect Inc 001FB6Chi Lin Technology Co., Ltd 001FB7WiMate Technologies Corp 001FB8Universal Remote Control, Inc 001FB9Paltronics 001FBABoYoung Tech. & Marketing, Inc 001FBBXenatech Co.,LTD 001FBCEVGA Corporation 001FBDKyocera Wireless Corp 001FBEShenzhen Mopnet Industrial Co.,Ltd 001FBFFulhua Microelectronics Corp. Taiwan Branch 001FC0Control Express Finland Oy 001FC1Hanlong Technology Co.,LTD 001FC2Jow Tong Technology Co Ltd 001FC3SmartSynch, Inc 001FC4ARRIS Group, Inc 001FC5Nintendo Co., Ltd 001FC6ASUSTek COMPUTER INC 001FC7Casio Hitachi Mobile Comunications Co., Ltd 001FC8Up-Today Industrial Co., Ltd 001FC9CISCO SYSTEMS, INC 001FCACISCO SYSTEMS, INC 001FCBNIW Solutions 001FCCSamsung Electronics Co.,Ltd 001FCDSamsung Electronics 001FCEQTECH LLC 001FCFMSI Technology GmbH 001FD0GIGA-BYTE TECHNOLOGY CO.,LTD 001FD1OPTEX CO.,LTD 001FD2COMMTECH TECHNOLOGY MACAO COMMERCIAL OFFSHORE LTD 001FD3RIVA Networks Inc 001FD44IPNET, INC 001FD5MICRORISC s.r.o 001FD6Shenzhen Allywll 001FD7TELERAD SA 001FD8A-TRUST COMPUTER CORPORATION 001FD9RSD Communications Ltd 001FDANortel Networks 001FDBNetwork Supply Corp., 001FDCMobile Safe Track Ltd 001FDDGDI LLC 001FDENokia Danmark A/S 001FDFNokia Danmark A/S 001FE0EdgeVelocity Corp 001FE1Hon Hai Precision Ind. Co., Ltd 001FE2Hon Hai Precision Ind. Co., Ltd 001FE3LG Electronics 001FE4Sony Ericsson Mobile Communications 001FE5In-Circuit GmbH 001FE6Alphion Corporation 001FE7Simet 001FE8KURUSUGAWA Electronics Industry Inc, 001FE9Printrex, Inc 001FEAApplied Media Technologies Corporation 001FEBTrio Datacom Pty Ltd 001FECSynapse Électronique 001FEDTecan Systems Inc 001FEEubisys technologies GmbH 001FEFSHINSEI INDUSTRIES CO.,LTD 001FF0Audio Partnership 001FF1Paradox Hellas S.A 001FF2VIA Technologies, Inc 001FF3Apple 001FF4Power Monitors, Inc 001FF5Kongsberg Defence & Aerospace 001FF6PS Audio International 001FF7Nakajima All Precision Co., Ltd 001FF8Siemens AG, Sector Industry, Drive Technologies, Motion Control Systems 001FF9Advanced Knowledge Associates 001FFACoretree, Co, Ltd 001FFBGreen Packet Bhd 001FFCRiccius+Sohn GmbH 001FFDIndigo Mobile Technologies Corp 001FFEHPN Supply Chain 001FFFRespironics, Inc 002000LEXMARK INTERNATIONAL, INC 002001DSP SOLUTIONS, INC 002002SERITECH ENTERPRISE CO., LTD 002003PIXEL POWER LTD 002004YAMATAKE-HONEYWELL CO., LTD 002005SIMPLE TECHNOLOGY 002006GARRETT COMMUNICATIONS, INC 002007SFA, INC 002008CABLE & COMPUTER TECHNOLOGY 002009PACKARD BELL ELEC., INC 00200ASOURCE-COMM CORP 00200BOCTAGON SYSTEMS CORP 00200CADASTRA SYSTEMS CORP 00200DCARL ZEISS 00200ESATELLITE TECHNOLOGY MGMT, INC 00200FTANBAC CO., LTD 002010JEOL SYSTEM TECHNOLOGY CO. LTD 002011CANOPUS CO., LTD 002012CAMTRONICS MEDICAL SYSTEMS 002013DIVERSIFIED TECHNOLOGY, INC 002014GLOBAL VIEW CO., LTD 002015ACTIS COMPUTER SA 002016SHOWA ELECTRIC WIRE & CABLE CO 002017ORBOTECH 002018CIS TECHNOLOGY INC 002019OHLER GmbH 00201AMRV Communications, Inc 00201BNORTHERN TELECOM/NETWORK 00201CEXCEL, INC 00201DKATANA PRODUCTS 00201ENETQUEST CORPORATION 00201FBEST POWER TECHNOLOGY, INC 002020MEGATRON COMPUTER INDUSTRIES PTY, LTD 002021ALGORITHMS SOFTWARE PVT. LTD 002022NMS Communications 002023T.C. TECHNOLOGIES PTY. LTD 002024PACIFIC COMMUNICATION SCIENCES 002025CONTROL TECHNOLOGY, INC 002026AMKLY SYSTEMS, INC 002027MING FORTUNE INDUSTRY CO., LTD 002028WEST EGG SYSTEMS, INC 002029TELEPROCESSING PRODUCTS, INC 00202AN.V. DZINE 00202BADVANCED TELECOMMUNICATIONS MODULES, LTD 00202CWELLTRONIX CO., LTD 00202DTAIYO CORPORATION 00202EDAYSTAR DIGITAL 00202FZETA COMMUNICATIONS, LTD 002030ANALOG & DIGITAL SYSTEMS 002031Tattile SRL 002032ALCATEL TAISEL 002033SYNAPSE TECHNOLOGIES, INC 002034ROTEC INDUSTRIEAUTOMATION GMBH 002035IBM Corp 002036BMC SOFTWARE 002037SEAGATE TECHNOLOGY 002038VME MICROSYSTEMS INTERNATIONAL CORPORATION 002039SCINETS 00203ADIGITAL BI0METRICS INC 00203BWISDM LTD 00203CEUROTIME AB 00203DHoneywell ECC 00203ELogiCan Technologies, Inc 00203FJUKI CORPORATION 002040ARRIS Group, Inc 002041DATA NET 002042DATAMETRICS CORP 002043NEURON COMPANY LIMITED 002044GENITECH PTY LTD 002045ION Networks, Inc 002046CIPRICO, INC 002047STEINBRECHER CORP 002048Marconi Communications 002049COMTRON, INC 00204APRONET GMBH 00204BAUTOCOMPUTER CO., LTD 00204CMITRON COMPUTER PTE LTD 00204DINOVIS GMBH 00204ENETWORK SECURITY SYSTEMS, INC 00204FDEUTSCHE AEROSPACE AG 002050KOREA COMPUTER INC 002051Verilink Corporation 002052RAGULA SYSTEMS 002053HUNTSVILLE MICROSYSTEMS, INC 002054Sycamore Networks 002055ALTECH CO., LTD 002056NEOPRODUCTS 002057TITZE DATENTECHNIK GmbH 002058ALLIED SIGNAL INC 002059MIRO COMPUTER PRODUCTS AG 00205ACOMPUTER IDENTICS 00205BKentrox, LLC 00205CInterNet Systems of Florida, Inc 00205DNANOMATIC OY 00205ECASTLE ROCK, INC 00205FGAMMADATA COMPUTER GMBH 002060ALCATEL ITALIA S.p.A 002061GarrettCom, Inc 002062SCORPION LOGIC, LTD 002063WIPRO INFOTECH LTD 002064PROTEC MICROSYSTEMS, INC 002065SUPERNET NETWORKING INC 002066GENERAL MAGIC, INC 002067 002068ISDYNE 002069ISDN SYSTEMS CORPORATION 00206AOSAKA COMPUTER CORP 00206BKONICA MINOLTA HOLDINGS, INC 00206CEVERGREEN TECHNOLOGY CORP 00206DDATA RACE, INC 00206EXACT, INC 00206FFLOWPOINT CORPORATION 002070HYNET, LTD 002071IBR GMBH 002072WORKLINK INNOVATIONS 002073FUSION SYSTEMS CORPORATION 002074SUNGWOON SYSTEMS 002075MOTOROLA COMMUNICATION ISRAEL 002076REUDO CORPORATION 002077KARDIOS SYSTEMS CORP 002078RUNTOP, INC 002079MIKRON GMBH 00207AWiSE Communications, Inc 00207BIntel Corporation 00207CAUTEC GmbH 00207DADVANCED COMPUTER APPLICATIONS 00207EFINECOM Co., Ltd 00207FKYOEI SANGYO CO., LTD 002080SYNERGY (UK) LTD 002081TITAN ELECTRONICS 002082ONEAC CORPORATION 002083PRESTICOM INCORPORATED 002084OCE PRINTING SYSTEMS, GMBH 002085Eaton Corporation 002086MICROTECH ELECTRONICS LIMITED 002087MEMOTEC, INC 002088GLOBAL VILLAGE COMMUNICATION 002089T3PLUS NETWORKING, INC 00208ASONIX COMMUNICATIONS, LTD 00208BLAPIS TECHNOLOGIES, INC 00208CGALAXY NETWORKS, INC 00208DCMD TECHNOLOGY 00208ECHEVIN SOFTWARE ENG. LTD 00208FECI TELECOM LTD 002090ADVANCED COMPRESSION TECHNOLOGY, INC 002091J125, NATIONAL SECURITY AGENCY 002092CHESS ENGINEERING B.V 002093LANDINGS TECHNOLOGY CORP 002094CUBIX CORPORATION 002095RIVA ELECTRONICS 002096Invensys 002097APPLIED SIGNAL TECHNOLOGY 002098HECTRONIC AB 002099BON ELECTRIC CO., LTD 00209ATHE 3DO COMPANY 00209BERSAT ELECTRONIC GMBH 00209CPRIMARY ACCESS CORP 00209DLIPPERT AUTOMATIONSTECHNIK 00209EBROWN'S OPERATING SYSTEM SERVICES, LTD 00209FMERCURY COMPUTER SYSTEMS, INC 0020A0OA LABORATORY CO., LTD 0020A1DOVATRON 0020A2GALCOM NETWORKING LTD 0020A3Harmonic, Inc 0020A4MULTIPOINT NETWORKS 0020A5API ENGINEERING 0020A6Proxim Wireless 0020A7PAIRGAIN TECHNOLOGIES, INC 0020A8SAST TECHNOLOGY CORP 0020A9WHITE HORSE INDUSTRIAL 0020AAEricsson Television Limited 0020ABMICRO INDUSTRIES CORP 0020ACINTERFLEX DATENSYSTEME GMBH 0020ADLINQ SYSTEMS 0020AEORNET DATA COMMUNICATION TECH 0020AF3COM CORPORATION 0020B0GATEWAY DEVICES, INC 0020B1COMTECH RESEARCH INC 0020B2GKD Gesellschaft Fur Kommunikation Und Datentechnik 0020B3Tattile SRL 0020B4TERMA ELEKTRONIK AS 0020B5YASKAWA ELECTRIC CORPORATION 0020B6AGILE NETWORKS, INC 0020B7NAMAQUA COMPUTERWARE 0020B8PRIME OPTION, INC 0020B9METRICOM, INC 0020BACENTER FOR HIGH PERFORMANCE 0020BBZAX CORPORATION 0020BCLong Reach Networks Pty Ltd 0020BDNIOBRARA R & D CORPORATION 0020BELAN ACCESS CORP 0020BFAEHR TEST SYSTEMS 0020C0PULSE ELECTRONICS, INC 0020C1SAXA, Inc 0020C2TEXAS MEMORY SYSTEMS, INC 0020C3COUNTER SOLUTIONS LTD 0020C4INET,INC 0020C5EAGLE TECHNOLOGY 0020C6NECTEC 0020C7AKAI Professional M.I. Corp 0020C8LARSCOM INCORPORATED 0020C9VICTRON BV 0020CADIGITAL OCEAN 0020CBPRETEC ELECTRONICS CORP 0020CCDIGITAL SERVICES, LTD 0020CDHYBRID NETWORKS, INC 0020CELOGICAL DESIGN GROUP, INC 0020CFTEST & MEASUREMENT SYSTEMS INC 0020D0VERSALYNX CORPORATION 0020D1MICROCOMPUTER SYSTEMS (M) SDN 0020D2RAD DATA COMMUNICATIONS, LTD 0020D3OST (OUEST STANDARD TELEMATIQU 0020D4CABLETRON - ZEITTNET INC 0020D5VIPA GMBH 0020D6BREEZECOM 0020D7JAPAN MINICOMPUTER SYSTEMS CO., Ltd 0020D8Nortel Networks 0020D9PANASONIC TECHNOLOGIES, INC./MIECO-US 0020DAAlcatel North America ESD 0020DBXNET TECHNOLOGY, INC 0020DCDENSITRON TAIWAN LTD 0020DDCybertec Pty Ltd 0020DEJAPAN DIGITAL LABORAT'Y CO.LTD 0020DFKYOSAN ELECTRIC MFG. CO., LTD 0020E0Actiontec Electronics, Inc 0020E1ALAMAR ELECTRONICS 0020E2INFORMATION RESOURCE ENGINEERING 0020E3MCD KENCOM CORPORATION 0020E4HSING TECH ENTERPRISE CO., LTD 0020E5APEX DATA, INC 0020E6LIDKOPING MACHINE TOOLS AB 0020E7B&W NUCLEAR SERVICE COMPANY 0020E8DATATREK CORPORATION 0020E9DANTEL 0020EAEFFICIENT NETWORKS, INC 0020EBCINCINNATI MICROWAVE, INC 0020ECTECHWARE SYSTEMS CORP 0020EDGIGA-BYTE TECHNOLOGY CO., LTD 0020EEGTECH CORPORATION 0020EFUSC CORPORATION 0020F0UNIVERSAL MICROELECTRONICS CO 0020F1ALTOS INDIA LIMITED 0020F2Oracle Corporation 0020F3RAYNET CORPORATION 0020F4SPECTRIX CORPORATION 0020F5PANDATEL AG 0020F6NET TEK AND KARLNET, INC 0020F7CYBERDATA CORPORATION 0020F8CARRERA COMPUTERS, INC 0020F9PARALINK NETWORKS, INC 0020FAGDE SYSTEMS, INC 0020FBOCTEL COMMUNICATIONS CORP 0020FCMATROX 0020FDITV TECHNOLOGIES, INC 0020FETOPWARE INC. / GRAND COMPUTER 0020FFSYMMETRICAL TECHNOLOGIES 002100GemTek Technology Co., Ltd 002101Aplicaciones Electronicas Quasar (AEQ) 002102UpdateLogic Inc 002103GHI Electronics, LLC 002104Gigaset Communications GmbH 002105Alcatel-Lucent 002106RIM Testing Services 002107Seowonintech Co Ltd 002108Nokia Danmark A/S 002109Nokia Danmark A/S 00210Abyd:sign Corporation 00210BGEMINI TRAZE RFID PVT. LTD 00210CCymtec Systems, Inc 00210DSAMSIN INNOTEC 00210EOrpak Systems L.T.D 00210FCernium Corp 002110Clearbox Systems 002111Uniphone Inc 002112WISCOM SYSTEM CO.,LTD 002113Padtec S/A 002114Hylab Technology Inc 002115PHYWE Systeme GmbH & Co. KG 002116Transcon Electronic Systems, spol. s r. o 002117Tellord 002118Athena Tech, Inc 002119Samsung Electro-Mechanics 00211ALInTech Corporation 00211BCISCO SYSTEMS, INC 00211CCISCO SYSTEMS, INC 00211DDataline AB 00211EARRIS Group, Inc 00211FSHINSUNG DELTATECH CO.,LTD 002120Sequel Technologies 002121VRmagic GmbH 002122Chip-pro Ltd 002123Aerosat Avionics 002124Optos Plc 002125KUK JE TONG SHIN Co.,LTD 002126Shenzhen Torch Equipment Co., Ltd 002127TP-LINK Technology Co., Ltd 002128Oracle Corporation 002129Cisco-Linksys, LLC 00212AAudiovox Corporation 00212BMSA Auer 00212CSemIndia System Private Limited 00212DSCIMOLEX CORPORATION 00212Edresden-elektronik 00212FPhoebe Micro Inc 002130Keico Hightech Inc 002131Blynke Inc 002132Masterclock, Inc 002133Building B, Inc 002134Brandywine Communications 002135ALCATEL-LUCENT 002136ARRIS Group, Inc 002137Bay Controls, LLC 002138Cepheid 002139Escherlogic Inc 00213AWinchester Systems Inc 00213BBerkshire Products, Inc 00213CAliphCom 00213DCermetek Microelectronics, Inc 00213ETomTom 00213FA-Team Technology Ltd 002140EN Technologies Inc 002141RADLIVE 002142Advanced Control Systems doo 002143ARRIS Group, Inc 002144SS Telecoms 002145Semptian Technologies Ltd 002146Sanmina-SCI 002147Nintendo Co., Ltd 002148Kaco Solar Korea 002149China Daheng Group ,Inc 00214APixel Velocity, Inc 00214BShenzhen HAMP Science & Technology Co.,Ltd 00214CSAMSUNG ELECTRONICS CO., LTD 00214DGuangzhou Skytone Transmission Technology Com. Ltd 00214EGS Yuasa Power Supply Ltd 00214FALPS Electric Co., Ltd 002150EYEVIEW ELECTRONICS 002151Millinet Co., Ltd 002152General Satellite Research & Development Limited 002153SeaMicro Inc 002154D-TACQ Solutions Ltd 002155CISCO SYSTEMS, INC 002156CISCO SYSTEMS, INC 002157National Datacast, Inc 002158Style Flying Technology Co 002159Juniper Networks 00215AHewlett-Packard Company 00215BInotive 00215CIntel Corporate 00215DIntel Corporate 00215EIBM Corp 00215FIHSE GmbH 002160Hidea Solutions Co. Ltd 002161Yournet Inc 002162Nortel 002163ASKEY COMPUTER CORP 002164Special Design Bureau for Seismic Instrumentation 002165Presstek Inc 002166NovAtel Inc 002167HWA JIN T&I Corp 002168iVeia, LLC 002169Prologix, LLC 00216AIntel Corporate 00216BIntel Corporate 00216CODVA 00216DSoltech Co., Ltd 00216EFunction ATI (Huizhou) Telecommunications Co., Ltd 00216FSymCom, Inc 002170Dell Inc 002171Wesung TNC Co., Ltd 002172Seoultek Valley 002173Ion Torrent Systems, Inc 002174AvaLAN Wireless 002175Pacific Satellite International Ltd 002176YMax Telecom Ltd 002177W. L. Gore & Associates 002178Matuschek Messtechnik GmbH 002179IOGEAR, Inc 00217ASejin Electron, Inc 00217BBastec AB 00217C2Wire 00217DPYXIS S.R.L 00217ETelit Communication s.p.a 00217FIntraco Technology Pte Ltd 002180ARRIS Group, Inc 002181Si2 Microsystems Limited 002182SandLinks Systems, Ltd 002183VATECH HYDRO 002184POWERSOFT SRL 002185MICRO-STAR INT'L CO.,LTD 002186Universal Global Scientific Industrial Co., Ltd 002187Imacs GmbH 002188EMC Corporation 002189AppTech, Inc 00218AElectronic Design and Manufacturing Company 00218BWescon Technology, Inc 00218CTopControl GMBH 00218DAP Router Ind. Eletronica LTDA 00218EMEKICS CO., LTD 00218FAvantgarde Acoustic Lautsprechersysteme GmbH 002190Goliath Solutions 002191D-Link Corporation 002192Baoding Galaxy Electronic Technology Co.,Ltd 002193Videofon MV 002194Ping Communication 002195GWD Media Limited 002196Telsey S.p.A 002197ELITEGROUP COMPUTER SYSTEM 002198Thai Radio Co, LTD 002199Vacon Plc 00219ACambridge Visual Networks Ltd 00219BDell Inc 00219CHoneywld Technology Corp 00219DAdesys BV 00219ESony Ericsson Mobile Communications 00219FSATEL OY 0021A0CISCO SYSTEMS, INC 0021A1CISCO SYSTEMS, INC 0021A2EKE-Electronics Ltd 0021A3Micromint 0021A4Dbii Networks 0021A5ERLPhase Power Technologies Ltd 0021A6Videotec Spa 0021A7Hantle System Co., Ltd 0021A8Telephonics Corporation 0021A9Mobilink Telecom Co.,Ltd 0021AANokia Danmark A/S 0021ABNokia Danmark A/S 0021ACInfrared Integrated Systems Ltd 0021ADNordic ID Oy 0021AEALCATEL-LUCENT FRANCE - WTD 0021AFRadio Frequency Systems 0021B0Tyco Telecommunications 0021B1DIGITAL SOLUTIONS LTD 0021B2Fiberblaze A/S 0021B3Ross Controls 0021B4APRO MEDIA CO., LTD 0021B5Galvanic Ltd 0021B6Triacta Power Technologies Inc 0021B7Lexmark International Inc 0021B8Inphi Corporation 0021B9Universal Devices Inc 0021BATexas Instruments 0021BBRiken Keiki Co., Ltd 0021BCZALA COMPUTER 0021BDNintendo Co., Ltd 0021BECisco, Service Provider Video Technology Group 0021BFHitachi High-Tech Control Systems Corporation 0021C0Mobile Appliance, Inc 0021C1ABB Oy / Medium Voltage Products 0021C2GL Communications Inc 0021C3CORNELL Communications, Inc 0021C4Consilium AB 0021C53DSP Corp 0021C6CSJ Global, Inc 0021C7Russound 0021C8LOHUIS Networks 0021C9Wavecom Asia Pacific Limited 0021CAART System Co., Ltd 0021CBSMS TECNOLOGIA ELETRONICA LTDA 0021CCFlextronics International 0021CDLiveTV 0021CENTC-Metrotek 0021CFThe Crypto Group 0021D0Global Display Solutions Spa 0021D1Samsung Electronics Co.,Ltd 0021D2Samsung Electronics Co.,Ltd 0021D3BOCOM SECURITY(ASIA PACIFIC) LIMITED 0021D4Vollmer Werke GmbH 0021D5X2E GmbH 0021D6LXI Consortium 0021D7CISCO SYSTEMS, INC 0021D8CISCO SYSTEMS, INC 0021D9SEKONIC CORPORATION 0021DAAutomation Products Group Inc 0021DBSantachi Video Technology (Shenzhen) Co., Ltd 0021DCTECNOALARM S.r.l 0021DDNorthstar Systems Corp 0021DEFirepro Wireless 0021DFMartin Christ GmbH 0021E0CommAgility Ltd 0021E1Nortel Networks 0021E2Creative Electronic GmbH 0021E3SerialTek LLC 0021E4I-WIN 0021E5Display Solution AG 0021E6Starlight Video Limited 0021E7Informatics Services Corporation 0021E8Murata Manufacturing Co., Ltd 0021E9Apple 0021EABystronic Laser AG 0021EBESP SYSTEMS, LLC 0021ECSolutronic GmbH 0021EDTelegesis 0021EEFull Spectrum Inc 0021EFKapsys 0021F0EW3 Technologies LLC 0021F1Tutus Data AB 0021F2EASY3CALL Technology Limited 0021F3Si14 SpA 0021F4INRange Systems, Inc 0021F5Western Engravers Supply, Inc 0021F6Oracle Corporation 0021F7HPN Supply Chain 0021F8Enseo, Inc 0021F9WIRECOM Technologies 0021FAA4SP Technologies Ltd 0021FBLG Electronics 0021FCNokia Danmark A/S 0021FDDSTA S.L 0021FENokia Danmark A/S 0021FFCyfrowy Polsat SA 002200IBM Corp 002201Aksys Networks Inc 002202Excito Elektronik i Skåne AB 002203Glensound Electronics Ltd 002204KORATEK 002205WeLink Solutions, Inc 002206Cyberdyne Inc 002207Inteno Broadband Technology AB 002208Certicom Corp 002209Omron Healthcare Co., Ltd 00220AOnLive, Inc 00220BNational Source Coding Center 00220CCISCO SYSTEMS, INC 00220DCISCO SYSTEMS, INC 00220EIndigo Security Co., Ltd 00220FMoCA (Multimedia over Coax Alliance) 002210ARRIS Group, Inc 002211Rohati Systems 002212CAI Networks, Inc 002213PCI CORPORATION 002214RINNAI KOREA 002215ASUSTek COMPUTER INC 002216SHIBAURA VENDING MACHINE CORPORATION 002217Neat Electronics 002218Verivue Inc 002219Dell Inc 00221AAudio Precision 00221BMorega Systems 00221C 00221DFreegene Technology LTD 00221EMedia Devices Co., Ltd 00221FeSang Technologies Co., Ltd 002220Mitac Technology Corp 002221ITOH DENKI CO,LTD 002222Schaffner Deutschland GmbH 002223TimeKeeping Systems, Inc 002224Good Will Instrument Co., Ltd 002225Thales Avionics Ltd 002226Avaak, Inc 002227uv-electronic GmbH 002228Breeze Innovations Ltd 002229Compumedics Ltd 00222ASoundEar A/S 00222BNucomm, Inc 00222CCeton Corp 00222DSMC Networks Inc 00222Emaintech GmbH 00222FOpen Grid Computing, Inc 002230FutureLogic Inc 002231SMT&C Co., Ltd 002232Design Design Technology Ltd 002233ADB Broadband Italia 002234Corventis Inc 002235Strukton Systems bv 002236VECTOR SP. Z O.O 002237Shinhint Group 002238LOGIPLUS 002239Indiana Life Sciences Incorporated 00223AScientific Atlanta, Cisco SPVT Group 00223BCommunication Networks, LLC 00223CRATIO Entwicklungen GmbH 00223DJumpGen Systems, LLC 00223EIRTrans GmbH 00223FNetgear Inc 002240Universal Telecom S/A 002241Apple 002242Alacron Inc 002243AzureWave Technologies, Inc 002244Chengdu Linkon Communications Device Co., Ltd 002245Leine & Linde AB 002246Evoc Intelligent Technology Co.,Ltd 002247DAC ENGINEERING CO., LTD 002248Microsoft Corporation 002249HOME MULTIENERGY SL 00224ARAYLASE AG 00224BAIRTECH TECHNOLOGIES, INC 00224CNintendo Co., Ltd 00224DMITAC INTERNATIONAL CORP 00224ESEEnergy Corp 00224FByzoro Networks Ltd 002250Point Six Wireless, LLC 002251Lumasense Technologies 002252ZOLL Lifecor Corporation 002253Entorian Technologies 002254Bigelow Aerospace 002255CISCO SYSTEMS, INC 002256CISCO SYSTEMS, INC 0022573Com Europe Ltd 002258Taiyo Yuden Co., Ltd 002259Guangzhou New Postcom Equipment Co.,Ltd 00225AGarde Security AB 00225BTeradici Corporation 00225CMultimedia & Communication Technology 00225DDigicable Network India Pvt. Ltd 00225EUwin Technologies Co.,LTD 00225FLiteon Technology Corporation 002260AFREEY Inc 002261Frontier Silicon Ltd 002262BEP Marine 002263Koos Technical Services, Inc 002264Hewlett-Packard Company 002265Nokia Danmark A/S 002266Nokia Danmark A/S 002267Nortel Networks 002268Hon Hai Precision Ind. Co., Ltd 002269Hon Hai Precision Ind. Co., Ltd 00226AHoneywell 00226BCisco-Linksys, LLC 00226CLinkSprite Technologies, Inc 00226DShenzhen GIEC Electronics Co., Ltd 00226EGowell Electronic Limited 00226F3onedata Technology Co. Ltd 002270ABK North America, LLC 002271Jäger Computergesteuerte Meßtechnik GmbH 002272American Micro-Fuel Device Corp 002273Techway 002274FamilyPhone AB 002275Belkin International Inc 002276Triple EYE B.V 002277NEC Australia Pty Ltd 002278Shenzhen Tongfang Multimedia Technology Co.,Ltd 002279Nippon Conlux Co., Ltd 00227ATelecom Design 00227BApogee Labs, Inc 00227CWoori SMT Co.,ltd 00227DYE DATA INC 00227EChengdu 30Kaitian Communication Industry Co.Ltd 00227FRuckus Wireless 002280A2B Electronics AB 002281Daintree Networks Pty 0022828086 Consultancy 002283Juniper Networks 002284DESAY A&V SCIENCE AND TECHNOLOGY CO.,LTD 002285NOMUS COMM SYSTEMS 002286ASTRON 002287Titan Wireless LLC 002288Sagrad, Inc 002289Optosecurity Inc 00228ATeratronik elektronische systeme gmbh 00228BKensington Computer Products Group 00228CPhoton Europe GmbH 00228DGBS Laboratories LLC 00228ETV-NUMERIC 00228FCNRS 002290CISCO SYSTEMS, INC 002291CISCO SYSTEMS, INC 002292Cinetal 002293ZTE Corporation 002294Kyocera Corporation 002295SGM Technology for lighting spa 002296LinoWave Corporation 002297XMOS Semiconductor 002298Sony Ericsson Mobile Communications 002299SeaMicro Inc 00229ALastar, Inc 00229BAverLogic Technologies, Inc 00229CVerismo Networks Inc 00229DPYUNG-HWA IND.CO.,LTD 00229ESocial Aid Research Co., Ltd 00229FSensys Traffic AB 0022A0Delphi Corporation 0022A1Huawei Symantec Technologies Co.,Ltd 0022A2Xtramus Technologies 0022A3California Eastern Laboratories 0022A42Wire 0022A5Texas Instruments 0022A6Sony Computer Entertainment America 0022A7Tyco Electronics AMP GmbH 0022A8Ouman Oy 0022A9LG Electronics Inc 0022AANintendo Co., Ltd 0022ABShenzhen Turbosight Technology Ltd 0022ACHangzhou Siyuan Tech. Co., Ltd 0022ADTELESIS TECHNOLOGIES, INC 0022AEMattel Inc 0022AFSafety Vision 0022B0D-Link Corporation 0022B1Elbit Systems 0022B24RF Communications Ltd 0022B3Sei S.p.A 0022B4ARRIS Group, Inc 0022B5NOVITA 0022B6Superflow Technologies Group 0022B7GSS Grundig SAT-Systems GmbH 0022B8Norcott 0022B9Analogix Seminconductor, Inc 0022BAHUTH Elektronik Systeme GmbH 0022BBbeyerdynamic GmbH & Co. KG 0022BCJDSU France SAS 0022BDCISCO SYSTEMS, INC 0022BECISCO SYSTEMS, INC 0022BFSieAmp Group of Companies 0022C0Shenzhen Forcelink Electronic Co, Ltd 0022C1Active Storage Inc 0022C2Proview Eletrônica do Brasil LTDA 0022C3Zeeport Technology Inc 0022C4epro GmbH 0022C5INFORSON Co,Ltd 0022C6Sutus Inc 0022C7SEGGER Microcontroller GmbH & Co. KG 0022C8Applied Instruments B.V 0022C9Lenord, Bauer & Co GmbH 0022CAAnviz Biometric Tech. Co., Ltd 0022CBIONODES Inc 0022CCSciLog, Inc 0022CDAred Technology Co., Ltd 0022CECisco, Service Provider Video Technology Group 0022CFPLANEX Communications INC 0022D0Polar Electro Oy 0022D1Albrecht Jung GmbH & Co. KG 0022D2All Earth Comércio de Eletrônicos LTDA 0022D3Hub-Tech 0022D4ComWorth Co., Ltd 0022D5Eaton Corp. Electrical Group Data Center Solutions - Pulizzi 0022D6Cypak AB 0022D7Nintendo Co., Ltd 0022D8Shenzhen GST Security and Safety Technology Limited 0022D9Fortex Industrial Ltd 0022DAANATEK, LLC 0022DBTranslogic Corporation 0022DCVigil Health Solutions Inc 0022DDProtecta Electronics Ltd 0022DEOPPO Digital, Inc 0022DFTAMUZ Monitors 0022E0Atlantic Software Technologies S.r.L 0022E1ZORT Labs, LLC 0022E2WABTEC Transit Division 0022E3Amerigon 0022E4APASS TECHNOLOGY CO., LTD 0022E5Fisher-Rosemount Systems Inc 0022E6Intelligent Data 0022E7WPS Parking Systems 0022E8Applition Co., Ltd 0022E9ProVision Communications 0022EARustelcom Inc 0022EBData Respons A/S 0022ECIDEALBT TECHNOLOGY CORPORATION 0022EDTSI Power Corporation 0022EEAlgo Communication Products Ltd 0022EFiWDL Technologies 0022F03 Greens Aviation Limited 0022F1 0022F2SunPower Corp 0022F3SHARP Corporation 0022F4AMPAK Technology, Inc 0022F5Advanced Realtime Tracking GmbH 0022F6Syracuse Research Corporation 0022F7Conceptronic 0022F8PIMA Electronic Systems Ltd 0022F9Pollin Electronic GmbH 0022FAIntel Corporate 0022FBIntel Corporate 0022FCNokia Danmark A/S 0022FDNokia Danmark A/S 0022FEMicroprocessor Designs Inc 0022FFiWDL Technologies 002300Cayee Computer Ltd 002301Witron Technology Limited 002302Cobalt Digital, Inc 002303LITE-ON IT Corporation 002304CISCO SYSTEMS, INC 002305CISCO SYSTEMS, INC 002306ALPS Electric Co., Ltd 002307FUTURE INNOVATION TECH CO.,LTD 002308Arcadyan Technology Corporation 002309Janam Technologies LLC 00230AARBURG GmbH & Co KG 00230BARRIS Group, Inc 00230CCLOVER ELECTRONICS CO.,LTD 00230DNortel Networks 00230EGorba AG 00230FHirsch Electronics Corporation 002310LNC Technology Co., Ltd 002311Gloscom Co., Ltd 002312Apple 002313Qool Technologies Ltd 002314Intel Corporate 002315Intel Corporate 002316KISAN ELECTRONICS CO 002317Lasercraft Inc 002318Toshiba 002319Sielox LLC 00231AITF Co., Ltd 00231BDanaher Motion - Kollmorgen 00231CFourier Systems Ltd 00231DDeltacom Electronics Ltd 00231ECezzer Multimedia Technologies 00231FGuangda Electronic & Telecommunication Technology Development Co., Ltd 002320Nicira Networks 002321Avitech International Corp 002322KISS Teknical Solutions, Inc 002323Zylin AS 002324G-PRO COMPUTER 002325IOLAN Holding 002326Fujitsu Limited 002327Shouyo Electronics CO., LTD 002328ALCON TELECOMMUNICATIONS CO., LTD 002329DDRdrive LLC 00232Aeonas IT-Beratung und -Entwicklung GmbH 00232BIRD A/S 00232CSenticare 00232DSandForce 00232EKedah Electronics Engineering, LLC 00232FAdvanced Card Systems Ltd 002330DIZIPIA, INC 002331Nintendo Co., Ltd 002332Apple 002333CISCO SYSTEMS, INC 002334CISCO SYSTEMS, INC 002335Linkflex Co.,Ltd 002336METEL s.r.o 002337Global Star Solutions ULC 002338OJ-Electronics A/S 002339Samsung Electronics 00233ASamsung Electronics Co.,Ltd 00233BC-Matic Systems Ltd 00233CAlflex 00233DNovero holding B.V 00233EAlcatel-Lucent-IPD 00233FPurechoice Inc 002340MiX Telematics 002341Siemens AB, Infrastructure & Cities, Building Technologies Division, IC BT SSP SP BA PR 002342Coffee Equipment Company 002343TEM AG 002344Objective Interface Systems, Inc 002345Sony Ericsson Mobile Communications 002346Vestac 002347ProCurve Networking by HP 002348SAGEM COMMUNICATION 002349Helmholtz Centre Berlin for Material and Energy 00234A 00234BInyuan Technology Inc 00234CKTC AB 00234DHon Hai Precision Ind. Co., Ltd 00234EHon Hai Precision Ind. Co., Ltd 00234FLuminous Power Technologies Pvt. Ltd 002350LynTec 0023512Wire 002352DATASENSOR S.p.A 002353F E T Elettronica snc 002354ASUSTek COMPUTER INC 002355Kinco Automation(Shanghai) Ltd 002356Packet Forensics LLC 002357Pitronot Technologies and Engineering P.T.E. Ltd 002358SYSTEL SA 002359Benchmark Electronics ( Thailand ) Public Company Limited 00235ACOMPAL INFORMATION (KUNSHAN) CO., Ltd 00235BGulfstream 00235CAprius, Inc 00235DCISCO SYSTEMS, INC 00235ECISCO SYSTEMS, INC 00235FSilicon Micro Sensors GmbH 002360Lookit Technology Co., Ltd 002361Unigen Corporation 002362Goldline Controls 002363Zhuhai RaySharp Technology Co., Ltd 002364Power Instruments Pte Ltd 002365ELKA-Elektronik GmbH 002366Beijing Siasun Electronic System Co.,Ltd 002367UniControls a.s 002368Motorola 002369Cisco-Linksys, LLC 00236ASmartRG Inc 00236BXembedded, Inc 00236CApple 00236DResMed Ltd 00236EBurster GmbH & Co KG 00236FDAQ System 002370Snell 002371SOAM Systel 002372MORE STAR INDUSTRIAL GROUP LIMITED 002373GridIron Systems, Inc 002374ARRIS Group, Inc 002375ARRIS Group, Inc 002376HTC Corporation 002377Isotek Electronics Ltd 002378GN Netcom A/S 002379Union Business Machines Co. Ltd 00237ARIM 00237BWHDI LLC 00237CNEOTION 00237DHewlett-Packard Company 00237EELSTER GMBH 00237FPLANTRONICS, INC 002380Nanoteq 002381Lengda Technology(Xiamen) Co.,Ltd 002382Lih Rong Electronic Enterprise Co., Ltd 002383InMage Systems Inc 002384GGH Engineering s.r.l 002385ANTIPODE 002386Tour & Andersson AB 002387ThinkFlood, Inc 002388V.T. Telematica S.p.a 002389HANGZHOU H3C Technologies Co., Ltd 00238ACiena Corporation 00238BQuanta Computer Inc 00238C 00238DTechno Design Co., Ltd 00238EPirelli Tyre S.p.A 00238FNIDEC COPAL CORPORATION 002390Algolware Corporation 002391Maxian 002392Proteus Industries Inc 002393AJINEXTEK 002394Samjeon 002395ARRIS Group, Inc 002396ANDES TECHNOLOGY CORPORATION 002397Westell Technologies Inc 002398Sky Control 002399VD Division, Samsung Electronics Co 00239AEasyData Hardware GmbH 00239BElster Solutions, LLC 00239CJuniper Networks 00239DMapower Electronics Co., Ltd 00239EJiangsu Lemote Technology Corporation Limited 00239FInstitut für Prüftechnik 0023A0Hana CNS Co., LTD 0023A1Trend Electronics Ltd 0023A2ARRIS Group, Inc 0023A3ARRIS Group, Inc 0023A4New Concepts Development Corp 0023A5SageTV, LLC 0023A6E-Mon 0023A7Redpine Signals, Inc 0023A8Marshall Electronics 0023A9Beijing Detianquan Electromechanical Equipment Co., Ltd 0023AAHFR, Inc 0023ABCISCO SYSTEMS, INC 0023ACCISCO SYSTEMS, INC 0023ADXmark Corporation 0023AEDell Inc 0023AFARRIS Group, Inc 0023B0COMXION Technology Inc 0023B1Longcheer Technology (Singapore) Pte Ltd 0023B2Intelligent Mechatronic Systems Inc 0023B3Lyyn AB 0023B4Nokia Danmark A/S 0023B5ORTANA LTD 0023B6SECURITE COMMUNICATIONS / HONEYWELL 0023B7Q-Light Co., Ltd 0023B8Sichuan Jiuzhou Electronic Technology Co.,Ltd 0023B9EADS Deutschland GmbH 0023BAChroma 0023BBSchmitt Industries 0023BCEQ-SYS GmbH 0023BDDigital Ally, Inc 0023BECisco SPVTG 0023BFMainpine, Inc 0023C0Broadway Networks 0023C1Securitas Direct AB 0023C2SAMSUNG Electronics. Co. LTD 0023C3LogMeIn, Inc 0023C4Lux Lumen 0023C5Radiation Safety and Control Services Inc 0023C6SMC Corporation 0023C7AVSystem 0023C8TEAM-R 0023C9Sichuan Tianyi Information Science & Technology Stock CO.,LTD 0023CABehind The Set, LLC 0023CBShenzhen Full-join Technology Co.,Ltd 0023CCNintendo Co., Ltd 0023CDTP-LINK TECHNOLOGIES CO., LTD 0023CEKITA DENSHI CORPORATION 0023CFCUMMINS-ALLISON CORP 0023D0Uniloc USA Inc 0023D1TRG 0023D2Inhand Electronics, Inc 0023D3AirLink WiFi Networking Corp 0023D4Texas Instruments 0023D5WAREMA electronic GmbH 0023D6Samsung Electronics Co.,LTD 0023D7Samsung Electronics 0023D8Ball-It Oy 0023D9Banner Engineering 0023DAIndustrial Computer Source (Deutschland)GmbH 0023DBsaxnet gmbh 0023DCBenein, Inc 0023DDELGIN S.A 0023DEAnsync Inc 0023DFApple 0023E0INO Therapeutics LLC 0023E1Cavena Image Products AB 0023E2SEA Signalisation 0023E3Microtronic AG 0023E4IPnect co. ltd 0023E5IPaXiom Networks 0023E6Pirkus, Inc 0023E7Hinke A/S 0023E8Demco Corp 0023E9F5 Networks, Inc 0023EACISCO SYSTEMS, INC 0023EBCISCO SYSTEMS, INC 0023ECAlgorithmix GmbH 0023EDARRIS Group, Inc 0023EEARRIS Group, Inc 0023EFZuend Systemtechnik AG 0023F0Shanghai Jinghan Weighing Apparatus Co. Ltd 0023F1Sony Ericsson Mobile Communications 0023F2TVLogic 0023F3Glocom, Inc 0023F4Masternaut 0023F5WILO SE 0023F6Softwell Technology Co., Ltd 0023F7 0023F8ZyXEL Communications Corporation 0023F9Double-Take Software, INC 0023FARG Nets, Inc 0023FBIP Datatel, LLC 0023FCUltra Stereo Labs, Inc 0023FDAFT Atlas Fahrzeugtechnik GmbH 0023FEBiodevices, SA 0023FFBeijing HTTC Technology Ltd 002400Nortel Networks 002401D-Link Corporation 002402Op-Tection GmbH 002403Nokia Danmark A/S 002404Nokia Danmark A/S 002405Dilog Nordic AB 002406Pointmobile 002407TELEM SAS 002408Pacific Biosciences 002409The Toro Company 00240AUS Beverage Net 00240BVirtual Computer Inc 00240CDELEC GmbH 00240DOnePath Networks LTD 00240EInventec Besta Co., Ltd 00240FIshii Tool & Engineering Corporation 002410NUETEQ Technology,Inc 002411PharmaSmart LLC 002412Benign Technologies Co, Ltd 002413CISCO SYSTEMS, INC 002414CISCO SYSTEMS, INC 002415Magnetic Autocontrol GmbH 002416Any Use 002417Thomson Telecom Belgium 002418Nextwave Semiconductor 002419 00241ARed Beetle Inc 00241BiWOW Communications Pte Ltd 00241CFuGang Electronic (DG) Co.,Ltd 00241DGIGA-BYTE TECHNOLOGY CO.,LTD 00241ENintendo Co., Ltd 00241FDCT-Delta GmbH 002420NetUP Inc 002421MICRO-STAR INT'L CO., LTD 002422Knapp Logistik Automation GmbH 002423AzureWave Technologies (Shanghai) Inc 002424Axis Network Technology 002425Shenzhenshi chuangzhicheng Technology Co.,Ltd 002426NOHMI BOSAI LTD 002427SSI COMPUTER CORP 002428EnergyICT 002429MK MASTER INC 00242AHittite Microwave Corporation 00242BHon Hai Precision Ind.Co.,Ltd 00242CHon Hai Precision Ind. Co., Ltd 00242EDatastrip Inc 00242FMicron 002430Ruby Tech Corp 002431Uni-v co.,ltd 002432Neostar Technology Co.,LTD 002433Alps Electric Co., Ltd 002434Lectrosonics, Inc 002435WIDE CORPORATION 002436Apple 002437Motorola - BSG 002438Brocade Communications Systems, Inc 002439Digital Barriers Advanced Technologies 00243ALudl Electronic Products 00243BCSSI (S) Pte Ltd 00243CS.A.A.A 00243DEmerson Appliance Motors and Controls 00243FStorwize, Inc 002440Halo Monitoring, Inc 002441Wanzl Metallwarenfabrik GmbH 002442Axona Limited 002443Nortel Networks 002444Nintendo Co., Ltd 002445CommScope Canada Inc 002446MMB Research Inc 002447Kaztek Systems 002448SpiderCloud Wireless, Inc 002449Shen Zhen Lite Star Electronics Technology Co., Ltd 00244AVoyant International 00244BPERCEPTRON INC 00244CSolartron Metrology Ltd 00244DHokkaido Electronics Corporation 00244ERadChips, Inc 00244FAsantron Technologies Ltd 002450CISCO SYSTEMS, INC 002451CISCO SYSTEMS, INC 002452Silicon Software GmbH 002453Initra d.o.o 002454Samsung Electronics CO., LTD 002455MuLogic BV 0024562Wire 002458PA Bastion CC 002459ABB STOTZ-KONTAKT GmbH 00245ANanjing Panda Electronics Company Limited 00245BRAIDON TECHNOLOGY, INC 00245CDesign-Com Technologies Pty. Ltd 00245DTerberg besturingstechniek B.V 00245EHivision Co.,ltd 00245FVine Telecom CO.,Ltd 002460Giaval Science Development Co. Ltd 002461Shin Wang Tech 002462Rayzone Corporation 002463Phybridge Inc 002464Bridge Technologies Co AS 002465Elentec 002466Unitron nv 002467AOC International (Europe) GmbH 002468Sumavision Technologies Co.,Ltd 002469Smart Doorphones 00246ASolid Year Co., Ltd 00246BCovia, Inc 00246CARUBA NETWORKS, INC 00246DWeinzierl Engineering GmbH 00246EPhihong USA Corp 00246FOnda Communication spa 002470AUROTECH ultrasound AS 002471Fusion MultiSystems dba Fusion-io 002472ReDriven Power Inc 0024733Com Europe Ltd 002474Autronica Fire And Securirty 002475Compass System(Embedded Dept.) 002476TAP.tv 002477Tibbo Technology 002478Mag Tech Electronics Co Limited 002479Optec Displays, Inc 00247AFU YI CHENG Technology Co., Ltd 00247BActiontec Electronics, Inc 00247CNokia Danmark A/S 00247DNokia Danmark A/S 00247EUniversal Global Scientific Industrial Co., Ltd 00247FNortel Networks 002480Meteocontrol GmbH 002481Hewlett-Packard Company 002482Ruckus Wireless 002483LG Electronics 002484Bang and Olufsen Medicom a/s 002485ConteXtream Ltd 002486DesignArt Networks 002487Blackboard Inc 002488Centre For Development Of Telematics 002489Vodafone Omnitel N.V 00248AKaga Electronics Co., Ltd 00248BHYBUS CO., LTD 00248CASUSTek COMPUTER INC 00248DSony Computer Entertainment Inc 00248EInfoware ZRt 00248FDO-MONIX 002490Samsung Electronics Co.,LTD 002491Samsung Electronics 002492Motorola, Broadband Solutions Group 002493ARRIS Group, Inc 002494Shenzhen Baoxin Tech CO., Ltd 002495ARRIS Group, Inc 002496Ginzinger electronic systems 002497CISCO SYSTEMS, INC 002498CISCO SYSTEMS, INC 002499Aquila Technologies 00249ABeijing Zhongchuang Telecommunication Test Co., Ltd 00249BAction Star Enterprise Co., Ltd 00249CBimeng Comunication System Co. Ltd 00249DNES Technology Inc 00249EADC-Elektronik GmbH 00249FRIM Testing Services 0024A0ARRIS Group, Inc 0024A1ARRIS Group, Inc 0024A2Hong Kong Middleware Technology Limited 0024A3Sonim Technologies Inc 0024A4Siklu Communication 0024A5Buffalo Inc 0024A6TELESTAR DIGITAL GmbH 0024A7Advanced Video Communications Inc 0024A8ProCurve Networking by HP 0024A9Ag Leader Technology 0024AADycor Technologies Ltd 0024ABA7 Engineering, Inc 0024ACHangzhou DPtech Technologies Co., Ltd 0024ADAdolf Thies Gmbh & Co. KG 0024AEMorpho 0024AFEchoStar Technologies 0024B0ESAB AB 0024B1Coulomb Technologies 0024B2Netgear 0024B3Graf-Syteco GmbH & Co. KG 0024B4ESCATRONIC GmbH 0024B5Nortel Networks 0024B6Seagate Technology 0024B7GridPoint, Inc 0024B8free alliance sdn bhd 0024B9Wuhan Higheasy Electronic Technology Development Co.Ltd 0024BATexas Instruments 0024BBCENTRAL Corporation 0024BCHuRob Co.,Ltd 0024BDHainzl Industriesysteme GmbH 0024BESony Corporation 0024BFCIAT 0024C0NTI COMODO INC 0024C1ARRIS Group, Inc 0024C2Asumo Co.,Ltd 0024C3CISCO SYSTEMS, INC 0024C4CISCO SYSTEMS, INC 0024C5Meridian Audio Limited 0024C6Hager Electro SAS 0024C7Mobilarm Ltd 0024C8Broadband Solutions Group 0024C9Broadband Solutions Group 0024CATobii Technology AB 0024CBAutonet Mobile 0024CCFascinations Toys and Gifts, Inc 0024CDWillow Garage, Inc 0024CEExeltech Inc 0024CFInscape Data Corporation 0024D0Shenzhen SOGOOD Industry CO.,LTD 0024D1Thomson Inc 0024D2Askey Computer 0024D3QUALICA Inc 0024D4FREEBOX SA 0024D5Winward Industrial Limited 0024D6Intel Corporate 0024D7Intel Corporate 0024D8IlSung Precision 0024D9BICOM, Inc 0024DAInnovar Systems Limited 0024DBAlcohol Monitoring Systems 0024DCJuniper Networks 0024DDCentrak, Inc 0024DEGLOBAL Technology Inc 0024DFDigitalbox Europe GmbH 0024E0DS Tech, LLC 0024E1Convey Computer Corp 0024E2HASEGAWA ELECTRIC CO.,LTD 0024E3CAO Group 0024E4Withings 0024E5Seer Technology, Inc 0024E6In Motion Technology Inc 0024E7Plaster Networks 0024E8Dell Inc 0024E9Samsung Electronics Co., Ltd., Storage System Division 0024EAiris-GmbH infrared & intelligent sensors 0024EBClearPath Networks, Inc 0024ECUnited Information Technology Co.,Ltd 0024EDYT Elec. Co,.Ltd 0024EEWynmax Inc 0024EFSony Ericsson Mobile Communications 0024F0Seanodes 0024F1Shenzhen Fanhai Sanjiang Electronics Co., Ltd 0024F2Uniphone Telecommunication Co., Ltd 0024F3Nintendo Co., Ltd 0024F4Kaminario Technologies Ltd 0024F5NDS Surgical Imaging 0024F6MIYOSHI ELECTRONICS CORPORATION 0024F7CISCO SYSTEMS, INC 0024F8Technical Solutions Company Ltd 0024F9CISCO SYSTEMS, INC 0024FAHilger u. Kern GMBH 0024FB 0024FCQuoPin Co., Ltd 0024FDAccedian Networks Inc 0024FEAVM GmbH 0024FFQLogic Corporation 002500Apple 002501JSC "Supertel" 002502NaturalPoint 002503IBM Corp 002504Valiant Communications Limited 002505eks Engel GmbH & Co. KG 002506A.I. ANTITACCHEGGIO ITALIA SRL 002507ASTAK Inc 002508Maquet Cardiopulmonary AG 002509SHARETRONIC Group LTD 00250ASecurity Expert Co. Ltd 00250BCENTROFACTOR INC 00250CEnertrac 00250DGZT Telkom-Telmor sp. z o.o 00250Egt german telematics gmbh 00250FOn-Ramp Wireless, Inc 002510Pico-Tesla Magnetic Therapies 002511ELITEGROUP COMPUTER SYSTEM CO., LTD 002512ZTE Corporation 002513CXP DIGITAL BV 002514PC Worth Int'l Co., Ltd 002515SFR 002516Integrated Design Tools, Inc 002517Venntis, LLC 002518Power PLUS Communications AG 002519Viaas Inc 00251APsiber Data Systems Inc 00251BPhilips CareServant 00251CEDT 00251DDSA Encore, LLC 00251EROTEL TECHNOLOGIES 00251FZYNUS VISION INC 002520SMA Railway Technology GmbH 002521Logitek Electronic Systems, Inc 002522ASRock Incorporation 002523OCP Inc 002524Lightcomm Technology Co., Ltd 002525CTERA Networks Ltd 002526Genuine Technologies Co., Ltd 002527Bitrode Corp 002528Daido Signal Co., Ltd 002529COMELIT GROUP S.P.A 00252AChengdu GeeYa Technology Co.,LTD 00252BStirling Energy Systems 00252CEntourage Systems, Inc 00252DKiryung Electronics 00252ECisco SPVTG 00252FEnergy, Inc 002530Aetas Systems Inc 002531Cloud Engines, Inc 002532Digital Recorders 002533WITTENSTEIN AG 002535Minimax GmbH & Co KG 002536Oki Electric Industry Co., Ltd 002537Runcom Technologies Ltd 002538Samsung Electronics Co., Ltd., Memory Division 002539IfTA GmbH 00253ACEVA, Ltd 00253Bdin Dietmar Nocker Facilitymanagement GmbH 00253C2Wire 00253DDRS Consolidated Controls 00253ESensus Metering Systems 002540Quasar Technologies, Inc 002541Maquet Critical Care AB 002542Pittasoft 002543MONEYTECH 002544LoJack Corporation 002545CISCO SYSTEMS, INC 002546CISCO SYSTEMS, INC 002547Nokia Danmark A/S 002548Nokia Danmark A/S 002549Jeorich Tech. Co.,Ltd 00254ARingCube Technologies, Inc 00254BApple 00254CVideon Central, Inc 00254DSingapore Technologies Electronics Limited 00254EVertex Wireless Co., Ltd 00254FELETTROLAB Srl 002550Riverbed Technology 002551SE-Elektronic GmbH 002552VXI CORPORATION 002553Pirelli Tyre S.p.A 002554Pixel8 Networks 002555Visonic Technologies 1993 Ltd 002556Hon Hai Precision Ind. Co., Ltd 002557Research In Motion 002558MPEDIA 002559Syphan Technologies Ltd 00255ATantalus Systems Corp 00255BCoachComm, LLC 00255CNEC Corporation 00255DMorningstar Corporation 00255EShanghai Dare Technologies Co.,Ltd 00255FSenTec AG 002560Ibridge Networks & Communications Ltd 002561ProCurve Networking by HP 002562interbro Co. Ltd 002563Luxtera Inc 002564Dell Inc 002565Vizimax Inc 002566Samsung Electronics Co.,Ltd 002567Samsung Electronics 002568Shenzhen Huawei Communication Technologies Co., Ltd 002569SAGEM COMMUNICATION 00256AinIT - Institut Industrial IT 00256BATENIX E.E. s.r.l 00256C"Azimut" Production Association JSC 00256DBroadband Forum 00256EVan Breda B.V 00256FDantherm Power 002570Eastern Communications Company Limited 002571Zhejiang Tianle Digital Electric Co.,Ltd 002572Nemo-Q International AB 002573ST Electronics (Info-Security) Pte Ltd 002574KUNIMI MEDIA DEVICE Co., Ltd 002575FiberPlex Technologies, LLC 002576NELI TECHNOLOGIES 002577D-BOX Technologies 002578JSC "Concern "Sozvezdie" 002579J & F Labs 00257ACAMCO Produktions- und Vertriebs-GmbH für Beschallungs- und Beleuchtungsanlagen 00257BSTJ ELECTRONICS PVT LTD 00257CHuachentel Technology Development Co., Ltd 00257DPointRed Telecom Private Ltd 00257ENEW POS Technology Limited 00257FCallTechSolution Co.,Ltd 002580Equipson S.A 002581x-star networks Inc 002582Maksat Technologies (P) Ltd 002583CISCO SYSTEMS, INC 002584CISCO SYSTEMS, INC 002585KOKUYO S&T Co., Ltd 002586TP-LINK Technologies Co., Ltd 002587Vitality, Inc 002588Genie Industries, Inc 002589Hills Industries Limited 00258APole/Zero Corporation 00258BMellanox Technologies Ltd 00258CESUS ELEKTRONIK SAN. VE DIS. TIC. LTD. STI 00258DHaier 00258EThe Weather Channel 00258FTrident Microsystems, Inc 002590Super Micro Computer, Inc 002591NEXTEK, Inc 002592Guangzhou Shirui Electronic Co., Ltd 002593DatNet Informatikai Kft 002594Eurodesign BG LTD 002595Northwest Signal Supply, Inc 002596GIGAVISION srl 002597Kalki Communication Technologies 002598Zhong Shan City Litai Electronic Industrial Co. Ltd 002599Hedon e.d. B.V 00259ACEStronics GmbH 00259BBeijing PKUNITY Microsystems Technology Co., Ltd 00259CCisco-Linksys, LLC 00259D 00259EHuawei Technologies Co., Ltd 00259FTechnoDigital Technologies GmbH 0025A0Nintendo Co., Ltd 0025A1Enalasys 0025A2Alta Definicion LINCEO S.L 0025A3Trimax Wireless, Inc 0025A4EuroDesign embedded technologies GmbH 0025A5Walnut Media Network 0025A6Central Network Solution Co., Ltd 0025A7Comverge, Inc 0025A8Kontron (BeiJing) Technology Co.,Ltd 0025A9Shanghai Embedway Information Technologies Co.,Ltd 0025AABeijing Soul Technology Co.,Ltd 0025ABAIO LCD PC BU / TPV 0025ACI-Tech corporation 0025ADManufacturing Resources International 0025AEMicrosoft Corporation 0025AFCOMFILE Technology 0025B0Schmartz Inc 0025B1Maya-Creation Corporation 0025B2MBDA Deutschland GmbH 0025B3Hewlett-Packard Company 0025B4CISCO SYSTEMS, INC 0025B5CISCO SYSTEMS, INC 0025B6Telecom FM 0025B7Costar electronics, inc., 0025B8Agile Communications, Inc 0025B9Cypress Solutions Inc 0025BAAlcatel-Lucent IPD 0025BBINNERINT Co., Ltd 0025BCApple 0025BDItaldata Ingegneria dell'Idea S.p.A 0025BETektrap Systems Inc 0025BFWireless Cables Inc 0025C0ZillionTV Corporation 0025C1Nawoo Korea Corp 0025C2RingBell Co.,Ltd 0025C3Nortel Networks 0025C4Ruckus Wireless 0025C5Star Link Communication Pvt. Ltd 0025C6kasercorp, ltd 0025C7altek Corporation 0025C8S-Access GmbH 0025C9SHENZHEN HUAPU DIGITAL CO., LTD 0025CALS Research, LLC 0025CBReiner SCT 0025CCMobile Communications Korea Incorporated 0025CDSkylane Optics 0025CEInnerSpace 0025CFNokia Danmark A/S 0025D0Nokia Danmark A/S 0025D1Eastern Asia Technology Limited 0025D2InpegVision Co., Ltd 0025D3AzureWave Technologies, Inc 0025D4Fortress Technologies 0025D5Robonica (Pty) Ltd 0025D6The Kroger Co 0025D7CEDO 0025D8KOREA MAINTENANCE 0025D9DataFab Systems Inc 0025DASecura Key 0025DBATI Electronics(Shenzhen) Co., LTD 0025DCSumitomo Electric Networks, Inc 0025DDSUNNYTEK INFORMATION CO., LTD 0025DEProbits Co., LTD 0025DF 0025E0CeedTec Sdn Bhd 0025E1SHANGHAI SEEYOO ELECTRONIC & TECHNOLOGY CO., LTD 0025E2Everspring Industry Co., Ltd 0025E3Hanshinit Inc 0025E4OMNI-WiFi, LLC 0025E5LG Electronics Inc 0025E6Belgian Monitoring Systems bvba 0025E7Sony Ericsson Mobile Communications 0025E8Idaho Technology 0025E9i-mate Development, Inc 0025EAIphion BV 0025EBReutech Radar Systems (PTY) Ltd 0025ECHumanware 0025EDNuVo Technologies LLC 0025EEAvtex Ltd 0025EFI-TEC Co., Ltd 0025F0Suga Electronics Limited 0025F1ARRIS Group, Inc 0025F2ARRIS Group, Inc 0025F3Nordwestdeutsche Zählerrevision 0025F4KoCo Connector AG 0025F5DVS Korea, Co., Ltd 0025F6netTALK.com, Inc 0025F7Ansaldo STS USA 0025F9GMK electronic design GmbH 0025FAJ&M Analytik AG 0025FBTunstall Healthcare A/S 0025FCENDA ENDUSTRIYEL ELEKTRONIK LTD. STI 0025FDOBR Centrum Techniki Morskiej S.A 0025FEPilot Electronics Corporation 0025FFCreNova Multimedia Co., Ltd 002600TEAC Australia Pty Ltd 002601Cutera Inc 002602SMART Temps LLC 002603Shenzhen Wistar Technology Co., Ltd 002604Audio Processing Technology Ltd 002605CC Systems AB 002606RAUMFELD GmbH 002607Enabling Technology Pty Ltd 002608Apple 002609Phyllis Co., Ltd 00260ACISCO SYSTEMS, INC 00260BCISCO SYSTEMS, INC 00260CDataram 00260DMercury Systems, Inc 00260EAblaze Systems, LLC 00260FLinn Products Ltd 002610Apacewave Technologies 002611Licera AB 002612Space Exploration Technologies 002613Engel Axil S.L 002614KTNF 002615Teracom Limited 002616Rosemount Inc 002617OEM Worldwide 002618ASUSTek COMPUTER INC 002619FRC 00261AFemtocomm System Technology Corp 00261BLAUREL BANK MACHINES CO., LTD 00261CNEOVIA INC 00261DCOP SECURITY SYSTEM CORP 00261EQINGBANG ELEC(SZ) CO., LTD 00261FSAE Magnetics (H.K.) Ltd 002620ISGUS GmbH 002621InteliCloud Technology Inc 002622COMPAL INFORMATION (KUNSHAN) CO., LTD 002623JRD Communication Inc 002624Thomson Inc 002625MediaSputnik 002626Geophysical Survey Systems, Inc 002627Truesell 002628companytec automação e controle ltda 002629Juphoon System Software Inc 00262AProxense, LLC 00262BWongs Electronics Co. Ltd 00262CIKT Advanced Technologies s.r.o 00262DWistron Corporation 00262EChengdu Jiuzhou Electronic Technology Inc 00262FHAMAMATSU TOA ELECTRONICS 002630ACOREL S.A.S 002631COMMTACT LTD 002632Instrumentation Technologies d.d 002633MIR - Medical International Research 002634Infineta Systems, Inc 002635Bluetechnix GmbH 002636ARRIS Group, Inc 002637Samsung Electro-Mechanics 002638Xia Men Joyatech Co., Ltd 002639T.M. Electronics, Inc 00263ADigitec Systems 00263BOnbnetech 00263CBachmann Technology GmbH & Co. KG 00263DMIA Corporation 00263ETrapeze Networks 00263FLIOS Technology GmbH 002640Baustem Broadband Technologies, Ltd 002641ARRIS Group, Inc 002642ARRIS Group, Inc 002643Alps Electric Co., Ltd 002644Thomson Telecom Belgium 002645Circontrol S.A 002646SHENYANG TONGFANG MULTIMEDIA TECHNOLOGY COMPANY LIMITED 002647WFE TECHNOLOGY CORP 002648Emitech Corp 00264AApple 00264CShanghai DigiVision Technology Co., Ltd 00264DArcadyan Technology Corporation 00264ERail & Road Protec GmbH 00264FKrüger &Gothe GmbH 0026502Wire 002651CISCO SYSTEMS, INC 002652CISCO SYSTEMS, INC 002653DaySequerra Corporation 0026543Com Corporation 002655Hewlett-Packard Company 002656Sansonic Electronics USA 002657OOO NPP EKRA 002658T-Platforms (Cyprus) Limited 002659Nintendo Co., Ltd 00265AD-Link Corporation 00265BHitron Technologies. Inc 00265CHon Hai Precision Ind. Co.,Ltd 00265DSamsung Electronics 00265EHon Hai Precision Ind. Co.,Ltd 00265FSamsung Electronics Co.,Ltd 002660Logiways 002661Irumtek Co., Ltd 002662Actiontec Electronics, Inc 002663Shenzhen Huitaiwei Tech. Ltd, co 002664Core System Japan 002665ProtectedLogic Corporation 002666EFM Networks 002667CARECOM CO.,LTD 002668Nokia Danmark A/S 002669Nokia Danmark A/S 00266AESSENSIUM NV 00266BSHINE UNION ENTERPRISE LIMITED 00266CInventec 00266DMobileAccess Networks 00266ENissho-denki Co.,LTD 00266FCoordiwise Technology Corp 002670Cinch Connectors 002671AUTOVISION Co., Ltd 002672AAMP of America 002673RICOH COMPANY,LTD 002674Electronic Solutions, Inc 002675Aztech Electronics Pte Ltd 002676COMMidt AS 002677DEIF A/S 002678Logic Instrument SA 002679Euphonic Technologies, Inc 00267Awuhan hongxin telecommunication technologies co.,ltd 00267BGSI Helmholtzzentrum für Schwerionenforschung GmbH 00267CMetz-Werke GmbH & Co KG 00267DA-Max Technology Macao Commercial Offshore Company Limited 00267EParrot SA 00267FZenterio AB 002680Lockie Innovation Pty Ltd 002681Interspiro AB 002682Gemtek Technology Co., Ltd 002683Ajoho Enterprise Co., Ltd 002684KISAN SYSTEM 002685Digital Innovation 002686Quantenna Communcations, Inc 002687Corega K.K 002688Juniper Networks 002689General Dynamics Robotic Systems 00268ATerrier SC Ltd 00268BGuangzhou Escene Computer Technology Limited 00268CStarLeaf Ltd 00268DCellTel S.p.A 00268EAlta Solutions, Inc 00268FMTA SpA 002690I DO IT 002691SAGEM COMMUNICATION 002692Mitsubishi Electric Co 002693QVidium Technologies, Inc 002694Senscient Ltd 002695ZT Group Int'l Inc 002696NOOLIX Co., Ltd 002697Cheetah Technologies, L.P 002698CISCO SYSTEMS, INC 002699CISCO SYSTEMS, INC 00269ACarina System Co., Ltd 00269BSOKRAT Ltd 00269CITUS JAPAN CO. LTD 00269DM2Mnet Co., Ltd 00269EQuanta Computer Inc 00269F 0026A0moblic 0026A1Megger 0026A2Instrumentation Technology Systems 0026A3FQ Ingenieria Electronica S.A 0026A4Novus Produtos Eletronicos Ltda 0026A5MICROROBOT.CO.,LTD 0026A6TRIXELL 0026A7CONNECT SRL 0026A8DAEHAP HYPER-TECH 0026A9Strong Technologies Pty Ltd 0026AAKenmec Mechanical Engineering Co., Ltd 0026ABSEIKO EPSON CORPORATION 0026ACShanghai LUSTER Teraband photonic Co., Ltd 0026ADArada Systems, Inc 0026AEWireless Measurement Ltd 0026AFDuelco A/S 0026B0Apple 0026B1Navis Auto Motive Systems, Inc 0026B2Setrix GmbH 0026B3Thales Communications Inc 0026B4Ford Motor Company 0026B5ICOMM Tele Ltd 0026B6Askey Computer 0026B7Kingston Technology Company, Inc 0026B8Actiontec Electronics, Inc 0026B9Dell Inc 0026BAARRIS Group, Inc 0026BBApple 0026BCGeneral Jack Technology Ltd 0026BDJTEC Card & Communication Co., Ltd 0026BESchoonderbeek Elektronica Systemen B.V 0026BFShenZhen Temobi Science&Tech Development Co.,Ltd 0026C0EnergyHub 0026C1ARTRAY CO., LTD 0026C2SCDI Co. LTD 0026C3Insightek Corp 0026C4Cadmos microsystems S.r.l 0026C5Guangdong Gosun Telecommunications Co.,Ltd 0026C6Intel Corporate 0026C7Intel Corporate 0026C8System Sensor 0026C9Proventix Systems, Inc 0026CACISCO SYSTEMS, INC 0026CBCISCO SYSTEMS, INC 0026CCNokia Danmark A/S 0026CDPurpleComm, Inc 0026CEKozumi USA Corp 0026CFDEKA R&D 0026D0Semihalf 0026D1S Squared Innovations Inc 0026D2Pcube Systems, Inc 0026D3Zeno Information System 0026D4IRCA SpA 0026D5Ory Solucoes em Comercio de Informatica Ltda 0026D6Ningbo Andy Optoelectronic Co., Ltd 0026D7KM Electornic Technology Co., Ltd 0026D8Magic Point Inc 0026D9Pace plc 0026DAUniversal Media Corporation /Slovakia/ s.r.o 0026DBIonics EMS Inc 0026DCOptical Systems Design 0026DDFival Science & Technology Co.,Ltd 0026DEFDI MATELEC 0026DFTaiDoc Technology Corp 0026E0ASITEQ 0026E1Stanford University, OpenFlow Group 0026E2LG Electronics 0026E3DTI 0026E4CANAL OVERSEAS 0026E5AEG Power Solutions 0026E6Visionhitech Co., Ltd 0026E7Shanghai ONLAN Communication Tech. Co., Ltd 0026E8Murata Manufacturing Co., Ltd 0026E9SP Corp 0026EACheerchip Electronic Technology (ShangHai) Co., Ltd 0026EBAdvanced Spectrum Technology Co., Ltd 0026ECLegrand Home Systems, Inc 0026EDzte corporation 0026EETKM GmbH 0026EFTechnology Advancement Group, Inc 0026F0cTrixs International GmbH 0026F1ProCurve Networking by HP 0026F2Netgear 0026F3SMC Networks 0026F4Nesslab 0026F5XRPLUS Inc 0026F6Military Communication Institute 0026F7Infosys Technologies Ltd 0026F8Golden Highway Industry Development Co., Ltd 0026F9S.E.M. srl 0026FABandRich Inc 0026FBAirDio Wireless, Inc 0026FCAcSiP Technology Corp 0026FDInteractive Intelligence 0026FEMKD Technology Inc 0026FFResearch In Motion 002700Shenzhen Siglent Technology Co., Ltd 002701INCOstartec GmbH 002702SolarEdge Technologies 002703Testech Electronics Pte Ltd 002704Accelerated Concepts, Inc 002705Sectronic 002706YOISYS 002707Lift Complex DS, JSC 002708Nordiag ASA 002709Nintendo Co., Ltd 00270AIEE S.A 00270BAdura Technologies 00270CCISCO SYSTEMS, INC 00270DCISCO SYSTEMS, INC 00270EIntel Corporate 00270FEnvisionnovation Inc 002710Intel Corporate 002711LanPro Inc 002712MaxVision LLC 002713Universal Global Scientific Industrial Co., Ltd 002714Grainmustards, Co,ltd 002715Rebound Telecom. Co., Ltd 002716Adachi-Syokai Co., Ltd 002717CE Digital(Zhenjiang)Co.,Ltd 002718Suzhou NEW SEAUNION Video Technology Co.,Ltd 002719TP-LINK TECHNOLOGIES CO., LTD 00271AGeenovo Technology Ltd 00271BAlec Sicherheitssysteme GmbH 00271CMERCURY CORPORATION 00271DComba Telecom Systems (China) Ltd 00271EXagyl Communications 00271FMIPRO Electronics Co., Ltd 002720NEW-SOL COM 002721Shenzhen Baoan Fenda Industrial Co., Ltd 002722Ubiquiti Networks 0027F8Brocade Communications Systems, Inc 002A6ACISCO SYSTEMS, INC 002AAFLARsys-Automation GmbH 002D76TITECH GmbH 003000ALLWELL TECHNOLOGY CORP 003001SMP 003002Expand Networks 003003Phasys Ltd 003004LEADTEK RESEARCH INC 003005Fujitsu Siemens Computers 003006SUPERPOWER COMPUTER 003007OPTI, INC 003008AVIO DIGITAL, INC 003009Tachion Networks, Inc 00300AAZTECH Electronics Pte Ltd 00300BmPHASE Technologies, Inc 00300CCONGRUENCY, LTD 00300DMMC Technology, Inc 00300EKlotz Digital AG 00300FIMT - Information Management T 003010VISIONETICS INTERNATIONAL 003011HMS Industrial Networks 003012DIGITAL ENGINEERING LTD 003013NEC Corporation 003014DIVIO, INC 003015CP CLARE CORP 003016ISHIDA CO., LTD 003017BlueArc UK Ltd 003018Jetway Information Co., Ltd 003019CISCO SYSTEMS, INC 00301ASMARTBRIDGES PTE. LTD 00301BSHUTTLE, INC 00301CALTVATER AIRDATA SYSTEMS 00301DSKYSTREAM, INC 00301E3COM Europe Ltd 00301FOPTICAL NETWORKS, INC 003020TSI, Inc. 003021HSING TECH. ENTERPRISE CO.,LTD 003022Fong Kai Industrial Co., Ltd 003023COGENT COMPUTER SYSTEMS, INC 003024CISCO SYSTEMS, INC 003025CHECKOUT COMPUTER SYSTEMS, LTD 003026HeiTel Digital Video GmbH 003027KERBANGO, INC 003028FASE Saldatura srl 003029OPICOM 00302ASOUTHERN INFORMATION 00302BINALP NETWORKS, INC 00302CSYLANTRO SYSTEMS CORPORATION 00302DQUANTUM BRIDGE COMMUNICATIONS 00302EHoft & Wessel AG 00302FGE Aviation System 003030HARMONIX CORPORATION 003031LIGHTWAVE COMMUNICATIONS, INC 003032MagicRam, Inc 003033ORIENT TELECOM CO., LTD 003034SET ENGINEERING 003035Corning Incorporated 003036RMP ELEKTRONIKSYSTEME GMBH 003037Packard Bell Nec Services 003038XCP, INC 003039SOFTBOOK PRESS 00303AMAATEL 00303BPowerCom Technology 00303CONNTO CORP 00303DIVA CORPORATION 00303ERadcom Ltd 00303FTurboComm Tech Inc 003040CISCO SYSTEMS, INC 003041SAEJIN T & M CO., LTD 003042DeTeWe-Deutsche Telephonwerke 003043IDREAM TECHNOLOGIES, PTE. LTD 003044CradlePoint, Inc 003045Village Networks, Inc. (VNI) 003046Controlled Electronic Manageme 003047NISSEI ELECTRIC CO., LTD 003048Supermicro Computer, Inc 003049BRYANT TECHNOLOGY, LTD 00304AFraunhofer IPMS 00304BORBACOM SYSTEMS, INC 00304CAPPIAN COMMUNICATIONS, INC 00304DESI 00304EBUSTEC PRODUCTION LTD 00304FPLANET Technology Corporation 003050Versa Technology 003051ORBIT AVIONIC & COMMUNICATION 003052ELASTIC NETWORKS 003053Basler AG 003054CASTLENET TECHNOLOGY, INC 003055Renesas Technology America, Inc 003056Beck IPC GmbH 003057QTelNet, Inc 003058API MOTION 003059KONTRON COMPACT COMPUTERS AG 00305ATELGEN CORPORATION 00305BToko Inc 00305CSMAR Laboratories Corp 00305DDIGITRA SYSTEMS, INC 00305EAbelko Innovation 00305FHasselblad 003060Powerfile, Inc 003061MobyTEL 003062IP Video Networks Inc 003063SANTERA SYSTEMS, INC 003064ADLINK TECHNOLOGY, INC 003065Apple 003066RFM 003067BIOSTAR MICROTECH INT'L CORP 003068CYBERNETICS TECH. CO., LTD 003069IMPACCT TECHNOLOGY CORP 00306APENTA MEDIA CO., LTD 00306BCMOS SYSTEMS, INC 00306CHitex Holding GmbH 00306DLUCENT TECHNOLOGIES 00306EHEWLETT PACKARD 00306FSEYEON TECH. CO., LTD 0030701Net Corporation 003071CISCO SYSTEMS, INC 003072Intellibyte Inc 003073International Microsystems, In 003074EQUIINET LTD 003075ADTECH 003076Akamba Corporation 003077ONPREM NETWORKS 003078CISCO SYSTEMS, INC 003079CQOS, INC 00307AAdvanced Technology & Systems 00307BCISCO SYSTEMS, INC 00307CADID SA 00307DGRE AMERICA, INC 00307ERedflex Communication Systems 00307FIRLAN LTD 003080CISCO SYSTEMS, INC 003081ALTOS C&C 003082TAIHAN ELECTRIC WIRE CO., LTD 003083Ivron Systems 003084ALLIED TELESYN INTERNAIONAL 003085CISCO SYSTEMS, INC 003086Transistor Devices, Inc 003087VEGA GRIESHABER KG 003088Ericsson 003089Spectrapoint Wireless, LLC 00308ANICOTRA SISTEMI S.P.A 00308BBrix Networks 00308CQuantum Corporation 00308DPinnacle Systems, Inc 00308ECROSS MATCH TECHNOLOGIES, INC 00308FMICRILOR, Inc 003090CYRA TECHNOLOGIES, INC 003091TAIWAN FIRST LINE ELEC. CORP 003092ModuNORM GmbH 003093Sonnet Technologies, Inc 003094CISCO SYSTEMS, INC 003095Procomp Informatics, Ltd 003096CISCO SYSTEMS, INC 003097AB Regin 003098Global Converging Technologies 003099BOENIG UND KALLENBACH OHG 00309AASTRO TERRA CORP 00309BSmartware 00309CTiming Applications, Inc 00309DNimble Microsystems, Inc 00309EWORKBIT CORPORATION 00309FAMBER NETWORKS 0030A0TYCO SUBMARINE SYSTEMS, LTD 0030A1WEBGATE Inc 0030A2Lightner Engineering 0030A3CISCO SYSTEMS, INC 0030A4Woodwind Communications System 0030A5ACTIVE POWER 0030A6VIANET TECHNOLOGIES, LTD 0030A7SCHWEITZER ENGINEERING 0030A8OL'E COMMUNICATIONS, INC 0030A9Netiverse, Inc 0030AAAXUS MICROSYSTEMS, INC 0030ABDELTA NETWORKS, INC 0030ACSysteme Lauer GmbH & Co., Ltd 0030ADSHANGHAI COMMUNICATION 0030AETimes N System, Inc 0030AFHoneywell GmbH 0030B0Convergenet Technologies 0030B1TrunkNet 0030B2L-3 Sonoma EO 0030B3San Valley Systems, Inc 0030B4INTERSIL CORP 0030B5Tadiran Microwave Networks 0030B6CISCO SYSTEMS, INC 0030B7Teletrol Systems, Inc 0030B8RiverDelta Networks 0030B9ECTEL 0030BAAC&T SYSTEM CO., LTD 0030BBCacheFlow, Inc 0030BCOptronic AG 0030BDBELKIN COMPONENTS 0030BECity-Net Technology, Inc 0030BFMULTIDATA GMBH 0030C0Lara Technology, Inc 0030C1HEWLETT-PACKARD 0030C2COMONE 0030C3FLUECKIGER ELEKTRONIK AG 0030C4Canon Imaging Systems Inc 0030C5CADENCE DESIGN SYSTEMS 0030C6CONTROL SOLUTIONS, INC 0030C7Macromate Corp 0030C8GAD LINE, LTD 0030C9LuxN, N 0030CADiscovery Com 0030CBOMNI FLOW COMPUTERS, INC 0030CCTenor Networks, Inc 0030CDCONEXANT SYSTEMS, INC 0030CEZaffire 0030CFTWO TECHNOLOGIES, INC 0030D0Tellabs 0030D1INOVA CORPORATION 0030D2WIN TECHNOLOGIES, CO., LTD 0030D3Agilent Technologies 0030D4AAE Systems, Inc 0030D5DResearch GmbH 0030D6MSC VERTRIEBS GMBH 0030D7Innovative Systems, L.L.C 0030D8SITEK 0030D9DATACORE SOFTWARE CORP 0030DACOMTREND CO 0030DBMindready Solutions, Inc 0030DCRIGHTECH CORPORATION 0030DDINDIGITA CORPORATION 0030DEWAGO Kontakttechnik GmbH 0030DFKB/TEL TELECOMUNICACIONES 0030E0OXFORD SEMICONDUCTOR LTD 0030E1Network Equipment Technologies, Inc 0030E2GARNET SYSTEMS CO., LTD 0030E3SEDONA NETWORKS CORP 0030E4CHIYODA SYSTEM RIKEN 0030E5Amper Datos S.A 0030E6Draeger Medical Systems, Inc 0030E7CNF MOBILE SOLUTIONS, INC 0030E8ENSIM CORP 0030E9GMA COMMUNICATION MANUFACT'G 0030EATeraForce Technology Corporation 0030EBTURBONET COMMUNICATIONS, INC 0030ECBORGARDT 0030EDExpert Magnetics Corp 0030EEDSG Technology, Inc 0030EFNEON TECHNOLOGY, INC 0030F0Uniform Industrial Corp 0030F1Accton Technology Corp 0030F2CISCO SYSTEMS, INC 0030F3At Work Computers 0030F4STARDOT TECHNOLOGIES 0030F5Wild Lab. Ltd 0030F6SECURELOGIX CORPORATION 0030F7RAMIX INC 0030F8Dynapro Systems, Inc 0030F9Sollae Systems Co., Ltd 0030FATELICA, INC 0030FBAZS Technology AG 0030FCTerawave Communications, Inc 0030FDINTEGRATED SYSTEMS DESIGN 0030FEDSA GmbH 0030FFDATAFAB SYSTEMS, INC 00336CSynapSense Corporation 0034F1Radicom Research, Inc 003532Electro-Metrics Corporation 0036F8Conti Temic microelectronic GmbH 0036FESuperVision 00376DMurata Manufacturing Co., Ltd 003A98CISCO SYSTEMS, INC 003A99CISCO SYSTEMS, INC 003A9ACISCO SYSTEMS, INC 003A9BCISCO SYSTEMS, INC 003A9CCISCO SYSTEMS, INC 003A9DNEC Platforms, Ltd 003AAFBlueBit Ltd 003CC5WONWOO Engineering Co., Ltd 003D41Hatteland Computer AS 003EE1Apple 004000PCI COMPONENTES DA AMZONIA LTD 004001Zero One Technology Co. Ltd 004002PERLE SYSTEMS LIMITED 004003Emerson Process Management Power & Water Solutions, Inc 004004ICM CO. LTD 004005ANI COMMUNICATIONS INC 004006SAMPO TECHNOLOGY CORPORATION 004007TELMAT INFORMATIQUE 004008A PLUS INFO CORPORATION 004009TACHIBANA TECTRON CO., LTD 00400APIVOTAL TECHNOLOGIES, INC 00400BCISCO SYSTEMS, INC 00400CGENERAL MICRO SYSTEMS, INC 00400DLANNET DATA COMMUNICATIONS,LTD 00400EMEMOTEC, INC 00400FDATACOM TECHNOLOGIES 004010SONIC SYSTEMS, INC 004011ANDOVER CONTROLS CORPORATION 004012WINDATA, INC 004013NTT DATA COMM. SYSTEMS CORP 004014COMSOFT GMBH 004015ASCOM INFRASYS AG 004016ADC - Global Connectivity Solutions Division 004017Silex Technology America 004018ADOBE SYSTEMS, INC 004019AEON SYSTEMS, INC 00401AFUJI ELECTRIC CO., LTD 00401BPRINTER SYSTEMS CORP 00401CAST RESEARCH, INC 00401DINVISIBLE SOFTWARE, INC 00401EICC 00401FCOLORGRAPH LTD 004020TE Connectivity Ltd 004021RASTER GRAPHICS 004022KLEVER COMPUTERS, INC 004023LOGIC CORPORATION 004024COMPAC INC 004025MOLECULAR DYNAMICS 004026Buffalo Inc 004027SMC MASSACHUSETTS, INC 004028NETCOMM LIMITED 004029COMPEX 00402ACANOGA-PERKINS 00402BTRIGEM COMPUTER, INC 00402CISIS DISTRIBUTED SYSTEMS, INC 00402DHARRIS ADACOM CORPORATION 00402EPRECISION SOFTWARE, INC 00402FXLNT DESIGNS INC 004030GK COMPUTER 004031KOKUSAI ELECTRIC CO., LTD 004032DIGITAL COMMUNICATIONS 004033ADDTRON TECHNOLOGY CO., LTD 004034BUSTEK CORPORATION 004035OPCOM 004036TRIBE COMPUTER WORKS, INC 004037SEA-ILAN, INC 004038TALENT ELECTRIC INCORPORATED 004039OPTEC DAIICHI DENKO CO., LTD 00403AIMPACT TECHNOLOGIES 00403BSYNERJET INTERNATIONAL CORP 00403CFORKS, INC 00403DTeradata Corporation 00403ERASTER OPS CORPORATION 00403FSSANGYONG COMPUTER SYSTEMS 004040RING ACCESS, INC 004041FUJIKURA LTD 004042N.A.T. GMBH 004043Nokia Siemens Networks GmbH & Co. KG 004044QNIX COMPUTER CO., LTD 004045TWINHEAD CORPORATION 004046UDC RESEARCH LIMITED 004047WIND RIVER SYSTEMS 004048SMD INFORMATICA S.A 004049Roche Diagnostics International Ltd 00404AWEST AUSTRALIAN DEPARTMENT 00404BMAPLE COMPUTER SYSTEMS 00404CHYPERTEC PTY LTD 00404DTELECOMMUNICATIONS TECHNIQUES 00404EFLUENT, INC 00404FSPACE & NAVAL WARFARE SYSTEMS 004050IRONICS, INCORPORATED 004051GRACILIS, INC 004052STAR TECHNOLOGIES, INC 004053AMPRO COMPUTERS 004054CONNECTION MACHINES SERVICES 004055METRONIX GMBH 004056MCM JAPAN LTD 004057LOCKHEED - SANDERS 004058KRONOS, INC 004059YOSHIDA KOGYO K. K 00405AGOLDSTAR INFORMATION & COMM 00405BFUNASSET LIMITED 00405CFUTURE SYSTEMS, INC 00405DSTAR-TEK, INC 00405ENORTH HILLS ISRAEL 00405FAFE COMPUTERS LTD 004060COMENDEC LTD 004061DATATECH ENTERPRISES CO., LTD 004062E-SYSTEMS, INC./GARLAND DIV 004063VIA TECHNOLOGIES, INC 004064KLA INSTRUMENTS CORPORATION 004065GTE SPACENET 004066Hitachi Metals, Ltd 004067OMNIBYTE CORPORATION 004068EXTENDED SYSTEMS 004069LEMCOM SYSTEMS, INC 00406AKENTEK INFORMATION SYSTEMS,INC 00406BSYSGEN 00406CCOPERNIQUE 00406DLANCO, INC 00406ECOROLLARY, INC 00406FSYNC RESEARCH INC 004070INTERWARE CO., LTD 004071ATM COMPUTER GMBH 004072Applied Innovation Inc 004073BASS ASSOCIATES 004074CABLE AND WIRELESS 004075Tattile SRL 004076Sun Conversion Technologies 004077MAXTON TECHNOLOGY CORPORATION 004078WEARNES AUTOMATION PTE LTD 004079JUKO MANUFACTURE COMPANY, LTD 00407ASOCIETE D'EXPLOITATION DU CNIT 00407BSCIENTIFIC ATLANTA 00407CQUME CORPORATION 00407DEXTENSION TECHNOLOGY CORP 00407EEVERGREEN SYSTEMS, INC 00407FFLIR Systems 004080ATHENIX CORPORATION 004081MANNESMANN SCANGRAPHIC GMBH 004082LABORATORY EQUIPMENT CORP 004083TDA INDUSTRIA DE PRODUTOS 004084HONEYWELL ACS 004085SAAB INSTRUMENTS AB 004086MICHELS & KLEBERHOFF COMPUTER 004087UBITREX CORPORATION 004088MOBIUS TECHNOLOGIES, INC 004089MEIDENSHA CORPORATION 00408ATPS TELEPROCESSING SYS. GMBH 00408BRAYLAN CORPORATION 00408CAXIS COMMUNICATIONS AB 00408DTHE GOODYEAR TIRE & RUBBER CO 00408ETattile SRL 00408FWM-DATA MINFO AB 004090ANSEL COMMUNICATIONS 004091PROCOMP INDUSTRIA ELETRONICA 004092ASP COMPUTER PRODUCTS, INC 004093PAXDATA NETWORKS LTD 004094SHOGRAPHICS, INC 004095R.P.T. INTERGROUPS INT'L LTD 004096Cisco Systems 004097DATEX DIVISION OF 004098DRESSLER GMBH & CO 004099NEWGEN SYSTEMS CORP 00409ANETWORK EXPRESS, INC 00409BHAL COMPUTER SYSTEMS INC 00409CTRANSWARE 00409DDIGIBOARD, INC 00409ECONCURRENT TECHNOLOGIES LTD 00409FTelco Systems, Inc 0040A0GOLDSTAR CO., LTD 0040A1ERGO COMPUTING 0040A2KINGSTAR TECHNOLOGY INC 0040A3MICROUNITY SYSTEMS ENGINEERING 0040A4ROSE ELECTRONICS 0040A5CLINICOMP INTL 0040A6Cray, Inc 0040A7ITAUTEC PHILCO S.A 0040A8IMF INTERNATIONAL LTD 0040A9DATACOM INC 0040AAMetso Automation 0040ABROLAND DG CORPORATION 0040ACSUPER WORKSTATION, INC 0040ADSMA REGELSYSTEME GMBH 0040AEDELTA CONTROLS, INC 0040AFDIGITAL PRODUCTS, INC 0040B0BYTEX CORPORATION, ENGINEERING 0040B1CODONICS INC 0040B2SYSTEMFORSCHUNG 0040B3ParTech Inc 0040B4NEXTCOM K.K 0040B5VIDEO TECHNOLOGY COMPUTERS LTD 0040B6COMPUTERM CORPORATION 0040B7STEALTH COMPUTER SYSTEMS 0040B8IDEA ASSOCIATES 0040B9MACQ ELECTRONIQUE SA 0040BAALLIANT COMPUTER SYSTEMS CORP 0040BBGOLDSTAR CABLE CO., LTD 0040BCALGORITHMICS LTD 0040BDSTARLIGHT NETWORKS, INC 0040BEBOEING DEFENSE & SPACE 0040BFCHANNEL SYSTEMS INTERN'L INC 0040C0VISTA CONTROLS CORPORATION 0040C1BIZERBA-WERKE WILHEIM KRAUT 0040C2APPLIED COMPUTING DEVICES 0040C3FISCHER AND PORTER CO 0040C4KINKEI SYSTEM CORPORATION 0040C5MICOM COMMUNICATIONS INC 0040C6FIBERNET RESEARCH, INC 0040C7RUBY TECH CORPORATION 0040C8MILAN TECHNOLOGY CORPORATION 0040C9NCUBE 0040CAFIRST INTERNAT'L COMPUTER, INC 0040CBLANWAN TECHNOLOGIES 0040CCSILCOM MANUF'G TECHNOLOGY INC 0040CDTERA MICROSYSTEMS, INC 0040CENET-SOURCE, INC 0040CFSTRAWBERRY TREE, INC 0040D0MITAC INTERNATIONAL CORP 0040D1FUKUDA DENSHI CO., LTD 0040D2PAGINE CORPORATION 0040D3KIMPSION INTERNATIONAL CORP 0040D4GAGE TALKER CORP 0040D5Sartorius Mechatronics T&H GmbH 0040D6LOCAMATION B.V 0040D7STUDIO GEN INC 0040D8OCEAN OFFICE AUTOMATION LTD 0040D9AMERICAN MEGATRENDS INC 0040DATELSPEC LTD 0040DBADVANCED TECHNICAL SOLUTIONS 0040DCTRITEC ELECTRONIC GMBH 0040DDHONG TECHNOLOGIES 0040DEElsag Datamat spa 0040DFDIGALOG SYSTEMS, INC 0040E0ATOMWIDE LTD 0040E1MARNER INTERNATIONAL, INC 0040E2MESA RIDGE TECHNOLOGIES, INC 0040E3QUIN SYSTEMS LTD 0040E4E-M TECHNOLOGY, INC 0040E5SYBUS CORPORATION 0040E6C.A.E.N 0040E7ARNOS INSTRUMENTS & COMPUTER 0040E8CHARLES RIVER DATA SYSTEMS,INC 0040E9ACCORD SYSTEMS, INC 0040EAPLAIN TREE SYSTEMS INC 0040EBMARTIN MARIETTA CORPORATION 0040ECMIKASA SYSTEM ENGINEERING 0040EDNETWORK CONTROLS INT'NATL INC 0040EEOPTIMEM 0040EFHYPERCOM, INC 0040F0MicroBrain,Inc 0040F1CHUO ELECTRONICS CO., LTD 0040F2JANICH & KLASS COMPUTERTECHNIK 0040F3NETCOR 0040F4CAMEO COMMUNICATIONS, INC 0040F5OEM ENGINES 0040F6KATRON COMPUTERS INC 0040F7Polaroid Corporation 0040F8SYSTEMHAUS DISCOM 0040F9COMBINET 0040FAMICROBOARDS, INC 0040FBCASCADE COMMUNICATIONS CORP 0040FCIBR COMPUTER TECHNIK GMBH 0040FDLXE 0040FESYMPLEX COMMUNICATIONS 0040FFTELEBIT CORPORATION 0041B4Wuxi Zhongxing Optoelectronics Technology Co.,Ltd 004252RLX Technologies 0043FFKETRON S.R.L 004501Versus Technology, Inc 00464BHUAWEI TECHNOLOGIES CO.,LTD 004D32Andon Health Co.,Ltd 005000NEXO COMMUNICATIONS, INC 005001YAMASHITA SYSTEMS CORP 005002OMNISEC AG 005003Xrite Inc 0050043COM CORPORATION 005006TAC AB 005007SIEMENS TELECOMMUNICATION SYSTEMS LIMITED 005008TIVA MICROCOMPUTER CORP. (TMC) 005009PHILIPS BROADBAND NETWORKS 00500AIRIS TECHNOLOGIES, INC 00500BCISCO SYSTEMS, INC 00500Ce-Tek Labs, Inc 00500DSATORI ELECTORIC CO., LTD 00500ECHROMATIS NETWORKS, INC 00500FCISCO SYSTEMS, INC 005010NovaNET Learning, Inc 005012CBL - GMBH 005013Chaparral Network Storage 005014CISCO SYSTEMS, INC 005015BRIGHT STAR ENGINEERING 005016SST/WOODHEAD INDUSTRIES 005017RSR S.R.L 005018AMIT, Inc 005019SPRING TIDE NETWORKS, INC 00501AIQinVision 00501BABL CANADA, INC 00501CJATOM SYSTEMS, INC 00501EMiranda Technologies, Inc 00501FMRG SYSTEMS, LTD 005020MEDIASTAR CO., LTD 005021EIS INTERNATIONAL, INC 005022ZONET TECHNOLOGY, INC 005023PG DESIGN ELECTRONICS, INC 005024NAVIC SYSTEMS, INC 005026COSYSTEMS, INC 005027GENICOM CORPORATION 005028AVAL COMMUNICATIONS 0050291394 PRINTER WORKING GROUP 00502ACISCO SYSTEMS, INC 00502BGENRAD LTD 00502CSOYO COMPUTER, INC 00502DACCEL, INC 00502ECAMBEX CORPORATION 00502FTollBridge Technologies, Inc 005030FUTURE PLUS SYSTEMS 005031AEROFLEX LABORATORIES, INC 005032PICAZO COMMUNICATIONS, INC 005033MAYAN NETWORKS 005036NETCAM, LTD 005037KOGA ELECTRONICS CO 005038DAIN TELECOM CO., LTD 005039MARINER NETWORKS 00503ADATONG ELECTRONICS LTD 00503BMEDIAFIRE CORPORATION 00503CTSINGHUA NOVEL ELECTRONICS 00503ECISCO SYSTEMS, INC 00503FANCHOR GAMES 005040Panasonic Electric Works Co., Ltd 005041Coretronic Corporation 005042SCI MANUFACTURING SINGAPORE PTE, LTD 005043MARVELL SEMICONDUCTOR, INC 005044ASACA CORPORATION 005045RIOWORKS SOLUTIONS, INC 005046MENICX INTERNATIONAL CO., LTD 005047 005048INFOLIBRIA 005049Arbor Networks Inc 00504AELTECO A.S 00504BBARCONET N.V 00504CGalil Motion Control 00504DTokyo Electron Device Limited 00504ESIERRA MONITOR CORP 00504FOLENCOM ELECTRONICS 005050CISCO SYSTEMS, INC 005051IWATSU ELECTRIC CO., LTD 005052TIARA NETWORKS, INC 005053CISCO SYSTEMS, INC 005054CISCO SYSTEMS, INC 005055DOMS A/S 005056VMware, Inc 005057BROADBAND ACCESS SYSTEMS 005058VegaStream Group Limted 005059iBAHN 00505ANETWORK ALCHEMY, INC 00505BKAWASAKI LSI U.S.A., INC 00505CTUNDO CORPORATION 00505EDIGITEK MICROLOGIC S.A 00505FBRAND INNOVATORS 005060TANDBERG TELECOM AS 005062KOUWELL ELECTRONICS CORP. ** 005063OY COMSEL SYSTEM AB 005064CAE ELECTRONICS 005065TDK-Lambda Corporation 005066AtecoM GmbH advanced telecomunication modules 005067AEROCOMM, INC 005068ELECTRONIC INDUSTRIES ASSOCIATION 005069PixStream Incorporated 00506AEDEVA, INC 00506BSPX-ATEG 00506CBeijer Electronics Products AB 00506DVIDEOJET SYSTEMS 00506ECORDER ENGINEERING CORPORATION 00506FG-CONNECT 005070CHAINTECH COMPUTER CO., LTD 005071AIWA CO., LTD 005072CORVIS CORPORATION 005073CISCO SYSTEMS, INC 005074ADVANCED HI-TECH CORP 005075KESTREL SOLUTIONS 005076IBM Corp 005077PROLIFIC TECHNOLOGY, INC 005078MEGATON HOUSE, LTD 005079 00507AXPEED, INC 00507BMERLOT COMMUNICATIONS 00507CVIDEOCON AG 00507DIFP 00507ENEWER TECHNOLOGY 00507FDrayTek Corp 005080CISCO SYSTEMS, INC 005081MURATA MACHINERY, LTD 005082FORESSON CORPORATION 005083GILBARCO, INC 005084ATL PRODUCTS 005086TELKOM SA, LTD 005087TERASAKI ELECTRIC CO., LTD 005088AMANO CORPORATION 005089SAFETY MANAGEMENT SYSTEMS 00508BHewlett-Packard Company 00508CRSI SYSTEMS 00508DABIT COMPUTER CORPORATION 00508EOPTIMATION, INC 00508FASITA TECHNOLOGIES INT'L LTD 005090DCTRI 005091NETACCESS, INC 005092RIGAKU INDUSTRIAL CORPORATION 005093BOEING 005094PACE plc 005095PERACOM NETWORKS 005096SALIX TECHNOLOGIES, INC 005097MMC-EMBEDDED COMPUTERTECHNIK GmbH 005098GLOBALOOP, LTD 0050993COM EUROPE, LTD 00509ATAG ELECTRONIC SYSTEMS 00509BSWITCHCORE AB 00509CBETA RESEARCH 00509DTHE INDUSTREE B.V 00509ELes Technologies SoftAcoustik Inc 00509FHORIZON COMPUTER 0050A0DELTA COMPUTER SYSTEMS, INC 0050A1CARLO GAVAZZI, INC 0050A2CISCO SYSTEMS, INC 0050A3TransMedia Communications, Inc 0050A4IO TECH, INC 0050A5CAPITOL BUSINESS SYSTEMS, LTD 0050A6OPTRONICS 0050A7CISCO SYSTEMS, INC 0050A8OpenCon Systems, Inc 0050A9MOLDAT WIRELESS TECHNOLGIES 0050AAKONICA MINOLTA HOLDINGS, INC 0050ABNALTEC, Inc 0050ACMAPLE COMPUTER CORPORATION 0050ADCommUnique Wireless Corp 0050AEFDK Co., Ltd 0050AFINTERGON, INC 0050B0TECHNOLOGY ATLANTA CORPORATION 0050B1GIDDINGS & LEWIS 0050B2BRODEL GmbH 0050B3VOICEBOARD CORPORATION 0050B4SATCHWELL CONTROL SYSTEMS, LTD 0050B5FICHET-BAUCHE 0050B6GOOD WAY IND. CO., LTD 0050B7BOSER TECHNOLOGY CO., LTD 0050B8INOVA COMPUTERS GMBH & CO. KG 0050B9XITRON TECHNOLOGIES, INC 0050BAD-LINK 0050BBCMS TECHNOLOGIES 0050BCHAMMER STORAGE SOLUTIONS 0050BDCISCO SYSTEMS, INC 0050BEFAST MULTIMEDIA AG 0050BFMetalligence Technology Corp 0050C0GATAN, INC 0050C1GEMFLEX NETWORKS, LTD 0050C2IEEE REGISTRATION AUTHORITY - Please see IAB public listing for more information 0050C4IMD 0050C5ADS Technologies, Inc 0050C6LOOP TELECOMMUNICATION INTERNATIONAL, INC 0050C8Addonics Technologies, Inc 0050C9MASPRO DENKOH CORP 0050CANET TO NET TECHNOLOGIES 0050CBJETTER 0050CCXYRATEX 0050CDDIGIANSWER A/S 0050CELG INTERNATIONAL CORP 0050CFVANLINK COMMUNICATION TECHNOLOGY RESEARCH INSTITUTE 0050D0MINERVA SYSTEMS 0050D1CISCO SYSTEMS, INC 0050D2CMC Electronics Inc 0050D3DIGITAL AUDIO PROCESSING PTY. LTD 0050D4JOOHONG INFORMATION & 0050D5AD SYSTEMS CORP 0050D6ATLAS COPCO TOOLS AB 0050D7TELSTRAT 0050D8UNICORN COMPUTER CORP 0050D9ENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA 0050DA3COM CORPORATION 0050DBCONTEMPORARY CONTROL 0050DCTAS TELEFONBAU A. SCHWABE GMBH & CO. KG 0050DDSERRA SOLDADURA, S.A 0050DESIGNUM SYSTEMS CORP 0050DFAirFiber, Inc 0050E1NS TECH ELECTRONICS SDN BHD 0050E2CISCO SYSTEMS, INC 0050E3ARRIS Group, Inc 0050E4Apple 0050E6HAKUSAN CORPORATION 0050E7PARADISE INNOVATIONS (ASIA) 0050E8NOMADIX INC 0050EAXEL COMMUNICATIONS, INC 0050EBALPHA-TOP CORPORATION 0050ECOLICOM A/S 0050EDANDA NETWORKS 0050EETEK DIGITEL CORPORATION 0050EFSPE Systemhaus GmbH 0050F0CISCO SYSTEMS, INC 0050F1Intel Corporation 0050F2MICROSOFT CORP 0050F3GLOBAL NET INFORMATION CO., Ltd 0050F4SIGMATEK GMBH & CO. KG 0050F6PAN-INTERNATIONAL INDUSTRIAL CORP 0050F7VENTURE MANUFACTURING (SINGAPORE) LTD 0050F8ENTREGA TECHNOLOGIES, INC 0050F9Sensormatic Electronics LLC 0050FAOXTEL, LTD 0050FBVSK ELECTRONICS 0050FCEDIMAX TECHNOLOGY CO., LTD 0050FDVISIONCOMM CO., LTD 0050FEPCTVnet ASA 0050FFHAKKO ELECTRONICS CO., LTD 005218Wuxi Keboda Electron Co.Ltd 0054AFContinental Automotive Systems Inc 005907LenovoEMC Products USA, LLC 005A39SHENZHEN FAST TECHNOLOGIES CO., LTD 005CB1Gospell DIGITAL TECHNOLOGY CO., LTD 005D03Xilinx, Inc 006000XYCOM INC 006001InnoSys, Inc 006002SCREEN SUBTITLING SYSTEMS, LTD 006003TERAOKA WEIGH SYSTEM PTE, LTD 006004COMPUTADORES MODULARES SA 006005FEEDBACK DATA LTD 006006SOTEC CO., LTD 006007ACRES GAMING, INC 0060083COM CORPORATION 006009CISCO SYSTEMS, INC 00600ASORD COMPUTER CORPORATION 00600BLOGWARE GmbH 00600CEurotech Inc 00600DDigital Logic GmbH 00600EWAVENET INTERNATIONAL, INC 00600FWESTELL, INC 006010NETWORK MACHINES, INC 006011CRYSTAL SEMICONDUCTOR CORP 006012POWER COMPUTING CORPORATION 006013NETSTAL MASCHINEN AG 006014EDEC CO., LTD 006015NET2NET CORPORATION 006016CLARIION 006017TOKIMEC INC 006018STELLAR ONE CORPORATION 006019Roche Diagnostics 00601AKEITHLEY INSTRUMENTS 00601BMESA ELECTRONICS 00601CTELXON CORPORATION 00601DLUCENT TECHNOLOGIES 00601ESOFTLAB, INC 00601FSTALLION TECHNOLOGIES 006020PIVOTAL NETWORKING, INC 006021DSC CORPORATION 006022VICOM SYSTEMS, INC 006023PERICOM SEMICONDUCTOR CORP 006024GRADIENT TECHNOLOGIES, INC 006025ACTIVE IMAGING PLC 006026VIKING Modular Solutions 006027Superior Modular Products 006028MACROVISION CORPORATION 006029CARY PERIPHERALS INC 00602ASYMICRON COMPUTER COMMUNICATIONS, LTD 00602BPEAK AUDIO 00602CLINX Data Terminals, Inc 00602DALERTON TECHNOLOGIES, INC 00602ECYCLADES CORPORATION 00602FCISCO SYSTEMS, INC 006030VILLAGE TRONIC ENTWICKLUNG 006031HRK SYSTEMS 006032I-CUBE, INC 006033ACUITY IMAGING, INC 006034ROBERT BOSCH GmbH 006035DALLAS SEMICONDUCTOR, INC 006036AIT Austrian Institute of Technology GmbH 006037NXP Semiconductors 006038Nortel Networks 006039SanCom Technology, Inc 00603AQUICK CONTROLS LTD 00603BAMTEC spa 00603CHAGIWARA SYS-COM CO., LTD 00603D3CX 00603ECISCO SYSTEMS, INC 00603FPATAPSCO DESIGNS 006040NETRO CORP 006041Yokogawa Electric Corporation 006042TKS (USA), INC 006043iDirect, INC 006044LITTON/POLY-SCIENTIFIC 006045PATHLIGHT TECHNOLOGIES 006046VMETRO, INC 006047CISCO SYSTEMS, INC 006048EMC CORPORATION 006049VINA TECHNOLOGIES 00604ASAIC IDEAS GROUP 00604BSafe-com GmbH & Co. KG 00604CSAGEM COMMUNICATION 00604DMMC NETWORKS, INC 00604ECYCLE COMPUTER CORPORATION, INC 00604FTattile SRL 006050INTERNIX INC 006051QUALITY SEMICONDUCTOR 006052PERIPHERALS ENTERPRISE CO., Ltd 006053TOYODA MACHINE WORKS, LTD 006054CONTROLWARE GMBH 006055CORNELL UNIVERSITY 006056NETWORK TOOLS, INC 006057MURATA MANUFACTURING CO., LTD 006058COPPER MOUNTAIN COMMUNICATIONS, INC 006059TECHNICAL COMMUNICATIONS CORP 00605ACELCORE, INC 00605BIntraServer Technology, Inc 00605CCISCO SYSTEMS, INC 00605DSCANIVALVE CORP 00605ELIBERTY TECHNOLOGY NETWORKING 00605FNIPPON UNISOFT CORPORATION 006060Data Innovations North America 006061WHISTLE COMMUNICATIONS CORP 006062TELESYNC, INC 006063PSION DACOM PLC 006064NETCOMM LIMITED 006065BERNECKER & RAINER INDUSTRIE-ELEKTRONIC GmbH 006066LACROIX Trafic 006067ACER NETXUS INC 006068Dialogic Corporation 006069Brocade Communications Systems, Inc 00606AMITSUBISHI WIRELESS COMMUNICATIONS. INC 00606BSynclayer Inc 00606CARESCOM 00606DDIGITAL EQUIPMENT CORP 00606EDAVICOM SEMICONDUCTOR, INC 00606FCLARION CORPORATION OF AMERICA 006070CISCO SYSTEMS, INC 006071MIDAS LAB, INC 006072VXL INSTRUMENTS, LIMITED 006073REDCREEK COMMUNICATIONS, INC 006074QSC AUDIO PRODUCTS 006075PENTEK, INC 006076SCHLUMBERGER TECHNOLOGIES RETAIL PETROLEUM SYSTEMS 006077PRISA NETWORKS 006078POWER MEASUREMENT LTD 006079Mainstream Data, Inc 00607ADVS GmbH 00607BFORE SYSTEMS, INC 00607CWaveAccess, Ltd 00607DSENTIENT NETWORKS INC 00607EGIGALABS, INC 00607FAURORA TECHNOLOGIES, INC 006080MICROTRONIX DATACOM LTD 006081TV/COM INTERNATIONAL 006082NOVALINK TECHNOLOGIES, INC 006083CISCO SYSTEMS, INC 006084DIGITAL VIDEO 006085Storage Concepts 006086LOGIC REPLACEMENT TECH. LTD 006087KANSAI ELECTRIC CO., LTD 006088WHITE MOUNTAIN DSP, INC 006089XATA 00608ACITADEL COMPUTER 00608BConferTech International 00608C3COM CORPORATION 00608DUNIPULSE CORP 00608EHE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH 00608FTEKRAM TECHNOLOGY CO., LTD 006090Artiza Networks Inc 006091FIRST PACIFIC NETWORKS, INC 006092MICRO/SYS, INC 006093VARIAN 006094IBM Corp 006095ACCU-TIME SYSTEMS, INC 006096T.S. MICROTECH INC 0060973COM CORPORATION 006098HT COMMUNICATIONS 006099SBE, Inc 00609ANJK TECHNO CO 00609BASTRO-MED, INC 00609CPerkin-Elmer Incorporated 00609DPMI FOOD EQUIPMENT GROUP 00609EASC X3 - INFORMATION TECHNOLOGY STANDARDS SECRETARIATS 00609FPHAST CORPORATION 0060A0SWITCHED NETWORK TECHNOLOGIES, INC 0060A1VPNet, Inc 0060A2NIHON UNISYS LIMITED CO 0060A3CONTINUUM TECHNOLOGY CORP 0060A4GEW Technologies (PTY)Ltd 0060A5PERFORMANCE TELECOM CORP 0060A6PARTICLE MEASURING SYSTEMS 0060A7MICROSENS GmbH & CO. KG 0060A8TIDOMAT AB 0060A9GESYTEC MbH 0060AAINTELLIGENT DEVICES INC. (IDI) 0060ABLARSCOM INCORPORATED 0060ACRESILIENCE CORPORATION 0060ADMegaChips Corporation 0060AETRIO INFORMATION SYSTEMS AB 0060AFPACIFIC MICRO DATA, INC 0060B0HEWLETT-PACKARD CO 0060B1INPUT/OUTPUT, INC 0060B2PROCESS CONTROL CORP 0060B3Z-COM, INC 0060B4GLENAYRE R&D INC 0060B5KEBA GmbH 0060B6LAND COMPUTER CO., LTD 0060B7CHANNELMATIC, INC 0060B8CORELIS Inc 0060B9NEC Platforms, Ltd 0060BASAHARA NETWORKS, INC 0060BBCABLETRON - NETLINK, INC 0060BCKeunYoung Electronics & Communication Co., Ltd 0060BDHUBBELL-PULSECOM 0060BEWEBTRONICS 0060BFMACRAIGOR SYSTEMS, INC 0060C0Nera Networks AS 0060C1WaveSpan Corporation 0060C2MPL AG 0060C3NETVISION CORPORATION 0060C4SOLITON SYSTEMS K.K 0060C5ANCOT CORP 0060C6DCS AG 0060C7AMATI COMMUNICATIONS CORP 0060C8KUKA WELDING SYSTEMS & ROBOTS 0060C9ControlNet, Inc 0060CAHARMONIC SYSTEMS INCORPORATED 0060CBHITACHI ZOSEN CORPORATION 0060CCEMTRAK, INCORPORATED 0060CDVideoServer, Inc 0060CEACCLAIM COMMUNICATIONS 0060CFALTEON NETWORKS, INC 0060D0SNMP RESEARCH INCORPORATED 0060D1CASCADE COMMUNICATIONS 0060D2LUCENT TECHNOLOGIES TAIWAN TELECOMMUNICATIONS CO., LTD 0060D3AT&T 0060D4ELDAT COMMUNICATION LTD 0060D5MIYACHI TECHNOS CORP 0060D6NovAtel Wireless Technologies Ltd 0060D7ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (EPFL) 0060D8ELMIC SYSTEMS, INC 0060D9TRANSYS NETWORKS INC 0060DAJBM ELECTRONICS CO 0060DBNTP ELEKTRONIK A/S 0060DCToyo Network Systems & System Integration Co. LTD 0060DDMYRICOM, INC 0060DEKayser-Threde GmbH 0060DFBrocade Communications Systems, Inc 0060E0AXIOM TECHNOLOGY CO., LTD 0060E1ORCKIT COMMUNICATIONS LTD 0060E2QUEST ENGINEERING & DEVELOPMENT 0060E3ARBIN INSTRUMENTS 0060E4COMPUSERVE, INC 0060E5FUJI AUTOMATION CO., LTD 0060E6SHOMITI SYSTEMS INCORPORATED 0060E7RANDATA 0060E8HITACHI COMPUTER PRODUCTS (AMERICA), INC 0060E9ATOP TECHNOLOGIES, INC 0060EAStreamLogic 0060EBFOURTHTRACK SYSTEMS 0060ECHERMARY OPTO ELECTRONICS INC 0060EDRICARDO TEST AUTOMATION LTD 0060EEAPOLLO 0060EFFLYTECH TECHNOLOGY CO., LTD 0060F0JOHNSON & JOHNSON MEDICAL, INC 0060F1EXP COMPUTER, INC 0060F2LASERGRAPHICS, INC 0060F3Performance Analysis Broadband, Spirent plc 0060F4ADVANCED COMPUTER SOLUTIONS, Inc 0060F5ICON WEST, INC 0060F6NEXTEST COMMUNICATIONS PRODUCTS, INC 0060F7DATAFUSION SYSTEMS 0060F8Loran International Technologies Inc 0060F9DIAMOND LANE COMMUNICATIONS 0060FAEDUCATIONAL TECHNOLOGY RESOURCES, INC 0060FBPACKETEER, INC 0060FCCONSERVATION THROUGH INNOVATION LTD 0060FDNetICs, Inc 0060FELYNX SYSTEM DEVELOPERS, INC 0060FFQuVis, Inc 006171Apple 006440CISCO SYSTEMS, INC 0064A6Maquet CardioVascular 00664BHuawei Technologies Co., Ltd 006B8EShanghai Feixun Communication Co.,Ltd 006B9EVIZIO Inc 006BA0SHENZHEN UNIVERSAL INTELLISYS PTE LTD 006DFBVutrix (UK) Ltd 0070B0M/A-COM INC. COMPANIES 0070B3DATA RECALL LTD 0071CCHon Hai Precision Ind. Co.,Ltd 00738DTinno Mobile Technology Corp 0073E0Samsung Electronics Co.,Ltd 007532INID BV 0075E1Ampt, LLC 00789ESAGEMCOM 007DFAVolkswagen Group of America 007F28Actiontec Electronics, Inc 008000MULTITECH SYSTEMS, INC 008001PERIPHONICS CORPORATION 008002SATELCOM (UK) LTD 008003HYTEC ELECTRONICS LTD 008004ANTLOW COMMUNICATIONS, LTD 008005CACTUS COMPUTER INC 008006COMPUADD CORPORATION 008007DLOG NC-SYSTEME 008008DYNATECH COMPUTER SYSTEMS 008009JUPITER SYSTEMS, INC 00800AJAPAN COMPUTER CORP 00800BCSK CORPORATION 00800CVIDECOM LIMITED 00800DVOSSWINKEL F.U 00800EATLANTIX CORPORATION 00800FSTANDARD MICROSYSTEMS 008010COMMODORE INTERNATIONAL 008011DIGITAL SYSTEMS INT'L. INC 008012INTEGRATED MEASUREMENT SYSTEMS 008013THOMAS-CONRAD CORPORATION 008014ESPRIT SYSTEMS 008015SEIKO SYSTEMS, INC 008016WANDEL AND GOLTERMANN 008017PFU LIMITED 008018KOBE STEEL, LTD 008019DAYNA COMMUNICATIONS, INC 00801ABELL ATLANTIC 00801BKODIAK TECHNOLOGY 00801CNEWPORT SYSTEMS SOLUTIONS 00801DINTEGRATED INFERENCE MACHINES 00801EXINETRON, INC 00801FKRUPP ATLAS ELECTRONIK GMBH 008020NETWORK PRODUCTS 008021Alcatel Canada Inc 008022SCAN-OPTICS 008023INTEGRATED BUSINESS NETWORKS 008024KALPANA, INC 008025STOLLMANN GMBH 008026NETWORK PRODUCTS CORPORATION 008027ADAPTIVE SYSTEMS, INC 008028TRADPOST (HK) LTD 008029EAGLE TECHNOLOGY, INC 00802ATEST SYSTEMS & SIMULATIONS INC 00802BINTEGRATED MARKETING CO 00802CTHE SAGE GROUP PLC 00802DXYLOGICS INC 00802ECASTLE ROCK COMPUTING 00802FNATIONAL INSTRUMENTS CORP 008030NEXUS ELECTRONICS 008031BASYS, CORP 008032ACCESS CO., LTD 008033EMS Aviation, Inc 008034SMT GOUPIL 008035TECHNOLOGY WORKS, INC 008036REFLEX MANUFACTURING SYSTEMS 008037Ericsson Group 008038DATA RESEARCH & APPLICATIONS 008039ALCATEL STC AUSTRALIA 00803AVARITYPER, INC 00803BAPT COMMUNICATIONS, INC 00803CTVS ELECTRONICS LTD 00803DSURIGIKEN CO., LTD 00803ESYNERNETICS 00803FTATUNG COMPANY 008040JOHN FLUKE MANUFACTURING CO 008041VEB KOMBINAT ROBOTRON 008042Artesyn Embedded Technologies 008043NETWORLD, INC 008044SYSTECH COMPUTER CORP 008045MATSUSHITA ELECTRIC IND. CO 008046Tattile SRL 008047IN-NET CORP 008048COMPEX INCORPORATED 008049NISSIN ELECTRIC CO., LTD 00804APRO-LOG 00804BEAGLE TECHNOLOGIES PTY.LTD 00804CCONTEC CO., LTD 00804DCYCLONE MICROSYSTEMS, INC 00804EAPEX COMPUTER COMPANY 00804FDAIKIN INDUSTRIES, LTD 008050ZIATECH CORPORATION 008051FIBERMUX 008052TECHNICALLY ELITE CONCEPTS 008053INTELLICOM, INC 008054FRONTIER TECHNOLOGIES CORP 008055FERMILAB 008056SPHINX ELEKTRONIK GMBH 008057ADSOFT, LTD 008058PRINTER SYSTEMS CORPORATION 008059STANLEY ELECTRIC CO., LTD 00805ATULIP COMPUTERS INTERNAT'L B.V 00805BCONDOR SYSTEMS, INC 00805CAGILIS CORPORATION 00805DCANSTAR 00805ELSI LOGIC CORPORATION 00805FHewlett-Packard Company 008060NETWORK INTERFACE CORPORATION 008061LITTON SYSTEMS, INC 008062INTERFACE CO 008063Hirschmann Automation and Control GmbH 008064WYSE TECHNOLOGY LLC 008065CYBERGRAPHIC SYSTEMS PTY LTD 008066ARCOM CONTROL SYSTEMS, LTD 008067SQUARE D COMPANY 008068YAMATECH SCIENTIFIC LTD 008069COMPUTONE SYSTEMS 00806AERI (EMPAC RESEARCH INC.) 00806BSCHMID TELECOMMUNICATION 00806CCEGELEC PROJECTS LTD 00806DCENTURY SYSTEMS CORP 00806ENIPPON STEEL CORPORATION 00806FONELAN LTD 008070COMPUTADORAS MICRON 008071SAI TECHNOLOGY 008072MICROPLEX SYSTEMS LTD 008073DWB ASSOCIATES 008074FISHER CONTROLS 008075PARSYTEC GMBH 008076MCNC 008077BROTHER INDUSTRIES, LTD 008078PRACTICAL PERIPHERALS, INC 008079MICROBUS DESIGNS LTD 00807AAITECH SYSTEMS LTD 00807BARTEL COMMUNICATIONS CORP 00807CFIBERCOM, INC 00807DEQUINOX SYSTEMS INC 00807ESOUTHERN PACIFIC LTD 00807FDY-4 INCORPORATED 008080DATAMEDIA CORPORATION 008081KENDALL SQUARE RESEARCH CORP 008082PEP MODULAR COMPUTERS GMBH 008083AMDAHL 008084THE CLOUD INC 008085H-THREE SYSTEMS CORPORATION 008086COMPUTER GENERATION INC 008087OKI ELECTRIC INDUSTRY CO., LTD 008088VICTOR COMPANY OF JAPAN, LTD 008089TECNETICS (PTY) LTD 00808ASUMMIT MICROSYSTEMS CORP 00808BDACOLL LIMITED 00808CNetScout Systems, Inc 00808DWESTCOAST TECHNOLOGY B.V 00808ERADSTONE TECHNOLOGY 00808FC. ITOH ELECTRONICS, INC 008090MICROTEK INTERNATIONAL, INC 008091TOKYO ELECTRIC CO.,LTD 008092Silex Technology, Inc 008093XYRON CORPORATION 008094ALFA LAVAL AUTOMATION AB 008095BASIC MERTON HANDELSGES.M.B.H 008096HUMAN DESIGNED SYSTEMS, INC 008097CENTRALP AUTOMATISMES 008098TDK CORPORATION 008099Eaton Industries GmbH 00809ANOVUS NETWORKS LTD 00809BJUSTSYSTEM CORPORATION 00809CLUXCOM, INC 00809DCommscraft Ltd 00809EDATUS GMBH 00809FALCATEL BUSINESS SYSTEMS 0080A0EDISA HEWLETT PACKARD S/A 0080A1MICROTEST, INC 0080A2CREATIVE ELECTRONIC SYSTEMS 0080A3Lantronix 0080A4LIBERTY ELECTRONICS 0080A5SPEED INTERNATIONAL 0080A6REPUBLIC TECHNOLOGY, INC 0080A7Honeywell International Inc 0080A8VITACOM CORPORATION 0080A9CLEARPOINT RESEARCH 0080AAMAXPEED 0080ABDUKANE NETWORK INTEGRATION 0080ACIMLOGIX, DIVISION OF GENESYS 0080ADCNET TECHNOLOGY, INC 0080AEHUGHES NETWORK SYSTEMS 0080AFALLUMER CO., LTD 0080B0ADVANCED INFORMATION 0080B1SOFTCOM A/S 0080B2NETWORK EQUIPMENT TECHNOLOGIES 0080B3AVAL DATA CORPORATION 0080B4SOPHIA SYSTEMS 0080B5UNITED NETWORKS INC 0080B6THEMIS COMPUTER 0080B7STELLAR COMPUTER 0080B8B.U.G. MORISEIKI, INCORPORATED 0080B9ARCHE TECHNOLIGIES INC 0080BASPECIALIX (ASIA) PTE, LTD 0080BBHUGHES LAN SYSTEMS 0080BCHITACHI ENGINEERING CO., LTD 0080BDTHE FURUKAWA ELECTRIC CO., LTD 0080BEARIES RESEARCH 0080BFTAKAOKA ELECTRIC MFG. CO. LTD 0080C0PENRIL DATACOMM 0080C1LANEX CORPORATION 0080C2IEEE 802.1 COMMITTEE 0080C3BICC INFORMATION SYSTEMS & SVC 0080C4DOCUMENT TECHNOLOGIES, INC 0080C5NOVELLCO DE MEXICO 0080C6NATIONAL DATACOMM CORPORATION 0080C7XIRCOM 0080C8D-LINK SYSTEMS, INC 0080C9ALBERTA MICROELECTRONIC CENTRE 0080CANETCOM RESEARCH INCORPORATED 0080CBFALCO DATA PRODUCTS 0080CCMICROWAVE BYPASS SYSTEMS 0080CDMICRONICS COMPUTER, INC 0080CEBROADCAST TELEVISION SYSTEMS 0080CFEMBEDDED PERFORMANCE INC 0080D0COMPUTER PERIPHERALS, INC 0080D1KIMTRON CORPORATION 0080D2SHINNIHONDENKO CO., LTD 0080D3SHIVA CORP 0080D4CHASE RESEARCH LTD 0080D5CADRE TECHNOLOGIES 0080D6NUVOTECH, INC 0080D7Fantum Engineering 0080D8NETWORK PERIPHERALS INC 0080D9EMK Elektronik GmbH & Co. KG 0080DABruel & Kjaer Sound & Vibration Measurement A/S 0080DBGRAPHON CORPORATION 0080DCPICKER INTERNATIONAL 0080DDGMX INC/GIMIX 0080DEGIPSI S.A 0080DFADC CODENOLL TECHNOLOGY CORP 0080E0XTP SYSTEMS, INC 0080E1STMICROELECTRONICS 0080E2T.D.I. CO., LTD 0080E3CORAL NETWORK CORPORATION 0080E4NORTHWEST DIGITAL SYSTEMS, INC 0080E5NetApp, Inc 0080E6PEER NETWORKS, INC 0080E7LYNWOOD SCIENTIFIC DEV. LTD 0080E8CUMULUS CORPORATIION 0080E9Madge Ltd 0080EAADVA Optical Networking Ltd 0080EBCOMPCONTROL B.V 0080ECSUPERCOMPUTING SOLUTIONS, INC 0080EDIQ TECHNOLOGIES, INC 0080EETHOMSON CSF 0080EFRATIONAL 0080F0Panasonic Communications Co., Ltd 0080F1OPUS SYSTEMS 0080F2RAYCOM SYSTEMS INC 0080F3SUN ELECTRONICS CORP 0080F4TELEMECANIQUE ELECTRIQUE 0080F5Quantel Ltd 0080F6SYNERGY MICROSYSTEMS 0080F7ZENITH ELECTRONICS 0080F8MIZAR, INC 0080F9HEURIKON CORPORATION 0080FARWT GMBH 0080FBBVM LIMITED 0080FCAVATAR CORPORATION 0080FDEXSCEED CORPRATION 0080FEAZURE TECHNOLOGIES, INC 0080FFSOC. DE TELEINFORMATIQUE RTC 0086A0 008865Apple 008B43RFTECH 008C10Black Box Corp 008C54ADB Broadband Italia 008CFAInventec Corporation 008D4ECJSC NII STT 008DDALink One Co., Ltd 008EF2NETGEAR INC., 009000DIAMOND MULTIMEDIA 009001NISHIMU ELECTRONICS INDUSTRIES CO., LTD 009002ALLGON AB 009003APLIO 0090043COM EUROPE LTD 009005PROTECH SYSTEMS CO., LTD 009006HAMAMATSU PHOTONICS K.K 009007DOMEX TECHNOLOGY CORP 009008HanA Systems Inc 009009I Controls, Inc 00900APROTON ELECTRONIC INDUSTRIAL CO., LTD 00900BLANNER ELECTRONICS, INC 00900CCISCO SYSTEMS, INC 00900DOverland Storage Inc 00900EHANDLINK TECHNOLOGIES, INC 00900FKAWASAKI HEAVY INDUSTRIES, LTD 009010SIMULATION LABORATORIES, INC 009011WAVTrace, Inc 009012GLOBESPAN SEMICONDUCTOR, INC 009013SAMSAN CORP 009014ROTORK INSTRUMENTS, LTD 009015CENTIGRAM COMMUNICATIONS CORP 009016ZAC 009017Zypcom, Inc 009018ITO ELECTRIC INDUSTRY CO, LTD 009019HERMES ELECTRONICS CO., LTD 00901AUNISPHERE SOLUTIONS 00901BDIGITAL CONTROLS 00901Cmps Software Gmbh 00901DPEC (NZ) LTD 00901ESelesta Ingegneria S.p.A 00901FADTEC PRODUCTIONS, INC 009020PHILIPS ANALYTICAL X-RAY B.V 009021CISCO SYSTEMS, INC 009022IVEX 009023ZILOG INC 009024PIPELINKS, INC 009025BAE Systems Australia (Electronic Systems) Pty Ltd 009026ADVANCED SWITCHING COMMUNICATIONS, INC 009027INTEL CORPORATION 009028NIPPON SIGNAL CO., LTD 009029CRYPTO AG 00902ACOMMUNICATION DEVICES, INC 00902BCISCO SYSTEMS, INC 00902CDATA & CONTROL EQUIPMENT LTD 00902DDATA ELECTRONICS (AUST.) PTY, LTD 00902ENAMCO LIMITED 00902FNETCORE SYSTEMS, INC 009030HONEYWELL-DATING 009031MYSTICOM, LTD 009032PELCOMBE GROUP LTD 009033INNOVAPHONE AG 009034IMAGIC, INC 009035ALPHA TELECOM, INC 009036ens, inc 009037ACUCOMM, INC 009038FOUNTAIN TECHNOLOGIES, INC 009039SHASTA NETWORKS 00903ANIHON MEDIA TOOL INC 00903BTriEMS Research Lab, Inc 00903CATLANTIC NETWORK SYSTEMS 00903DBIOPAC SYSTEMS, INC 00903EN.V. PHILIPS INDUSTRIAL ACTIVITIES 00903FAZTEC RADIOMEDIA 009040Siemens Network Convergence LLC 009041APPLIED DIGITAL ACCESS 009042ECCS, Inc 009043Tattile SRL 009044ASSURED DIGITAL, INC 009045Marconi Communications 009046DEXDYNE, LTD 009047GIGA FAST E. LTD 009048ZEAL CORPORATION 009049ENTRIDIA CORPORATION 00904ACONCUR SYSTEM TECHNOLOGIES 00904BGemTek Technology Co., Ltd 00904CEPIGRAM, INC 00904DSPEC S.A 00904EDELEM BV 00904FABB POWER T&D COMPANY, INC 009050TELESTE OY 009051ULTIMATE TECHNOLOGY CORP 009052SELCOM ELETTRONICA S.R.L 009053DAEWOO ELECTRONICS CO., LTD 009054INNOVATIVE SEMICONDUCTORS, INC 009055PARKER HANNIFIN CORPORATION COMPUMOTOR DIVISION 009056TELESTREAM, INC 009057AANetcom, Inc 009058Ultra Electronics Ltd., Command and Control Systems 009059TELECOM DEVICE K.K 00905ADEARBORN GROUP, INC 00905BRAYMOND AND LAE ENGINEERING 00905CEDMI 00905DNETCOM SICHERHEITSTECHNIK GmbH 00905ERAULAND-BORG CORPORATION 00905FCISCO SYSTEMS, INC 009060SYSTEM CREATE CORP 009061PACIFIC RESEARCH & ENGINEERING CORPORATION 009062ICP VORTEX COMPUTERSYSTEME GmbH 009063COHERENT COMMUNICATIONS SYSTEMS CORPORATION 009064Thomson Inc 009065FINISAR CORPORATION 009066Troika Networks, Inc 009067WalkAbout Computers, Inc 009068DVT CORP 009069JUNIPER NETWORKS, INC 00906ATURNSTONE SYSTEMS, INC 00906BAPPLIED RESOURCES, INC 00906CSartorius Hamburg GmbH 00906DCISCO SYSTEMS, INC 00906EPRAXON, INC 00906FCISCO SYSTEMS, INC 009070NEO NETWORKS, INC 009071Applied Innovation Inc 009072SIMRAD AS 009073GAIO TECHNOLOGY 009074ARGON NETWORKS, INC 009075NEC DO BRASIL S.A 009076FMT AIRCRAFT GATE SUPPORT SYSTEMS AB 009077ADVANCED FIBRE COMMUNICATIONS 009078MER TELEMANAGEMENT SOLUTIONS, LTD 009079ClearOne, Inc 00907ASpectralink, Inc 00907BE-TECH, INC 00907CDIGITALCAST, INC 00907DLake Communications 00907EVETRONIX CORP 00907FWatchGuard Technologies, Inc 009080NOT LIMITED, INC 009081ALOHA NETWORKS, INC 009082FORCE INSTITUTE 009083TURBO COMMUNICATION, INC 009084ATECH SYSTEM 009085GOLDEN ENTERPRISES, INC 009086CISCO SYSTEMS, INC 009087ITIS 009088BAXALL SECURITY LTD 009089SOFTCOM MICROSYSTEMS, INC 00908ABAYLY COMMUNICATIONS, INC 00908BTattile SRL 00908CETREND ELECTRONICS, INC 00908DVICKERS ELECTRONICS SYSTEMS 00908ENortel Networks Broadband Access 00908FAUDIO CODES LTD 009090I-BUS 009091DigitalScape, Inc 009092CISCO SYSTEMS, INC 009093NANAO CORPORATION 009094OSPREY TECHNOLOGIES, INC 009095UNIVERSAL AVIONICS 009096ASKEY COMPUTER CORP 009097Sycamore Networks 009098SBC DESIGNS, INC 009099ALLIED TELESIS, K.K 00909AONE WORLD SYSTEMS, INC 00909BMARKEM-IMAJE 00909CARRIS Group, Inc 00909DNovaTech Process Solutions, LLC 00909ECritical IO, LLC 00909FDIGI-DATA CORPORATION 0090A08X8 INC 0090A1Flying Pig Systems/High End Systems Inc 0090A2CYBERTAN TECHNOLOGY, INC 0090A3Corecess Inc 0090A4ALTIGA NETWORKS 0090A5SPECTRA LOGIC 0090A6CISCO SYSTEMS, INC 0090A7CLIENTEC CORPORATION 0090A8NineTiles Networks, Ltd 0090A9WESTERN DIGITAL 0090AAINDIGO ACTIVE VISION SYSTEMS LIMITED 0090ABCISCO SYSTEMS, INC 0090ACOPTIVISION, INC 0090ADASPECT ELECTRONICS, INC 0090AEITALTEL S.p.A 0090AFJ. MORITA MFG. CORP 0090B0VADEM 0090B1CISCO SYSTEMS, INC 0090B2AVICI SYSTEMS INC 0090B3AGRANAT SYSTEMS 0090B4WILLOWBROOK TECHNOLOGIES 0090B5NIKON CORPORATION 0090B6FIBEX SYSTEMS 0090B7DIGITAL LIGHTWAVE, INC 0090B8ROHDE & SCHWARZ GMBH & CO. KG 0090B9BERAN INSTRUMENTS LTD 0090BAVALID NETWORKS, INC 0090BBTAINET COMMUNICATION SYSTEM Corp 0090BCTELEMANN CO., LTD 0090BDOMNIA COMMUNICATIONS, INC 0090BEIBC/INTEGRATED BUSINESS COMPUTERS 0090BFCISCO SYSTEMS, INC 0090C0K.J. LAW ENGINEERS, INC 0090C1Peco II, Inc 0090C2JK microsystems, Inc 0090C3TOPIC SEMICONDUCTOR CORP 0090C4JAVELIN SYSTEMS, INC 0090C5INTERNET MAGIC, INC 0090C6OPTIM SYSTEMS, INC 0090C7ICOM INC 0090C8WAVERIDER COMMUNICATIONS (CANADA) INC 0090C9DPAC Technologies 0090CAACCORD VIDEO TELECOMMUNICATIONS, LTD 0090CBWireless OnLine, Inc 0090CCPlanex Communications 0090CDENT-EMPRESA NACIONAL DE TELECOMMUNICACOES, S.A 0090CETETRA GmbH 0090CFNORTEL 0090D0Thomson Telecom Belgium 0090D1LEICHU ENTERPRISE CO., LTD 0090D2ARTEL VIDEO SYSTEMS 0090D3GIESECKE & DEVRIENT GmbH 0090D4BindView Development Corp 0090D5EUPHONIX, INC 0090D6CRYSTAL GROUP 0090D7NetBoost Corp 0090D8WHITECROSS SYSTEMS 0090D9CISCO SYSTEMS, INC 0090DADYNARC, INC 0090DBNEXT LEVEL COMMUNICATIONS 0090DCTECO INFORMATION SYSTEMS 0090DDMIHARU COMMUNICATIONS Inc 0090DECARDKEY SYSTEMS, INC 0090DFMITSUBISHI CHEMICAL AMERICA, INC 0090E0SYSTRAN CORP 0090E1TELENA S.P.A 0090E2DISTRIBUTED PROCESSING TECHNOLOGY 0090E3AVEX ELECTRONICS INC 0090E4NEC AMERICA, INC 0090E5TEKNEMA, INC 0090E6ALi Corporation 0090E7HORSCH ELEKTRONIK AG 0090E8MOXA TECHNOLOGIES CORP., LTD 0090E9JANZ COMPUTER AG 0090EAALPHA TECHNOLOGIES, INC 0090EBSENTRY TELECOM SYSTEMS 0090ECPYRESCOM 0090EDCENTRAL SYSTEM RESEARCH CO., LTD 0090EEPERSONAL COMMUNICATIONS TECHNOLOGIES 0090EFINTEGRIX, INC 0090F0Harmonic Video Systems Ltd 0090F1DOT HILL SYSTEMS CORPORATION 0090F2CISCO SYSTEMS, INC 0090F3ASPECT COMMUNICATIONS 0090F4LIGHTNING INSTRUMENTATION 0090F5CLEVO CO 0090F6ESCALATE NETWORKS, INC 0090F7NBASE COMMUNICATIONS LTD 0090F8MEDIATRIX TELECOM 0090F9LEITCH 0090FAEmulex Corporation 0090FBPORTWELL, INC 0090FCNETWORK COMPUTING DEVICES 0090FDCopperCom, Inc 0090FEELECOM CO., LTD. (LANEED DIV.) 0090FFTELLUS TECHNOLOGY INC 0091D6Crystal Group, Inc 0091FASynapse Product Development 0092FASHENZHEN WISKY TECHNOLOGY CO.,LTD 009363Uni-Link Technology Co., Ltd 009569LSD Science and Technology Co.,Ltd 0097FFHeimann Sensor GmbH 009C02Hewlett-Packard Company 009D8ECARDIAC RECORDERS, INC 009EC8Beijing Xiaomi Electronic Products Co., Ltd 00A000CENTILLION NETWORKS, INC 00A001DRS Signal Solutions 00A002LEEDS & NORTHRUP AUSTRALIA PTY LTD 00A003Siemens Switzerland Ltd., I B T HVP 00A004NETPOWER, INC 00A005DANIEL INSTRUMENTS, LTD 00A006IMAGE DATA PROCESSING SYSTEM GROUP 00A007APEXX TECHNOLOGY, INC 00A008NETCORP 00A009WHITETREE NETWORK 00A00AAirspan 00A00BCOMPUTEX CO., LTD 00A00CKINGMAX TECHNOLOGY, INC 00A00DTHE PANDA PROJECT 00A00EVISUAL NETWORKS, INC 00A00FBroadband Technologies 00A010SYSLOGIC DATENTECHNIK AG 00A011MUTOH INDUSTRIES LTD 00A012Telco Systems, Inc 00A013TELTREND LTD 00A014CSIR 00A015WYLE 00A016MICROPOLIS CORP 00A017J B M CORPORATION 00A018CREATIVE CONTROLLERS, INC 00A019NEBULA CONSULTANTS, INC 00A01ABINAR ELEKTRONIK AB 00A01BPREMISYS COMMUNICATIONS, INC 00A01CNASCENT NETWORKS CORPORATION 00A01DSIXNET 00A01EEST CORPORATION 00A01FTRICORD SYSTEMS, INC 00A020CITICORP/TTI 00A021General Dynamics 00A022CENTRE FOR DEVELOPMENT OF ADVANCED COMPUTING 00A023APPLIED CREATIVE TECHNOLOGY, INC 00A0243COM CORPORATION 00A025REDCOM LABS INC 00A026TELDAT, S.A 00A027FIREPOWER SYSTEMS, INC 00A028CONNER PERIPHERALS 00A029COULTER CORPORATION 00A02ATRANCELL SYSTEMS 00A02BTRANSITIONS RESEARCH CORP 00A02CinterWAVE Communications 00A02D1394 Trade Association 00A02EBRAND COMMUNICATIONS, LTD 00A02FPIRELLI CAVI 00A030CAPTOR NV/SA 00A031HAZELTINE CORPORATION, MS 1-17 00A032GES SINGAPORE PTE. LTD 00A033imc MeBsysteme GmbH 00A034AXEL 00A035CYLINK CORPORATION 00A036APPLIED NETWORK TECHNOLOGY 00A037Mindray DS USA, Inc 00A038EMAIL ELECTRONICS 00A039ROSS TECHNOLOGY, INC 00A03AKUBOTEK CORPORATION 00A03BTOSHIN ELECTRIC CO., LTD 00A03CEG&G NUCLEAR INSTRUMENTS 00A03DOPTO-22 00A03EATM FORUM 00A03FCOMPUTER SOCIETY MICROPROCESSOR & MICROPROCESSOR STANDARDS C 00A040Apple 00A041INFICON 00A042SPUR PRODUCTS CORP 00A043AMERICAN TECHNOLOGY LABS, INC 00A044NTT IT CO., LTD 00A045PHOENIX CONTACT GMBH & CO 00A046SCITEX CORP. LTD 00A047INTEGRATED FITNESS CORP 00A048QUESTECH, LTD 00A049DIGITECH INDUSTRIES, INC 00A04ANISSHIN ELECTRIC CO., LTD 00A04BTFL LAN INC 00A04CINNOVATIVE SYSTEMS & TECHNOLOGIES, INC 00A04DEDA INSTRUMENTS, INC 00A04EVOELKER TECHNOLOGIES, INC 00A04FAMERITEC CORP 00A050CYPRESS SEMICONDUCTOR 00A051ANGIA COMMUNICATIONS. INC 00A052STANILITE ELECTRONICS PTY. LTD 00A053COMPACT DEVICES, INC 00A054 00A055Data Device Corporation 00A056MICROPROSS 00A057LANCOM Systems GmbH 00A058GLORY, LTD 00A059HAMILTON HALLMARK 00A05AKOFAX IMAGE PRODUCTS 00A05BMARQUIP, INC 00A05CINVENTORY CONVERSION, INC./ 00A05DCS COMPUTER SYSTEME GmbH 00A05EMYRIAD LOGIC INC 00A05FBTG Electronics Design BV 00A060ACER PERIPHERALS, INC 00A061PURITAN BENNETT 00A062AES PRODATA 00A063JRL SYSTEMS, INC 00A064KVB/ANALECT 00A065Symantec Corporation 00A066ISA CO., LTD 00A067NETWORK SERVICES GROUP 00A068BHP LIMITED 00A069Symmetricom, Inc 00A06AVerilink Corporation 00A06BDMS DORSCH MIKROSYSTEM GMBH 00A06CSHINDENGEN ELECTRIC MFG. CO., LTD 00A06DMANNESMANN TALLY CORPORATION 00A06EAUSTRON, INC 00A06FTHE APPCON GROUP, INC 00A070COASTCOM 00A071VIDEO LOTTERY TECHNOLOGIES,INC 00A072OVATION SYSTEMS LTD 00A073COM21, INC 00A074PERCEPTION TECHNOLOGY 00A075MICRON TECHNOLOGY, INC 00A076CARDWARE LAB, INC 00A077FUJITSU NEXION, INC 00A078Marconi Communications 00A079ALPS ELECTRIC (USA), INC 00A07AADVANCED PERIPHERALS TECHNOLOGIES, INC 00A07BDAWN COMPUTER INCORPORATION 00A07CTONYANG NYLON CO., LTD 00A07DSEEQ TECHNOLOGY, INC 00A07EAVID TECHNOLOGY, INC 00A07FGSM-SYNTEL, LTD 00A080Tattile SRL 00A081ALCATEL DATA NETWORKS 00A082NKT ELEKTRONIK A/S 00A083ASIMMPHONY TURKEY 00A084Dataplex Pty Ltd 00A085 00A086AMBER WAVE SYSTEMS, INC 00A087Microsemi Corporation 00A088ESSENTIAL COMMUNICATIONS 00A089XPOINT TECHNOLOGIES, INC 00A08ABROOKTROUT TECHNOLOGY, INC 00A08BASTON ELECTRONIC DESIGNS LTD 00A08CMultiMedia LANs, Inc 00A08DJACOMO CORPORATION 00A08ECheck Point Software Technologies 00A08FDESKNET SYSTEMS, INC 00A090TimeStep Corporation 00A091APPLICOM INTERNATIONAL 00A092H. BOLLMANN MANUFACTURERS, LTD 00A093B/E AEROSPACE, Inc 00A094COMSAT CORPORATION 00A095ACACIA NETWORKS, INC 00A096MITSUMI ELECTRIC CO., LTD 00A097JC INFORMATION SYSTEMS 00A098NetApp 00A099K-NET LTD 00A09ANIHON KOHDEN AMERICA 00A09BQPSX COMMUNICATIONS, LTD 00A09CXyplex, Inc 00A09DJOHNATHON FREEMAN TECHNOLOGIES 00A09EICTV 00A09FCOMMVISION CORP 00A0A0COMPACT DATA, LTD 00A0A1EPIC DATA INC 00A0A2DIGICOM S.P.A 00A0A3RELIABLE POWER METERS 00A0A4MICROS SYSTEMS, INC 00A0A5TEKNOR MICROSYSTEME, INC 00A0A6M.I. SYSTEMS, K.K 00A0A7VORAX CORPORATION 00A0A8RENEX CORPORATION 00A0A9NAVTEL COMMUNICATIONS INC 00A0AASPACELABS MEDICAL 00A0ABNETCS INFORMATIONSTECHNIK GMBH 00A0ACGILAT SATELLITE NETWORKS, LTD 00A0ADMARCONI SPA 00A0AENUCOM SYSTEMS, INC 00A0AFWMS INDUSTRIES 00A0B0I-O DATA DEVICE, INC 00A0B1FIRST VIRTUAL CORPORATION 00A0B2SHIMA SEIKI 00A0B3ZYKRONIX 00A0B4TEXAS MICROSYSTEMS, INC 00A0B53H TECHNOLOGY 00A0B6SANRITZ AUTOMATION CO., LTD 00A0B7CORDANT, INC 00A0B8SYMBIOS LOGIC INC 00A0B9EAGLE TECHNOLOGY, INC 00A0BAPATTON ELECTRONICS CO 00A0BBHILAN GMBH 00A0BCVIASAT, INCORPORATED 00A0BDI-TECH CORP 00A0BEINTEGRATED CIRCUIT SYSTEMS, INC. COMMUNICATIONS GROUP 00A0BFWIRELESS DATA GROUP MOTOROLA 00A0C0DIGITAL LINK CORP 00A0C1ORTIVUS MEDICAL AB 00A0C2R.A. SYSTEMS CO., LTD 00A0C3UNICOMPUTER GMBH 00A0C4CRISTIE ELECTRONICS LTD 00A0C5ZYXEL COMMUNICATION 00A0C6QUALCOMM INCORPORATED 00A0C7TADIRAN TELECOMMUNICATIONS 00A0C8ADTRAN INC 00A0C9INTEL CORPORATION - HF1-06 00A0CAFUJITSU DENSO LTD 00A0CBARK TELECOMMUNICATIONS, INC 00A0CCLITE-ON COMMUNICATIONS, INC 00A0CDDR. JOHANNES HEIDENHAIN GmbH 00A0CEEcessa 00A0CFSOTAS, INC 00A0D0TEN X TECHNOLOGY, INC 00A0D1INVENTEC CORPORATION 00A0D2ALLIED TELESIS INTERNATIONAL CORPORATION 00A0D3INSTEM COMPUTER SYSTEMS, LTD 00A0D4RADIOLAN, INC 00A0D5SIERRA WIRELESS INC 00A0D6SBE, INC 00A0D7KASTEN CHASE APPLIED RESEARCH 00A0D8SPECTRA - TEK 00A0D9CONVEX COMPUTER CORPORATION 00A0DAINTEGRATED SYSTEMS Technology, Inc 00A0DBFISHER & PAYKEL PRODUCTION 00A0DCO.N. ELECTRONIC CO., LTD 00A0DDAZONIX CORPORATION 00A0DEYAMAHA CORPORATION 00A0DFSTS TECHNOLOGIES, INC 00A0E0TENNYSON TECHNOLOGIES PTY LTD 00A0E1WESTPORT RESEARCH ASSOCIATES, INC 00A0E2Keisokugiken Corporation 00A0E3XKL SYSTEMS CORP 00A0E4OPTIQUEST 00A0E5NHC COMMUNICATIONS 00A0E6DIALOGIC CORPORATION 00A0E7CENTRAL DATA CORPORATION 00A0E8REUTERS HOLDINGS PLC 00A0E9ELECTRONIC RETAILING SYSTEMS INTERNATIONAL 00A0EAETHERCOM CORP 00A0EBEncore Networks, Inc 00A0ECTRANSMITTON LTD 00A0EDBrooks Automation, Inc 00A0EENASHOBA NETWORKS 00A0EFLUCIDATA LTD 00A0F0TORONTO MICROELECTRONICS INC 00A0F1MTI 00A0F2INFOTEK COMMUNICATIONS, INC 00A0F3STAUBLI 00A0F4GE 00A0F5RADGUARD LTD 00A0F6AutoGas Systems Inc 00A0F7V.I COMPUTER CORP 00A0F8SYMBOL TECHNOLOGIES, INC 00A0F9BINTEC COMMUNICATIONS GMBH 00A0FAMarconi Communication GmbH 00A0FBTORAY ENGINEERING CO., LTD 00A0FCIMAGE SCIENCES, INC 00A0FDSCITEX DIGITAL PRINTING, INC 00A0FEBOSTON TECHNOLOGY, INC 00A0FFTELLABS OPERATIONS, INC 00A1DEShenZhen ShiHua Technology CO.,LTD 00A2DAINAT GmbH 00A2F5Guangzhou Yuanyun Network Technology Co.,Ltd 00A2FFabatec group AG 00AA00INTEL CORPORATION 00AA01INTEL CORPORATION 00AA02INTEL CORPORATION 00AA3COLIVETTI TELECOM SPA (OLTECO) 00AA70LG Electronics 00ACE0ARRIS Group, Inc 00AEFAMurata Manufacturing Co., Ltd 00B009Grass Valley Group 00B017InfoGear Technology Corp 00B019UTC CCS 00B01CWestport Technologies 00B01ERantic Labs, Inc 00B02AORSYS GmbH 00B02DViaGate Technologies, Inc 00B033OAO "Izhevskiy radiozavod" 00B03BHiQ Networks 00B048Marconi Communications Inc 00B04ACISCO SYSTEMS, INC 00B052Atheros Communications 00B064CISCO SYSTEMS, INC 00B069Honewell Oy 00B06DJones Futurex Inc 00B080Mannesmann Ipulsys B.V 00B086LocSoft Limited 00B08ECISCO SYSTEMS, INC 00B091Transmeta Corp 00B094Alaris, Inc 00B09AMorrow Technologies Corp 00B09DPoint Grey Research Inc 00B0ACSIAE-Microelettronica S.p.A 00B0AESymmetricom 00B0B3Xstreamis PLC 00B0C2CISCO SYSTEMS, INC 00B0C7Tellabs Operations, Inc 00B0CETECHNOLOGY RESCUE 00B0D0Dell Computer Corp 00B0DBNextcell, Inc 00B0DFStarboard Storage Systems 00B0E7British Federal Ltd 00B0ECEACEM 00B0EEAjile Systems, Inc 00B0F0CALY NETWORKS 00B0F5NetWorth Technologies, Inc 00B338Kontron Design Manufacturing Services (M) Sdn. Bhd 00B342MacroSAN Technologies Co., Ltd 00B56DDavid Electronics Co., LTD 00B5D6Omnibit Inc 00B78DNanjing Shining Electric Automation Co., Ltd 00B9F6Shenzhen Super Rich Electronics Co.,Ltd 00BAC0Biometric Access Company 00BB01OCTOTHORPE CORP 00BB3A 00BB8EHME Co., Ltd 00BBF0UNGERMANN-BASS INC 00BD27Exar Corp 00BD3ANokia Corporation 00BF15Genetec Inc 00C000LANOPTICS, LTD 00C001DIATEK PATIENT MANAGMENT 00C002SERCOMM CORPORATION 00C003GLOBALNET COMMUNICATIONS 00C004JAPAN BUSINESS COMPUTER CO.LTD 00C005LIVINGSTON ENTERPRISES, INC 00C006NIPPON AVIONICS CO., LTD 00C007PINNACLE DATA SYSTEMS, INC 00C008SECO SRL 00C009KT TECHNOLOGY (S) PTE LTD 00C00AMICRO CRAFT 00C00BNORCONTROL A.S 00C00CRELIA TECHNOLGIES 00C00DADVANCED LOGIC RESEARCH, INC 00C00EPSITECH, INC 00C00FQUANTUM SOFTWARE SYSTEMS LTD 00C010HIRAKAWA HEWTECH CORP 00C011INTERACTIVE COMPUTING DEVICES 00C012NETSPAN CORPORATION 00C013NETRIX 00C014TELEMATICS CALABASAS INT'L,INC 00C015NEW MEDIA CORPORATION 00C016ELECTRONIC THEATRE CONTROLS 00C017Fluke Corporation 00C018LANART CORPORATION 00C019LEAP TECHNOLOGY, INC 00C01ACOROMETRICS MEDICAL SYSTEMS 00C01BSOCKET COMMUNICATIONS, INC 00C01CINTERLINK COMMUNICATIONS LTD 00C01DGRAND JUNCTION NETWORKS, INC 00C01ELA FRANCAISE DES JEUX 00C01FS.E.R.C.E.L 00C020ARCO ELECTRONIC, CONTROL LTD 00C021NETEXPRESS 00C022LASERMASTER TECHNOLOGIES, INC 00C023TUTANKHAMON ELECTRONICS 00C024EDEN SISTEMAS DE COMPUTACAO SA 00C025DATAPRODUCTS CORPORATION 00C026LANS TECHNOLOGY CO., LTD 00C027CIPHER SYSTEMS, INC 00C028JASCO CORPORATION 00C029Nexans Deutschland GmbH - ANS 00C02AOHKURA ELECTRIC CO., LTD 00C02BGERLOFF GESELLSCHAFT FUR 00C02CCENTRUM COMMUNICATIONS, INC 00C02DFUJI PHOTO FILM CO., LTD 00C02ENETWIZ 00C02FOKUMA CORPORATION 00C030INTEGRATED ENGINEERING B. V 00C031DESIGN RESEARCH SYSTEMS, INC 00C032I-CUBED LIMITED 00C033TELEBIT COMMUNICATIONS APS 00C034TRANSACTION NETWORK 00C035QUINTAR COMPANY 00C036RAYTECH ELECTRONIC CORP 00C037DYNATEM 00C038RASTER IMAGE PROCESSING SYSTEM 00C039Teridian Semiconductor Corporation 00C03AMEN-MIKRO ELEKTRONIK GMBH 00C03BMULTIACCESS COMPUTING CORP 00C03CTOWER TECH S.R.L 00C03DWIESEMANN & THEIS GMBH 00C03EFA. GEBR. HELLER GMBH 00C03FSTORES AUTOMATED SYSTEMS, INC 00C040ECCI 00C041DIGITAL TRANSMISSION SYSTEMS 00C042DATALUX CORP 00C043STRATACOM 00C044EMCOM CORPORATION 00C045ISOLATION SYSTEMS, LTD 00C046Blue Chip Technology Ltd 00C047UNIMICRO SYSTEMS, INC 00C048BAY TECHNICAL ASSOCIATES 00C049U.S. ROBOTICS, INC 00C04AGROUP 2000 AG 00C04BCREATIVE MICROSYSTEMS 00C04CDEPARTMENT OF FOREIGN AFFAIRS 00C04DMITEC, INC 00C04ECOMTROL CORPORATION 00C04FDELL COMPUTER CORPORATION 00C050TOYO DENKI SEIZO K.K 00C051ADVANCED INTEGRATION RESEARCH 00C052BURR-BROWN 00C053Aspect Software Inc 00C054NETWORK PERIPHERALS, LTD 00C055MODULAR COMPUTING TECHNOLOGIES 00C056SOMELEC 00C057MYCO ELECTRONICS 00C058DATAEXPERT CORP 00C059DENSO CORPORATION 00C05ASEMAPHORE COMMUNICATIONS CORP 00C05BNETWORKS NORTHWEST, INC 00C05CELONEX PLC 00C05DL&N TECHNOLOGIES 00C05EVARI-LITE, INC 00C05FFINE-PAL COMPANY LIMITED 00C060ID SCANDINAVIA AS 00C061SOLECTEK CORPORATION 00C062IMPULSE TECHNOLOGY 00C063MORNING STAR TECHNOLOGIES, INC 00C064GENERAL DATACOMM IND. INC 00C065SCOPE COMMUNICATIONS, INC 00C066DOCUPOINT, INC 00C067UNITED BARCODE INDUSTRIES 00C068HME Clear-Com LTD 00C069Axxcelera Broadband Wireless 00C06AZAHNER-ELEKTRIK GMBH & CO. KG 00C06BOSI PLUS CORPORATION 00C06CSVEC COMPUTER CORP 00C06DBOCA RESEARCH, INC 00C06EHAFT TECHNOLOGY, INC 00C06FKOMATSU LTD 00C070SECTRA SECURE-TRANSMISSION AB 00C071AREANEX COMMUNICATIONS, INC 00C072KNX LTD 00C073XEDIA CORPORATION 00C074TOYODA AUTOMATIC LOOM 00C075XANTE CORPORATION 00C076I-DATA INTERNATIONAL A-S 00C077DAEWOO TELECOM LTD 00C078COMPUTER SYSTEMS ENGINEERING 00C079FONSYS CO.,LTD 00C07APRIVA B.V 00C07BASCEND COMMUNICATIONS, INC 00C07CHIGHTECH INFORMATION 00C07DRISC DEVELOPMENTS LTD 00C07EKUBOTA CORPORATION ELECTRONIC 00C07FNUPON COMPUTING CORP 00C080NETSTAR, INC 00C081METRODATA LTD 00C082MOORE PRODUCTS CO 00C083TRACE MOUNTAIN PRODUCTS, INC 00C084DATA LINK CORP. LTD 00C085ELECTRONICS FOR IMAGING, INC 00C086THE LYNK CORPORATION 00C087UUNET TECHNOLOGIES, INC 00C088EKF ELEKTRONIK GMBH 00C089TELINDUS DISTRIBUTION 00C08ALauterbach GmbH 00C08BRISQ MODULAR SYSTEMS, INC 00C08CPERFORMANCE TECHNOLOGIES, INC 00C08DTRONIX PRODUCT DEVELOPMENT 00C08ENETWORK INFORMATION TECHNOLOGY 00C08FPanasonic Electric Works Co., Ltd 00C090PRAIM S.R.L 00C091JABIL CIRCUIT, INC 00C092MENNEN MEDICAL INC 00C093ALTA RESEARCH CORP 00C094VMX INC 00C095ZNYX 00C096TAMURA CORPORATION 00C097ARCHIPEL SA 00C098CHUNTEX ELECTRONIC CO., LTD 00C099YOSHIKI INDUSTRIAL CO.,LTD 00C09APHOTONICS CORPORATION 00C09BRELIANCE COMM/TEC, R-TEC 00C09CHIOKI E.E. CORPORATION 00C09DDISTRIBUTED SYSTEMS INT'L, INC 00C09ECACHE COMPUTERS, INC 00C09FQUANTA COMPUTER, INC 00C0A0ADVANCE MICRO RESEARCH, INC 00C0A1TOKYO DENSHI SEKEI CO 00C0A2INTERMEDIUM A/S 00C0A3DUAL ENTERPRISES CORPORATION 00C0A4UNIGRAF OY 00C0A5DICKENS DATA SYSTEMS 00C0A6EXICOM AUSTRALIA PTY. LTD 00C0A7SEEL LTD 00C0A8GVC CORPORATION 00C0A9BARRON MCCANN LTD 00C0AASILICON VALLEY COMPUTER 00C0ABTelco Systems, Inc 00C0ACGAMBIT COMPUTER COMMUNICATIONS 00C0ADMARBEN COMMUNICATION SYSTEMS 00C0AETOWERCOM CO. INC. DBA PC HOUSE 00C0AFTEKLOGIX INC 00C0B0GCC TECHNOLOGIES,INC 00C0B1GENIUS NET CO 00C0B2NORAND CORPORATION 00C0B3COMSTAT DATACOMM CORPORATION 00C0B4MYSON TECHNOLOGY, INC 00C0B5CORPORATE NETWORK SYSTEMS,INC 00C0B6Overland Storage, Inc 00C0B7AMERICAN POWER CONVERSION CORP 00C0B8FRASER'S HILL LTD 00C0B9FUNK SOFTWARE, INC 00C0BANETVANTAGE 00C0BBFORVAL CREATIVE, INC 00C0BCTELECOM AUSTRALIA/CSSC 00C0BDINEX TECHNOLOGIES, INC 00C0BEALCATEL - SEL 00C0BFTECHNOLOGY CONCEPTS, LTD 00C0C0SHORE MICROSYSTEMS, INC 00C0C1QUAD/GRAPHICS, INC 00C0C2INFINITE NETWORKS LTD 00C0C3ACUSON COMPUTED SONOGRAPHY 00C0C4COMPUTER OPERATIONAL 00C0C5SID INFORMATICA 00C0C6PERSONAL MEDIA CORP 00C0C7SPARKTRUM MICROSYSTEMS, INC 00C0C8MICRO BYTE PTY. LTD 00C0C9ELSAG BAILEY PROCESS 00C0CAALFA, INC 00C0CBCONTROL TECHNOLOGY CORPORATION 00C0CCTELESCIENCES CO SYSTEMS, INC 00C0CDCOMELTA, S.A 00C0CECEI SYSTEMS & ENGINEERING PTE 00C0CFIMATRAN VOIMA OY 00C0D0RATOC SYSTEM INC 00C0D1COMTREE TECHNOLOGY CORPORATION 00C0D2SYNTELLECT, INC 00C0D3OLYMPUS IMAGE SYSTEMS, INC 00C0D4AXON NETWORKS, INC 00C0D5Werbeagentur Jürgen Siebert 00C0D6J1 SYSTEMS, INC 00C0D7TAIWAN TRADING CENTER DBA 00C0D8UNIVERSAL DATA SYSTEMS 00C0D9QUINTE NETWORK CONFIDENTIALITY 00C0DANICE SYSTEMS LTD 00C0DBIPC CORPORATION (PTE) LTD 00C0DCEOS TECHNOLOGIES, INC 00C0DDQLogic Corporation 00C0DEZCOMM, INC 00C0DFKYE Systems Corp 00C0E0DSC COMMUNICATION CORP 00C0E1SONIC SOLUTIONS 00C0E2CALCOMP, INC 00C0E3OSITECH COMMUNICATIONS, INC 00C0E4SIEMENS BUILDING 00C0E5GESPAC, S.A 00C0E6Verilink Corporation 00C0E7FIBERDATA AB 00C0E8PLEXCOM, INC 00C0E9OAK SOLUTIONS, LTD 00C0EAARRAY TECHNOLOGY LTD 00C0EBSEH COMPUTERTECHNIK GMBH 00C0ECDAUPHIN TECHNOLOGY 00C0EDUS ARMY ELECTRONIC 00C0EEKYOCERA CORPORATION 00C0EFABIT CORPORATION 00C0F0KINGSTON TECHNOLOGY CORP 00C0F1SHINKO ELECTRIC CO., LTD 00C0F2TRANSITION NETWORKS 00C0F3NETWORK COMMUNICATIONS CORP 00C0F4INTERLINK SYSTEM CO., LTD 00C0F5METACOMP, INC 00C0F6CELAN TECHNOLOGY INC 00C0F7ENGAGE COMMUNICATION, INC 00C0F8ABOUT COMPUTING INC 00C0F9Artesyn Embedded Technologies 00C0FACANARY COMMUNICATIONS, INC 00C0FBADVANCED TECHNOLOGY LABS 00C0FCELASTIC REALITY, INC 00C0FDPROSUM 00C0FEAPTEC COMPUTER SYSTEMS, INC 00C0FFDOT HILL SYSTEMS CORPORATION 00C14FDDL Co,.ltd 00C2C6Intel Corporate 00C5DBDatatech Sistemas Digitales Avanzados SL 00C610Apple 00CBBDCambridge Broadband Networks Ltd 00CD90MAS Elektronik AG 00CF1CCOMMUNICATION MACHINERY CORP 00D000FERRAN SCIENTIFIC, INC 00D001VST TECHNOLOGIES, INC 00D002DITECH CORPORATION 00D003COMDA ENTERPRISES CORP 00D004PENTACOM LTD 00D005ZHS ZEITMANAGEMENTSYSTEME 00D006CISCO SYSTEMS, INC 00D007MIC ASSOCIATES, INC 00D008MACTELL CORPORATION 00D009HSING TECH. ENTERPRISE CO. LTD 00D00ALANACCESS TELECOM S.A 00D00BRHK TECHNOLOGY, INC 00D00CSNIJDER MICRO SYSTEMS 00D00DMICROMERITICS INSTRUMENT 00D00EPLURIS, INC 00D00FSPEECH DESIGN GMBH 00D010CONVERGENT NETWORKS, INC 00D011PRISM VIDEO, INC 00D012GATEWORKS CORP 00D013PRIMEX AEROSPACE COMPANY 00D014ROOT, INC 00D015UNIVEX MICROTECHNOLOGY CORP 00D016SCM MICROSYSTEMS, INC 00D017SYNTECH INFORMATION CO., LTD 00D018QWES. COM, INC 00D019DAINIPPON SCREEN CORPORATE 00D01AURMET TLC S.P.A 00D01BMIMAKI ENGINEERING CO., LTD 00D01CSBS TECHNOLOGIES, 00D01DFURUNO ELECTRIC CO., LTD 00D01EPINGTEL CORP 00D01FCTAM PTY. LTD 00D020AIM SYSTEM, INC 00D021REGENT ELECTRONICS CORP 00D022INCREDIBLE TECHNOLOGIES, INC 00D023INFORTREND TECHNOLOGY, INC 00D024Cognex Corporation 00D025XROSSTECH, INC 00D026HIRSCHMANN AUSTRIA GMBH 00D027APPLIED AUTOMATION, INC 00D028Harmonic, Inc 00D029WAKEFERN FOOD CORPORATION 00D02AVoxent Systems Ltd 00D02BJETCELL, INC 00D02CCAMPBELL SCIENTIFIC, INC 00D02DADEMCO 00D02ECOMMUNICATION AUTOMATION CORP 00D02FVLSI TECHNOLOGY INC 00D030Safetran Systems Corp 00D031INDUSTRIAL LOGIC CORPORATION 00D032YANO ELECTRIC CO., LTD 00D033DALIAN DAXIAN NETWORK 00D034ORMEC SYSTEMS CORP 00D035BEHAVIOR TECH. COMPUTER CORP 00D036TECHNOLOGY ATLANTA CORP 00D037Pace France 00D038FIVEMERE, LTD 00D039UTILICOM, INC 00D03AZONEWORX, INC 00D03BVISION PRODUCTS PTY. LTD 00D03CVieo, Inc 00D03DGALILEO TECHNOLOGY, LTD 00D03EROCKETCHIPS, INC 00D03FAMERICAN COMMUNICATION 00D040SYSMATE CO., LTD 00D041AMIGO TECHNOLOGY CO., LTD 00D042MAHLO GMBH & CO. UG 00D043ZONAL RETAIL DATA SYSTEMS 00D044ALIDIAN NETWORKS, INC 00D045KVASER AB 00D046DOLBY LABORATORIES, INC 00D047XN TECHNOLOGIES 00D048ECTON, INC 00D049IMPRESSTEK CO., LTD 00D04APRESENCE TECHNOLOGY GMBH 00D04BLA CIE GROUP S.A 00D04CEUROTEL TELECOM LTD 00D04DDIV OF RESEARCH & STATISTICS 00D04ELOGIBAG 00D04FBITRONICS, INC 00D050ISKRATEL 00D051O2 MICRO, INC 00D052ASCEND COMMUNICATIONS, INC 00D053CONNECTED SYSTEMS 00D054SAS INSTITUTE INC 00D055KATHREIN-WERKE KG 00D056SOMAT CORPORATION 00D057ULTRAK, INC 00D058CISCO SYSTEMS, INC 00D059AMBIT MICROSYSTEMS CORP 00D05ASYMBIONICS, LTD 00D05BACROLOOP MOTION CONTROL 00D05CTECHNOTREND SYSTEMTECHNIK GMBH 00D05DINTELLIWORXX, INC 00D05ESTRATABEAM TECHNOLOGY, INC 00D05FVALCOM, INC 00D060Panasonic Europe Ltd 00D061TREMON ENTERPRISES CO., LTD 00D062DIGIGRAM 00D063CISCO SYSTEMS, INC 00D064MULTITEL 00D065TOKO ELECTRIC 00D066WINTRISS ENGINEERING CORP 00D067CAMPIO COMMUNICATIONS 00D068IWILL CORPORATION 00D069TECHNOLOGIC SYSTEMS 00D06ALINKUP SYSTEMS CORPORATION 00D06BSR TELECOM INC 00D06CSHAREWAVE, INC 00D06DACRISON, INC 00D06ETRENDVIEW RECORDERS LTD 00D06FKMC CONTROLS 00D070LONG WELL ELECTRONICS CORP 00D071ECHELON CORP 00D072BROADLOGIC 00D073ACN ADVANCED COMMUNICATIONS 00D074TAQUA SYSTEMS, INC 00D075ALARIS MEDICAL SYSTEMS, INC 00D076Bank of America 00D077LUCENT TECHNOLOGIES 00D078Eltex of Sweden AB 00D079CISCO SYSTEMS, INC 00D07AAMAQUEST COMPUTER CORP 00D07BCOMCAM INTERNATIONAL INC 00D07CKOYO ELECTRONICS INC. CO.,LTD 00D07DCOSINE COMMUNICATIONS 00D07EKEYCORP LTD 00D07FSTRATEGY & TECHNOLOGY, LIMITED 00D080EXABYTE CORPORATION 00D081RTD Embedded Technologies, Inc 00D082IOWAVE INC 00D083INVERTEX, INC 00D084NEXCOMM SYSTEMS, INC 00D085OTIS ELEVATOR COMPANY 00D086FOVEON, INC 00D087MICROFIRST INC 00D088ARRIS Group, Inc 00D089DYNACOLOR, INC 00D08APHOTRON USA 00D08BADVA Optical Networking Ltd 00D08CGENOA TECHNOLOGY, INC 00D08DPHOENIX GROUP, INC 00D08ENVISION INC 00D08FARDENT TECHNOLOGIES, INC 00D090CISCO SYSTEMS, INC 00D091SMARTSAN SYSTEMS, INC 00D092GLENAYRE WESTERN MULTIPLEX 00D093TQ - COMPONENTS GMBH 00D094TIMELINE VISTA, INC 00D095Alcatel-Lucent, Enterprise Business Group 00D0963COM EUROPE LTD 00D097CISCO SYSTEMS, INC 00D098Photon Dynamics Canada Inc 00D099Elcard Wireless Systems Oy 00D09AFILANET CORPORATION 00D09BSPECTEL LTD 00D09CKAPADIA COMMUNICATIONS 00D09DVERIS INDUSTRIES 00D09E2WIRE, INC 00D09FNOVTEK TEST SYSTEMS 00D0A0MIPS DENMARK 00D0A1OSKAR VIERLING GMBH + CO. KG 00D0A2INTEGRATED DEVICE 00D0A3VOCAL DATA, INC 00D0A4ALANTRO COMMUNICATIONS 00D0A5AMERICAN ARIUM 00D0A6LANBIRD TECHNOLOGY CO., LTD 00D0A7TOKYO SOKKI KENKYUJO CO., LTD 00D0A8NETWORK ENGINES, INC 00D0A9SHINANO KENSHI CO., LTD 00D0AACHASE COMMUNICATIONS 00D0ABDELTAKABEL TELECOM CV 00D0ACGRAYSON WIRELESS 00D0ADTL INDUSTRIES 00D0AEORESIS COMMUNICATIONS, INC 00D0AFCUTLER-HAMMER, INC 00D0B0BITSWITCH LTD 00D0B1OMEGA ELECTRONICS SA 00D0B2XIOTECH CORPORATION 00D0B3DRS Technologies Canada Ltd 00D0B4KATSUJIMA CO., LTD 00D0B5IPricot formerly DotCom 00D0B6CRESCENT NETWORKS, INC 00D0B7INTEL CORPORATION 00D0B8Iomega Corporation 00D0B9MICROTEK INTERNATIONAL, INC 00D0BACISCO SYSTEMS, INC 00D0BBCISCO SYSTEMS, INC 00D0BCCISCO SYSTEMS, INC 00D0BDSilicon Image GmbH 00D0BEEMUTEC INC 00D0BFPIVOTAL TECHNOLOGIES 00D0C0CISCO SYSTEMS, INC 00D0C1HARMONIC DATA SYSTEMS, LTD 00D0C2BALTHAZAR TECHNOLOGY AB 00D0C3VIVID TECHNOLOGY PTE, LTD 00D0C4TERATECH CORPORATION 00D0C5COMPUTATIONAL SYSTEMS, INC 00D0C6THOMAS & BETTS CORP 00D0C7PATHWAY, INC 00D0C8Prevas A/S 00D0C9ADVANTECH CO., LTD 00D0CAIntrinsyc Software International Inc 00D0CBDASAN CO., LTD 00D0CCTECHNOLOGIES LYRE INC 00D0CDATAN TECHNOLOGY INC 00D0CEASYST ELECTRONIC 00D0CFMORETON BAY 00D0D0ZHONGXING TELECOM LTD 00D0D1Sycamore Networks 00D0D2EPILOG CORPORATION 00D0D3CISCO SYSTEMS, INC 00D0D4V-BITS, INC 00D0D5GRUNDIG AG 00D0D6AETHRA TELECOMUNICAZIONI 00D0D7B2C2, INC 00D0D83Com Corporation 00D0D9DEDICATED MICROCOMPUTERS 00D0DATAICOM DATA SYSTEMS CO., LTD 00D0DBMCQUAY INTERNATIONAL 00D0DCMODULAR MINING SYSTEMS, INC 00D0DDSUNRISE TELECOM, INC 00D0DEPHILIPS MULTIMEDIA NETWORK 00D0DFKUZUMI ELECTRONICS, INC 00D0E0DOOIN ELECTRONICS CO 00D0E1AVIONITEK ISRAEL INC 00D0E2MRT MICRO, INC 00D0E3ELE-CHEM ENGINEERING CO., LTD 00D0E4CISCO SYSTEMS, INC 00D0E5SOLIDUM SYSTEMS CORP 00D0E6IBOND INC 00D0E7VCON TELECOMMUNICATION LTD 00D0E8MAC SYSTEM CO., LTD 00D0E9Advantage Century Telecommunication Corp 00D0EANEXTONE COMMUNICATIONS, INC 00D0EBLIGHTERA NETWORKS, INC 00D0ECNAKAYO TELECOMMUNICATIONS, INC 00D0EDXIOX 00D0EEDICTAPHONE CORPORATION 00D0EFIGT 00D0F0CONVISION TECHNOLOGY GMBH 00D0F1SEGA ENTERPRISES, LTD 00D0F2MONTEREY NETWORKS 00D0F3SOLARI DI UDINE SPA 00D0F4CARINTHIAN TECH INSTITUTE 00D0F5ORANGE MICRO, INC 00D0F6Alcatel Canada 00D0F7NEXT NETS CORPORATION 00D0F8FUJIAN STAR TERMINAL 00D0F9ACUTE COMMUNICATIONS CORP 00D0FAThales e-Security Ltd 00D0FBTEK MICROSYSTEMS, INCORPORATED 00D0FCGRANITE MICROSYSTEMS 00D0FDOPTIMA TELE.COM, INC 00D0FEASTRAL POINT 00D0FFCISCO SYSTEMS, INC 00D11CACETEL 00D38DHotel Technology Next Generation 00D632GE Energy 00D9D1Sony Computer Entertainment Inc 00DB1EAlbedo Telecom SL 00DB45THAMWAY CO.,LTD 00DBDFIntel Corporate 00DD00UNGERMANN-BASS INC 00DD01UNGERMANN-BASS INC 00DD02UNGERMANN-BASS INC 00DD03UNGERMANN-BASS INC 00DD04UNGERMANN-BASS INC 00DD05UNGERMANN-BASS INC 00DD06UNGERMANN-BASS INC 00DD07UNGERMANN-BASS INC 00DD08UNGERMANN-BASS INC 00DD09UNGERMANN-BASS INC 00DD0AUNGERMANN-BASS INC 00DD0BUNGERMANN-BASS INC 00DD0CUNGERMANN-BASS INC 00DD0DUNGERMANN-BASS INC 00DD0EUNGERMANN-BASS INC 00DD0FUNGERMANN-BASS INC 00DEFBCISCO SYSTEMS, INC 00E000Fujitsu Limited 00E001STRAND LIGHTING LIMITED 00E002CROSSROADS SYSTEMS, INC 00E003NOKIA WIRELESS BUSINESS COMMUN 00E004PMC-SIERRA, INC 00E005TECHNICAL CORP 00E006SILICON INTEGRATED SYS. CORP 00E007Avaya ECS Ltd 00E008AMAZING CONTROLS! INC 00E009MARATHON TECHNOLOGIES CORP 00E00ADIBA, INC 00E00BROOFTOP COMMUNICATIONS CORP 00E00CMOTOROLA 00E00DRADIANT SYSTEMS 00E00EAVALON IMAGING SYSTEMS, INC 00E00FSHANGHAI BAUD DATA 00E010HESS SB-AUTOMATENBAU GmbH 00E011Uniden Corporation 00E012PLUTO TECHNOLOGIES INTERNATIONAL INC 00E013EASTERN ELECTRONIC CO., LTD 00E014CISCO SYSTEMS, INC 00E015HEIWA CORPORATION 00E016RAPID CITY COMMUNICATIONS 00E017EXXACT GmbH 00E018ASUSTEK COMPUTER INC 00E019ING. GIORDANO ELETTRONICA 00E01ACOMTEC SYSTEMS. CO., LTD 00E01BSPHERE COMMUNICATIONS, INC 00E01CCradlepoint, Inc 00E01DWebTV NETWORKS, INC 00E01ECISCO SYSTEMS, INC 00E01FAVIDIA Systems, Inc 00E020TECNOMEN OY 00E021FREEGATE CORP 00E022Analog Devices Inc 00E023TELRAD 00E024GADZOOX NETWORKS 00E025dit Co., Ltd 00E026Redlake MASD LLC 00E027DUX, INC 00E028APTIX CORPORATION 00E029STANDARD MICROSYSTEMS CORP 00E02ATANDBERG TELEVISION AS 00E02BEXTREME NETWORKS 00E02CAST COMPUTER 00E02DInnoMediaLogic, Inc 00E02ESPC ELECTRONICS CORPORATION 00E02FMCNS HOLDINGS, L.P 00E030MELITA INTERNATIONAL CORP 00E031HAGIWARA ELECTRIC CO., LTD 00E032MISYS FINANCIAL SYSTEMS, LTD 00E033E.E.P.D. GmbH 00E034CISCO SYSTEMS, INC 00E035Artesyn Embedded Technologies 00E036PIONEER CORPORATION 00E037CENTURY CORPORATION 00E038PROXIMA CORPORATION 00E039PARADYNE CORP 00E03ACABLETRON SYSTEMS, INC 00E03BPROMINET CORPORATION 00E03CAdvanSys 00E03DFOCON ELECTRONIC SYSTEMS A/S 00E03EALFATECH, INC 00E03FJATON CORPORATION 00E040DeskStation Technology, Inc 00E041CSPI 00E042Pacom Systems Ltd 00E043VitalCom 00E044LSICS CORPORATION 00E045TOUCHWAVE, INC 00E046BENTLY NEVADA CORP 00E047InFocus Corporation 00E048SDL COMMUNICATIONS, INC 00E049MICROWI ELECTRONIC GmbH 00E04AENHANCED MESSAGING SYSTEMS, INC 00E04BJUMP INDUSTRIELLE COMPUTERTECHNIK GmbH 00E04CREALTEK SEMICONDUCTOR CORP 00E04DINTERNET INITIATIVE JAPAN, INC 00E04ESANYO DENKI CO., LTD 00E04FCISCO SYSTEMS, INC 00E050EXECUTONE INFORMATION SYSTEMS, INC 00E051TALX CORPORATION 00E052Brocade Communications Systems, Inc 00E053CELLPORT LABS, INC 00E054KODAI HITEC CO., LTD 00E055INGENIERIA ELECTRONICA COMERCIAL INELCOM S.A 00E056HOLONTECH CORPORATION 00E057HAN MICROTELECOM. CO., LTD 00E058PHASE ONE DENMARK A/S 00E059CONTROLLED ENVIRONMENTS, LTD 00E05AGALEA NETWORK SECURITY 00E05BWEST END SYSTEMS CORP 00E05CMATSUSHITA KOTOBUKI ELECTRONICS INDUSTRIES, LTD 00E05DUNITEC CO., LTD 00E05EJAPAN AVIATION ELECTRONICS INDUSTRY, LTD 00E05Fe-Net, Inc 00E060SHERWOOD 00E061EdgePoint Networks, Inc 00E062HOST ENGINEERING 00E063CABLETRON - YAGO SYSTEMS, INC 00E064SAMSUNG ELECTRONICS 00E065OPTICAL ACCESS INTERNATIONAL 00E066ProMax Systems, Inc 00E067eac AUTOMATION-CONSULTING GmbH 00E068MERRIMAC SYSTEMS INC 00E069JAYCOR 00E06AKAPSCH AG 00E06BW&G SPECIAL PRODUCTS 00E06CUltra Electronics Limited (AEP Networks) 00E06DCOMPUWARE CORPORATION 00E06EFAR SYSTEMS S.p.A 00E06FARRIS Group, Inc 00E070DH TECHNOLOGY 00E071EPIS MICROCOMPUTER 00E072LYNK 00E073NATIONAL AMUSEMENT NETWORK, INC 00E074TIERNAN COMMUNICATIONS, INC 00E075Verilink Corporation 00E076DEVELOPMENT CONCEPTS, INC 00E077WEBGEAR, INC 00E078BERKELEY NETWORKS 00E079A.T.N.R 00E07AMIKRODIDAKT AB 00E07BBAY NETWORKS 00E07CMETTLER-TOLEDO, INC 00E07DNETRONIX, INC 00E07EWALT DISNEY IMAGINEERING 00E07FLOGISTISTEM s.r.l 00E080CONTROL RESOURCES CORPORATION 00E081TYAN COMPUTER CORP 00E082ANERMA 00E083JATO TECHNOLOGIES, INC 00E084COMPULITE R&D 00E085GLOBAL MAINTECH, INC 00E086Emerson Network Power, Avocent Division 00E087LeCroy - Networking Productions Division 00E088LTX-Credence CORPORATION 00E089ION Networks, Inc 00E08AGEC AVERY, LTD 00E08BQLogic Corp 00E08CNEOPARADIGM LABS, INC 00E08DPRESSURE SYSTEMS, INC 00E08EUTSTARCOM 00E08FCISCO SYSTEMS, INC 00E090BECKMAN LAB. AUTOMATION DIV 00E091LG ELECTRONICS, INC 00E092ADMTEK INCORPORATED 00E093ACKFIN NETWORKS 00E094OSAI SRL 00E095ADVANCED-VISION TECHNOLGIES CORP 00E096SHIMADZU CORPORATION 00E097CARRIER ACCESS CORPORATION 00E098AboCom Systems, Inc 00E099SAMSON AG 00E09APositron Inc 00E09BENGAGE NETWORKS, INC 00E09CMII 00E09DSARNOFF CORPORATION 00E09EQUANTUM CORPORATION 00E09FPIXEL VISION 00E0A0WILTRON CO 00E0A1HIMA PAUL HILDEBRANDT GmbH Co. KG 00E0A2MICROSLATE INC 00E0A3CISCO SYSTEMS, INC 00E0A4ESAOTE S.p.A 00E0A5ComCore Semiconductor, Inc 00E0A6TELOGY NETWORKS, INC 00E0A7IPC INFORMATION SYSTEMS, INC 00E0A8SAT GmbH & Co 00E0A9FUNAI ELECTRIC CO., LTD 00E0AAELECTROSONIC LTD 00E0ABDIMAT S.A 00E0ACMIDSCO, INC 00E0ADEES TECHNOLOGY, LTD 00E0AEXAQTI CORPORATION 00E0AFGENERAL DYNAMICS INFORMATION SYSTEMS 00E0B0CISCO SYSTEMS, INC 00E0B1Alcatel-Lucent, Enterprise Business Group 00E0B2TELMAX COMMUNICATIONS CORP 00E0B3EtherWAN Systems, Inc 00E0B4TECHNO SCOPE CO., LTD 00E0B5ARDENT COMMUNICATIONS CORP 00E0B6Entrada Networks 00E0B7PI GROUP, LTD 00E0B8GATEWAY 2000 00E0B9BYAS SYSTEMS 00E0BABERGHOF AUTOMATIONSTECHNIK GmbH 00E0BBNBX CORPORATION 00E0BCSYMON COMMUNICATIONS, INC 00E0BDINTERFACE SYSTEMS, INC 00E0BEGENROCO INTERNATIONAL, INC 00E0BFTORRENT NETWORKING TECHNOLOGIES CORP 00E0C0SEIWA ELECTRIC MFG. CO., LTD 00E0C1MEMOREX TELEX JAPAN, LTD 00E0C2NECSY S.p.A 00E0C3SAKAI SYSTEM DEVELOPMENT CORP 00E0C4HORNER ELECTRIC, INC 00E0C5BCOM ELECTRONICS INC 00E0C6LINK2IT, L.L.C 00E0C7EUROTECH SRL 00E0C8VIRTUAL ACCESS, LTD 00E0C9AutomatedLogic Corporation 00E0CABEST DATA PRODUCTS 00E0CBRESON, INC 00E0CCHERO SYSTEMS, LTD 00E0CDSAAB SENSIS CORPORATION 00E0CEARN 00E0CFINTEGRATED DEVICE TECHNOLOGY, INC 00E0D0NETSPEED, INC 00E0D1TELSIS LIMITED 00E0D2VERSANET COMMUNICATIONS, INC 00E0D3DATENTECHNIK GmbH 00E0D4EXCELLENT COMPUTER 00E0D5Emulex Corporation 00E0D6COMPUTER & COMMUNICATION RESEARCH LAB 00E0D7SUNSHINE ELECTRONICS, INC 00E0D8LANBit Computer, Inc 00E0D9TAZMO CO., LTD 00E0DAAlcatel North America ESD 00E0DBViaVideo Communications, Inc 00E0DCNEXWARE CORP 00E0DDZENITH ELECTRONICS CORPORATION 00E0DEDATAX NV 00E0DFKEYMILE GmbH 00E0E0SI ELECTRONICS, LTD 00E0E1G2 NETWORKS, INC 00E0E2INNOVA CORP 00E0E3SK-ELEKTRONIK GmbH 00E0E4FANUC ROBOTICS NORTH AMERICA, Inc 00E0E5CINCO NETWORKS, INC 00E0E6INCAA DATACOM B.V 00E0E7RAYTHEON E-SYSTEMS, INC 00E0E8GRETACODER Data Systems AG 00E0E9DATA LABS, INC 00E0EAINNOVAT COMMUNICATIONS, INC 00E0EBDIGICOM SYSTEMS, INCORPORATED 00E0ECCELESTICA INC 00E0EDSILICOM, LTD 00E0EEMAREL HF 00E0EFDIONEX 00E0F0ABLER TECHNOLOGY, INC 00E0F1THAT CORPORATION 00E0F2ARLOTTO COMNET, INC 00E0F3WebSprint Communications, Inc 00E0F4INSIDE Technology A/S 00E0F5TELES AG 00E0F6DECISION EUROPE 00E0F7CISCO SYSTEMS, INC 00E0F8DICNA CONTROL AB 00E0F9CISCO SYSTEMS, INC 00E0FATRL TECHNOLOGY, LTD 00E0FBLEIGHTRONIX, INC 00E0FCHUAWEI TECHNOLOGIES CO., LTD 00E0FDA-TREND TECHNOLOGY CO., LTD 00E0FECISCO SYSTEMS, INC 00E0FFSECURITY DYNAMICS TECHNOLOGIES, Inc 00E16DCisco 00E175AK-Systems Ltd 00E3B2Samsung Electronics Co.,Ltd 00E666ARIMA Communications Corp 00E6D3NIXDORF COMPUTER CORP 00E8ABMeggitt Training Systems, Inc 00EB2DSony Mobile Communications AB 00EEBDHTC Corporation 00F051KWB Gmbh 00F403Orbis Systems Oy 00F4B9Apple 00F76FApple 00F860PT. Panggung Electric Citrabuana 00FA3BCLOOS ELECTRONIC GMBH 00FC58WebSilicon Ltd 00FC70Intrepid Control Systems, Inc 00FD4CNEVATEC 020701RACAL-DATACOM 021C7CPERQ SYSTEMS CORPORATION 026086LOGIC REPLACEMENT TECH. LTD 02608C3COM CORPORATION 027001RACAL-DATACOM 0270B0M/A-COM INC. COMPANIES 0270B3DATA RECALL LTD 029D8ECARDIAC RECORDERS INC 02AA3COLIVETTI TELECOMM SPA (OLTECO) 02BB01OCTOTHORPE CORP 02C08C3COM CORPORATION 02CF1CCOMMUNICATION MACHINERY CORP 02E6D3NIXDORF COMPUTER CORPORATION 040A83Alcatel-Lucent 040AE0XMIT AG COMPUTER NETWORKS 040CCEApple 040EC2ViewSonic Mobile China Limited 041552Apple 04180FSamsung Electronics Co.,Ltd 0418B6 0418D6Ubiquiti Networks 041A04WaveIP 041B94Host Mobility AB 041BBASamsung Electronics Co.,Ltd 041D10Dream Ware Inc 041E64Apple 04209APanasonic AVC Networks Company 042234Wireless Standard Extensions 042605GFR Gesellschaft für Regelungstechnik und Energieeinsparung mbH 042665Apple 042BBBPicoCELA, Inc 042F56ATOCS (Shenzhen) LTD 0432F4Partron 043604Gyeyoung I&T 043D98ChongQing QingJia Electronics CO.,LTD 0444A1TELECON GALICIA,S.A 044665Murata Manufacturing Co., Ltd 04489AApple 044A50Ramaxel Technology (Shenzhen) limited company 044BFFGuangZhou Hedy Digital Technology Co., Ltd 044CEFFujian Sanao Technology Co.,Ltd 044E06Ericsson AB 044F8BAdapteva, Inc 044FAARuckus Wireless 045453Apple 0455CABriView (Xiamen) Corp 04572FSertel Electronics UK Ltd 04586FSichuan Whayer information industry Co.,LTD 045A95Nokia Corporation 045C06Zmodo Technology Corporation 045C8Egosund GROUP CO.,LTD 045D56camtron industrial inc 045FA7Shenzhen Yichen Technology Development Co.,LTD 0462D7ALSTOM HYDRO FRANCE 0463E0Nome Oy 046785scemtec Hard- und Software fuer Mess- und Steuerungstechnik GmbH 046D42Bryston Ltd 046E49TaiYear Electronic Technology (Suzhou) Co., Ltd 0470BCGlobalstar Inc 0474A1Aligera Equipamentos Digitais Ltda 0475F5CSST 04766EALPS Co,. Ltd 047D7BQuanta Computer Inc 0481AEClack Corporation 04848A7INOVA TECHNOLOGY LIMITED 04888CEifelwerk Butler Systeme GmbH 0488E2Beats Electronics LLC 048A15Avaya, Inc 048B42Skspruce Technology Limited 048C03ThinPAD Technology (Shenzhen)CO.,LTD 048D38Netcore Technology Inc 0494A1CATCH THE WIND INC 0498F3ALPS Electric Co,. Ltd 0499E6Shenzhen Yoostar Technology Co., Ltd 049C62BMT Medical Technology s.r.o 049F06Smobile Co., Ltd 049F81Netscout Systems, Inc 04A151NETGEAR INC., 04A3F3Emicon 04A82ANokia Corporation 04B3B6Seamap (UK) Ltd 04B466BSP Co., Ltd 04BFA8ISB Corporation 04C05BTigo Energy 04C06FShenzhen Huawei Communication Technologies Co., Ltd 04C1B9Fiberhome Telecommunication Tech.Co.,Ltd 04C5A4CISCO SYSTEMS, INC 04C880Samtec Inc 04C991Phistek INC 04CB1DTraka plc 04CE14Wilocity LTD 04CF25MANYCOLORS, INC 04D437ZNV 04D783Y&H E&C Co.,LTD 04DAD2Cisco 04DB56Apple, Inc 04DB8ASuntech International Ltd 04DD4CVelocytech 04DEDBRockport Networks Inc 04DF69Car Connectivity Consortium 04E0C4TRIUMPH-ADLER AG 04E1C8IMS Soluções em Energia Ltda 04E2F8AEP Ticketing solutions srl 04E451Texas Instruments 04E536Apple 04E548Cohda Wireless Pty Ltd 04E662Acroname Inc 04E676AMPAK Technology Inc 04E9E5PJRC.COM, LLC 04EE91x-fabric GmbH 04F021Compex Systems Pte Ltd 04F13EApple 04F17DTarana Wireless 04F4BCXena Networks 04F7E4Apple 04F8C2Flaircomm Microelectronics, Inc 04F938HUAWEI TECHNOLOGIES CO.,LTD 04FE31Samsung Electronics Co.,Ltd 04FE7FCISCO SYSTEMS, INC 04FF51NOVAMEDIA INNOVISION SP. Z O.O 080001COMPUTERVISION CORPORATION 080002BRIDGE COMMUNICATIONS INC 080003ADVANCED COMPUTER COMM 080004CROMEMCO INCORPORATED 080005SYMBOLICS INC 080006SIEMENS AG 080007Apple 080008BOLT BERANEK AND NEWMAN INC 080009HEWLETT PACKARD 08000ANESTAR SYSTEMS INCORPORATED 08000BUNISYS CORPORATION 08000CMIKLYN DEVELOPMENT CO 08000DINTERNATIONAL COMPUTERS LTD 08000ENCR CORPORATION 08000FMITEL CORPORATION 080011TEKTRONIX INC 080012BELL ATLANTIC INTEGRATED SYST 080013EXXON 080014EXCELAN 080015STC BUSINESS SYSTEMS 080016BARRISTER INFO SYS CORP 080017NATIONAL SEMICONDUCTOR 080018PIRELLI FOCOM NETWORKS 080019GENERAL ELECTRIC CORPORATION 08001ATIARA/ 10NET 08001BEMC Corporation 08001CKDD-KOKUSAI DEBNSIN DENWA CO 08001DABLE COMMUNICATIONS INC 08001EAPOLLO COMPUTER INC 08001FSHARP CORPORATION 080020Oracle Corporation 0800213M COMPANY 080022NBI INC 080023Panasonic Communications Co., Ltd 08002410NET COMMUNICATIONS/DCA 080025CONTROL DATA 080026NORSK DATA A.S 080027CADMUS COMPUTER SYSTEMS 080028Texas Instruments 080029MEGATEK CORPORATION 08002AMOSAIC TECHNOLOGIES INC 08002BDIGITAL EQUIPMENT CORPORATION 08002CBRITTON LEE INC 08002DLAN-TEC INC 08002EMETAPHOR COMPUTER SYSTEMS 08002FPRIME COMPUTER INC 080030NETWORK RESEARCH CORPORATION 080030CERN 080030ROYAL MELBOURNE INST OF TECH 080031LITTLE MACHINES INC 080032TIGAN INCORPORATED 080033BAUSCH & LOMB 080034FILENET CORPORATION 080035MICROFIVE CORPORATION 080036INTERGRAPH CORPORATION 080037FUJI-XEROX CO. LTD 080038BULL S.A.S 080039SPIDER SYSTEMS LIMITED 08003AORCATECH INC 08003BTORUS SYSTEMS LIMITED 08003CSCHLUMBERGER WELL SERVICES 08003DCADNETIX CORPORATIONS 08003ECODEX CORPORATION 08003FFRED KOSCHARA ENTERPRISES 080040FERRANTI COMPUTER SYS. LIMITED 080041RACAL-MILGO INFORMATION SYS. 080042JAPAN MACNICS CORP 080043PIXEL COMPUTER INC 080044DAVID SYSTEMS INC 080045CONCURRENT COMPUTER CORP 080046Sony Corporation 080047SEQUENT COMPUTER SYSTEMS INC 080048EUROTHERM GAUGING SYSTEMS 080049UNIVATION 08004ABANYAN SYSTEMS INC 08004BPLANNING RESEARCH CORP 08004CHYDRA COMPUTER SYSTEMS INC 08004DCORVUS SYSTEMS INC 08004E3COM EUROPE LTD 08004FCYGNET SYSTEMS 080050DAISY SYSTEMS CORP 080051EXPERDATA 080052INSYSTEC 080053MIDDLE EAST TECH. UNIVERSITY 080055STANFORD TELECOMM. INC 080056STANFORD LINEAR ACCEL. CENTER 080057EVANS & SUTHERLAND 080058SYSTEMS CONCEPTS 080059A/S MYCRON 08005AIBM Corp 08005BVTA TECHNOLOGIES INC 08005CFOUR PHASE SYSTEMS 08005DGOULD INC 08005ECOUNTERPOINT COMPUTER INC 08005FSABER TECHNOLOGY CORP 080060INDUSTRIAL NETWORKING INC 080061JAROGATE LTD 080062GENERAL DYNAMICS 080063PLESSEY 080064Sitasys AG 080065GENRAD INC 080066AGFA CORPORATION 080067COMDESIGN 080068RIDGE COMPUTERS 080069SILICON GRAPHICS INC 08006AATT BELL LABORATORIES 08006BACCEL TECHNOLOGIES INC 08006CSUNTEK TECHNOLOGY INT'L 08006DWHITECHAPEL COMPUTER WORKS 08006EMASSCOMP 08006FPHILIPS APELDOORN B.V 080070MITSUBISHI ELECTRIC CORP 080071MATRA (DSIE) 080072XEROX CORP UNIV GRANT PROGRAM 080073TECMAR INC 080074CASIO COMPUTER CO. LTD 080075DANSK DATA ELECTRONIK 080076PC LAN TECHNOLOGIES 080077TSL COMMUNICATIONS LTD 080078ACCELL CORPORATION 080079THE DROID WORKS 08007AINDATA 08007BSANYO ELECTRIC CO. LTD 08007CVITALINK COMMUNICATIONS CORP 08007EAMALGAMATED WIRELESS(AUS) LTD 08007FCARNEGIE-MELLON UNIVERSITY 080080AES DATA INC 080081ASTECH INC 080082VERITAS SOFTWARE 080083Seiko Instruments Inc 080084TOMEN ELECTRONICS CORP 080085ELXSI 080086KONICA MINOLTA HOLDINGS, INC 080087XYPLEX 080088Brocade Communications Systems, Inc 080089KINETICS 08008APerfTech, Inc 08008BPYRAMID TECHNOLOGY CORP 08008CNETWORK RESEARCH CORPORATION 08008DXYVISION INC 08008ETANDEM COMPUTERS 08008FCHIPCOM CORPORATION 080090SONOMA SYSTEMS 080371KRG CORPORATE 0805CDDongGuang EnMai Electronic Product Co.Ltd 0808C2Samsung Electronics 0808EAAMSC 0809B6Masimo Corp 080C0BSysMik GmbH Dresden 080CC9Mission Technology Group, dba Magma 080D84GECO, Inc 080EA8Velex s.r.l 080FFAKSP INC 08115EBitel Co., Ltd 081196Intel Corporate 081443UNIBRAIN S.A 081651Shenzhen Sea Star Technology Co.,Ltd 081735CISCO SYSTEMS, INC 0817F4IBM Corp 08181Azte corporation 08184CA. S. Thomas, Inc 0819A6HUAWEI TECHNOLOGIES CO.,LTD 081DFBShanghai Mexon Communication Technology Co.,Ltd 081F3FWondaLink Inc 081FF3CISCO SYSTEMS, INC 082522ADVANSEE 082719APS systems/electronic AG 082AD0SRD Innovations Inc 082E5FHewlett Packard 083571CASwell INC 08373DSamsung Electronics Co.,Ltd 08379CTopaz Co. LTD 0838A5Funkwerk plettac electronic GmbH 083AB8Shinoda Plasma Co., Ltd 083D88Samsung Electronics Co.,Ltd 083E0CARRIS Group, Inc 083E8EHon Hai Precision Ind.Co.Ltd 083F3EWSH GmbH 083F76Intellian Technologies, Inc 084027Gridstore Inc 084656VODALYS Ingénierie 08482CRaycore Taiwan Co., LTD 084E1CH2A Systems, LLC 084EBFBroad Net Mux Corporation 08512EOrion Diagnostica Oy 085240EbV Elektronikbau- und Vertriebs GmbH 085700TP-LINK TECHNOLOGIES CO.,LTD 085AE0Recovision Technology Co., Ltd 085B0EFortinet, Inc 085DDDMercury Corporation 08606EASUSTek COMPUTER INC 086361Huawei Technologies Co., Ltd 0868D0Japan System Design 0868EAEITO ELECTRONICS CO., LTD 086DF2Shenzhen MIMOWAVE Technology Co.,Ltd 087045Apple 0874F6Winterhalter Gastronom GmbH 087572Obelux Oy 087618ViE Technologies Sdn. Bhd 087695Auto Industrial Co., Ltd 0876FFThomson Telecom Belgium 087999AIM GmbH 087A4CHuawei Technologies Co., Ltd 087BAASVYAZKOMPLEKTSERVICE, LLC 087CBEQuintic Corp 087D21Altasec technology corporation 088039Cisco SPVTG 0881BCHongKong Ipro Technology Co., Limited 0881F4Juniper Networks 08863BBelkin International, Inc 088DC8Ryowa Electronics Co.,Ltd 088E4FSF Software Solutions 088F2CHills Sound Vision & Lighting 0896D7AVM GmbH 089758Shenzhen Strong Rising Electronics Co.,Ltd DongGuan Subsidiary 089E01QUANTA COMPUTER INC 089F97LEROY AUTOMATION 08A12BShenZhen EZL Technology Co., Ltd 08A95AAzurewave 08ACA5Benu Video, Inc 08AF78Totus Solutions, Inc 08B2A3Cynny Italia S.r.L 08B4CFAbicom International 08B738Lite-On Technogy Corp 08B7ECWireless Seismic 08BBCCAK-NORD EDV VERTRIEBSGES. mbH 08BD43NETGEAR INC., 08BE09Astrol Electronic AG 08CA45Toyou Feiji Electronics Co., Ltd 08CC68Cisco 08CD9Bsamtec automotive electronics & software GmbH 08D09FCISCO SYSTEMS, INC 08D29AProformatique 08D40CIntel Corporate 08D42BSamsung Electronics 08D5C0Seers Technology Co., Ltd 08D833Shenzhen RF Technology Co,.Ltd 08DF1FBose Corporation 08E5DANANJING FUJITSU COMPUTER PRODUCTS CO.,LTD 08E672JEBSEE ELECTRONICS CO.,LTD 08E84FHUAWEI TECHNOLOGIES CO.,LTD 08EA44Aerohive Networks, Inc 08EB29Jiangsu Huitong Group Co.,Ltd 08EB74Humax 08EBEDWorld Elite Technology Co.,LTD 08EDB9Hon Hai Precision Ind. Co.,Ltd 08EF3BMCS Logic Inc 08F1B7Towerstream Corpration 08F2F4Net One Partners Co.,Ltd 08F6F8GET Engineering 08F728GLOBO Multimedia Sp. z o.o. Sp.k 08FAE0Fohhn Audio AG 08FC52OpenXS BV 08FC88Samsung Electronics Co.,Ltd 08FD0ESamsung Electronics Co.,Ltd 0C0400Jantar d.o.o 0C0535Juniper Systems 0C1105Ringslink (Xiamen) Network Communication Technologies Co., Ltd 0C1262zte corporation 0C130BUniqoteq Ltd 0C1420Samsung Electronics Co.,Ltd 0C15C5SDTEC Co., Ltd 0C17F1TELECSYS 0C191FInform Electronik 0C1DAFBeijing Xiaomi communications co.,ltd 0C1DC2SeAH Networks 0C2026noax Technologies AG 0C2724Cisco 0C2755Valuable Techologies Limited 0C2A69electric imp, incorporated 0C2AE7Beijing General Research Institute of Mining and Metallurgy 0C2D89QiiQ Communications Inc 0C3021Apple 0C37DCHuawei Technologies Co., Ltd 0C383EFanvil Technology Co., Ltd 0C3956Observator instruments 0C3C65Dome Imaging Inc 0C3E9FApple, Inc 0C469DMS Sedco 0C473DHitron Technologies. Inc 0C4C39Mitrastar Technology 0C4DE9Apple 0C4F5AASA-RT s.r.l 0C51F7CHAUVIN ARNOUX 0C54A5PEGATRON CORPORATION 0C5521Axiros GmbH 0C565CHyBroad Vision (Hong Kong) Technology Co Ltd 0C57EBMueller Systems 0C5A19Axtion Sdn Bhd 0C5CD8DOLI Elektronik GmbH 0C6076Hon Hai Precision Ind. Co.,Ltd 0C63FCNanjing Signway Technology Co., Ltd 0C6803Cisco 0C6E4FPrimeVOLT Co., Ltd 0C715DSamsung Electronics Co.,Ltd 0C722CTP-LINK TECHNOLOGIES CO.,LTD 0C74C2Apple 0C7523BEIJING GEHUA CATV NETWORK CO.,LTD 0C771AApple 0C7D7CKexiang Information Technology Co, Ltd 0C8112 0C8230SHENZHEN MAGNUS TECHNOLOGIES CO.,LTD 0C8268TP-LINK TECHNOLOGIES CO.,LTD 0C826AWuhan Huagong Genuine Optics Technology Co., Ltd 0C8411A.O. Smith Water Products 0C8484Zenovia Electronics Inc 0C84DCHon Hai Precision Ind. Co.,Ltd 0C8525CISCO SYSTEMS, INC 0C8910Samsung Electronics Co.,LTD 0C8BFDIntel Corporate 0C8C8FKamo Technology Limited 0C8CDCSuunto Oy 0C8D98TOP EIGHT IND CORP 0C924ERice Lake Weighing Systems 0C9301PT. Prasimax Inovasi Teknologi 0C93FBBNS Solutions 0C96BFHuawei Technologies Co., Ltd 0C9B13Shanghai Magic Mobile Telecommunication Co.Ltd 0C9D56Consort Controls Ltd 0C9E91Sankosha Corporation 0CA138Blinq Wireless Inc 0CA2F4Chameleon Technology (UK) Limited 0CA402Alcatel Lucent IPD 0CA42AOB Telecom Electronic Technology Co., Ltd 0CA694Sunitec Enterprise Co.,Ltd 0CAC05Unitend Technologies Inc 0CAF5AGENUS POWER INFRASTRUCTURES LIMITED 0CB4EFDigience Co.,Ltd 0CBD51TCT Mobile Limited 0CBF15Genetec 0CC0C0MAGNETI MARELLI SISTEMAS ELECTRONICOS MEXICO 0CC3A7Meritec 0CC47ASuper Micro Computer, Inc 0CC47EEUCAST Co., Ltd 0CC655Wuxi YSTen Technology Co.,Ltd 0CC66ANokia Corporation 0CC6ACDAGS 0CC81FSummer Infant, Inc 0CC9C6Samwin Hong Kong Limited 0CCB8DASCO Numatics GmbH 0CCDD3EASTRIVER TECHNOLOGY CO., LTD 0CCDFBEDIC Systems Inc 0CCFD1SPRINGWAVE Co., Ltd 0CD292Intel Corporate 0CD2B5Binatone Telecommunication Pvt. Ltd 0CD502Westell 0CD696Amimon Ltd 0CD7C2Axium Technologies, Inc 0CD996CISCO SYSTEMS, INC 0CD9C1Johnson Controls-ASG 0CDA41Hangzhou H3C Technologies Co., Limited 0CDCCCInala Technologies 0CDDEFNokia Corporation 0CDFA4Samsung Electronics Co.,Ltd 0CE0E4Plantronics, Inc 0CE5D3DH electronics GmbH 0CE709Fox Crypto B.V 0CE82FBonfiglioli Vectron GmbH 0CE936ELIMOS srl 0CEEE6Hon Hai Precision Ind. Co.,Ltd 0CEF7CAnaCom Inc 0CF019Malgn Technology Co., Ltd 0CF0B4Globalsat International Technology Ltd 0CF361Java Information 0CF3EEEM Microelectronic 0CF405Beijing Signalway Technologies Co.,Ltd 0CF893ARRIS Group, Inc 0CFC83Airoha Technology Corp., 100000 10005AIBM Corp 1000E8NATIONAL SEMICONDUCTOR 1000FDLaonPeople 1001CAAshley Butterworth 1005CACisco 1008B1Hon Hai Precision Ind. Co.,Ltd 10090CJanome Sewing Machine Co., Ltd 100BA9Intel Corporate 100C24pomdevices, LLC 100D2FOnline Security Pty. Ltd 100D32Embedian, Inc 100D7FNETGEAR INC., 100E2BNEC CASIO Mobile Communications 100E7EJuniper networks 100F18Fu Gang Electronic(KunShan)CO.,LTD 1010B6McCain Inc 101212Vivo International Corporation Pty Ltd 101218Korins Inc 101248ITG, Inc 1013EEJustec International Technology INC 10189EElmo Motion Control 101B54HUAWEI TECHNOLOGIES CO.,LTD 101C0CApple 101D51ON-Q LLC dba ON-Q Mesh Networks 101DC0Samsung Electronics Co.,Ltd 101F74Hewlett-Packard Company 102279ZeroDesktop, Inc 1027BETVIP 102831Morion Inc 102D96Looxcie Inc 102EAFTexas Instruments 102F6BMicrosoft Corporation 103047Samsung Electronics Co.,Ltd 103378FLECTRON Co., LTD 103711Simlink AS 103B59Samsung Electronics Co.,Ltd 103DEAHFC Technology (Beijing) Ltd. Co 1040F3Apple 104369Soundmax Electronic Limited 10445AShaanxi Hitech Electronic Co., LTD 1045BENorphonic AS 1045F8LNT-Automation GmbH 104780HUAWEI TECHNOLOGIES CO.,LTD 1048B1Beijing Duokan Technology Limited 104B46Mitsubishi Electric Corporation 104D77Innovative Computer Engineering 104E07Shanghai Genvision Industries Co.,Ltd 105172HUAWEI TECHNOLOGIES CO.,LTD 1056CAPeplink International Ltd 105C3BPerma-Pipe, Inc 105CBFDuroByte Inc 105F06Actiontec Electronics, Inc 105F49Cisco SPVTG 10604BHewlett Packard 1062C9Adatis GmbH & Co. KG 1064E2ADFweb.com s.r.l 1065A3Core Brands LLC 1065CFIQSIM 106682NEC Platforms, Ltd 10683FLG Electronics 106F3FBuffalo Inc 106FEFAd-Sol Nissin Corp 1071F9Cloud Telecomputers, LLC 10768AEoCell 1077B1Samsung Electronics Co.,LTD 1078CEHanvit SI, Inc 1078D2ELITEGROUP COMPUTER SYSTEM CO., LTD 107A86U&U ENGINEERING INC 107BEFZyXEL Communications Corp 1083D2Microseven Systems, LLC 10880FDaruma Telecomunicações e Informática S.A 1088CEFiberhome Telecommunication Tech.Co.,Ltd 108A1BRAONIX Inc 108CCFCISCO SYSTEMS, INC 109266Samsung Electronics Co.,Ltd 1093E9Apple 109AB9Tosibox Oy 109ADDApple 109FA9Actiontec Electronics, Inc 10A13BFUJIKURA RUBBER LTD 10A5D0Murata Manufacturing Co.,Ltd 10A743SK Mtek Limited 10A932Beijing Cyber Cloud Technology Co. ,Ltd 10AE60 10B26Bbase Co.,Ltd 10B713 10B7F6Plastoform Industries Ltd 10B9FELika srl 10BAA5GANA I&C CO., LTD 10BD18CISCO SYSTEMS, INC 10BF48ASUSTEK COMPUTER INC 10C2BAUTT Co., Ltd 10C37BASUSTek COMPUTER INC 10C586BIO SOUND LAB CO., LTD 10C61FHuawei Technologies Co., Ltd 10C6FCGarmin International 10C73FMidas Klark Teknik Ltd 10CA81PRECIA 10CCDBAXIMUM PRODUITS ELECTRONIQUES 10D1DCINSTAR Deutschland GmbH 10D542Samsung Electronics Co.,Ltd 10DDB1Apple 10DDF4Maxway Electronics CO.,LTD 10DEE4automationNEXT GmbH 10E2D5Qi Hardware Inc 10E3C7Seohwa Telecom 10E4AFAPR, LLC 10E6AESource Technologies, LLC 10E8EEPhaseSpace 10EA59Cisco SPVTG 10EED9Canoga Perkins Corporation 10F311Cisco 10F3DBGridco Systems, Inc 10F49AT3 Innovation 10F96FLG Electronics 10F9EENokia Corporation 10FBF0KangSheng LTD 10FC54Shany Electronic Co., Ltd 10FEEDTP-LINK TECHNOLOGIES CO., LTD 1100AA 140708 1407E0Abrantix AG 140C76FREEBOX SAS 140D4FFlextronics International 14109FApple 141330Anakreon UK LLP 14144BFUJIAN STAR-NET COMMUNICATION CO.,LTD 141A51Treetech Sistemas Digitais 141BBDVolex Inc 141BF0Intellimedia Systems Ltd 141FBAIEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information 1423D7EUTRONIX CO., LTD 142BD2Armtel Ltd 142BD6Guangdong Appscomm Co.,Ltd 142D27Hon Hai Precision Ind. Co.,Ltd 142D8BIncipio Technologies, Inc 142DF5Amphitech 14307AAvermetrics 1430C6Motorola Mobility LLC 14358BMediabridge Products, LLC 1435B3Future Designs, Inc 143605Nokia Corporation 14373BPROCOM Systems 143AEADynapower Company LLC 143DF2Beijing Shidai Hongyuan Network Communication Co.,Ltd 143E60Alcatel-Lucent 1441E2Monaco Enterprises, Inc 144319Creative&Link Technology Limited 1446E4AVISTEL 14488BShenzhen Doov Technology Co.,Ltd 144978Digital Control Incorporated 1449E0Samsung Electro Mechanics co.,LTD 144C1AMax Communication GmbH 145412Entis Co., Ltd 145645Savitech Corp 1458D0Hewlett Packard 145A05Apple 145BD1ARRIS Group, Inc 146080zte corporation 146308JABIL CIRCUIT (SHANGHAI) LTD 146A0BCypress Electronics Limited 146E0A 147373TUBITAK UEKAE 147411RIM 147590TP-LINK TECHNOLOGIES CO.,LTD 147DB3JOA TELECOM.CO.,LTD 147DC5Murata Manufacturing Co., Ltd 14825BHefei Radio Communication Technology Co., Ltd 148692TP-LINK TECHNOLOGIES CO.,LTD 1489FDSamsung Electronics 148A70ADS GmbH 148FC6Apple 149090KongTop industrial(shen zhen)CO.,LTD 149448BLU CASTLE S.A 1499E2Apple, Inc 149FE8Lenovo Mobile Communication Technology Ltd 14A364Samsung Electronics Co.,Ltd 14A62CS.M. Dezac S.A 14A86BShenZhen Telacom Science&Technology Co., Ltd 14A9E3MST CORPORATION 14ABF0ARRIS Group, Inc 14B126Industrial Software Co 14B1C8InfiniWing, Inc 14B484Samsung Electronics Co.,Ltd 14B73DARCHEAN Technologies 14B968Huawei Technologies Co., Ltd 14C089DUNE HD LTD 14C126Nokia Corporation 14C21DSabtech Industries 14CC20TP-LINK TECHNOLOGIES CO.,LTD 14CF8DOHSUNG ELECTRONICS CO., LTD 14CF92TP-LINK TECHNOLOGIES CO., LTD 14CFE2ARRIS Group, Inc 14D4FEPace plc 14D64DD-Link International 14D76ECONCH ELECTRONIC Co.,Ltd 14DAE9ASUSTek COMPUTER INC 14DB85S NET MEDIA 14E4ECmLogic LLC 14E6E4TP-LINK TECHNOLOGIES CO., LTD 14EB33BSMediasoft Co., Ltd 14EDA5Wächter GmbH Sicherheitssysteme 14EDE4Kaiam Corporation 14EE9DAirNav Systems LLC 14F0C5Xtremio Ltd 14F28EShenYang ZhongKe-Allwin Technology Co.LTD 14F42ASamsung Electronics 14F65AXiaomi inc 14F893Wuhan FiberHome Digital Technology Co.,Ltd 14FEAFSAGITTAR LIMITED 14FEB5Dell Inc 18002DSony Mobile Communications AB 1800DBFitbit Inc 1801E3Elektrobit Wireless Communications Ltd 180373Dell Inc 1803FAIBT Interfaces 180675DILAX Intelcom GmbH 180B52Nanotron Technologies GmbH 180C14iSonea Limited 180C77Westinghouse Electric Company, LLC 180CACCANON INC 18104ECEDINT-UPM 181420TEB SAS 181456Nokia Corporation 181714DAEWOOIS 181725Cameo Communications, Inc 18193FTamtron Oy 181BEBActiontec Electronics, Inc 181EB0Samsung Electronics Co.,Ltd 182012Aztech Associates Inc 182032Apple 1820A6Sage Co., Ltd 18227ESamsung Electronics Co.,Ltd 182666Samsung Electronics Co.,Ltd 182861AirTies Wireless Networks 182A7BNintendo Co., Ltd 182B058D Technologies 182C91Concept Development, Inc 183009Woojin Industrial Systems Co., Ltd 1832A2LAON TECHNOLOGY CO., LTD 18339DCISCO SYSTEMS, INC 183451Apple 1836FCElecsys International Corporation 183825Wuhan Lingjiu High-tech Co.,Ltd 183919Unicoi Systems 183BD2BYD Precision Manufacture Company Ltd 183DA2Intel Corporate 183F47Samsung Electronics Co.,Ltd 18421D 18422FAlcatel Lucent 184462Riava Networks, Inc 184617Samsung Electronics 1848D8Fastback Networks 184A6FAlcatel-Lucent Shanghai Bell Co., Ltd 184E94MESSOA TECHNOLOGIES INC 185253Pixord Corporation 1853E0Hanyang Digitech Co.Ltd 18550FCisco SPVTG 185933Cisco SPVTG 185AE8Zenotech.Co.,Ltd 18622CSAGEMCOM SAS 186472Aruba Networks 1866E3Veros Systems, Inc 18673FHanover Displays Limited 186751KOMEG Industrielle Messtechnik GmbH 1867B0Samsung Electronics Co.,LTD 186D99Adanis Inc 187117eta plus electronic gmbh 1879A2GMJ ELECTRIC LIMITED 187A93AMICCOM Electronics Corporation 187C81Valeo Vision Systems 187ED5shenzhen kaism technology Co. Ltd 1880CEBarberry Solutions Ltd 1880F5Alcatel-Lucent Shanghai Bell Co., Ltd 188219Alibaba Cloud Computing Ltd 188331Samsung Electronics Co.,Ltd 1883BFArcadyan Technology Corporation 188410CoreTrust Inc 18863ADIGITAL ART SYSTEM 1886ACNokia Danmark A/S 188796HTC Corporation 188857Beijing Jinhong Xi-Dian Information Technology Corp 1889DFCerebrEX Inc 188ED5TP Vision Belgium N.V. - innovation site Brugge 18922CVirtual Instruments 1897FFTechFaith Wireless Technology Limited 189A67CSE-Servelec Limited 189C5DCisco 189EFCApple 18A905Hewlett-Packard Company 18A958PROVISION THAI CO., LTD 18A99BDell Inc 18AA45Fon Technology 18ABF5Ultra Electronics - Electrics 18AD4DPolostar Technology Corporation 18AEBBSiemens Convergence Creators GmbH&Co.KG 18AF61Apple, Inc 18AF8FApple 18AF9FDIGITRONIC Automationsanlagen GmbH 18B209Torrey Pines Logic, Inc 18B3BANetlogic AB 18B430Nest Labs Inc 18B591I-Storm 18B79EInvoxia 18C086Broadcom Corporation 18C451Tucson Embedded Systems 18C8E7Shenzhen Hualistone Technology Co.,Ltd 18CC23Philio Technology Corporation 18CF5ELiteon Technology Corporation 18D071DASAN SMC, Inc 18D5B6SMG Holdings LLC 18D66AInmarsat 18D6CFKurth Electronic GmbH 18D949Qvis Labs, LLC 18DC56Yulong Computer Telecommunication Scientific(shenzhen)Co.,Lt 18E288STT Condigi 18E2C2Samsung Electronics 18E728Cisco 18E7F4Apple 18E80FViking Electronics Inc 18E8DDMODULETEK 18EF63CISCO SYSTEMS, INC 18F46AHon Hai Precision Ind. Co.,Ltd 18F650Multimedia Pacific Limited 18F87Ai3 International Inc 18FA6FISC applied systems corp 18FB7BDell Inc 18FC9FChanghe Electronics Co., Ltd 18FE34Espressif Inc 18FF2EShenzhen Rui Ying Da Technology Co., Ltd 1C0656IDY Corporation 1C08C1Lg Innotek 1C0B52EPICOM S.A 1C0FCFSypro Optics GmbH 1C11E1Wartsila Finland Oy 1C129DIEEE PES PSRC/SUB 1C1448ARRIS Group, Inc 1C17D3CISCO SYSTEMS, INC 1C184AShenZhen RicherLink Technologies Co.,LTD 1C19DEeyevis GmbH 1C1AC0Apple 1C1B68ARRIS Group, Inc 1C1CFDDalian Hi-Think Computer Technology, Corp 1C1D67Shenzhen Huawei Communication Technologies Co., Ltd 1C1D86Cisco 1C334DITS Telecom 1C3477Innovation Wireless 1C35F1NEW Lift Neue Elektronische Wege Steuerungsbau GmbH 1C37BFCloudium Systems Ltd 1C3A4FAccuSpec Electronics, LLC 1C3DE7Sigma Koki Co.,Ltd 1C3E84Hon Hai Precision Ind. Co.,Ltd 1C4158Gemalto M2M GmbH 1C43ECJAPAN CIRCUIT CO.,LTD 1C4593Texas Instruments 1C4840IMS Messsysteme GmbH 1C48F9GN Netcom A/S 1C4AF7AMON INC 1C4BB9SMG ENTERPRISE, LLC 1C4BD6AzureWave 1C51B5Techaya LTD 1C5216DONGGUAN HELE ELECTRONICS CO., LTD 1C52D6FLAT DISPLAY TECHNOLOGY CORPORATION 1C5A3ESamsung Eletronics Co., Ltd (Visual Display Divison) 1C5A6BPhilips Electronics Nederland BV 1C5C55PRIMA Cinema, Inc 1C5C60Shenzhen Belzon Technology Co.,LTD 1C5FFFBeijing Ereneben Information Technology Co.,Ltd Shenzhen Branch 1C62B8Samsung Electronics Co.,Ltd 1C63B7OpenProducts 237 AB 1C659DLiteon Technology Corporation 1C666DHon Hai Precision Ind.Co.Ltd 1C66AASamsung Electronics 1C69A5Research In Motion 1C6A7ACisco 1C6BCAMitsunami Co., Ltd 1C6F65GIGA-BYTE TECHNOLOGY CO.,LTD 1C7508COMPAL INFORMATION (KUNSHAN) CO., LTD 1C76CATerasic Technologies Inc 1C7839Shenzhen Tencent Computer System Co., Ltd 1C7B21Sony Mobile Communications AB 1C7C11EID 1C7C45Vitek Industrial Video Products, Inc 1C7CC7Coriant GmbH 1C7E513bumen.com 1C7EE5D-Link International 1C83B0Linked IP GmbH 1C8464FORMOSA WIRELESS COMMUNICATION CORP 1C86ADMCT CO., LTD 1C8E8EDB Communication & Systems Co., ltd 1C8F8APhase Motion Control SpA 1C9179Integrated System Technologies Ltd 1C9492RUAG Schweiz AG 1C955DI-LAX ELECTRONICS INC 1C959FVeethree Electronics And Marine LLC 1C965AWeifang goertek Electronics CO.,LTD 1C973DPRICOM Design 1C994CMurata Manufactuaring Co.,Ltd 1C9C26Zoovel Technologies 1C9ECBBeijing Nari Smartchip Microelectronics Company Limited 1CA2B1ruwido austria gmbh 1CA770SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LT 1CAA07CISCO SYSTEMS, INC 1CAB01Innovolt 1CABA7Apple 1CAF05Samsung Electronics Co.,Ltd 1CAFF7D-LINK INTERNATIONAL PTE LIMITED 1CB094HTC Corporation 1CB17FNEC Platforms, Ltd 1CB243TDC A/S 1CBA8CTexas Instruments 1CBBA8OJSC "Ufimskiy Zavod "Promsvyaz" 1CBD0EAmplified Engineering Pty Ltd 1CBDB9D-LINK INTERNATIONAL PTE LIMITED 1CC11AWavetronix 1CC1DEHewlett-Packard Company 1CC316MileSight Technology Co., Ltd 1CC63CArcadyan Technology Corporation 1CD40CKriwan Industrie-Elektronik GmbH 1CDEA7Cisco 1CDF0FCISCO SYSTEMS, INC 1CE165Marshal Corporation 1CE192Qisda Corporation 1CE2CCTexas Instruments 1CE62BApple 1CE6C7Cisco 1CEEE8Ilshin Elecom 1CF061SCAPS GmbH 1CF4CA 1CF5E7Turtle Industry Co., Ltd 1CFA68TP-LINK TECHNOLOGIES CO.,LTD 1CFCBBRealfiction ApS 1CFEA7IDentytech Solutins Ltd 20014FLinea Research Ltd 2002AFMurata Manufactuaring Co.,Ltd 200505RADMAX COMMUNICATION PRIVATE LIMITED 2005E8OOO InProMedia 2008EDHuawei Technologies Co., Ltd 200A5EXiangshan Giant Eagle Technology Developing co.,LTD 200BC7HUAWEI TECHNOLOGIES CO.,LTD 200CC8NETGEAR INC., 200E95IEC – TC9 WG43 20107AGemtek Technology Co., Ltd 201257Most Lucky Trading Ltd 2012D5Scientech Materials Corporation 2013E0Samsung Electronics Co.,Ltd 2016D8Liteon Technology Corporation 20180EShenzhen Sunchip Technology Co., Ltd 201A06COMPAL INFORMATION (KUNSHAN) CO., LTD 201D03Elatec GmbH 2021A5LG Electronics Inc 202564PEGATRON CORPORATION 202598Teleview 202BC1Shenzhen Huawei Communication Technologies Co., Ltd 202CB7Kong Yue Electronics & Information Industry (Xinhui) Ltd 203706CISCO SYSTEMS, INC 2037BCKuipers Electronic Engineering BV 203A07Cisco 204005feno GmbH 20415ASmarteh d.o.o 20443ASchneider Electric Asia Pacific Ltd 2046A1VECOW Co., Ltd 2046F9Advanced Network Devices (dba:AND) 204AAAHanscan Spain S.A 204C6DHugo Brennenstuhl Gmbh & Co. KG 204E6BAxxana(israel) ltd 204E7FNETGEAR 2053CARisk Technology Ltd 205476Sony Mobile Communications AB 205721Salix Technology CO., Ltd 2059A0Paragon Technologies Inc 205A00Coval 205B2A 205B5EShenzhen Wonhe Technology Co., Ltd 205CFAYangzhou ChangLian Network Technology Co,ltd 206432SAMSUNG ELECTRO MECHANICS CO.,LTD 2067B1Pluto inc 20689DLiteon Technology Corporation 206A8AWistron InfoComm Manufacturing(Kunshan)Co.,Ltd 206AFFAtlas Elektronik UK Limited 206E9CSamsung Electronics Co.,Ltd 206FECBraemac CA LLC 207355ARRIS Group, Inc 2074CFShenzhen Voxtech Co.,Ltd 207600Actiontec Electronics, Inc 207693Lenovo (Beijing) Limited 207C8FQuanta Microsystems,Inc 207D74Apple 20858CAssa 2087ACAES motomation 208984COMPAL INFORMATION (KUNSHAN) CO., LTD 208986zte corporation 20918APROFALUX 2091D9I'M SPA 20934DFujian Star-net Communication Co., Ltd 209AE9Volacomm Co., Ltd 209BA5JIAXING GLEAD Electronics Co.,Ltd 20A2E7Lee-Dickens Ltd 20A787Bointec Taiwan Corporation Limited 20A99BMicrosoft Corporation 20AA25IP-NET LLC 20AA4BCisco-Linksys, LLC 20B0F7Enclustra GmbH 20B399Enterasys 20B5C6Mimosa Networks 20B7C0Omicron electronics GmbH 20BBC0Cisco 20BBC6Jabil Circuit Hungary Ltd 20BFDBDVL 20C1AFi Wit Digital Co., Limited 20C38FTexas Instruments Inc 20C60DShanghai annijie Information technology Co.,LTD 20C6EBPanasonic Corporation AVC Networks Company 20C8B3SHENZHEN BUL-TECH CO.,LTD 20C9D0Apple 20CD39Texas Instruments, Inc 20CEC4Peraso Technologies 20CF30ASUSTek COMPUTER INC 20D21FWincal Technology Corp 20D390Samsung Electronics Co.,Ltd 20D5ABKorea Infocom Co.,Ltd 20D5BFSamsung Eletronics Co., Ltd 20D607Nokia Corporation 20D906Iota, Inc 20DC93Cheetah Hi-Tech, Inc 20DCE6TP-LINK TECHNOLOGIES CO., LTD 20DF3FNanjing SAC Power Grid Automation Co., Ltd 20E52ANETGEAR INC., 20E564ARRIS Group, Inc 20E791Siemens Healthcare Diagnostics, Inc 20EAC7SHENZHEN RIOPINE ELECTRONICS CO., LTD 20ED74Ability enterprise co.,Ltd 20EEC6Elefirst Science & Tech Co., ltd 20F002MTData Developments Pty. Ltd 20F3A3Huawei Technologies Co., Ltd 20F85EDelta Electronics 20FABBCambridge Executive Limited 20FDF13COM EUROPE LTD 20FECDSystem In Frontier Inc 20FEDBM2M Solution S.A.S 2401C7Cisco 24050FMTN Electronic Co. Ltd 240917Devlin Electronics Limited 240A11TCT Mobile Limited 240A64AzureWaveTechnologies,Inc 240B2AViettel Group 240BB1KOSTAL Industrie Elektrik GmbH 241064Shenzhen Ecsino Tecnical Co. Ltd 241125Hutek Co., Ltd 241148Entropix, LLC 2411D0Chongqing Ehs Science and Technology Development Co.,Ltd 241A8CSquarehead Technology AS 241B13Shanghai Nutshell Electronic Co., Ltd 241F2CCalsys, Inc 2421ABSony Ericsson Mobile Communications 242642SHARP Corporation 242FFAToshiba Global Commerce Solutions 24336C 24374CCisco SPVTG 2437EFEMC Electronic Media Communication SA 243C20Dynamode Group 2442BCAlinco,incorporated 244597GEMUE Gebr. Mueller Apparatebau 24470EPentronicAB 24497BInnovative Converged Devices Inc 244F1DiRule LLC 245FDFKYOCERA Corporation 246278sysmocom - systems for mobile communications GmbH 2464EFCYG SUNRI CO.,LTD 246511AVM GmbH 24694AJasmine Systems Inc 2469A5Huawei Technologies Co., Ltd 246AABIT-IS International 24767DCisco SPVTG 247703Intel Corporate 248000Westcontrol AS 2481AAKSH International Co., Ltd 24828AProwave Technologies Ltd 2486F4Ctek, Inc 248707SEnergy Corporation 2493CAVoxtronic Technology Computer-Systeme GmbH 249442OPEN ROAD SOLUTIONS , INC 249504SFR 2497EDTechvision Intelligent Technology Limited 24A2E1Apple, Inc 24A42CKOUKAAM a.s 24A43CUbiquiti Networks, INC 24A495Thales Canada Inc 24A87DPanasonic Automotive Systems Asia Pacific(Thailand)Co.,Ltd 24A937PURE Storage 24AB81Apple 24AF4AAlcatel-Lucent-IPD 24AF54NEXGEN Mediatech Inc 24B657CISCO SYSTEMS, INC 24B6B8FRIEM SPA 24B6FDDell Inc 24B88CCrenus Co.,Ltd 24B8D2Opzoon Technology Co.,Ltd 24BA30Technical Consumer Products, Inc 24BBC1Absolute Analysis 24BC82Dali Wireless, Inc 24BE05Hewlett Packard 24BF74 24C0B3RSF 24C696Samsung Electronics Co.,Ltd 24C848mywerk system GmbH 24C86EChaney Instrument Co 24C9A1Ruckus Wireless 24C9DEGenoray 24CBE7MYK, Inc 24CF21Shenzhen State Micro Technology Co., Ltd 24D13FMEXUS CO.,LTD 24D2CCSmartDrive Systems Inc 24D921Avaya, Inc 24DAB6Sistemas de Gestión Energética S.A. de C.V 24DBACShenzhen Huawei Communication Technologies Co., Ltd 24DBADShopperTrak RCT Corporation 24DBEDSamsung Electronics Co.,Ltd 24DEC6Aruba Networks 24E271Qingdao Hisense Communications Co.,Ltd 24E314Apple 24E6BAJSC Zavod im. Kozitsky 24E9B3Cisco 24EA40Systeme Helmholz GmbH 24EB65SAET I.S. S.r.l 24EC99Askey Computer Corp 24ECD6CSG Science & Technology Co.,Ltd.Hefei 24EE3AChengdu Yingji Electronic Hi-tech Co Ltd 24F0FFGHT Co., Ltd 24F2DDRadiant Zemax LLC 24F5AASamsung Electronics Co.,LTD 24FD52Liteon Technology Corporation 2804E0FERMAX ELECTRONICA S.A.U 28061ENINGBO GLOBAL USEFUL ELECTRIC CO.,LTD 28068DITL, LLC 280B5CApple 280CB8Mikrosay Yazilim ve Elektronik A.S 280DFCSony Computer Entertainment Inc 28107BD-Link International 281471Lantis co., LTD 28162E2Wire 2817CEOmnisense Ltd 281878Microsoft Corporation 2818FDAditya Infotech Ltd 282246Beijing Sinoix Communication Co., LTD 2826A6PBR electronics GmbH 28285DZyXEL Communications Corporation 2829CCCorsa Technology Incorporated 2829D9GlobalBeiMing technology (Beijing)Co. Ltd 282CB2TP-LINK TECHNOLOGIES CO.,LTD 283152HUAWEI TECHNOLOGIES CO.,LTD 2832C5Humax.co.,ltd 283410Enigma Diagnostics Limited 2834A2Cisco 283737Apple 2838CFGen2wave 2839E7Preceno Technology Pte.Ltd 283B96Cool Control LTD 283CE4Huawei Technologies Co., Ltd 28401AC8 MediSensors, Inc 284121OptiSense Network, LLC 284430GenesisTechnical Systems (UK) Ltd 2847AANokia Corporation 284846GridCentric Inc 284C53Intune Networks 284D92Luminator 284ED7OutSmart Power Systems, Inc 284FCELiaoning Wontel Science and Technology Development Co.,Ltd 285132Shenzhen Prayfly Technology Co.,Ltd 285767Echostar Technologies Corp 285FDBShenzhen Huawei Communication Technologies Co., Ltd 286046Lantech Communications Global, Inc 286094CAPELEC 286336Siemens AG - Industrial Automation - EWA 28656BKeystone Microtech Corporation 286AB8Apple 286ABAApple 286D97SAMJIN Co., Ltd 286ED4HUAWEI TECHNOLOGIES CO.,LTD 287184Spire Payments 2872C5Smartmatic Corp 2872F0ATHENA 287994Realplay Digital Technology(Shenzhen) Co.,Ltd 288023Hewlett Packard 28852DTouch Networks 288915CashGuard Sverige AB 288A1CJuniper networks 2891D0Stage Tec Entwicklungsgesellschaft für professionelle Audiotechnik mbH 28924AHewlett Packard 2893FECISCO SYSTEMS, INC 28940FCISCO SYSTEMS, INC 2894AFSamhwa Telecom 28987BSamsung Electronics Co.,Ltd 289A4BSteelSeries ApS 289AFATCT Mobile Limited 289EDFDanfoss Turbocor Compressors, Inc 28A186enblink 28A192GERP Solution 28A1EBETEK TECHNOLOGY (SHENZHEN) CO.,LTD 28A241exlar corp 28A574Miller Electric Mfg. Co 28A5EEShenzhen SDGI CATV Co., Ltd 28AF0ASirius XM Radio Inc 28B0CCXenya d.o.o 28B2BDIntel Corporate 28B3ABGenmark Automation 28BA18NextNav, LLC 28BAB5Samsung Electronics Co.,Ltd 28BB59RNET Technologies, Inc 28BE9BTechnicolor USA Inc 28C0DAJuniper Networks 28C671Yota Devices OY 28C68ENETGEAR INC., 28C718Altierre 28C7CECisco 28C825DellKing Industrial Co., Ltd 28C914Taimag Corporation 28CBEBOne 28CC01Samsung Electronics Co.,Ltd 28CCFFCorporacion Empresarial Altra SL 28CD1CEspotel Oy 28CD4CIndividual Computers GmbH 28CD9CShenzhen Dynamax Software Development Co.,Ltd 28CFDAApple 28CFE9Apple 28D1AFNokia Corporation 28D244LCFC(HeFei) Electronics Technology Co., Ltd 28D576Premier Wireless, Inc 28D93ETelecor Inc 28D997Yuduan Mobile Co., Ltd 28DB81Shanghai Guao Electronic Technology Co., Ltd 28DEF6bioMerieux Inc 28E02CApple 28E14CApple, Inc 28E297Shanghai InfoTM Microelectronics Co.,Ltd 28E31FXiaomi inc 28E347Liteon Technology Corporation 28E608Tokheim 28E6E9SIS Sat Internet Services GmbH 28E794Microtime Computer Inc 28E7CFApple 28ED58JAG Jakob AG 28EE2CFrontline Test Equipment 28EF01 28F3582C - Trifonov & Co 28F532ADD-Engineering BV 28F606Syes srl 28FBD3Ragentek Technology Group 28FC51The Electric Controller and Manufacturing Co., LLC 28FCF6Shenzhen Xin KingBrand enterprises Co.,Ltd 2C002CUNOWHY 2C0033EControls, LLC 2C00F7XOS 2C010BNASCENT Technology, LLC - RemKon 2C0623Win Leader Inc 2C073CDEVLINE LIMITED 2C10C1Nintendo Co., Ltd 2C18AETrend Electronics Co., Ltd 2C1984IDN Telecom, Inc 2C1A31Electronics Company Limited 2C1EEAAERODEV 2C2172Juniper Networks 2C245FBabolat VS 2C26C5zte corporation 2C27D7Hewlett-Packard Company 2C282DBBK COMMUNICATIAO TECHNOLOGY CO.,LTD 2C2997Microsoft Corporation 2C2D48bct electronic GesmbH 2C3068Pantech Co.,Ltd 2C3427ERCO & GENER 2C3557ELLIY Power CO..Ltd 2C36A0Capisco Limited 2C36F8CISCO SYSTEMS, INC 2C3731ShenZhen Yifang Digital Technology Co.,LTD 2C3796CYBO CO.,LTD 2C3996SAGEMCOM 2C39C1Ciena Corporation 2C3A28Fagor Electrónica 2C3BFDNetstor Technology Co., Ltd 2C3ECFCisco 2C3F38CISCO SYSTEMS, INC 2C3F3EAlge-Timing GmbH 2C4138Hewlett-Packard Company 2C4401Samsung Electronics Co.,Ltd 2C441BSpectrum Medical Limited 2C44FDHewlett Packard 2C534AShenzhen Winyao Electronic Limited 2C542DCISCO SYSTEMS, INC 2C54CFLG Electronics 2C553CGainspeed, Inc 2C59E5Hewlett Packard 2C5A05Nokia Corporation 2C5AA3PROMATE ELECTRONIC CO.LTD 2C5BE1Centripetal Networks, Inc 2C5D93Ruckus Wireless 2C5FF3Pertronic Industries 2C600CQUANTA COMPUTER INC 2C625AFinest Security Systems Co., Ltd 2C6289Regenersis (Glenrothes) Ltd 2C67FBShenZhen Zhengjili Electronics Co., LTD 2C69BARF Controls, LLC 2C6BF5Juniper networks 2C7155HiveMotion 2C72C3Soundmatters 2C750FShanghai Dongzhou-Lawton Communication Technology Co. Ltd 2C768AHewlett-Packard Company 2C7B5AMilper Ltd 2C7B84OOO Petr Telegin 2C7ECFOnzo Ltd 2C8065HARTING Inc. of North America 2C8158Hon Hai Precision Ind. Co.,Ltd 2C8A72HTC Corporation 2C8BF2Hitachi Metals America Ltd 2C9127Eintechno Corporation 2C922CKishu Giken Kogyou Company Ltd, 2C9464Cincoze Co., Ltd 2C957Fzte corporation 2C9717I.C.Y. B.V 2C9AA4NGI SpA 2C9E5FARRIS Group, Inc 2C9EFCCANON INC 2CA157acromate, Inc 2CA30EPOWER DRAGON DEVELOPMENT LIMITED 2CA780True Technologies Inc 2CA835RIM 2CAB25Shenzhen Gongjin Electronics Co.,Ltd 2CABA4Cisco SPVTG 2CB05DNETGEAR 2CB0DFSoliton Technologies Pvt Ltd 2CB43AApple 2CB693Radware 2CB69DRED Digital Cinema 2CBE08Apple 2CBE97Ingenieurbuero Bickele und Buehler GmbH 2CC260Ravello Systems 2CCC15Nokia Corporation 2CCD27Precor Inc 2CCD43Summit Technology Group 2CCD69Aqavi.com 2CD05ALiteon Technology Corporation 2CD1DASanjole, Inc 2CD2E7Nokia Corporation 2CD444Fujitsu Limited 2CDD0CDiscovergy GmbH 2CE2A8DeviceDesign 2CE412SAGEMCOM SAS 2CE6CCRuckus Wireless 2CE871Alert Metalguard ApS 2CEDEBAlpheus Digital Company Limited 2CEE26Petroleum Geo-Services 2CF0EEApple 2CF203EMKO ELEKTRONIK SAN VE TIC AS 2CF4C5Avaya, Inc 2CF7F1Seeed Technology Inc 2CFAA2Alcatel-Lucent 30055CBrother industries, LTD 300B9CDelta Mobile Systems, Inc 300D2AZhejiang Wellcom Technology Co.,Ltd 300ED5Hon Hai Precision Ind.Co.Ltd 3010B3Liteon Technology Corporation 3010E4Apple, Inc 30142DPiciorgros GmbH 30144AWistron Neweb Corp 301518Ubiquitous Communication Co. ltd 30168DProLon 3017C8Sony Ericsson Mobile Communications AB 3018CFDEOS control systems GmbH 301966Samsung Electronics Co.,Ltd 301A28Mako Networks Ltd 30215BShenzhen Ostar Display Electronic Co.,Ltd 302DE8JDA, LLC (JDA Systems) 303294W-IE-NE-R Plein & Baus GmbH 3032D4Hanilstm Co., Ltd 303335Boosty 3037A6CISCO SYSTEMS, INC 303855Nokia Corporation 303926Sony Ericsson Mobile Communications AB 303955Shenzhen Jinhengjia Electronic Co., Ltd 3039F2ADB Broadband Italia 303A64Intel Corporate 303D08GLINTT TES S.A 303EADSonavox Canada Inc 304174ALTEC LANSING LLC 304225BURG-WÄCHTER KG 304449PLATH GmbH 30469ANETGEAR 30493BNanjing Z-Com Wireless Co.,Ltd 304C7EPanasonic Electric Works Automation Controls Techno Co.,Ltd 304EC3Tianjin Techua Technology Co., Ltd 3051F8BYK-Gardner GmbH 30525ANST Co., LTD 3055EDTrex Network LLC 3057ACIRLAB LTD 30595Bstreamnow AG 3059B7Microsoft 305D38Beissbarth 306023ARRIS Group, Inc 306112PAV GmbH 306118Paradom Inc 3065ECWistron (ChongQing) 30688CReach Technology Inc 30694BRIM 306CBESkymotion Technology (HK) Limited 306E5CValidus Technologies 3071B2Hangzhou Prevail Optoelectronic Equipment Co.,LTD 307512Sony Mobile Communications AB 30766FLG Electronics 3077CBMaike Industry(Shenzhen)CO.,LTD 30786BTIANJIN Golden Pentagon Electronics Co., Ltd 3078C2Innowireless, Co. Ltd 307C30RIM 307ECBSFR 3085A9Asustek Computer Inc 308730Shenzhen Huawei Communication Technologies Co., Ltd 308999Guangdong East Power Co., 308CFBDropcam 3090ABApple 30918FTechnicolor 3092F6SHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD 309BADBBK Electronics Corp., Ltd., 30A8DBSony Mobile Communications AB 30AABDShanghai Reallytek Information Technology Co.,Ltd 30AE7BDeqing Dusun Electron CO., LTD 30AEF6Radio Mobile Access 30B216Hytec Geraetebau GmbH 30B3A2Shenzhen Heguang Measurement & Control Technology Co.,Ltd 30B5C2TP-LINK TECHNOLOGIES CO.,LTD 30B5F1Aitexin Technology Co., Ltd 30C750MIC Technology Group 30C7AESamsung Electronics Co.,Ltd 30C82AWi-Next s.r.l 30CDA7Samsung Electronics ITS, Printer division 30D17EHUAWEI TECHNOLOGIES CO.,LTD 30D357Logosol, Inc 30D46AAutosales Incorporated 30D6C9Samsung Electronics Co.,Ltd 30DE86Cedac Software S.r.l 30E48EVodafone UK 30E4DBCISCO SYSTEMS, INC 30EB25INTEK DIGITAL 30EFD1Alstom Strongwish (Shenzhen) Co., Ltd 30F31Dzte corporation 30F33A+plugg srl 30F42FESP 30F70DCisco Systems 30F7C5Apple 30F7D7Thread Technology Co., Ltd 30F9EDSony Corporation 30FAB7Tunai Creative 30FD11MACROTECH (USA) INC 3400A3HUAWEI TECHNOLOGIES CO.,LTD 340286Intel Corporate 34029BCloudBerry Technologies Private Limited 3407FBEricsson AB 340804D-Link Corporation 340AFFQingdao Hisense Communications Co.,Ltd 3413A8Mediplan Limited 3413E8Intel Corporate 34159EApple 3417EBDell Inc 341A4CSHENZHEN WEIBU ELECTRONICS CO.,LTD 341B22Grandbeing Technology Co., Ltd 342109Jensen Scandinavia AS 342387Hon Hai Precision Ind. Co.,Ltd 3423BASamsung Electro Mechanics co.,LTD 34255DShenzhen Loadcom Technology Co.,Ltd 3428F0ATN International Limited 3429EAMCD ELECTRONICS SP. Z O.O 342F6EAnywire corporation 343111Samsung Electronics Co.,Ltd 3431C4AVM GmbH 3440B5IBM 34466FHiTEM Engineering 344B3DFiberhome Telecommunication Tech.Co.,Ltd 344B50ZTE Corporation 344DEAzte corporation 344DF7LG Electronics 344F3FIO-Power Technology Co., Ltd 344F5CR&M AG 344F69EKINOPS SAS 3451AAJID GLOBAL 3451C9Apple 345B11EVI HEAT AB 345C40Cargt Holdings LLC 345D10Wytek 346178The Boeing Company 346288Cisco 3464A9Hewlett Packard 34684ATeraworks Co., Ltd 346BD3Huawei Technologies Co., Ltd 346E8AEcosense 346F92White Rodgers Division 3475C7Avaya, Inc 3476C5I-O DATA DEVICE, INC 347877O-NET Communications(Shenzhen) Limited 347E39Nokia Danmark A/S 348137UNICARD SA 3481C4AVM GmbH 3482DEKayo Technology, Inc 348302iFORCOM Co., Ltd 348446Ericsson AB 34862AHeinz Lackmann GmbH & Co KG 34885DLogitech Far East 348AAESAGEMCOM SAS 3495DBLogitec Corporation 3497FBADVANCED RF TECHNOLOGIES INC 34996FVPI Engineering 3499D7Universal Flow Monitors, Inc 349A0DZBD Displays Ltd 349D90Heinzmann GmbH & CO. KG 34A183AWare, Inc 34A3BFTerewave. Inc 34A55DTECHNOSOFT INTERNATIONAL SRL 34A5E1Sensorist ApS 34A68CShine Profit Development Limited 34A709Trevil srl 34A7BAFischer International Systems Corporation 34A843KYOCERA Display Corporation 34A84ECisco 34AA8BSamsung Electronics Co.,Ltd 34AA99Alcatel-Lucent 34AAEEMikrovisatos Servisas UAB 34ADE4Shanghai Chint Power Systems Co., Ltd 34AF2CNintendo Co., Ltd 34B1F7Texas Instruments 34B571PLDS 34B7FDGuangzhou Younghead Electronic Technology Co.,Ltd 34BA51Se-Kure Controls, Inc 34BA9AAsiatelco Technologies Co 34BB1FResearch In Motion 34BB26Motorola Mobility LLC 34BCA6Beijing Ding Qing Technology, Ltd 34BDC8Cisco Systems 34BDF9Shanghai WDK Industrial Co.,Ltd 34BDFACisco SPVTG 34BE00Samsung Electronics Co.,Ltd 34BF90Fiberhome Telecommunication Tech.Co.,Ltd 34C059Apple 34C3ACSamsung Electronics 34C5D0Hagleitner Hygiene International GmbH 34C69AEnecsys Ltd 34C731ALPS Co,. Ltd 34C803Nokia Corporation 34C99DEIDOLON COMMUNICATIONS TECHNOLOGY CO. LTD 34CD6DCommSky Technologies 34CDBEHuawei Technologies Co., Ltd 34CE94Parsec (Pty) Ltd 34D09BMobilMAX Technology Inc 34D2C4RENA GmbH Print Systeme 34D7B4Tributary Systems, Inc 34DBFDCisco 34DE1AIntel Corporate 34DE34zte corporation 34DF2AFujikon Industrial Co.,Limited 34E0CFzte corporation 34E0D7DONGGUAN QISHENG ELECTRONICS INDUSTRIAL CO., LTD 34E2FDApple 34E42AAutomatic Bar Controls Inc 34E6ADIntel Corporate 34EF442Wire 34EF8BNTT Communications Corporation 34F0CAShenzhen Linghangyuan Digital Technology Co.,Ltd 34F39BWizLAN Ltd 34F62DSHARP Corporation 34F6D2Panasonic Taiwan Co.,Ltd 34F968ATEK Products, LLC 34FA40Guangzhou Robustel Technologies Co., Limited 34FC6FALCEA 380197Toshiba Samsung Storage Technolgoy Korea Corporation 3806B4A.D.C. GmbH 3808FDSilca Spa 380A0ASky-City Communication and Electronics Limited Company 380A94Samsung Electronics Co.,Ltd 380B40Samsung Electronics Co.,Ltd 380DD4Primax Electronics LTD 380E7BV.P.S. Thai Co., Ltd 380F4AApple 380FE4Dedicated Network Partners Oy 3816D1Samsung Electronics Co.,Ltd 381766PROMZAKAZ LTD 38192FNokia Corporation 381C1ACisco 381C4ASIMCom Wireless Solutions Co.,Ltd 38229DPirelli Tyre S.p.A 3822D6H3C Technologies Co., Limited 38262BUTran Technology 3826CDANDTEK 3828EAFujian Netcom Technology Co., LTD 382DD1Samsung Electronics Co.,Ltd 3831ACWEG 383F10DBL Technology Ltd 384233Wildeboer Bauteile GmbH 3842A6Ingenieurbuero Stahlkopf 384369Patrol Products Consortium LLC 38458CMyCloud Technology corporation 384608ZTE Corporation 38484CApple 384B76AIRTAME ApS 384FF0Azurewave Technologies, Inc 38521AAlcatel-Lucent 7705 38580CPanaccess Systems GmbH 3859F8MindMade sp. z o.o 3859F9Hon Hai Precision Ind. Co.,Ltd 385AA8Beijing Zhongdun Security Technology Development Co 385FC3Yu Jeong System, Co.Ltd 386077PEGATRON CORPORATION 3863F63NOD MULTIMEDIA(SHENZHEN)CO.,LTD 386645OOSIC Technology CO.,Ltd 386793Asia Optical Co., Inc 386BBBARRIS Group, Inc 386C9BIvy Biomedical 386E21Wasion Group Ltd 3872C0COMTREND 387B47AKELA, Inc 388345TP-LINK TECHNOLOGIES CO., LTD 3889DCOpticon Sensors Europe B.V 388AB7ITC Networks 388EE7Fanhattan LLC 3891FBXenox Holding BV 389592Beijing Tendyron Corporation 389F83OTN Systems N.V 38A53CVeenstra Instruments 38A5B6SHENZHEN MEGMEET ELECTRICAL CO.,LTD 38A851Moog, Ing 38A86BOrga BV 38A95FActifio Inc 38AA3CSAMSUNG ELECTRO-MECHANICS 38B12DSonotronic Nagel GmbH 38B1DBHon Hai Precision Ind. Co.,Ltd 38B5BDE.G.O. Elektro-Ger 38B74DFijowave Limited 38BB23OzVision America LLC 38BB3CAvaya, Inc 38BC1AMeizu technology co.,ltd 38BF2FEspec Corp 38BF33NEC CASIO Mobile Communications 38C096ALPS ELECTRIC CO.,LTD 38C7BACS Services Co.,Ltd 38C85CCisco SPVTG 38C9A9SMART High Reliability Solutions, Inc 38CA97Contour Design LLC 38D135EasyIO Corporation Sdn. Bhd 38DBBBSunbow Telecom Co., Ltd 38DE60Mohlenhoff GmbH 38E08EMitsubishi Electric Corporation 38E595Shenzhen Gongjin Electronics Co.,Ltd 38E7D8HTC Corporation 38E8DFb gmbh medien + datenbanken 38E98CReco S.p.A 38EAA7Hewlett Packard 38EC11Novatek Microelectronics Corp 38ECE4Samsung Electronics 38EE9DAnedo Ltd 38F098Vapor Stone Rail Systems 38F33FTATSUNO CORPORATION 38F597home2net GmbH 38F708National Resource Management, Inc 38F889Huawei Technologies Co., Ltd 38F8B7V2COM PARTICIPACOES S.A 38FEC5Ellips B.V 3C02B1Creation Technologies LP 3C04BFPRAVIS SYSTEMS Co.Ltd., 3C05ABProduct Creation Studio 3C0754Apple 3C0771Sony Corporation 3C081EBeijing Yupont Electric Power Technology Co.,Ltd 3C08F6Cisco 3C096DPowerhouse Dynamics 3C0C48Servergy, Inc 3C0E23Cisco 3C0FC1KBC Networks 3C1040daesung network 3C106FALBAHITH TECHNOLOGIES 3C15C2Apple 3C15EATESCOM CO., LTD 3C189FNokia Corporation 3C18A0Luxshare Precision Industry Co.,Ltd 3C1915GFI Chrono Time 3C197DEricsson AB 3C1A57Cardiopulmonary Corp 3C1A79Huayuan Technology CO.,LTD 3C1CBEJADAK LLC 3C25D7Nokia Corporation 3C26D5Sotera Wireless 3C2763SLE quality engineering GmbH & Co. KG 3C2DB7Texas Instruments 3C2F3ASFORZATO Corp 3C300CDewar Electronics Pty Ltd 3C363DNokia Corporation 3C36E4Arris Group, Inc 3C3888ConnectQuest, llc 3C39C3JW Electronics Co., Ltd 3C3A73Avaya, Inc 3C404FGuangdong Pisen Electronics Co. Ltd 3C438EARRIS Group, Inc 3C46D8TP-LINK TECHNOLOGIES CO.,LTD 3C4A92Hewlett-Packard Company 3C4C69Infinity System S.L 3C4E47Etronic A/S 3C57BDKessler Crane Inc 3C57D5FiveCo 3C5A37Samsung Electronics 3C5AB4Google 3C5F01Synerchip Co., Ltd 3C6104Juniper Networks 3C6200Samsung electronics CO., LTD 3C6278SHENZHEN JETNET TECHNOLOGY CO.,LTD 3C672CSciovid Inc 3C6A7DNiigata Power Systems Co., Ltd 3C6E63Mitron OY 3C6F45Fiberpro Inc 3C6FF7EnTek Systems, Inc 3C7059MakerBot Industries 3C7437RIM 3C754AARRIS Group, Inc 3C77E6Hon Hai Precision Ind. Co.,Ltd 3C7DB1Texas Instruments 3C81D8SAGEMCOM SAS 3C83B5Advance Vision Electronics Co. Ltd 3C86A8Sangshin elecom.co,, LTD 3C89A6KAPELSE 3C8AB0Juniper Networks 3C8AE5Tensun Information Technology(Hangzhou) Co.,LTD 3C8BFESamsung Electronics 3C9157Hangzhou Yulong Conmunication Co.,Ltd 3C9174ALONG COMMUNICATION TECHNOLOGY 3C94D5Juniper Networks 3C970EWistron InfoComm(Kunshan)Co.,Ltd 3C977EIPS Technology Limited 3C98BFQuest Controls, Inc 3C99F7Lansentechnology AB 3C9F81Shenzhen CATIC Bit Communications Technology Co.,Ltd 3CA10DSamsung Electronics Co.,Ltd 3CA315Bless Information & Communications Co., Ltd 3CA72BMRV Communications (Networks) LTD 3CA9F4Intel Corporate 3CAA3FiKey, Ltd 3CAB8EApple 3CB15BAvaya, Inc 3CB17FWattwatchers Pty Ld 3CB87A 3CB9A6Belden Deutschland GmbH 3CBDD8LG ELECTRONICS INC 3CC0C6d&b audiotechnik GmbH 3CC12CAES Corporation 3CC1F6Melange Systems Pvt. Ltd 3CC243Nokia Corporation 3CC99EHuiyang Technology Co., Ltd 3CCA87Iders Incorporated 3CCD5ATechnische Alternative GmbH 3CCD93LG ELECTRONICS INC 3CCE73CISCO SYSTEMS, INC 3CD0F8Apple 3CD16ETelepower Communication Co., Ltd 3CD4D6WirelessWERX, Inc 3CD7DASK Mtek microelectronics(shenzhen)limited 3CD92BHewlett-Packard Company 3CD9CEEclipse WiFi 3CDF1ECISCO SYSTEMS, INC 3CDFBDHuawei Technologies Co., Ltd 3CE072Apple 3CE5A6Hangzhou H3C Technologies Co., Ltd 3CE5B4KIDASEN INDUSTRIA E COMERCIO DE ANTENAS LTDA 3CE624LG Display 3CEA4F2Wire 3CEAFBNSE AG 3CF392Virtualtek. Co. Ltd 3CF52CDSPECIALISTS GmbH 3CF72ANokia Corporation 3CF748Shenzhen Linsn Technology Development Co.,Ltd 3CF808HUAWEI TECHNOLOGIES CO.,LTD 3CFB96Emcraft Systems LLC 400107Arista Corp 4001C63COM EUROPE LTD 40040CA&T 4007C0Railtec Systems GmbH 400E67Tremol Ltd 400E85Samsung Electro Mechanics co.,LTD 4012E4Compass-EOS 4013D9Global ES 401597Protect America, Inc 40167EASUSTek COMPUTER INC 40169FTP-LINK TECHNOLOGIES CO., LTD 4016FAEKM Metering 4018B1Aerohive Networks Inc 4018D7Wyle Telemetry and Data Systems 401D59Biometric Associates, LP 4022EDDigital Projection Ltd 4025C2Intel Corporate 40270BMobileeco Co., Ltd 402BA1Sony Ericsson Mobile Communications AB 402CF4Universal Global Scientific Industrial Co., Ltd 403004Apple 403067Conlog (Pty) Ltd 40336CGodrej & Boyce Mfg. co. ltd 4037ADMacro Image Technology, Inc 403CFCApple 404022ZIV 40406BIcomera 4045DASpreadtrum Communications (Shanghai) Co., Ltd 404A03ZyXEL Communications Corporation 404A18Addrek Smart Solutions 404D8EShenzhen Huawei Communication Technologies Co., Ltd 404EEBHigher Way Electronic Co., Ltd 4050E0Milton Security Group LLC 40516CGrandex International Corporation 40520DPico Technology 405539CISCO SYSTEMS, INC 40560CIn Home Displays Ltd 405A9BANOVO 405FBERIM 405FC2Texas Instruments 40605AHawkeye Tech Co. Ltd 406186MICRO-STAR INT'L CO.,LTD 40618EStella-Green Co 40667Amediola - connected living AG 406826Thales UK Limited 406AABRIM 406C8FApple 406F2AResearch In Motion 407009ARRIS Group, Inc 40704APower Idea Technology Limited 407074Life Technology (China) Co., Ltd 407496aFUN TECHNOLOGY INC 40786AMotorola Mobility LLC 407875IMBEL - Industria de Material Belico do Brasil 407A80Nokia Corporation 407B1BMettle Networks Inc 408256Continental Automotive GmbH 4083DEMotorola 408493Clavister AB 4088E0Beijing Ereneben Information Technology Limited Shenzhen Branch 408A9ATITENG CO., Ltd 408B07Actiontec Electronics, Inc 408BF6Shenzhen TCL New Technology Co; Ltd 409558Aisino Corporation 4097D1BK Electronics cc 40984CCasacom Solutions AG 40984ETexas Instruments 40987BAisino Corporation 409B0DShenzhen Yourf Kwan Industrial Co., Ltd 409FC7BAEKCHUN I&C Co., Ltd 40A6A4PassivSystems Ltd 40A6D9Apple 40A8F0Hewlett Packard 40AC8DData Management, Inc 40B0FALG Electronics 40B2C8Nortel Networks 40B395Apple 40B3CDChiyoda Electronics Co.,Ltd 40B3FCLogital Co. Limited 40B4F0Juniper Networks 40B6B1SUNGSAM CO,.Ltd 40B7F3ARRIS Group, Inc 40BA61Arima Communications Corp 40BC73Cronoplast S.L 40BC8Bitelio GmbH 40BD9EPhysio-Control, Inc 40BF17Digistar Telecom. SA 40C245Shenzhen Hexicom Technology Co., Ltd 40C4D6ChongQing Camyu Technology Development Co.,Ltd 40C62AShanghai Jing Ren Electronic Technology Co., Ltd 40C7C9Naviit Inc 40CBA8Huawei Technologies Co., Ltd 40CD3AZ3 Technology 40D32DApple 40D40EBiodata Ltd 40D559MICRO S.E.R.I 40D855IEEE REGISTRATION AUTHORITY 40E230AzureWave Technologies, Inc 40E730DEY Storage Systems, Inc 40E793Shenzhen Siviton Technology Co.,Ltd 40ECF8Siemens AG 40EF4CFihonest communication co.,Ltd 40F02FLiteon Technology Corporation 40F14CISE Europe SPRL 40F201SAGEMCOM 40F2E9IBM 40F308Murata Manufactuaring Co.,Ltd 40F407Nintendo Co., Ltd 40F4ECCISCO SYSTEMS, INC 40F52ELeica Microsystems (Schweiz) AG 40FC89ARRIS Group, Inc 4403A7Cisco 440CFDNetMan Co., Ltd 4411C2Telegartner Karl Gartner GmbH 441319WKK TECHNOLOGY LTD 44184FFitview 4419B6Hangzhou Hikvision Digital Technology Co.,Ltd 441E91ARVIDA Intelligent Electronics Technology Co.,Ltd 441EA1Hewlett-Packard Company 4423AAFarmage Co., Ltd 4425BBBamboo Entertainment Corporation 442938NietZsche enterprise Co.Ltd 442A60Apple 442AFFE3 Technology, Inc 442B03CISCO SYSTEMS, INC 443192Hewlett Packard 44322AAvaya, Inc 4432C8Technicolor USA Inc 44334CShenzhen Bilian electronic CO.,LTD 44348FMXT INDUSTRIAL LTDA 4437192 Save Energy Ltd 44376FYoung Electric Sign Co 4437E6Hon Hai Precision Ind.Co.Ltd 443839Cumulus Networks, inc 4439C4Universal Global Scientific Industrial Co.,Ltd 443C9CPintsch Tiefenbach GmbH 443D21Nuvolt 443EB2DEOTRON Co., LTD 444891HDMI Licensing, LLC 444A65Silverflare Ltd 444C0CApple 444E1ASamsung Electronics Co.,Ltd 444F5EPan Studios Co.,Ltd 4451DBRaytheon BBN Technologies 4454C0Thompson Aerospace 44568DPNC Technologies Co., Ltd 4456B7Spawn Labs, Inc 445829Cisco SPVTG 44599FCriticare Systems, Inc 445EF3Tonalite Holding B.V 445F7AShihlin Electric & Engineering Corp 446132ecobee inc 44619CFONsystem co. ltd 44666EIP-LINE 446755Orbit Irrigation 4468ABJUIN COMPANY, LIMITED 446C24Reallin Electronic Co.,Ltd 446D57Liteon Technology Corporation 44700BIFFU 447098MING HONG TECHNOLOGY (SHEN ZHEN) LIMITED 44746CSony Mobile Communications AB 447BC4DualShine Technology(SZ)Co.,Ltd 447C7FInnolight Technology Corporation 447DA5VTION INFORMATION TECHNOLOGY (FUJIAN) CO.,LTD 447E76Trek Technology (S) Pte Ltd 447E95Alpha and Omega, Inc 448312Star-Net 448500Intel Corporate 4486C1Siemens Low Voltage & Products 4487FCELITEGROUP COMPUTER SYSTEM CO., LTD 4488CBCamco Technologies NV 448A5BMicro-Star INT'L CO., LTD 448C52KTIS CO., Ltd 448E12DT Research, Inc 448E81VIG 4491DBShanghai Huaqin Telecom Technology Co.,Ltd 4494FCNETGEAR INC., 4495FAQingdao Santong Digital Technology Co.Ltd 449B78The Now Factory 449CB5Alcomp, Inc 44A42DTCT Mobile Limited 44A689PROMAX ELECTRONICA SA 44A6E5THINKING TECHNOLOGY CO.,LTD 44A7CFMurata Manufacturing Co., Ltd 44A8C2SEWOO TECH CO., LTD 44AA27udworks Co., Ltd 44AAE8Nanotec Electronic GmbH & Co. KG 44ADD9Cisco 44B382Kuang-chi Institute of Advanced Technology 44C15CTexas Instruments 44C233Guangzhou Comet Technology Development Co.Ltd 44C306SIFROM Inc 44C39BOOO RUBEZH NPO 44C4A9Opticom Communication, LLC 44C56FNGN Easy Satfinder (Tianjin) Electronic Co., Ltd 44C9A2Greenwald Industries 44CE7DSFR 44D15EShanghai Kingto Information Technology Ltd 44D2CAAnvia TV Oy 44D3CACISCO SYSTEMS, INC 44D4E0Sony Mobile Communications AB 44D63DTalari Networks 44D832Azurewave Technologies, Inc 44D884Apple 44DC91PLANEX COMMUNICATIONS INC 44DCCBSEMINDIA SYSTEMS PVT LTD 44E08ECisco SPVTG 44E49AOMNITRONICS PTY LTD 44E4D9CISCO SYSTEMS, INC 44E8A5Myreka Technologies Sdn. Bhd 44ED57Longicorn, inc 44EE30Budelmann Elektronik GmbH 44F459Samsung Electronics 44F849Union Pacific Railroad 44FB42Apple 48022AB-Link Electronic Limited 480362DESAY ELECTRONICS(HUIZHOU)CO.,LTD 480C49NAKAYO TELECOMMUNICATIONS,INC 481249Luxcom Technologies Inc 4813F3BBK Electronics Corp., Ltd 48174CMicroPower technologies 481842Shanghai Winaas Co. Equipment Co. Ltd 481A84Pointer Telocation Ltd 481BD2Intron Scientific co., ltd 4826E8Tek-Air Systems, Inc 48282FZTE Corporation 482CEAMotorola Inc Business Light Radios 4833DDZENNIO AVANCE Y TECNOLOGIA, S.L 48343DIEP GmbH 483D32Syscor Controls & Automation 484487Cisco SPVTG 4844F7Samsung Electronics Co., LTD 4846F1Uros Oy 4846FBHUAWEI TECHNOLOGIES CO.,LTD 4851B7Intel Corporate 485261SOREEL 4857DDFacebook 485929LG Electronics 485A3FWISOL 485AB6Hon Hai Precision Ind. Co.,Ltd 485B39ASUSTek COMPUTER INC 485D60Azurewave Technologies, Inc 4860BCApple 4861A3Concern "Axion" JSC 486276HUAWEI TECHNOLOGIES CO.,LTD 486B2CBBK Electronics Corp., Ltd., 486B91Fleetwood Group Inc 486E73Pica8, Inc 486FD2StorSimple Inc 487119SGB GROUP LTD 48746EApple 487604 488244Life Fitness / Div. of Brunswick 488E42DIGALOG GmbH 489153Weinmann Geräte für Medizin GmbH + Co. KG 4891F6Shenzhen Reach software technology CO.,LTD 489BE2SCI Innovations Ltd 489D18Flashbay Limited 489D24Research In Motion 48A22DShenzhen Huaxuchang Telecom Technology Co.,Ltd 48A2B7Kodofon JSC 48A6D2GJsun Optical Science and Tech Co.,Ltd 48AA5DStore Electronic Systems 48B253Marketaxess Corporation 48B5A7Glory Horse Industries Ltd 48B8DEHOMEWINS TECHNOLOGY CO.,LTD 48B977PulseOn Oy 48B9C2Teletics Inc 48BE2DSymanitron 48C1ACPLANTRONICS, INC 48C862Simo Wireless,Inc 48C8B6SysTec GmbH 48CB6ECello Electronics (UK) Ltd 48D0CFUniversal Electronics, Inc 48D18EMetis Communication Co.,Ltd 48D224Liteon Technology Corporation 48D54CJeda Networks 48D705Apple 48D7FFBLANKOM Antennentechnik GmbH 48D855Telvent 48D8FEClarIDy Solutions, Inc 48DCFBNokia Corporation 48DF1CWuhan NEC Fibre Optic Communications industry Co. Ltd 48E1AFVity 48EA63Zhejiang Uniview Technologies Co., Ltd 48EB30ETERNA TECHNOLOGY, INC 48ED80daesung eltec 48EE07Silver Palm Technologies LLC 48EE86UTStarcom (China) Co.,Ltd 48F230Ubizcore Co.,LTD 48F317 48F47DTechVision Holding Internation Limited 48F7F1Alcatel-Lucent 48F8B3Cisco-Linksys, LLC 48F8E1Alcatel Lucent WT 48F925Maestronic 48FCB8Woodstream Corporation 48FEEAHOMA B.V 4C0082Cisco 4C022ECMR KOREA CO., LTD 4C0289LEX COMPUTECH CO., LTD 4C068ABasler Electric Company 4C07C9COMPUTER OFFICE Co.,Ltd 4C09B4zte corporation 4C0B3ATCT Mobile Limited 4C0BBEMicrosoft 4C0DEEJABIL CIRCUIT (SHANGHAI) LTD 4C0F6EHon Hai Precision Ind. Co.,Ltd 4C0FC7Earda Electronics Co.,Ltd 4C11BFZHEJIANG DAHUA TECHNOLOGY CO.,LTD 4C1480NOREGON SYSTEMS, INC 4C14A3TCL Technoly Electronics (Huizhou) Co., Ltd 4C16F1zte corporation 4C17EBSAGEMCOM 4C1A3APRIMA Research And Production Enterprise Ltd 4C1A95Novakon Co., Ltd 4C1FCCHUAWEI TECHNOLOGIES CO.,LTD 4C21D0Sony Mobile Communications AB 4C2258cozybit, Inc 4C2578Nokia Corporation 4C26E7Welgate Co., Ltd 4C2C80Beijing Skyway Technologies Co.,Ltd 4C2C83Zhejiang KaNong Network Technology Co.,Ltd 4C2F9DICM Controls 4C3089Thales Transportation Systems GmbH 4C322DTELEDATA NETWORKS 4C32D9M Rutty Holdings Pty. Ltd 4C3909HPL Electric & Power Private Limited 4C3910Newtek Electronics co., Ltd 4C3B74VOGTEC(H.K.) Co., Ltd 4C3C16Samsung Electronics Co.,Ltd 4C48DABeijing Autelan Technology Co.,Ltd 4C4B68Mobile Device, Inc 4C4E35Cisco 4C5427Linepro Sp. z o.o 4C5499Shenzhen Huawei Communication Technologies Co., Ltd 4C5585Hamilton Systems 4C55B8Turkcell Teknoloji 4C55CCACKme Networks Pty Ltd 4C5DCDOy Finnish Electric Vehicle Technologies Ltd 4C5E0CRouterboard.com 4C5FD2Alcatel-Lucent 4C60D5airPointe of New Hampshire 4C60DENETGEAR 4C6255SANMINA-SCI SYSTEM DE MEXICO S.A. DE C.V 4C63EBApplication Solutions (Electronics and Vision) Ltd 4C64D9Guangdong Leawin Group Co., Ltd 4C6E6EComnect Technology CO.,LTD 4C72B9Pegatron Corporation 4C7367Genius Bytes Software Solutions GmbH 4C73A5KOVE 4C7403Mundo Reader (bq) 4C774FEmbedded Wireless Labs 4C7897Arrowhead Alarm Products Ltd 4C79BAIntel Corporate 4C7F62Nokia Corporation 4C804FArmstrong Monitoring Corp 4C8093Intel Corporate 4C82CFEchostar Technologies 4C83DECisco SPVTG 4C8B30Actiontec Electronics, Inc 4C8B55Grupo Digicon 4C8BEFHuawei Technologies Co., Ltd 4C8D79Apple 4C8FA5Jastec 4C9614Juniper Networks 4C98EFZeo 4C9E80KYOKKO ELECTRIC Co., Ltd 4C9EE4Hanyang Navicom Co.,Ltd 4C9EFFZyXEL Communications Corp 4CA56DSamsung Electronics Co.,Ltd 4CA74BAlcatel Lucent 4CAA16AzureWave Technologies (Shanghai) Inc 4CAB33KST technology 4CAC0AZTE Corporation 4CB16CHUAWEI TECHNOLOGIES CO.,LTD 4CB199Apple 4CB4EAHRD (S) PTE., LTD 4CB81CSAM Electronics GmbH 4CB9C8CONET CO., LTD 4CBAA3Bison Electronics Inc 4CBB58Chicony Electronics Co., Ltd 4CBC42Shenzhen Hangsheng Electronics Co.,Ltd 4CBCA5Samsung Electronics Co.,Ltd 4CC452Shang Hai Tyd. Electon Technology Ltd 4CC602Radios, Inc 4CC94FAlcatel-Lucent 4CCA53Skyera, Inc 4CCBF5zte corporation 4CCC34Motorola Solutions Inc 4CD637Qsono Electronics Co., Ltd 4CD7B6Helmer Scientific 4CD9C4Magneti Marelli Automotive Electronics (Guangzhou) Co. Ltd 4CDF3DTEAM ENGINEERS ADVANCE TECHNOLOGIES INDIA PVT LTD 4CE1BBZhuhai HiFocus Technology Co., Ltd 4CE2F1sclak srl 4CE676Buffalo Inc 4CE933RailComm, LLC 4CEB42Intel Corporate 4CEDDEAskey Computer Corp 4CF02EVifa Denmark A/S 4CF2BFCambridge Industries(Group) Co.,Ltd 4CF45BBlue Clover Devices 4CF5A0Scalable Network Technologies Inc 4CF737SamJi Electronics Co., Ltd 50008CHong Kong Telecommunications (HKT) Limited 5001BBSamsung Electronics 50053DCyWee Group Ltd 500604Cisco 500B32Foxda Technology Industrial(ShenZhen)Co.,LTD 500E6DTrafficCast International 5011EBSilverNet Ltd 5014B5Richfit Information Technology Co., Ltd 5017FFCisco 501AC5Microsoft 501CBFCisco 50206BEmerson Climate Technologies Transportation Solutions 502267PixeLINK 50252BNethra Imaging Incorporated 502690Fujitsu Limited 5027C7TECHNART Co.,Ltd 50294DNANJING IOT SENSOR TECHNOLOGY CO,LTD 502A7ESmart electronic GmbH 502A8BTelekom Research and Development Sdn Bhd 502D1DNokia Corporation 502DA2Intel Corporate 502DF4Phytec Messtechnik GmbH 502E5CHTC Corporation 502ECEAsahi Electronics Co.,Ltd 503275Samsung Electronics Co.,Ltd 503955Cisco SPVTG 503CC4Lenovo Mobile Communication Technology Ltd 503DE5CISCO SYSTEMS, INC 503F56Syncmold Enterprise Corp 50465DASUSTek COMPUTER INC 5048EBBEIJING HAIHEJINSHENG NETWORK TECHNOLOGY CO. LTD 504A5EMasimo Corporation 504A6ENETGEAR INC., 504F94Loxone Electronics GmbH 505065TAKT Corporation 505663Texas Instruments 5056A8Jolla Ltd 5056BFSamsung Electronics Co.,LTD 5057A8CISCO SYSTEMS, INC 505800WyTec International, Inc 505AC6GUANGDONG SUPER TELECOM CO.,LTD 506028Xirrus Inc 506184Avaya, Inc 5061D6Indu-Sol GmbH 506313Hon Hai Precision Ind. Co.,Ltd 506441Greenlee 506787iTellus 5067AECisco 5067F0ZyXEL Communications Corporation 506F9AWi-Fi Alliance 5070E5He Shan World Fair Electronics Technology Limited 50724DBEG Brueck Electronic GmbH 507691Tekpea, Inc 5076A6Ecil Informatica Ind. Com. Ltda 50795BInterexport Telecomunicaciones S.A 507D02BIODIT 507E5DArcadyan Technology Corporation 508569Samsung Electronics Co.,LTD 508789Cisco 5087B8Nuvyyo Inc 508A42Uptmate Technology Co., LTD 508ACBSHENZHEN MAXMADE TECHNOLOGY CO., LTD 508C77DIRMEIER Schanktechnik GmbH &Co KG 508D6FCHAHOO Limited 50934FGradual Tecnologia Ltda 509772Westinghouse Digital 509871Inventum Technologies Private Limited 509F27Huawei Technologies Co., Ltd 50A054Actineon 50A0BFAlba Fiber Systems Inc 50A4C8Samsung Electronics Co.,Ltd 50A6E3David Clark Company 50A715Aboundi, Inc 50A733Ruckus Wireless 50ABBFHoseo Telecom 50AF73Shenzhen Bitland Information Technology Co., Ltd 50B695Micropoint Biotechnologies,Inc 50B7C3Samsung Electronics CO., LTD 50B888wi2be Tecnologia S/A 50B8A2ImTech Technologies LLC, 50BD5FTP-LINK TECHNOLOGIES CO.,LTD 50C006Carmanah Signs 50C271SECURETECH INC 50C58DJuniper Networks 50C7BFTP-LINK TECHNOLOGIES CO.,LTD 50C971GN Netcom A/S 50C9A0SKIPPER Electronics AS 50CCF8Samsung Electro Mechanics 50CD32NanJing Chaoran Science & Technology Co.,Ltd 50CE75Measy Electronics Ltd 50D274Steffes Corporation 50D6D7Takahata Precision 50E0C7TurControlSystme AG 50E14A 50E549GIGA-BYTE TECHNOLOGY CO.,LTD 50EAD6Apple 50EB1ABrocade Communications Systems, Inc 50ED78Changzhou Yongse Infotech Co.,Ltd 50ED94Egatel SL 50F003Open Stack, Inc 50F520Samsung Electronics Co.,Ltd 50F61AKunshan JADE Technologies co., Ltd 50FAABL-tek d.o.o 50FC30Treehouse Labs 50FC9FSamsung Electronics Co.,Ltd 50FEF2Sify Technologies Ltd 5403F5EBN Technology Corp 540496Gigawave LTD 5404A6ASUSTek COMPUTER INC 540536Vivago Oy 54055FAlcatel Lucent 54112FSulzer Pump Solutions Finland Oy 54115FAtamo Pty Ltd 541B5DTechno-Innov 541DFBFreestyle Energy Ltd 541FD5Advantage Electronics 542018Tely Labs 542160Resolution Products 5422F8zte corporation 542696Apple 54271EAzureWave Technonloies, Inc 542A9CLSY Defense, LLC 542AA2Alpha Networks Inc 542CEAPROTECTRON 542F89Euclid Laboratories, Inc 543131Raster Vision Ltd 543530Hon Hai Precision Ind. Co.,Ltd 5435DFSymeo GmbH 543968Edgewater Networks Inc 5439DFHUAWEI TECHNOLOGIES CO.,LTD 543D37Ruckus Wireless 544249Sony Corporation 544408Nokia Corporation 54466BShenzhen CZTIC Electronic Technology Co., Ltd 544A00Cisco 544A05wenglor sensoric gmbh 544A16Texas Instruments 5453EDSony Corporation 545414Digital RF Corea, Inc 545EBDNL Technologies 545FA9Teracom Limited 5461EAZaplox AB 54724FApple 547398Toyo Electronics Corporation 5474E6Webtech Wireless 5475D0CISCO SYSTEMS, INC 54781ACisco 547975Nokia Corporation 547F54INGENICO 547FA8TELCO systems, s.r.o 547FEECISCO SYSTEMS, INC 5481ADEagle Research Corporation 54847BDigital Devices GmbH 54880ESamsung Electro Mechanics co., LTD 548922Zelfy Inc 548998HUAWEI TECHNOLOGIES CO.,LTD 5492BESamsung Electronics Co.,Ltd 549359SHENZHEN TWOWING TECHNOLOGIES CO.,LTD 549478Silvershore Technology Partners 549A16Uzushio Electric Co.,Ltd 549B12Samsung Electronics 549D85EnerAccess inc 549F35Dell Inc 54A04Ft-mac Technologies Ltd 54A050ASUSTek COMPUTER INC 54A31BShenzhen Linkworld Technology Co,.LTD 54A51BShenzhen Huawei Communication Technologies Co., Ltd 54A54BNSC Communications Siberia Ltd 54A619Alcatel-Lucent Shanghai Bell Co., Ltd 54A9D4Minibar Systems 54AE27Apple 54B620SUHDOL E&C Co.Ltd 54B753Hunan Fenghui Yinjia Science And Technology Co.,Ltd 54BEF7PEGATRON CORPORATION 54C80FTP-LINK TECHNOLOGIES CO.,LTD 54CDA7Fujian Shenzhou Electronic Co.,Ltd 54CDEEShenZhen Apexis Electronic Co.,Ltd 54D0EDAXIM Communications 54D163MAX-TECH,INC 54D1B0Universal Laser Systems, Inc 54D46FCisco SPVTG 54DF00Ulterius Technologies, LLC 54DF63Intrakey technologies GmbH 54E032Juniper Networks 54E2E0Pace plc 54E3B0JVL Industri Elektronik 54E43AApple, Inc 54E4BDFN-LINK TECHNOLOGY LIMITED 54E63FShenZhen LingKeWeiEr Technology Co., Ltd 54E6FCTP-LINK TECHNOLOGIES CO., LTD 54EAA8Apple, Inc 54EE75Wistron InfoComm(Kunshan)Co.,Ltd 54EF92Shenzhen Elink Technology Co., LTD 54F5B6ORIENTAL PACIFIC INTERNATIONAL LIMITED 54F666Berthold Technologies GmbH and Co.KG 54F876ABB AG 54FA3ESamsung Electronics Co.,LTD 54FB58WISEWARE, Lda 54FDBFScheidt & Bachmann GmbH 54FFCFMopria Alliance 580528LABRIS NETWORKS 580556Elettronica GF S.r.L 5808FAFiber Optic & telecommunication INC 580943 5809E5Kivic Inc 580A20Cisco 58108CIntelbras 581243AcSiP Technology Corp 581626Avaya, Inc 58170CSony Ericsson Mobile Communications AB 581CBDAffinegy 581D91Advanced Mobile Telecom co.,ltd 581F67Open-m technology limited 581FAAApple 581FEFTuttnaer LTD 582136KMB systems, s.r.o 58238CTechnicolor CH USA 582EFELighting Science Group 582F42Universal Electric Corporation 58343BGlovast Technology Ltd 5835D9CISCO SYSTEMS, INC 583CC6Omneality Ltd 5842E4Sigma International General Medical Apparatus, LLC 58468FKoncar Electronics and Informatics 5846E1Baxter Healthcare 5848C0COFLEC 58493BPalo Alto Networks 5849BAChitai Electronic Corp 584C19Chongqing Guohong Technology Development Company Limited 584CEEDigital One Technologies, Limited 585076Linear Equipamentos Eletronicos SA 5850ABTLS Corporation 5850E6Best Buy Corporation 5855CAApple 5856E8ARRIS Group, Inc 58570DDanfoss Solar Inverters 58639ATPL SYSTEMES 5865E6INFOMARK CO., LTD 5866BAHangzhou H3C Technologies Co., Limited 58671ABARNES&NOBLE.COM 58677FClare Controls Inc 58696CFujian Ruijie Networks co, ltd 5869F9Fusion Transactive Ltd 586D8FCisco-Linksys, LLC 586ED6 587521CJSC RTSoft 587675Beijing ECHO Technologies Co.,Ltd 5876C5DIGI I'S LTD 587A4DStonesoft Corporation 587BE9AirPro Technology India Pvt. Ltd 587E61Hisense Electric Co., Ltd 587FB7SONAR INDUSTRIAL CO., LTD 587FC8S2M 5884E4IP500 Alliance e.V 58874CLITE-ON CLEAN ENERGY TECHNOLOGY CORP 5887E2Shenzhen Coship Electronics Co., Ltd 588D09CISCO SYSTEMS, INC 5891CFIntel Corporate 58920DKinetic Avionics Limited 589396Ruckus Wireless 58946BIntel Corporate 5894CFVertex Standard LMR, Inc 58971ECisco 589835Technicolor 58986FRevolution Display 589CFCFreeBSD Foundation 58A2B5LG Electronics 58A76FiD corporation 58B035Apple 58B0D4ZuniData Systems Inc 58B961SOLEM Electronique 58B9E1Crystalfontz America, Inc 58BC27CISCO SYSTEMS, INC 58BDA3Nintendo Co., Ltd 58BDF9Sigrand 58BFEACISCO SYSTEMS, INC 58C232NEC Corporation 58C38BSamsung Electronics 58CF4BLufkin Industries 58D071BW Broadcast 58D08FIEEE 1904.1 Working Group 58D6D3Dairy Cheq Inc 58DB8DFast Co., Ltd 58E02CMicro Technic A/S 58E326Compass Technologies Inc 58E476CENTRON COMMUNICATIONS TECHNOLOGIES FUJIAN CO.,LTD 58E636EVRsafe Technologies 58E747Deltanet AG 58E808AUTONICS CORPORATION 58EB14Proteus Digital Health 58ECE1Newport Corporation 58EECEIcon Time Systems 58F387HCCP 58F39CCisco 58F67BXia Men UnionCore Technology LTD 58F6BFKyoto University 58F98ESECUDOS GmbH 58FCDBIEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information 58FD20Bravida Sakerhet AB 5C026AApplied Vision Corporation 5C076FThought Creator 5C0A5BSAMSUNG ELECTRO-MECHANICS CO., LTD 5C0CBBCELIZION Inc 5C0E8BMotorola 5C1193Seal One AG 5C1437Thyssenkrupp Aufzugswerke GmbH 5C1515ADVAN 5C15E1AIDC TECHNOLOGY (S) PTE LTD 5C16C7Big Switch Networks 5C1737I-View Now, LLC 5C17D3LGE 5C18B5Talon Communications 5C20D0Asoni Communication Co., Ltd 5C22C4DAE EUN ELETRONICS CO., LTD 5C2479Baltech AG 5C254CAvire Global Pte Ltd 5C260ADell Inc 5C2AEFOpen Access Pty Ltd 5C2BF5Vivint 5C2E59Samsung Electronics Co.,Ltd 5C313ETexas Instruments 5C3327Spazio Italia srl 5C335CSwissphone Telecom AG 5C338EAlpha Networkc Inc 5C353BCompal Broadband Networks Inc 5C35DAThere Corporation Oy 5C36B8TCL King Electrical Appliances (Huizhou) Ltd 5C38E0Shanghai Super Electronics Technology Co.,LTD 5C3C27Samsung Electronics Co.,Ltd 5C4058Jefferson Audio Video Systems, Inc 5C43D2HAZEMEYER 5C4A26Enguity Technology Corp 5C4CA9Shenzhen Huawei Communication Technologies Co., Ltd 5C5015CISCO SYSTEMS, INC 5C514FIntel Corporate 5C56ED3pleplay Electronics Private Limited 5C571AARRIS Group, Inc 5C57C8Nokia Corporation 5C5948Apple 5C5BC2YIK Corporation 5C5EABJuniper Networks 5C63BFTP-LINK TECHNOLOGIES CO., LTD 5C6984NUVICO 5C6A7DKENTKART EGE ELEKTRONIK SAN. VE TIC. LTD. STI 5C6B32Texas Instruments 5C6D20Hon Hai Precision Ind. Co.,Ltd 5C6F4FS.A. SISTEL 5C7757Haivision Network Video 5C7D5EHuawei Technologies Co., Ltd 5C8486Brightsource Industries Israel LTD 5C864ASecret Labs LLC 5C8778Cybertelbridge co.,ltd 5C89D4Beijing Banner Electric Co.,Ltd 5C8D4EApple 5C8FE0ARRIS Group, Inc 5C93A2Liteon Technology Corporation 5C95AEApple 5C969DApple 5C97F3Apple 5C9AD8Fujitsu Limited 5CA39DSAMSUNG ELECTRO-MECHANICS CO., LTD 5CA3EBLokel s.r.o 5CA48ACisco 5CAAFDSonos, Inc 5CAC4CHon Hai Precision Ind. Co.,Ltd 5CB524Sony Ericsson Mobile Communications AB 5CB6CCNovaComm Technologies Inc 5CB8CBAllis Communications 5CBD9EHONGKONG MIRACLE EAGLE TECHNOLOGY(GROUP) LIMITED 5CC213Fr. Sauter AG 5CC5D4Intel Corporate 5CC6D0Skyworth Digital technology(shenzhen)co.ltd 5CC9D3PALLADIUM ENERGY ELETRONICA DA AMAZONIA LTDA 5CCA32Theben AG 5CCEADCDYNE Corporation 5CD135Xtreme Power Systems 5CD2E4Intel Corporate 5CD41BUCZOON Technology Co., LTD 5CD4ABZektor 5CD61FQardio, Inc 5CD998D-Link Corporation 5CDAD4Murata Manufacturing Co., Ltd 5CDD70Hangzhou H3C Technologies Co., Limited 5CE0CAFeiTian United (Beijing) System Technology Co., Ltd 5CE0F6NIC.br- Nucleo de Informacao e Coordenacao do Ponto BR 5CE223Delphin Technology AG 5CE286Nortel Networks 5CE2F4AcSiP Technology Corp 5CE7BFNew Singularity International Technical Development Co.,Ltd 5CE8EBSamsung Electronics 5CEB4ER. STAHL HMI Systems GmbH 5CEE79Global Digitech Co LTD 5CF207Speco Technologies 5CF370CC&C Technologies, Inc 5CF3FCIBM Corp 5CF4ABZyXEL Communications Corp 5CF50DInstitute of microelectronic applications 5CF6DCSamsung Electronics Co.,LTD 5CF8A1Murata Manufactuaring Co.,Ltd 5CF938Apple, Inc 5CF96AHuawei Technologies Co., Ltd 5CF9DDDell Inc 5CF9F0Atomos Engineering P/L 5CFF35Wistron Corporation 5CFFFFShenzhen Kezhonglong Optoelectronic Technology Co., Ltd 600292PEGATRON CORPORATION 6002B4Wistron NeWeb Corp 600308Apple 600347Billion Electric Co. Ltd 600417POSBANK CO.,LTD 600F77SilverPlus, Inc 601199Siama Systems Inc 601283Soluciones Tecnologicas para la Salud y el Bienestar SA 6015C7IdaTech 60190CRRAMAC 601929VOLTRONIC POWER TECHNOLOGY(SHENZHEN) CORP 601D0FMidnite Solar 601E02EltexAlatau 602103STCUBE.INC 6021C0Murata Manufactuaring Co.,Ltd 6024C1Jiangsu Zhongxun Electronic Technology Co., Ltd 602A54CardioTek B.V 602AD0Cisco SPVTG 6032F0Mplus technology 60334BApple 603553Buwon Technology 603696The Sapling Company 6036DDIntel Corporate 60380EAlps Electric Co., 60391FABB Ltd 603FC5COX CO., LTD 6044F5Easy Digital Ltd 60455ELiptel s.r.o 6045BDMicrosoft 604616XIAMEN VANN INTELLIGENT CO., LTD 6047D4FORICS Electronic Technology Co., Ltd 604826Newbridge Technologies Int. Ltd 604A1CSUYIN Corporation 6050C1Kinetek Sports 60512CTCT mobile limited 6052D0FACTS Engineering 605464Eyedro Green Solutions Inc 605718Intel Corporate 60601FSZ DJI TECHNOLOGY CO.,LTD 6063FDTranscend Communication Beijing Co.,Ltd 6064A1RADiflow Ltd 606720Intel Corporate 606944Apple, Inc 60699Bisepos GmbH 606BBDSamsung Electronics Co., LTD 606C66Intel Corporate 60735CCisco 60748DAtmaca Elektronik 607688Velodyne 6077E2Samsung Electronics Co.,Ltd 60812BCustom Control Concepts 6081F9Helium Systems, Inc 6083B2GkWare e.K 60843BSoladigm, Inc 608645Avery Weigh-Tronix, LLC 60893CThermo Fisher Scientific P.O.A 6089B1Key Digital Systems 6089B7KAEL MÜHENDİSLİK ELEKTRONİK TİCARET SANAYİ LİMİTED ŞİRKETİ 608C2BHanson Technology 608D17Sentrus Government Systems Division, Inc 608F5CSamsung Electronics Co.,Ltd 609084DSSD Inc 609217Apple 609620 6099D1Vuzix / Lenovo 609AA4GVI SECURITY INC 609E64Vivonic GmbH 609F9DCloudSwitch 60A10ASamsung Electronics Co.,Ltd 60A44CASUSTek COMPUTER INC 60A8FENokia Solutions and Networks 60A9B0Merchandising Technologies, Inc 60B185ATH system 60B3C4Elber Srl 60B606Phorus 60B617Fiberhome Telecommunication Tech.Co.,Ltd 60B933Deutron Electronics Corp 60B982RO.VE.R. Laboratories S.p.A 60BB0CBeijing HuaqinWorld Technology Co,Ltd 60BC4CEWM Hightec Welding GmbH 60BD91Move Innovation 60BEB5Motorola Mobility LLC 60C1CBFujian Great Power PLC Equipment Co.,Ltd 60C3972Wire Inc 60C547Apple 60C5A8Beijing LT Honway Technology Co.,Ltd 60C798Verifone, Inc 60C980Trymus 60CBFBAirScape Inc 60CDA9Abloomy 60CDC5Taiwan Carol Electronics., Ltd 60D0A9Samsung Electronics Co.,Ltd 60D1AAVishal Telecommunications Pvt Ltd 60D2B9REALAND BIO CO., LTD 60D30AQuatius Limited 60D819Hon Hai Precision Ind. Co.,Ltd 60D9C7Apple 60DA23Estech Co.,Ltd 60DB2AHNS 60DE44HUAWEI TECHNOLOGIES CO.,LTD 60E00ESHINSEI ELECTRONICS CO LTD 60E327TP-LINK TECHNOLOGIES CO.,LTD 60E701Huawei Technologies Co., Ltd 60E956Ayla Networks, Inc 60EB69Quanta computer Inc 60F13DJABLOCOM s.r.o 60F281TRANWO TECHNOLOGY CO., LTD 60F2EFVisionVera International Co., Ltd 60F3DALogic Way GmbH 60F494Hon Hai Precision Ind. Co.,Ltd 60F59CCRU-Dataport 60F673TERUMO CORPORATION 60FACDApple 60FB42Apple 60FE1EChina Palms Telecom.Ltd 60FE202 Wire 60FEC5Apple 60FEF9Thomas & Betts 60FFDDC.E. ELECTRONICS, INC 64002DPowerlinq Co., LTD 6400F1CISCO SYSTEMS, INC 6405BENEW LIGHT LED 64094CBeijing Superbee Wireless Technology Co.,Ltd 640980XIAOMI Electronics,CO.,LTD 640B4ADigital Telecom Technology Limited 640E36TAZTAG 640E94Pluribus Networks, Inc 640F282wire 641084HEXIUM Technical Development Co., Ltd 641225Cisco 64168DCISCO SYSTEMS, INC 6416F0Shehzhen Huawei Communication Technologies Co., Ltd 641A22Heliospectra/Woodhill Investments 641C67DIGIBRAS INDUSTRIA DO BRASILS/A 641E81Dowslake Microsystems 64200CApple 642184Nippon Denki Kagaku Co.,LTD 642216Shandong Taixin Electronic co.,Ltd 642400Xorcom Ltd 642737Hon Hai Precision Ind. Co.,Ltd 642DB7SEUNGIL ELECTRONICS 643150Hewlett-Packard Company 64317EDexin Corporation 643409BITwave Pte Ltd 643F5FExablaze 644214Swisscom Energy Solutions AG 644346GuangDong Quick Network Computer CO.,LTD 644BC3Shanghai WOASiS Telecommunications Ltd., Co 644BF0CalDigit, Inc 644D70dSPACE GmbH 644F74LENUS Co., Ltd 644FB0Hyunjin.com 645106Hewlett Packard 64517ELONG BEN (DONGGUAN) ELECTRONIC TECHNOLOGY CO.,LTD 645299The Chamberlain Group, Inc 64535DFrauscher Sensortechnik 645422Equinox Payments 645563Intelight Inc 64557FNSFOCUS Information Technology Co., Ltd 6455B1ARRIS Group, Inc 645601TP-LINK TECHNOLOGIES CO.,LTD 645A04Chicony Electronics Co., Ltd 645DD7Shenzhen Lifesense Medical Electronics Co., Ltd 645EBEYahoo! JAPAN 645FFFNicolet Neuro 646223Cellient Co., Ltd 64649Bjuniper networks 6465C0Nuvon, Inc 6466B3TP-LINK TECHNOLOGIES CO., LTD 646707Beijing Omnific Technology, Ltd 64680CCOMTREND 6469BCHytera Communications Co.,ltd 646CB2Samsung Electronics Co.,Ltd 646E6CRadio Datacom LLC 646EEAIskratel d.o.o 647002TP-LINK TECHNOLOGIES CO., LTD 6472D8GooWi Technology Co.,Limited 6473E2Arbiter Systems, Inc 647657Innovative Security Designs 6476BAApple 647791Samsung Electronics Co.,Ltd 647BD4Texas Instruments 647C34Ubee Interactive Corp 647D81YOKOTA INDUSTRIAL CO,.LTD 647FDATEKTELIC Communications Inc 64808BVG Controls, Inc 648099Intel Corporate 648125Alphatron Marine BV 648788Juniper Networks 6487D7Pirelli Tyre S.p.A 6488FFSichuan Changhong Electric Ltd 648D9EIVT Electronic Co.,Ltd 64995DLGE 649968Elentec 6499A0AG Elektronik AB 649B24V Technology Co., Ltd 649C81Qualcomm iSkoot, Inc 649C8ETexas Instruments 649EF3CISCO SYSTEMS, INC 649FF7Kone OYj 64A0E7CISCO SYSTEMS, INC 64A232OOO Samlight 64A341Wonderlan (Beijing) Technology Co., Ltd 64A3CBApple 64A769HTC Corporation 64A7DDAvaya, Inc 64A837Juni Korea Co., Ltd 64AE0CCISCO SYSTEMS, INC 64AE88Polytec GmbH 64B310Samsung Electronics Co.,Ltd 64B370PowerComm Solutons LLC 64B473Xiaomi inc 64B64AViVOtech, Inc 64B9E8Apple 64BABDSDJ Technologies, Inc 64BC11CombiQ AB 64C5AASouth African Broadcasting Corporation 64C667Barnes&Noble 64C6AFAXERRA Networks Ltd 64C944LARK Technologies, Inc 64D02DNext Generation Integration (NGI) 64D1A3Sitecom Europe BV 64D241Keith & Koep GmbH 64D4BDALPS ELECTRIC CO.,LTD 64D4DAIntel Corporate 64D814CISCO SYSTEMS, INC 64D912Solidica, Inc 64D954TAICANG AND W ELECTRONICS CO LTD 64D989CISCO SYSTEMS, INC 64DB18OpenPattern 64DC01Static Systems Group PLC 64DE1CKingnetic Pte Ltd 64E161DEP Corp 64E599EFM Networks 64E625Woxu Wireless Co., Ltd 64E682Apple 64E84FSerialway Communication Technology Co. Ltd 64E892Morio Denki Co., Ltd 64E8E6global moisture management system 64E950Cisco 64EAC5SiboTech Automation Co., Ltd 64EB8CSeiko Epson Corporation 64ED57ARRIS Group, Inc 64ED62WOORI SYSTEMS Co., Ltd 64F242Gerdes Aktiengesellschaft 64F50EKinion Technology Company Limited 64F970Kenade Electronics Technology Co.,LTD 64F987Avvasi Inc 64FC8CZonar Systems 680571Samsung Electronics Co.,Ltd 6805CAIntel Corporate 680927Apple 680AD7Yancheng Kecheng Optoelectronic Technology Co., Ltd 68122DSpecial Instrument Development Co., Ltd 681590SAGEMCOM SAS 6815D3Zaklady Elektroniki i Mechaniki Precyzyjnej R&G S.A 681605Systems And Electronic Development FZCO 681729Intel Corporate 68193FDigital Airways 681AB2zte corporation 681CA2Rosewill Inc 681D64Sunwave Communications Co., Ltd 681E8BInfoSight Corporation 681FD8Advanced Telemetry 68234BNihon Dengyo Kousaku 6828BADejai 682DDCWuhan Changjiang Electro-Communication Equipment CO.,LTD 6836B5DriveScale, Inc 683B1ECountwise LTD 683EECERECA 684352Bhuu Limited 684898Samsung Electronics Co.,Ltd 684B88Galtronics Telemetry Inc 684CA8Shenzhen Herotel Tech. Co., Ltd 6851B7PowerCloud Systems, Inc 6854EDAlcatel-Lucent - Nuage 6854F5enLighted Inc 68597FAlcatel Lucent 685B35Apple 685B36POWERTECH INDUSTRIAL CO., LTD 685D43Intel Corporate 685E6BPowerRay Co., Ltd 686359Advanced Digital Broadcast SA 68692EZycoo Co.,Ltd 6869F2ComAp s.r.o 686E23Wi3 Inc 686E48Prophet Electronic Technology Corp.,Ltd 687251Ubiquiti Networks 6872DCCETORY.TV Company Limited 68764FSony Mobile Communications AB 687848Westunitis Co., Ltd 68784CNortel Networks 687924ELS-GmbH & Co. KG 6879EDSHARP Corporation 687CC8Measurement Systems S. de R.L 687CD5Y Soft Corporation, a.s 687F74Cisco-Linksys, LLC 68831APandora Mobility Corporation 688470eSSys Co.,Ltd 688540IGI Mobile, Inc 68856AOuterLink Corporation 6886A7Cisco 6886E7Orbotix, Inc 68876BINQ Mobile Limited 688AB5EDP Servicos 689234Ruckus Wireless 689423Hon Hai Precision Ind. Co.,Ltd 68967BApple 68974BShenzhen Costar Electronics Co. Ltd 6897E8Society of Motion Picture & Television Engineers 689C5EAcSiP Technology Corp 689C70Apple 68A0F6Huawei Technologies Co., Ltd 68A1B7Honghao Mingchuan Technology (Beijing) CO.,Ltd 68A3C4Liteon Technology Corporation 68A40EBSH Bosch and Siemens Home Appliances GmbH 68A86DApple 68AAD2DATECS LTD., 68AB8ARF IDeas 68AE20Apple 68AF13Futura Mobility 68B094INESA ELECTRON CO.,LTD 68B43AWaterFurnace International, Inc 68B599Hewlett-Packard Company 68B6FCHitron Technologies. Inc 68B8D9Act KDE, Inc 68BC0CCISCO SYSTEMS, INC 68BDABCISCO SYSTEMS, INC 68CA00Octopus Systems Limited 68CC9CMine Site Technologies 68CD0FU Tek Company Limited 68CE4EL-3 Communications Infrared Products 68D1FDShenzhen Trimax Technology Co.,Ltd 68D247Portalis LC 68D925ProSys Development Services 68D93CApple 68DB67Nantong Coship Electronics Co., Ltd 68DB96OPWILL Technologies CO.,LTD 68DCE8PacketStorm Communications 68DFDDXiaomi inc 68E166 68E41FUnglaube Identech GmbH 68EBAESamsung Electronics Co.,Ltd 68EBC5Angstrem Telecom 68EC62YODO Technology Corp. Ltd 68ED43Research In Motion 68EE96Cisco SPVTG 68EFBDCISCO SYSTEMS, INC 68F06DALONG INDUSTRIAL CO., LIMITED 68F125Data Controls Inc 68F895Redflow Limited 68FB95Generalplus Technology Inc 68FCB3Next Level Security Systems, Inc 6C0273Shenzhen Jin Yun Video Equipment Co., Ltd 6C0460RBH Access Technologies Inc 6C09D6Digiquest Electronics LTD 6C0B84Universal Global Scientific Industrial Co.,Ltd 6C0E0DSony Ericsson Mobile Communications AB 6C0F6AJDC Tech Co., Ltd 6C14F7Erhardt+Leimer GmbH 6C15F9Nautronix Limited 6C1811Decatur Electronics 6C198FD-Link International 6C2056Cisco 6C22ABAinsworth Game Technology 6C23B9Sony Ericsson Mobile Communications AB 6C2995Intel Corporate 6C2C06OOO NPP Systemotechnika-NN 6C2E33Accelink Technologies Co.,Ltd 6C2E85SAGEMCOM 6C2F2CSamsung Electronics Co.,Ltd 6C32DEIndieon Technologies Pvt. Ltd 6C33A9Magicjack LP 6C391DBeijing ZhongHuaHun Network Information center 6C3A84Shenzhen Aero-Startech. Co.Ltd 6C3BE5Hewlett Packard 6C3C53SoundHawk Corp 6C3E6DApple 6C3E9CKE Knestel Elektronik GmbH 6C4008Apple 6C40C6Nimbus Data Systems, Inc 6C416ACisco 6C4B7FVossloh-Schwabe Deutschland GmbH 6C504DCISCO SYSTEMS, INC 6C5779Aclima, Inc 6C5A34Shenzhen Haitianxiong Electronic Co., Ltd 6C5AB5TCL Technoly Electronics (Huizhou) Co., Ltd 6C5CDESunReports, Inc 6C5D63ShenZhen Rapoo Technology Co., Ltd 6C5E7AUbiquitous Internet Telecom Co., Ltd 6C5F1CLenovo Mobile Communication Technology Ltd 6C6126Rinicom Holdings 6C626DMicro-Star INT'L CO., LTD 6C641APenguin Computing 6C6EFECore Logic Inc 6C6F18Stereotaxis, Inc 6C7039Novar GmbH 6C709FApple 6C71D9AzureWave Technologies, Inc 6C7660KYOCERA Corporation 6C81FEMitsuba Corporation 6C8336Samsung Electronics Co.,Ltd 6C8366Nanjing SAC Power Grid Automation Co., Ltd 6C8686Technonia 6C8814Intel Corporate 6C8B2Fzte corporation 6C8CDBOtus Technologies Ltd 6C8D65Wireless Glue Networks, Inc 6C90B1SanLogic Inc 6C92BFInspur Electronic Information Industry Co.,Ltd 6C98EBOcedo GmbH 6C9989Cisco 6C9AC9Valentine Research, Inc 6C9B02Nokia Corporation 6C9CE9Nimble Storage 6C9CEDCISCO SYSTEMS, INC 6CA682EDAM information & communications 6CA780Nokia Corporation 6CA906Telefield Ltd 6CA96FTransPacket AS 6CAAB3Ruckus Wireless 6CAB4DDigital Payment Technologies 6CAC60Venetex Corp 6CAD3FHubbell Building Automation, Inc 6CADEFKZ Broadband Technologies, Ltd 6CADF8Azurewave Technologies, Inc 6CAE8BIBM Corporation 6CB0CENETGEAR 6CB311Shenzhen Lianrui Electronics Co.,Ltd 6CB350Anhui comhigher tech co.,ltd 6CB7F4Samsung Electronics Co.,Ltd 6CBEE9Alcatel-Lucent-IPD 6CBFB5Noon Technology Co., Ltd 6CC1D2ARRIS Group, Inc 6CC217Hewlett Packard 6CC26BApple 6CD032LG Electronics 6CD146Smartek d.o.o 6CD1B0WING SING ELECTRONICS HONG KONG LIMITED 6CD68ALG Electronics Inc 6CDC6APromethean Limited 6CE0B0SOUND4 6CE4CEVilliger Security Solutions AG 6CE873TP-LINK TECHNOLOGIES CO., LTD 6CE907Nokia Corporation 6CE983Gastron Co., LTD 6CECA1SHENZHEN CLOU ELECTRONICS CO. LTD 6CECEBTexas Instruments 6CF049GIGA-BYTE TECHNOLOGY CO.,LTD 6CF373Samsung Electronics Co.,Ltd 6CF37FAruba Networks 6CF97CNanoptix Inc 6CFA58Avaya, Inc 6CFA89Cisco 6CFAA7AMPAK Technology Inc 6CFDB9Proware Technologies Co Ltd 6CFFBEMPB Communications Inc 70025801DB-METRAVIB 700514LG Electronics 700BC0Dewav Technology Company 700FECPoindus Systems Corp 70105CCisco 701124Apple 701404Limited Liability Company 70188BHon Hai Precision Ind. Co.,Ltd 701A04Liteon Tech Corp 701AEDADVAS CO., LTD 701D7FComtech Technology Co., Ltd 702393fos4X GmbH 702526Alcatel-Lucent 702559CyberTAN Technology, Inc 702B1DE-Domus International Limited 702C1FWisol 702DD1Newings Communication CO., LTD 702F4BPolyVision Inc 702F97Aava Mobile Oy 703018Avaya, Inc 70305DUbiquoss Inc 70305ENanjing Zhongke Menglian Information Technology Co.,LTD 703187ACX GmbH 7032D5Athena Wireless Communications Inc 703811Invensys Rail 7038B4Low Tech Solutions 7038EEAvaya, Inc 703AD8Shenzhen Afoundry Electronic Co., Ltd 703C39SEAWING Kft 7041B7Edwards Lifesciences LLC 704642CHYNG HONG ELECTRONIC CO., LTD 704AAEXstream Flow (Pty) Ltd 704AE4Rinstrum Pty Ltd 704CEDTMRG, Inc 704E01KWANGWON TECH CO., LTD 7052C5Avaya, Inc 70533FAlfa Instrumentos Eletronicos Ltda 7054D2PEGATRON CORPORATION 7054F5HUAWEI TECHNOLOGIES CO.,LTD 705681Apple 705812Panasonic AVC Networks Company 705957Medallion Instrumentation Systems 705986OOO TTV 705AB6COMPAL INFORMATION (KUNSHAN) CO., LTD 705B2EM2Communication Inc 705CADKonami Gaming Inc 705EAAAction Target, Inc 7060DELaVision GmbH 706173Calantec GmbH 7062B8D-Link International 706417ORBIS TECNOLOGIA ELECTRICA S.A 706582Suzhou Hanming Technologies Co., Ltd 706F81 70704CPurple Communications, Inc 7071B3Brain Corporation 7071BCPEGATRON CORPORATION 70720DLenovo Mobile Communication Technology Ltd 70723CHuawei Technologies Co., Ltd 7072CFEdgeCore Networks 7073CBApple 707630Pace plc 7076DDOxyguard International A/S 7076F0LevelOne Communications (India) Private Limited 707BE8HUAWEI TECHNOLOGIES CO.,LTD 707C18ADATA Technology Co., Ltd 707E43ARRIS Group, Inc 707EDENASTEC LTD 708105CISCO SYSTEMS, INC 70820Eas electronics GmbH 70828EOleumTech Corporation 7085C6Pace plc 708B78citygrow technology co., ltd 708D09Nokia Corporation 709383Intelligent Optical Network High Tech CO.,LTD 7093F8Space Monkey, Inc 709756Happyelectronics Co.,Ltd 709A0BItalian Institute of Technology 709BA5Shenzhen Y&D Electronics Co.,LTD 709BFCBryton Inc 709E29Sony Computer Entertainment Inc 709E86X6D Limited 70A191Trendsetter Medical, LLC 70A41CAdvanced Wireless Dynamics S.L 70A66AProx Dynamics AS 70A8E3HUAWEI TECHNOLOGIES CO.,LTD 70AAB2Research In Motion 70AF25Nishiyama Industry Co.,LTD 70B035Shenzhen Zowee Technology Co., Ltd 70B08CShenou Communication Equipment Co.,Ltd 70B14EPace plc 70B265Hiltron s.r.l 70B3D5IEEE REGISTRATION AUTHORITY - Please see OUI36 public listing for more information 70B599Embedded Technologies s.r.o 70B921FiberHome Telecommunication Technologies CO.,LTD 70BAEFHangzhou H3C Technologies Co., Limited 70C6ACBosch Automotive Aftermarket 70CA9BCISCO SYSTEMS, INC 70CD60Apple 70D4F2RIM 70D57EScalar Corporation 70D5E7Wellcore Corporation 70D6B6Metrum Technologies 70D880Upos System sp. z o.o 70DDA1Tellabs 70DEE2Apple 70E027HONGYU COMMUNICATION TECHNOLOGY LIMITED 70E1393view Ltd 70E24CSAE IT-systems GmbH & Co. KG 70E284Wistron InfoComm(Zhongshan) Corporation 70E843Beijing C&W Optical Communication Technology Co.,Ltd 70EE50Netatmo 70F176Data Modul AG 70F196Actiontec Electronics, Inc 70F1A1Liteon Technology Corporation 70F1E5Xetawave LLC 70F395Universal Global Scientific Industrial Co., Ltd 70F927Samsung Electronics 70F96DHangzhou H3C Technologies Co., Limited 70FC8COneAccess SA 70FF5CCheerzing Communication(Xiamen)Technology Co.,Ltd 70FF76Texas Instruments 740ABCJSJS Designs (Europe) Limited 740EDBOptowiz Co., Ltd 741489SRT Wireless 7415E2Tri-Sen Systems Corporation 7419F8IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information 741E93Fiberhome Telecommunication Tech.Co.,Ltd 74258AHangzhou H3C Technologies Co., Limited 7426ACCisco 74273CChangYang Technology (Nanjing) Co., LTD 7427EAElitegroup Computer Systems Co., Ltd 742B0FInfinidat Ltd 742B62Fujitsu Limited 742D0ANorfolk Elektronik AG 742F68Azurewave Technologies, Inc 743170Arcadyan Technology Corporation 743256NT-ware Systemprg GmbH 74372FTongfang Shenzhen Cloudcomputing Technology Co.,Ltd 743889ANNAX Anzeigesysteme GmbH 743ECBGentrice tech 744401NETGEAR 74458ASamsung Electronics Co.,Ltd 7446A0Hewlett Packard 744BE9EXPLORER HYPERTECH CO.,LTD 744D79Arrive Systems Inc 745327COMMSEN CO., LIMITED 745612ARRIS Group, Inc 745798TRUMPF Laser GmbH + Co. KG 745E1CPIONEER CORPORATION 745F00Samsung Semiconductor Inc 745FAETSL PPL 7463DFVTS GmbH 7465D1Atlinks 746630T:mi Ytti 746A89Rezolt Corporation 746A8FVS Vision Systems GmbH 746B82MOVEK 746F3DContec GmbH 7472F2Chipsip Technology Co., Ltd 747548Amazon Technologies Inc 747818ServiceAssure 747B7AETH Inc 747DB6Aliwei Communications, Inc 747E1ARed Embedded Design Limited 747E2DBeijing Thomson CITIC Digital Technology Co. LTD 74867ADell Inc 74882AHUAWEI TECHNOLOGIES CO.,LTD 74888BADB Broadband Italia 748E08Bestek Corp 748EF8Brocade Communications Systems, Inc 748F1BMasterImage 3D 748F4DMEN Mikro Elektronik GmbH 749050Renesas Electronics Corporation 74911ARuckus Wireless 7493A4Zebra Technologies Corp 74943DAgJunction 749975IBM Corporation 749C52Huizhou Desay SV Automotive Co., Ltd 749DDC2Wire 74A4A7QRS Music Technologies, Inc 74A4B5Powerleader Science and Technology Co. Ltd 74A722LG Electronics 74ADB7China Mobile Group Device Co.,Ltd 74AE76iNovo Broadband, Inc 74B00CNetwork Video Technologies, Inc 74B9EBFujian JinQianMao Electronic Technology Co.,Ltd 74BADBLongconn Electornics(shenzhen)Co.,Ltd 74BE08ATEK Products, LLC 74BFA1HYUNTECK 74C621Zhejiang Hite Renewable Energy Co.,LTD 74C99AEricsson AB 74CA25Calxeda, Inc 74CD0CSmith Myers Communications Ltd 74CE56Packet Force Technology Limited Company 74D02BASUSTek COMPUTER INC 74D0DCERICSSON AB 74D435GIGA-BYTE TECHNOLOGY CO.,LTD 74D675WYMA Tecnologia 74D850Evrisko Systems 74DA38Edimax Technology Co. Ltd 74DBD1Ebay Inc 74DE2BLiteon Technology Corporation 74E06EErgophone GmbH 74E14AIEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information 74E1B6Apple 74E2F5Apple 74E424APISTE CORPORATION 74E50BIntel Corporate 74E537RADSPIN 74E543Liteon Technology Corporation 74E6E2Dell Inc 74E7C6ARRIS Group, Inc 74EA3ATP-LINK Technologies Co.,Ltd 74ECF1Acumen 74F06DAzureWave Technologies, Inc 74F07DBnCOM Co.,Ltd 74F102Beijing HCHCOM Technology Co., Ltd 74F413Maxwell Forest 74F612ARRIS Group, Inc 74F726Neuron Robotics 74F85DBerkeley Nucleonics Corp 74FDA0Compupal (Group) Corporation 74FE48ADVANTECH CO., LTD 74FF7DWren Sound Systems, LLC 78028FAdaptive Spectrum and Signal Alignment (ASSIA), Inc 780738Z.U.K. Elzab S.A 781185NBS Payment Solutions Inc 7812B8ORANTEK LIMITED 781881AzureWave Technologies, Inc 78192ENASCENT Technology 7819F7Juniper Networks 781C5ASHARP Corporation 781DBAHUAWEI TECHNOLOGIES CO.,LTD 781DFDJabil Inc 781FDBSamsung Electronics Co.,Ltd 78223DAffirmed Networks 7824AFASUSTek COMPUTER INC 782544Omnima Limited 7825ADSAMSUNG ELECTRONICS CO., LTD 782BCBDell Inc 782EEFNokia Corporation 78303BStephen Technologies Co.,Limited 7830E1UltraClenz, LLC 7831C1Apple 78324FMillennium Group, Inc 783A84Apple 783CE3Kai-EE 783D5BTELNET Redes Inteligentes S.A 783E53BSkyB Ltd 783F15EasySYNC Ltd 784405FUJITU(HONG KONG) ELECTRONIC Co.,LTD 784476Zioncom technology co.,ltd 784561CyberTAN Technology Inc 7845C4Dell Inc 7846C4DAEHAP HYPER-TECH 78471DSamsung Electronics Co.,Ltd 784859Hewlett Packard 78491DThe Will-Burt Company 784B08f.robotics acquisitions ltd 784B87Murata Manufacturing Co.,Ltd 78510CLiveU Ltd 78521ASamsung Electronics Co.,Ltd 785262Shenzhen Hojy Software Co., Ltd 78542ED-Link International 785517SankyuElectronics 785712Mobile Integration Workgroup 78593ERAFI GmbH & Co.KG 78595ESamsung Electronics Co.,Ltd 785968Hon Hai Precision Ind.Co.,Ltd 785C72Hioso Technology Co., Ltd 78617CMITSUMI ELECTRIC CO.,LTD 7866AEZTEC Instruments, Inc 786A89Huawei Technologies Co., Ltd 786C1CApple 787F62GiK mbH 78818FServer Racks Australia Pty Ltd 78843CSony Corporation 7884EEINDRA ESPACIO S.A 788973CMC 788C54Eltek Technologies LTD 788DF7Hitron Technologies. Inc 78923ENokia Corporation 78929CIntel Corporate 789684ARRIS Group, Inc 7898FDQ9 Networks Inc 78995CNationz Technologies Inc 789966Musilab Electronics (DongGuan)Co.,Ltd 78998FMEDILINE ITALIA SRL 789CE7Shenzhen Aikede Technology Co., Ltd 789ED0Samsung Electronics 789F4CHOERBIGER Elektronik GmbH 789F87Siemens AG I IA PP PRM 78A051iiNet Labs Pty Ltd 78A106TP-LINK TECHNOLOGIES CO.,LTD 78A183Advidia 78A2A0Nintendo Co., Ltd 78A3E4Apple 78A504Texas Instruments 78A5DDShenzhen Smarteye Digital Electronics Co., Ltd 78A683Precidata 78A6BDDAEYEON Control&Instrument Co,.Ltd 78A714Amphenol 78A873Samsung Electronics Co.,Ltd 78AB60ABB Australia 78ABBBSamsung Electronics Co.,LTD 78ACC0Hewlett-Packard Company 78AE0CFar South Networks 78B3CEElo touch solutions 78B5D2Ever Treasure Industrial Limited 78B6C1AOBO Telecom Co.,Ltd 78B81AINTER SALES A/S 78BAD0Shinybow Technology Co. Ltd 78BEB6Enhanced Vision 78BEBDSTULZ GmbH 78C40EH&D Wireless 78C4ABShenzhen Runsil Technology Co.,Ltd 78C5E5Texas Instruments 78C6BBInnovasic, Inc 78CA04Nokia Corporation 78CA39Apple 78CA5EELNO 78CB33DHC Software Co.,Ltd 78CD8ESMC Networks Inc 78D004Neousys Technology Inc 78D129Vicos 78D34FPace-O-Matic, Inc 78D38DHONGKONG YUNLINK TECHNOLOGY LIMITED 78D5B5NAVIELEKTRO KY 78D66FAristocrat Technologies Australia Pty. Ltd 78D6F0Samsung Electro Mechanics 78D752HUAWEI TECHNOLOGIES CO.,LTD 78D99FNuCom HK Ltd 78DA6ECisco 78DAB3GBO Technology 78DD08Hon Hai Precision Ind. Co.,Ltd 78DDD6c-scape 78DEE4Texas Instruments 78E3B5Hewlett-Packard Company 78E400Hon Hai Precision Ind. Co.,Ltd 78E7D1Hewlett-Packard Company 78E8B6zte corporation 78EC22Shanghai Qihui Telecom Technology Co., LTD 78EC74Kyland-USA 78EF4CUnetconvergence Co., Ltd 78F5E5BEGA Gantenbrink-Leuchten KG 78F5FDHuawei Technologies Co., Ltd 78F7BESamsung Electronics Co.,Ltd 78F7D0Silverbrook Research 78FD94Apple 78FE3DJuniper Networks 78FE41Socus networks 78FEE2Shanghai Diveo Technology Co., Ltd 78FF57Intel Corporate 7C0187Curtis Instruments, Inc 7C02BCHansung Electronics Co. LTD 7C034CSAGEMCOM 7C03D8SAGEMCOM SAS 7C0507PEGATRON CORPORATION 7C051ERAFAEL LTD 7C0623Ultra Electronics, CIS 7C08D9Shanghai B-Star Technology Co 7C092BBekey A/S 7C0A50J-MEX Inc 7C0ECECisco 7C11BEApple 7C1476Damall Technologies SAS 7C160DSaia-Burgess Controls AG 7C1A038Locations Co., Ltd 7C1AFCDalian Co-Edifice Video Technology Co., Ltd 7C1E52Microsoft 7C1EB32N TELEKOMUNIKACE a.s 7C2048KoamTac 7C2064Alcatel Lucent IPD 7C2587chaowifi.com 7C2CF3Secure Electrans Ltd 7C2E0DBlackmagic Design 7C2F80Gigaset Communications GmbH 7C336EMEG Electronics Inc 7C386CReal Time Logic 7C3920SSOMA SECURITY 7C3BD5Imago Group 7C3E9DPATECH 7C438FE-Band Communications Corp 7C444CEntertainment Solutions, S.L 7C49B9Plexus Manufacturing Sdn Bhd 7C4A82Portsmith LLC 7C4AA8MindTree Wireless PVT Ltd 7C4B78Red Sun Synthesis Pte Ltd 7C4C58Scale Computing, Inc 7C4CA5BSkyB Ltd 7C4FB5Arcadyan Technology Corporation 7C55E7YSI, Inc 7C6097HUAWEI TECHNOLOGIES CO.,LTD 7C6193HTC Corporation 7C669DTexas Instruments 7C69F6Cisco 7C6AB3IBC TECHNOLOGIES INC 7C6AC3GatesAir, Inc 7C6ADBSafeTone Technology Co.,Ltd 7C6B33Tenyu Tech Co. Ltd 7C6B52Tigaro Wireless 7C6C39PIXSYS SRL 7C6C8FAMS NEVE LTD 7C6D62Apple 7C6DF8Apple 7C6F06Caterpillar Trimble Control Technologies 7C6FF8ShenZhen ACTO Digital Video Technology Co.,Ltd 7C70BCIEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information 7C72E4Unikey Technologies 7C7673ENMAS GmbH 7C7A91Intel Corporate 7C7BE4Z'SEDAI KENKYUSHO CORPORATION 7C7D41Jinmuyu Electronics Co., Ltd 7C822DNortec 7C8306Glen Dimplex Nordic as 7C8D91Shanghai Hongzhuo Information Technology co.,LTD 7C8EE4Texas Instruments 7C94B2Philips Healthcare PCCI 7C95F3Cisco 7C9763Openmatics s.r.o 7C9A9BVSE valencia smart energy 7CA15DGN ReSound A/S 7CA29BD.SignT GmbH & Co. KG 7CA61DMHL, LLC 7CACB2Bosch Software Innovations GmbH 7CAD74Cisco 7CB03EOSRAM GmbH 7CB177Satelco AG 7CB21BCisco SPVTG 7CB232TCL King High Frequency EI,Co.,LTD 7CB542ACES Technology 7CB733ASKEY COMPUTER CORP 7CB77BParadigm Electronics Inc 7CBB6FCosco Electronics Co., Ltd 7CBD06AE REFUsol 7CBF88Mobilicom LTD 7CBFB1ARRIS Group, Inc 7CC3A1Apple 7CC4EFDevialet 7CC537Apple 7CC8ABAcro Associates, Inc 7CC8D0TIANJIN YAAN TECHNOLOGY CO., LTD 7CC8D7Damalisk 7CCB0DAntaira Technologies, LLC 7CCCB8Intel Corporate 7CCD11MS-Magnet 7CCD3CGuangzhou Juzing Technology Co., Ltd 7CCFCFShanghai SEARI Intelligent System Co., Ltd 7CD1C3Apple 7CD30AINVENTEC Corporation 7CD762Freestyle Technology Pty Ltd 7CD844Enmotus Inc 7CD9FENew Cosmos Electric Co., Ltd 7CDA84Dongnian Networks Inc 7CDD11Chongqing MAS SCI&TECH.Co.,Ltd 7CDD20IOXOS Technologies S.A 7CDD90Shenzhen Ogemray Technology Co., Ltd 7CE044NEON Inc 7CE1FFComputer Performance, Inc. DBA Digital Loggers, Inc 7CE4AA 7CE524Quirky, Inc 7CE56BESEN Optoelectronics Technology Co.,Ltd 7CE9D3Hon Hai Precision Ind. Co.,Ltd 7CEBEAASCT 7CED8DMICROSOFT 7CEF18Creative Product Design Pty. Ltd 7CEF8AInhon International Ltd 7CF05FApple 7CF098Bee Beans Technologies, Inc 7CF0BALinkwell Telesystems Pvt Ltd 7CF429NUUO Inc 7CFADFApple 7CFE28Salutron Inc 7CFE4EShenzhen Safe vision Technology Co.,LTD 7CFF62Huizhou Super Electron Technology Co.,Ltd 80000BIntel Corporate 800010ATT BELL LABORATORIES 80006EApple 8005DFMontage Technology Group Limited 8007A2Esson Technology Inc 800902Keysight Technologies, Inc 800A06COMTEC co.,ltd 800E24ForgetBox 801440Sunlit System Technology Corp 8014A8Guangzhou V-SOLUTION Electronic Technology Co., Ltd 8016B7Brunel University 80177DNortel Networks 8018A7Samsung Eletronics Co., Ltd 801934Intel Corporate 801967Shanghai Reallytek Information Technology Co.,Ltd 801DAAAvaya Inc 801F02Edimax Technology Co. Ltd 8020AFTrade FIDES, a.s 802275Beijing Beny Wave Technology Co Ltd 802AFAGermaneers GmbH 802DE1Solarbridge Technologies 802E14azeti Networks AG 802FDEZurich Instruments AG 803457OT Systems Limited 803773Netgear Inc 8038FDLeapFrog Enterprises, Inc 8039E5PATLITE CORPORATION 803B9Aghe-ces electronic ag 803F5DWinstars Technology Ltd 803FD6bytes at work AG 80414EBBK Electronics Corp., Ltd., 80427CAdolf Tedsen GmbH & Co. KG 804731Packet Design, Inc 8048A5SICHUAN TIANYI COMHEART TELECOM CO.,LTD 804971Apple 804B20Ventilation Control 804F58ThinkEco, Inc 80501BNokia Corporation 8056F2Hon Hai Precision Ind. Co.,Ltd 805719Samsung Electronics Co.,Ltd 8058C5NovaTec Kommunikationstechnik GmbH 8059FDNoviga 806007RIM 80618FShenzhen sangfei consumer communications co.,ltd 806459Nimbus Inc 8065E9BenQ Corporation 806629Prescope Technologies CO.,LTD 806C1BMotorola Mobility LLC 806C8BKAESER KOMPRESSOREN AG 806CBCNET New Electronic Technology GmbH 80711FJuniper Networks 80717AHuawei Technologies Co., Ltd 807693Newag SA 8079AEShanDong Tecsunrise Co.,Ltd 807A7FABB Genway Xiamen Electrical Equipment CO., LTD 807B1ECorsair Components 807D1BNeosystem Co. Ltd 807DE3Chongqing Sichuan Instrument Microcircuit Co.LTD 8081A5TONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd 808287ATCOM Technology Co.Ltd 808698Netronics Technologies Inc 8086F2Intel Corporate 808B5CShenzhen Runhuicheng Technology Co., Ltd 80912ALih Rong electronic Enterprise Co., Ltd 8091C0AgileMesh, Inc 80929FApple 809393Xapt GmbH 80946CTOKYO RADAR CORPORATION 8096B1ARRIS Group, Inc 8096CAHon Hai Precision Ind Co.,Ltd 80971BAltenergy Power System,Inc 809B20Intel Corporate 80A1D7Shanghai DareGlobal Technologies Co.,Ltd 80AAA4USAG 80AD67Kasda Digital Technology Co.,Ltd 80B219ELEKTRON TECHNOLOGY UK LIMITED 80B289Forworld Electronics Ltd 80B32AAlstom Grid 80B686Huawei Technologies Co., Ltd 80B95CELFTECH Co., Ltd 80BAACTeleAdapt Ltd 80BAE6Neets 80BBEBSatmap Systems Ltd 80BE05Apple 80C16EHewlett Packard 80C63FRemec Broadband Wireless , LLC 80C6ABTechnicolor USA Inc 80C6CAEndian s.r.l 80C862Openpeak, Inc 80CEB1Theissen Training Systems GmbH 80CF41Lenovo Mobile Communication Technology Ltd 80D019Embed, Inc 80D18BHangzhou I'converge Technology Co.,Ltd 80D21DAzureWave Technologies, Inc 80D433LzLabs GmbH 80D733QSR Automations, Inc 80DB31Power Quotient International Co., Ltd 80E650Apple 80EA96Apple 80EACADialog Semiconductor Hellas SA 80EE73Shuttle Inc 80F25EKyynel 80F593IRCO Sistemas de Telecomunicación S.A 80F62EHangzhou H3C Technologies Co., Limited 80F8EBRayTight 80FA5BCLEVO CO 80FB06HUAWEI TECHNOLOGIES CO.,LTD 80FFA8UNIDIS 8400D2Sony Ericsson Mobile Communications AB 8401A7Greyware Automation Products, Inc 840B2DSAMSUNG ELECTRO-MECHANICS CO., LTD 840F45Shanghai GMT Digital Technologies Co., Ltd 841715GP Electronics (HK) Ltd 841766Weifang GoerTek Electronics Co., Ltd 841826Osram GmbH 84183ARuckus Wireless 841888Juniper Networks 841B38Shenzhen Excelsecu Data Technology Co.,Ltd 841B5ENETGEAR 841E26KERNEL-I Co.,LTD 842141Shenzhen Ginwave Technologies Ltd 84248DMotorola Solutions Inc 84253FSilex Technology, Inc 8425A4Tariox Limited 8425DBSamsung Electronics Co.,Ltd 842615ADB Broadband Italia 84262BAlcatel-Lucent 8427CECorporation of the Presiding Bishop of The Church of Jesus Christ of Latter-day Saints 842914EMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG 842999Apple 842B2BDell Inc 842B50Huria Co.,Ltd 842BBCModelleisenbahn GmbH 842F75Innokas Group 8430E5SkyHawke Technologies, LLC 8432EAANHUI WANZTEN P&T CO., LTD 843497Hewlett Packard 843611hyungseul publishing networks 843835Apple 843838Samsung Electro Mechanics co., LTD 843A4BIntel Corporate 843F4ETri-Tech Manufacturing, Inc 844823WOXTER TECHNOLOGY Co. Ltd 844915vArmour Networks, Inc 844BF5Hon Hai Precision Ind. Co.,Ltd 844F03Ablelink Electronics Ltd 845181Samsung Electronics Co.,Ltd 84569CCoho Data, Inc., 845787DVR C&C Co., Ltd 845C93Chabrier Services 845DD7Shenzhen Netcom Electronics Co.,Ltd 846223Shenzhen Coship Electronics Co., Ltd 8462A6EuroCB (Phils), Inc 846AEDWireless Tsukamoto.,co.LTD 846EB1Park Assist LLC 847207I&C Technology 84742Azte corporation 847616Addat S.r.o 84788BApple 8478ACCisco 847A88HTC Corporation 847E40Texas Instruments 8482F4Beijing Huasun Unicreate Technology Co., Ltd 848336Newrun 848371Avaya, Inc 848433Paradox Engineering SA 848506Apple 84850AHella Sonnen- und Wetterschutztechnik GmbH 8486F3Greenvity Communications 848D84Rajant Corporation 848DC7Cisco SPVTG 848E0CApple 848E96Embertec Pty Ltd 848F69Dell Inc 849000Arnold & Richter Cine Technik 84930CInCoax Networks Europe AB 84948CHitron Technologies. Inc 849681Cathay Communication Co.,Ltd 8496D8Pace plc 8497B8Memjet Inc 849CA6Arcadyan Technology Corporation 849DC5Centera Photonics Inc 84A6C8Intel Corporate 84A783Alcatel Lucent 84A8E4Shenzhen Huawei Communication Technologies Co., Ltd 84A991Cyber Trans Japan Co.,Ltd 84ACA4Beijing Novel Super Digital TV Technology Co., Ltd 84AF1FBeat System Service Co,. Ltd 84B153Apple 84B59CJuniper networks 84C2E4Jiangsu Qinheng Co., Ltd 84C727Gnodal Ltd 84C7A9C3PO S.A 84C8B1Incognito Software Inc 84C9B2D-Link International 84D32AIEEE 1905.1 84D9C8Unipattern Co., 84DB2FSierra Wireless Inc 84DD20Texas Instruments 84DE3DCrystal Vision Ltd 84DF0CNET2GRID BV 84E058Pace plc 84E4D9Shenzhen NEED technology Ltd 84E629Bluwan SA 84E714Liang Herng Enterprise,Co.Ltd 84EA99Vieworks 84EB18Texas Instruments 84ED33BBMC Co.,Ltd 84F493OMS spol. s.r.o 84F64CCross Point BV 84FCFEApple 84FE9ERTC Industries, Inc 880355Arcadyan Technology Corp 880905MTMCommunications 880F10Huami Information Technology Co.,Ltd 880FB6Jabil Circuits India Pvt Ltd,-EHTP unit 881036Panodic(ShenZhen) Electronics Limted 88124EQualcomm Atheros 88142BProtonic Holland 881544Meraki, Inc 8818AETamron Co., Ltd 881FA1Apple 882012LMI Technologies 8821E3Nebusens, S.L 882364Watchnet DVR Inc 8823FETTTech Computertechnik AG 88252CArcadyan Technology Corporation 882950Dalian Netmoon Tech Develop Co.,Ltd 882E5AstorONE 88308AMurata Manufactuaring Co.,Ltd 88329BSamsung Electro Mechanics co.,LTD 883314Texas Instruments 88354CTransics 883612SRC Computers, LLC 8841C1ORBISAT DA AMAZONIA IND E AEROL SA 8841FCAirTies Wireless Netowrks 8843E1CISCO SYSTEMS, INC 8844F6Nokia Corporation 88462ATelechips Inc 884B39Siemens AG, Healthcare Sector 8851FBHewlett Packard 88532EIntel Corporate 885395Apple 8853D4Huawei Technologies Co., Ltd 88576DXTA Electronics Ltd 885A92Cisco 885BDDAerohive Networks Inc 885C47Alcatel Lucent 88615ASiano Mobile Silicon Ltd 8863DFApple 88685CShenzhen ChuangDao & Perpetual Eternal Technology Co.,Ltd 886B76CHINA HOPEFUL GROUP HOPEFUL ELECTRIC CO.,LTD 88708CLenovo Mobile Communication Technology Ltd 887398K2E Tekpoint 887556Cisco 88789CGame Technologies SA 888603HUAWEI TECHNOLOGIES CO.,LTD 8886A0Simton Technologies, Ltd 888717CANON INC 8887DDDarbeeVision Inc 888914All Components Incorporated 888964GSI Electronics Inc 888B5DStorage Appliance Corporation 888C19Brady Corp Asia Pacific Ltd 889166Viewcooper Corp 8891DDRacktivity 889471Brocade Communications Systems, Inc 8894F9Gemicom Technology, Inc 8895B9Unified Packet Systems Crop 889676TTC MARCONI s.r.o 8897DFEntrypass Corporation Sdn. Bhd 889821TERAON 889B39Samsung Electronics Co.,Ltd 889CA6BTB Korea INC 889FFAHon Hai Precision Ind. Co.,Ltd 88A3CCAmatis Controls 88A5BDQPCOM INC 88A73CRagentek Technology Group 88ACC1Generiton Co., Ltd 88AE1DCOMPAL INFORMATION(KUNSHAN)CO.,LTD 88B168Delta Control GmbH 88B1E1AirTight Networks, Inc 88B627Gembird Europe BV 88BA7FQfiednet Co., Ltd 88BFD5Simple Audio Ltd 88C36EBeijing Ereneben lnformation Technology Limited 88C626Logitech - Ultimate Ears 88C663Apple 88C9D0LG Electronics 88CB87Apple 88D7BCDEP Company 88D962Canopus Systems US LLC 88DC96SENAO Networks, Inc 88DD79Voltaire 88E0A0Shenzhen VisionSTOR Technologies Co., Ltd 88E0F3Juniper Networks 88E3ABHuawei Technologies Co., Ltd 88E712Whirlpool Corporation 88E7A6iKnowledge Integration Corp 88E8F8YONG TAI ELECTRONIC (DONGGUAN) LTD 88E917Tamaggo 88ED1CCudo Communication Co., Ltd 88F031Cisco 88F077CISCO SYSTEMS, INC 88F488cellon communications technology(shenzhen)Co.,Ltd 88F490Jetmobile Pte Ltd 88F7C7Technicolor USA Inc 88FD15LINEEYE CO., LTD 88FED6ShangHai WangYong Software Co., Ltd 8C006DApple 8C04FFTechnicolor USA Inc 8C078CFLOW DATA INC 8C088BRemote Solution 8C09F4ARRIS Group, Inc 8C0C90Ruckus Wireless 8C0CA3Amper 8C0EE3GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD 8C11CBABUS Security-Center GmbH & Co. KG 8C18D9Shenzhen RF Technology Co., Ltd 8C1F94RF Surgical System Inc 8C210ATP-LINK TECHNOLOGIES CO., LTD 8C271DQuantHouse 8C278AVocollect Inc 8C2937Apple 8C2DAAApple 8C2F39IBA Dosimetry GmbH 8C3330EmFirst Co., Ltd 8C3357HiteVision Digital Media Technology Co.,Ltd 8C3AE3LG Electronics 8C3C07Skiva Technologies, Inc 8C3C4ANAKAYO TELECOMMUNICATIONS,INC 8C41F2RDA Technologies Ltd 8C4435Shanghai BroadMobi Communication Technology Co., Ltd 8C4AEEGIGA TMS INC 8C4B593D Imaging & Simulations Corp 8C4CDCPLANEX COMMUNICATIONS INC 8C4DB9Unmonday Ltd 8C4DEACerio Corporation 8C5105Shenzhen ireadygo Information Technology CO.,LTD 8C53F7A&D ENGINEERING CO., LTD 8C541DLGE 8C569DImaging Solutions Group 8C56C5Nintendo Co., Ltd 8C57FDLVX Western 8C5877Apple 8C598BC Technologies AB 8C5AF0Exeltech Solar Products 8C5CA1d-broad,INC 8C5D60UCI Corporation Co.,Ltd 8C5FDFBeijing Railway Signal Factory 8C604FCISCO SYSTEMS, INC 8C640BBeyond Devices d.o.o 8C6422Sony Ericsson Mobile Communications AB 8C6878Nortek-AS 8C6AE4Viogem Limited 8C705AIntel Corporate 8C71F8Samsung Electronics Co.,Ltd 8C736EFujitsu Limited 8C76C1Goden Tech Limited 8C7712Samsung Electronics Co.,Ltd 8C7716LONGCHEER TELECOMMUNICATION LIMITED 8C7B9DApple 8C7C92Apple 8C7CB5Hon Hai Precision Ind. Co.,Ltd 8C7CFFBrocade Communications Systems, Inc 8C7EB3Lytro, Inc 8C7F3BARRIS Group, Inc 8C82A8Insigma Technology Co.,Ltd 8C8401 8C89A5Micro-Star INT'L CO., LTD 8C8A6EESTUN AUTOMATION TECHNOLOY CO., LTD 8C8E76taskit GmbH 8C90D3Alcatel Lucent 8C9236Aus.Linx Technology Co., Ltd 8C94CFEncell Technology, Inc 8CA048Beijing NeTopChip Technology Co.,LTD 8CA982Intel Corporate 8CAE4CPlugable Technologies 8CAE89Y-cam Solutions Ltd 8CB094Airtech I&C Co., Ltd 8CB64FCISCO SYSTEMS, INC 8CB7F7Shenzhen UniStrong Science & Technology Co., Ltd 8CB82CIPitomy Communications 8CB864AcSiP Technology Corp 8CBEBEXiaomi Technology Co.,Ltd 8CBF9DShanghai Xinyou Information Technology Ltd. Co 8CC121Panasonic Corporation AVC Networks Company 8CC5E1ShenZhen Konka Telecommunication Technology Co.,Ltd 8CC7AARadinet Communications Inc 8CC7D0zhejiang ebang communication co.,ltd 8CC8CDSamsung Electronics Co., LTD 8CCDA2ACTP, Inc 8CCDE8Nintendo Co., Ltd 8CCF5CBEFEGA GmbH 8CD17BCG Mobile 8CD3A2VisSim AS 8CD628Ikor Metering 8CDB25ESG Solutions 8CDCD4Hewlett Packard 8CDD8DWifly-City System Inc 8CDE52ISSC Technologies Corp 8CDE99Comlab Inc 8CDF9DNEC Corporation 8CE081zte corporation 8CE748 8CE7B3Sonardyne International Ltd 8CEEC6Precepscion Pty. Ltd 8CF813ORANGE POLSKA 8CF945Power Automation pte Ltd 8CF9C9MESADA Technology Co.,Ltd 8CFABAApple 8CFDF0QUALCOMM Incorporated 90004EHon Hai Precision Ind. Co.,Ltd 90013BSAGEMCOM 90028AShenzhen Shidean Legrand Electronic Products Co.,Ltd 9002A9ZHEJIANG DAHUA TECHNOLOGY CO.,LTD 9003B7PARROT 900917Far-sighted mobile 900A3APSG Plastic Service GmbH 900D66Digimore Electronics Co., Ltd 900DCBARRIS Group, Inc 90179BNanomegas 9017ACHUAWEI TECHNOLOGIES CO.,LTD 90185EApex Tool Group GmbH & Co OHG 90187CSamsung Electro Mechanics co., LTD 9018AEShanghai Meridian Technologies, Co. Ltd 901900SCS SA 901ACAARRIS Group, Inc 901B0EFujitsu Technology Solutions GmbH 901D27zte corporation 901EDDGREAT COMPUTER CORPORATION 90203ABYD Precision Manufacture Co.,Ltd 902083General Engine Management Systems Ltd 902155HTC Corporation 902181Shanghai Huaqin Telecom Technology Co.,Ltd 9027E4Apple 902B34GIGA-BYTE TECHNOLOGY CO.,LTD 902CC7C-MAX Asia Limited 902E87LabJack 9031CDOnyx Healthcare Inc 90342BGatekeeper Systems, Inc 9034FCHon Hai Precision Ind. Co.,Ltd 90356EVodafone Omnitel N.V 9038DFChangzhou Tiannengbo System Co. Ltd 903AA0Alcatel-Lucent 903CAEYunnan KSEC Digital Technology Co.,Ltd 903D5AShenzhen Wision Technology Holding Limited 903D6BZicon Technology Corp 903EABARRIS Group, Inc 9046B7Vadaro Pte Ltd 904716RORZE CORPORATION 90489AHon Hai Precision Ind. Co.,Ltd 9049FAIntel Corporation 904CE5Hon Hai Precision Ind. Co.,Ltd 904E2BHuawei Technologies Co., Ltd 90507BAdvanced PANMOBIL Systems GmbH & Co. KG 90513FElettronica Santerno 905446TES ELECTRONIC SOLUTIONS 9055AEEricsson, EAB/RWI/K 905682Lenbrook Industries Limited 905692Autotalks Ltd 9059AFTexas Instruments 905F2ETCT Mobile Limited 905F8Dmodas GmbH 90610CFida International (S) Pte Ltd 906717Alphion India Private Limited 9067B5Alcatel-Lucent 9067F3Alcatel Lucent 906DC8DLG Automação Industrial Ltda 906EBBHon Hai Precision Ind. Co.,Ltd 907025Garea Microsys Co.,Ltd 907240Apple 907990Benchmark Electronics Romania SRL 907A0AGebr. Bode GmbH & Co KG 907A28Beijing Morncloud Information And Technology Co. Ltd 907AF1SNUPI Technologies 907EBAUTEK TECHNOLOGY (SHENZHEN) CO.,LTD 907F61Chicony Electronics Co., Ltd 908260IEEE 1904.1 Working Group 90837AGeneral Electric Water & Process Technologies 90840DApple 9088A2IONICS TECHNOLOGY ME LTDA 908C09Total Phase 908C44H.K ZONGMU TECHNOLOGY CO., LTD 908C63GZ Weedong Networks Technology Co. , Ltd 908D1DGH Technologies 908FCFUNO System Co., Ltd 90903CTRISON TECHNOLOGY CORPORATION 909060RSI VIDEO TECHNOLOGIES 9092B4Diehl BGT Defence GmbH & Co. KG 9094E4D-Link International 909864Impex-Sat GmbH&Co KG 909916ELVEES NeoTek OJSC 909DE0Newland Design + Assoc. Inc 909F33EFM Networks 909F43Accutron Instruments Inc 90A2DAGHEO SA 90A4DEWistron Neweb Corp 90A783JSW PACIFIC CORPORATION 90A7C1Pakedge Device and Software Inc 90AC3FBrightSign LLC 90AE1BTP-LINK TECHNOLOGIES CO.,LTD 90B11CDell Inc 90B134ARRIS Group, Inc 90B21FApple 90B686Murata Manufacturing Co., Ltd 90B8D0Joyent, Inc 90B931Apple, Inc 90B97DJohnson Outdoors Marine Electronics d/b/a Minnkota 90C115Sony Ericsson Mobile Communications AB 90C792ARRIS Group, Inc 90CC24Synaptics, Inc 90CF15Nokia Corporation 90CF6FDlogixs Co Ltd 90CF7DQingdao Hisense Electric Co.,Ltd 90D11BPalomar Medical Technologies 90D74FBookeen 90D7EBTexas Instruments 90D852Comtec Co., Ltd 90D92CHUG-WITSCHI AG 90DA4EAVANU 90DA6AFOCUS H&S Co., Ltd 90DB46E-LEAD ELECTRONIC CO., LTD 90DFB7s.m.s smart microwave sensors GmbH 90E0F0IEEE 1722a Working Group 90E2BAIntel Corporate 90E6BAASUSTek COMPUTER INC 90EA60SPI Lasers Ltd 90EF68ZyXEL Communications Corporation 90F1AASamsung Electronics Co.,LTD 90F1B0Hangzhou Anheng Info&Tech CO.,LTD 90F278Radius Gateway 90F3B7Kirisun Communications Co., Ltd 90F4C1Rand McNally 90F652TP-LINK TECHNOLOGIES CO., LTD 90F72FPhillips Machine & Welding Co., Inc 90FB5BAvaya, Inc 90FBA6Hon Hai Precision Ind.Co.Ltd 90FD61Apple 90FF79Metro Ethernet Forum 940070Nokia Corporation 940149AutoHotBox 9401C2Samsung Electronics Co.,Ltd 940B2DNetView Technologies(Shenzhen) Co., Ltd 940BD5Himax Technologies, Inc 940C6DTP-LINK Technologies Co.,Ltd 94103EBelkin International Inc 9411DAITF Fröschl GmbH 941673Point Core SARL 941D1CTLab West Systems AB 942053Nokia Corporation 942197Stalmart Technology Limited 94236EShenzhen Junlan Electronic Ltd 942E17Schneider Electric Canada Inc 942E63Finsécur 94319BAlphatronics BV 9433DDTaco Electronic Solutions, Inc 94350ASamsung Electronics Co.,Ltd 9436E0Sichuan Bihong Broadcast & Television New Technologies Co.,Ltd 9439E5Hon Hai Precision Ind. Co.,Ltd 943AF0Nokia Corporation 943BB1KAONMEDIA 9440A2Anywave Communication Technologies, Inc 944444LG Innotek 944452Belkin International Inc 944696BaudTec Corporation 944A09BitWise Controls 945047Rechnerbetriebsgruppe 945103Samsung Electronics 9451BFHyundai ESG 945493Rigado, LLC 94592DEKE Building Technology Systems Ltd 945B7ETRILOBIT LTDA 946124Pason Systems 946269Arris Group, Inc 9463D1Samsung Electronics Co.,Ltd 9470D2WINFIRM TECHNOLOGY 9471ACTCT Mobile Limited 94756EQinetiQ North America 947C3EPolewall Norge AS 9481A4Azuray Technologies 94857AEvantage Industries Corp 9486D4Surveillance Pro Corporation 94877CARRIS Group, Inc 948854Texas Instruments 948B03EAGET Innovation and Technology Co., Ltd 948D50Beamex Oy Ab 948FEEHughes Telematics, Inc 949426Apple 9498A2Shanghai LISTEN TECH.LTD 949BFDTrans New Technology, Inc 949C55Alta Data Technologies 949F3FOptek Digital Technology company limited 949FB4ChengDu JiaFaAnTai Technology Co.,Ltd 94A7BCBodyMedia, Inc 94AAB8Joview(Beijing) Technology Co. Ltd 94ACCAtrivum technologies GmbH 94AE61Alcatel Lucent 94AEE3Belden Hirschmann Industries (Suzhou) Ltd 94B40FAruba Networks 94B8C5RuggedCom Inc 94B9B4Aptos Technology 94BA31Visiontec da Amazônia Ltda 94BA56Shenzhen Coship Electronics Co., Ltd 94BF1Eeflow Inc. / Smart Device Planning and Development Division 94BF95Shenzhen Coship Electronics Co., Ltd 94C014Sorter Sp. j. Konrad Grzeszczyk MichaA, Ziomek 94C038Tallac Networks 94C1502Wire Inc 94C3E4SCA Schucker Gmbh & Co KG 94C4E9PowerLayer Microsystems HongKong Limited 94C6EBNOVA electronics, Inc 94C7AFRaylios Technology 94C962Teseq AG 94CA0FHoneywell Analytics 94CCB9ARRIS Group, Inc 94CDACCreowave Oy 94CE2CSony Mobile Communications AB 94CE31CTS Limited 94D019Cydle Corp 94D60Eshenzhen yunmao information technologies co., ltd 94D723Shanghai DareGlobal Technologies Co., Ltd 94D771Samsung Electronics Co.,Ltd 94D93CENELPS 94DB49SITCORP 94DBC9Azurewave 94DD3FA+V Link Technologies, Corp 94DE0ESmartOptics AS 94DE80GIGA-BYTE TECHNOLOGY CO.,LTD 94DF4EWistron InfoComm(Kunshan)Co.,Ltd 94DF58IJ Electron CO.,Ltd 94E0D0HealthStream Taiwan Inc 94E226D. ORtiz Consulting, LLC 94E711Xirka Dama Persada PT 94E848FYLDE MICRO LTD 94E98CAlcatel-Lucent 94EB2CGoogle Inc 94EBCDResearch In Motion Limited 94F692Geminico co.,Ltd 94F720Tianjin Deviser Electronics Instrument Co., Ltd 94FAE8Shenzhen Eycom Technology Co., Ltd 94FBB2Shenzhen Gongjin Electronics Co.,Ltd 94FD1DWhereWhen Corp 94FD2EShanghai Uniscope Technologies Co.,Ltd 94FEF4SAGEMCOM 980284Theobroma Systems GmbH 9803A0ABB n.v. Power Quality Products 9803D8Apple 980C82Samsung Electro Mechanics 980D2EHTC Corporation 980EE4 981094Shenzhen Vsun communication technology Co.,ltd 9816ECIC Intracom 98208EDefinium Technologies 98262AApplied Research Associates, Inc 98291DJaguar de Mexico, SA de CV 98293FFujian Start Computer Equipment Co.,Ltd 982CBE2Wire 982D56Resolution Audio 982F3CSichuan Changhong Electric Ltd 983000Beijing KEMACOM Technologies Co., Ltd 983071DAIKYUNG VASCOM 98349DKrauss Maffei Technologies GmbH 983571Sub10 Systems Ltd 9835B8Assembled Products Corporation 983713PT.Navicom Indonesia 983B16AMPAK Technology Inc 983F9FChina SSJ (Suzhou) Network Technology Inc 984246SOL INDUSTRY PTE., LTD 9843DAINTERTECH 98473CSHANGHAI SUNMON COMMUNICATION TECHNOGY CO.,LTD 984A47CHG Hospital Beds 984B4AARRIS Group, Inc 984BE1Hewlett-Packard Company 984C04Zhangzhou Keneng Electrical Equipment Co Ltd 984CD3Mantis Deposition 984E97Starlight Marketing (H. K.) Ltd 984FEEIntel Corporate 9852B1Samsung Electronics 9857D3HON HAI-CCPBG PRECISION IND.CO.,LTD 98588ASYSGRATION Ltd 985945Texas Instruments 985C93SBG Systems SAS 985D46PeopleNet Communication 985E1BConversDigital Co., Ltd 986022EMW Co., Ltd 9866EAIndustrial Control Communications, Inc 986B3DARRIS Group, Inc 986CF5zte corporation 986DC8TOSHIBA MITSUBISHI-ELECTRIC INDUSTRIAL SYSTEMS CORPORATION 9873C4Sage Electronic Engineering LLC 9876B6Adafruit 987770Pep Digital Technology (Guangzhou) Co., Ltd 987E46Emizon Networks Limited 988217Disruptive Ltd 9886B1Flyaudio corporation (China) 9889EDAnadem Information Inc 988B5DSAGEM COMMUNICATION 988BADCorintech Ltd 988E34ZHEJIANG BOXSAM ELECTRONIC CO.,LTD 988E4ANOXUS(BEIJING) TECHNOLOGY CO.,LTD 988EDDTE Connectivity Limerick 989080Linkpower Network System Inc Ltd 989096Dell Inc 9893CCLG Electronics Inc 989449Skyworth Wireless Technology Ltd 98A7B0MCST ZAO 98AAD7BLUE WAVE NETWORKING CO LTD 98B039Alcatel-Lucent 98B8E3Apple 98BC57SVA TECHNOLOGIES CO.LTD 98BC99Edeltech Co.,Ltd 98BE94IBM 98C0EBGlobal Regency Ltd 98C845PacketAccess 98CDB4Virident Systems, Inc 98D331Shenzhen Bolutek Technology Co.,Ltd 98D686Chyi Lee industry Co., ltd 98D6BBApple 98D6F7LG Electronics 98D88CNortel Networks 98DA92Vuzix Corporation 98DCD9UNITEC Co., Ltd 98E165Accutome 98E79AFoxconn(NanJing) Communication Co.,Ltd 98EC65Cosesy ApS 98F0ABApple 98F170Murata Manufacturing Co., Ltd 98F537zte corporation 98F8C1IDT Technology Limited 98F8DBMarini Impianti Industriali s.r.l 98FB12Grand Electronics (HK) Ltd 98FC11Cisco-Linksys, LLC 98FE03Ericsson - North America 98FE94Apple 98FF6AOTEC(Shanghai)Technology Co.,Ltd 98FFD0Lenovo Mobile Communication Technology Ltd 9C0111Shenzhen Newabel Electronic Co., Ltd 9C0298Samsung Electronics Co.,Ltd 9C039EBeijing Winchannel Software Technology Co., Ltd 9C0473Tecmobile (International) Ltd 9C04EBApple 9C066EHytera Communications Corporation Limited 9C0DACTymphany HK Limited 9C1465Edata Elektronik San. ve Tic. A.Ş 9C1874Nokia Danmark A/S 9C1C12Aruba Networks 9C1FDDAccupix Inc 9C207BApple 9C216ATP-LINK TECHNOLOGIES CO.,LTD 9C220ETASCAN Service GmbH 9C2840Discovery Technology,LTD. 9C28BFContinental Automotive Czech Republic s.r.o 9C28EFHUAWEI TECHNOLOGIES CO.,LTD 9C2A70Hon Hai Precision Ind. Co.,Ltd 9C3178Foshan Huadian Intelligent Communications Teachnologies Co.,Ltd 9C31B6Kulite Semiconductor Products Inc 9C3583Nipro Diagnostics, Inc 9C3AAFSamsung Electronics Co.,Ltd 9C3EAAEnvyLogic Co.,Ltd 9C417CHame Technology Co., Limited 9C443DCHENGDU XUGUANG TECHNOLOGY CO, LTD 9C44A6SwiftTest, Inc 9C4563DIMEP Sistemas 9C4A7BNokia Corporation 9C4CAEMesa Labs 9C4E20CISCO SYSTEMS, INC 9C4E36Intel Corporate 9C4E8EALT Systems Ltd 9C4EBFBoxCast 9C53CDENGICAM s.r.l 9C541CShenzhen My-power Technology Co.,Ltd 9C54CAZhengzhou VCOM Science and Technology Co.,Ltd 9C55B4I.S.E. S.r.l 9C5711Feitian Xunda(Beijing) Aeronautical Information Technology Co., Ltd 9C5B96NMR Corporation 9C5C8DFIREMAX INDÚSTRIA E COMÉRCIO DE PRODUTOS ELETRÔNICOS LTDA 9C5D12Aerohive Networks Inc 9C5D95VTC Electronics Corp 9C5E73Calibre UK Ltd 9C611DOmni-ID USA, Inc 9C645EHarman Consumer Group 9C65B0Samsung Electronics Co.,Ltd 9C65F9AcSiP Technology Corp 9C6650Glodio Technolies Co.,Ltd Tianjin Branch 9C6ABEQEES ApS 9C7514Wildix srl 9C77AANADASNV 9C79ACSuntec Software(Shanghai) Co., Ltd 9C7BD2NEOLAB Convergence 9C807DSYSCABLE Korea Inc 9C80DFArcadyan Technology Corporation 9C86DAPhoenix Geophysics Ltd 9C8888Simac Techniek NV 9C8BF1The Warehouse Limited 9C8D1AINTEG process group inc 9C8E99Hewlett-Packard Company 9C8EDCTeracom Limited 9C934EXerox Corporation 9C93E4 9C95F8SmartDoor Systems, LLC 9C9726Technicolor 9C9811Guangzhou Sunrise Electronics Development Co., Ltd 9C9C1DStarkey Labs Inc 9CA10ASCLE SFE 9CA134Nike, Inc 9CA3BASAKURA Internet Inc 9CA577Osorno Enterprises Inc 9CA9E4zte corporation 9CAD97Hon Hai Precision Ind. Co.,Ltd 9CADEFObihai Technology, Inc 9CAFCACISCO SYSTEMS, INC 9CB008Ubiquitous Computing Technology Corporation 9CB206PROCENTEC 9CB654Hewlett Packard 9CB70DLiteon Technology Corporation 9CB793Creatcomm Technology Inc 9CBB98Shen Zhen RND Electronic Co.,LTD 9CBD9DSkyDisk, Inc 9CC077PrintCounts, LLC 9CC0D2Conductix-Wampfler AG 9CC172Huawei Technologies Co., Ltd 9CC7A6AVM GmbH 9CC7D1SHARP Corporation 9CCAD9Nokia Corporation 9CCD82CHENG UEI PRECISION INDUSTRY CO.,LTD 9CD21EHon Hai Precision Ind. Co.,Ltd 9CD24Bzte corporation 9CD36DNETGEAR INC., 9CD643D-Link International 9CDF03Harman/Becker Automotive Systems GmbH 9CE10ENCTech Ltd 9CE1D6Junger Audio-Studiotechnik GmbH 9CE635Nintendo Co., Ltd 9CE6E7Samsung Electronics Co.,Ltd 9CE7BDWinduskorea co., Ltd 9CEBE8BizLink (Kunshan) Co.,Ltd 9CF61AUTC Fire and Security 9CF67DRicardo Prague, s.r.o 9CF8DBshenzhen eyunmei technology co,.ltd 9CF938AREVA NP GmbH 9CFBF1MESOMATIC GmbH & Co.KG 9CFFBEOTSL Inc A002DCAmazon Technologies Inc A00363Robert Bosch Healthcare GmbH A00627NEXPA System A00798Samsung Electronics A007B6Advanced Technical Support, Inc A00ABFWieson Technologies Co., Ltd A00BBASAMSUNG ELECTRO-MECHANICS A00CA1SKTB SKiT A01290Avaya, Inc A012DBTABUCHI ELECTRIC CO.,LTD A0133BCopyright © HiTi Digital, Inc A0143DPARROT SA A0165CTriteka LTD A01859Shenzhen Yidashi Electronics Co Ltd A01917Bertel S.p.a A01C05NIMAX TELECOM CO.,LTD A01D48Hewlett Packard A02195Samsung Electronics Digital Imaging A021B7NETGEAR A0231BTeleComp R&D Corp A02BB8Hewlett Packard A02EF3United Integrated Services Co., Led A0369FIntel Corporate A036F0Comprehensive Power A036FAEttus Research LLC A03A75PSS Belgium N.V A03B1BInspire Tech A04025Actioncable, Inc A04041SAMWONFA Co.,Ltd A041A7NL Ministry of Defense A0423FTyan Computer Corp A0481CHewlett Packard A04CC1Helixtech Corp A04E04Nokia Corporation A051C6Avaya, Inc A055DEPace plc A056B2Harman/Becker Automotive Systems GmbH A0593AV.D.S. Video Display Systems srl A05AA4Grand Products Nevada, Inc A05B21ENVINET GmbH A05DC1TMCT Co., LTD A05DE7DIRECTV, Inc A05E6BMELPER Co., Ltd A06518VNPT TECHNOLOGY A067BESicon s.r.l A06986Wellav Technologies Ltd A06A00Verilink Corporation A06CECRIM A06D09Intelcan Technosystems Inc A06E50Nanotek Elektronik Sistemler Ltd. Sti A071A9Nokia Corporation A07332Cashmaster International Limited A073FCRancore Technologies Private Limited A07591Samsung Electronics Co.,Ltd A07771Vialis BV A078BAPantech Co., Ltd A0821FSamsung Electronics Co.,Ltd A082C7P.T.I Co.,LTD A0861DChengdu Fuhuaxin Technology co.,Ltd A086ECSAEHAN HITEC Co., Ltd A08869Intel Corporate A088B4Intel Corporate A089E4Skyworth Digital Technology(Shenzhen) Co.,Ltd A08A87HuiZhou KaiYue Electronic Co.,Ltd A08C15Gerhard D. Wempe KG A08C9BXtreme Technologies Corp A090DEVEEDIMS,LLC A09347GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD A09805OpenVox Communication Co Ltd A098EDShandong Intelligent Optical Communication Development Co., Ltd A09A5ATime Domain A09BBDTotal Aviation Solutions Pty Ltd A0A130DLI Taiwan Branch office A0A23CGPMS A0A763Polytron Vertrieb GmbH A0A8CDIntel Corporate A0AAFDEraThink Technologies Corp A0B100ShenZhen Cando Electronics Co.,Ltd A0B3CCHewlett Packard A0B5DAHongKong THTF Co., Ltd A0B662Acutvista Innovation Co., Ltd A0B9EDSkytap A0BAB8Pixon Imaging A0BF50S.C. ADD-PRODUCTION S.R.L A0BFA5CORESYS A0C3DETriton Electronic Systems Ltd A0C6ECShenZhen ANYK Technology Co.,LTD A0CEC8CE LINK LIMITED A0CF5BCISCO SYSTEMS, INC A0D12AAXPRO Technology Inc A0D3C1Hewlett Packard A0DA92Nanjing Glarun Atten Technology Co. Ltd A0DC04Becker-Antriebe GmbH A0DD97PolarLink Technologies, Ltd A0DDE5SHARP Corporation A0DE05JSC "Irbis-T" A0E201AVTrace Ltd.(China) A0E25AAmicus SK, s.r.o A0E295DAT System Co.,Ltd A0E453Sony Mobile Communications AB A0E534Stratec Biomedical AG A0E5E9enimai Inc A0E6F8Texas Instruments Inc A0E9DBNingbo FreeWings Technologies Co.,Ltd A0EB76AirCUVE Inc A0EC80zte corporation A0EDCDApple A0EF84Seine Image Int'l Co., Ltd A0F217GE Medical System(China) Co., Ltd A0F3C1TP-LINK TECHNOLOGIES CO., LTD A0F3E4Alcatel Lucent IPD A0F419Nokia Corporation A0F450HTC Corporation A0F459FN-LINK TECHNOLOGY LIMITED A0FC6ETelegrafia a.s A0FE91AVAT Automation GmbH A40130ABIsystems Co., LTD A4059ESTA Infinity LLP A409CBAlfred Kaercher GmbH & Co KG A40BEDCarry Technology Co.,Ltd A40CC3CISCO SYSTEMS, INC A41242NEC Platforms, Ltd A4134ELuxul A41566Wei Fang Goertek Electronics Co.,Ltd A41731Hon Hai Precision Ind. Co.,Ltd A41875CISCO SYSTEMS, INC A41BC0Fastec Imaging Corporation A41F72Dell Inc A4218ANortel Networks A42305Open Networking Laboratory A424B3FlatFrog Laboratories AB A4251BAvaya, Inc A42940Shenzhen YOUHUA Technology Co., Ltd A429B7bluesky A42C08Masterwork Automodules A433D1Fibrlink Communications Co.,Ltd A438FCPlastic Logic A43A69Vers Inc A43BFAIEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information A43D78GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD A4466BEOC Technology A446FAAmTRAN Video Corporation A44AD3ST Electronics(Shanghai) Co.,Ltd A44B15Sun Cupid Technology (HK) LTD A44C11CISCO SYSTEMS, INC A44E2DAdaptive Wireless Solutions, LLC A44E31Intel Corporate A45055busware.de A4526FADB Broadband Italia A4561BMCOT Corporation A45630CISCO SYSTEMS, INC A45A1Csmart-electronic GmbH A45C27Nintendo Co., Ltd A45D36Hewlett Packard A45DA1ADB Broadband Italia A46032MRV Communications (Networks) LTD A46706Apple A46CC1LTi REEnergy GmbH A46E79DFT System Co.Ltd A470D6Motorola Mobility LLC A47733Google A47760Nokia Corporation A479E4KLINFO Corp A47AA4ARRIS Group, Inc A47ACFVIBICOM COMMUNICATIONS INC A47C14ChargeStorm AB A47C1FCobham plc A47E39zte corporation A481EENokia Corporation A4856BQ Electronics Ltd A4895BARK INFOSOLUTIONS PVT LTD A49005CHINA GREATWALL COMPUTER SHENZHEN CO.,LTD A4934CCISCO SYSTEMS, INC A497BBHitachi Industrial Equipment Systems Co.,Ltd A49947Huawei Technologies Co., Ltd A49981FuJian Elite Power Tech CO.,LTD A49A58Samsung Electronics Co.,Ltd A49B13Burroughs Payment Systems, Inc A49D49Ketra, Inc A49EDBAutoCrib, Inc A49F85Lyve Minds, Inc A49F89Shanghai Rui Rui Communication Technology Co.Ltd A4A1C2Ericsson AB (EAB) A4A24ACisco SPVTG A4A4D3Bluebank Communication Technology Co.Ltd A4A80FShenzhen Coship Electronics Co., Ltd A4AD00Ragsdale Technology A4ADB8Vitec Group, Camera Dynamics Ltd A4AE9AMaestro Wireless Solutions ltd A4B121Arantia 2010 S.L A4B197Apple A4B1E9Technicolor A4B1EEH. ZANDER GmbH & Co. KG A4B2A7Adaxys Solutions AG A4B36AJSC SDO Chromatec A4B818PENTA Gesellschaft für elektronische Industriedatenverarbeitung mbH A4B980Parking BOXX Inc A4BADBDell Inc A4BBAFLime Instruments A4BE61EutroVision System, Inc A4C0C7ShenZhen Hitom Communication Technology Co..LTD A4C0E1Nintendo Co., Ltd A4C2ABHangzhou LEAD-IT Information & Technology Co.,Ltd A4C361Apple A4C7DECambridge Industries(Group) Co.,Ltd A4D094Erwin Peters Systemtechnik GmbH A4D18FShenzhen Skyee Optical Fiber Communication Technology Ltd A4D1D1ECOtality North America A4D1D2Apple A4D3B5GLITEL Stropkov, s.r.o A4D856Gimbal, Inc A4DA3FBionics Corp A4DB2EKingspan Environmental Ltd A4DB30Liteon Technology Corporation A4DE50Total Walther GmbH A4E0E6FILIZOLA S.A. PESAGEM E AUTOMACAO A4E32ESilicon & Software Systems Ltd A4E391DENY FONTAINE A4E4B8BlackBerry Limited A4E731Nokia Corporation A4E7E4Connex GmbH A4E991SISTEMAS AUDIOVISUALES ITELSIS S.L A4E9A3Honest Technology Co., Ltd A4EBD3Samsung Electronics Co.,Ltd A4ED4EARRIS Group, Inc A4EE57SEIKO EPSON CORPORATION A4EF52Telewave Co., Ltd A4F3C1Open Source Robotics Foundation, Inc A4F522CHOFU SEISAKUSHO CO.,LTD A4F7D0LAN Accessories Co., Ltd A4FB8DHangzhou Dunchong Technology Co.Ltd A4FCCESecurity Expert Ltd A80180IMAGO Technologies GmbH A80600Samsung Electronics Co.,Ltd A80C0DCisco A81374Panasonic Corporation AVC Networks Company A8154DTP-LINK TECHNOLOGIES CO.,LTD A816B2LG Electronics A81758Elektronik System i Umeå AB A81B18XTS CORP A81B5DFoxtel Management Pty Ltd A81FAFKRYPTON POLSKA A82066Apple A824EBZAO NPO Introtest A826D9HTC Corporation A8294CPrecision Optical Transceivers, Inc A82BD6Shina System Co., Ltd A830ADWei Fang Goertek Electronics Co.,Ltd A8329ADigicom Futuristic Technologies Ltd A83944Actiontec Electronics, Inc A84041Dragino Technology Co., Limited A84481Nokia Corporation A845E9Firich Enterprises CO., LTD A849A5Lisantech Co., Ltd A854B2Wistron Neweb Corp A8556APocketnet Technology Inc A8574ETP-LINK TECHNOLOGIES CO.,LTD A85BB0Shenzhen Dehoo Technology Co.,Ltd A85BF3Audivo GmbH A861AACloudview Limited A862A2JIWUMEDIA CO., LTD A863DFDISPLAIRE CORPORATION A863F2Texas Instruments A865B2DONGGUAN YISHANG ELECTRONIC TECHNOLOGY CO., LIMITED A86A6FRIM A870A5UniComm Inc A875D6FreeTek International Co., Ltd A875E2Aventura Technologies, Inc A8776FZonoff A87B39Nokia Corporation A87E33Nokia Danmark A/S A881F1BMEYE B.V A886DDApple, Inc A88792Broadband Antenna Tracking Systems A887EDARC Wireless LLC A88808Apple A88CEEMicroMade Galka i Drozdz sp.j A88D7BSunDroid Global limited A88E24Apple A8922CLG Electronics A893E6JIANGXI JINGGANGSHAN CKING COMMUNICATION TECHNOLOGY CO.,LTD A895B0Aker Subsea Ltd A8968AApple A897DCIBM A898C6Shinbo Co., Ltd A8995Caizo ag A89B10inMotion Ltd A89DD2Shanghai DareGlobal Technologies Co., Ltd A8A668zte corporation A8AD3DAlcatel-Lucent Shanghai Bell Co., Ltd A8B0AELEONI A8B1D4CISCO SYSTEMS, INC A8B9B3ESSYS A8BBCFApple A8BD1AHoney Bee (Hong Kong) Limited A8BD3AUNIONMAN TECHNOLOGY CO.,LTD A8C222TM-Research Inc A8CB95EAST BEST CO., LTD A8CCC5Saab AB (publ) A8CE90CVC A8D0E3Systech Electronics Ltd A8D0E5Juniper Networks A8D236Lightware Visual Engineering A8D3C8Wachendorff Elektronik GmbH & Co. KG A8E018Nokia Corporation A8E3EESony Computer Entertainment Inc A8E539Moimstone Co.,Ltd A8EF26Tritonwave A8F274Samsung Electronics A8F470Fujian Newland Communication Science Technologies Co.,Ltd A8F7E0PLANET Technology Corporation A8F94BEltex Enterprise Ltd A8FAD8Apple A8FB70WiseSec L.t.d A8FCB7Consolidated Resource Imaging AA0000DIGITAL EQUIPMENT CORPORATION AA0001DIGITAL EQUIPMENT CORPORATION AA0002DIGITAL EQUIPMENT CORPORATION AA0003DIGITAL EQUIPMENT CORPORATION AA0004DIGITAL EQUIPMENT CORPORATION AC0142Uriel Technologies SIA AC02CAHI Solutions, Inc AC02CFRW Tecnologia Industria e Comercio Ltda AC02EFComsis AC0613Senselogix Ltd AC0A61Labor S.r.L AC0DFEEkon GmbH - myGEKKO AC11D3Suzhou HOTEK Video Technology Co. Ltd AC1461ATAW Co., Ltd AC14D2wi-daq, inc AC162DHewlett Packard AC1702Fibar Group sp. z o.o AC1826SEIKO EPSON CORPORATION AC199FSUNGROW POWER SUPPLY CO.,LTD AC20AADMATEK Co., Ltd AC220BASUSTek COMPUTER INC AC2DA3TXTR GmbH AC2FA8Humannix Co.,Ltd AC319DShenzhen TG-NET Botone Technology Co.,Ltd AC34CBShanhai GBCOM Communication Technology Co. Ltd AC3613Samsung Electronics Co.,Ltd AC3870Lenovo Mobile Communication Technology Ltd AC3C0BApple AC3CB4Nilan A/S AC3D05Instorescreen Aisa AC3D75HANGZHOU ZHIWAY TECHNOLOGIES CO.,LTD AC3FA4TAIYO YUDEN CO.,LTD AC40EAC&T Solution Inc AC4122Eclipse Electronic Systems Inc AC44F2Revolabs Inc AC4723Genelec AC4AFEHisense Broadband Multimedia Technology Co.,Ltd AC4BC8Juniper Networks AC4E91HUAWEI TECHNOLOGIES CO.,LTD AC4FFCSVS-VISTEK GmbH AC5036Pi-Coral Inc AC5135MPI TECH AC51EECambridge Communication Systems Ltd AC54ECIEEE P1823 Standards Working Group AC583BHuman Assembler, Inc AC5D10Pace Americas AC5E8CUtillink AC6123Drivven, Inc AC6706Ruckus Wireless AC6BACJenny Science AG AC6E1AShenzhen Gongjin Electronics Co.,Ltd AC6F4FEnspert Inc AC6FBBTATUNG Technology Inc AC6FD9Valueplus Inc AC7236Lexking Technology Co., Ltd AC7289Intel Corporate AC7A42iConnectivity AC7BA1Intel Corporate AC7F3EApple AC80D6Hexatronic AB AC8112Gemtek Technology Co., Ltd AC81F3Nokia Corporation AC8317Shenzhen Furtunetel Communication Co., Ltd AC83F0ImmediaTV Corporation AC853DHUAWEI TECHNOLOGIES CO.,LTD AC8674Open Mesh, Inc AC867ECreate New Technology (HK) Limited Company AC87A3Apple AC8ACDROGER D.Wensker, G.Wensker sp.j AC8D14Smartrove Inc AC932FNokia Corporation AC9403Envision Peripherals Inc AC9A96Lantiq Deutschland GmbH AC9B84Smak Tecnologia e Automacao AC9CE4Alcatel-Lucent Shanghai Bell Co., Ltd ACA016CISCO SYSTEMS, INC ACA213Shenzhen Bilian electronic CO.,LTD ACA22CBaycity Technologies Ltd ACA31EAruba Networks ACA430Peerless AV ACA919TrekStor GmbH ACA9A0Audioengine, Ltd ACAB8DLyngso Marine A/S ACB313ARRIS Group, Inc ACB74FMETEL s.r.o ACB859Uniband Electronic Corp, ACBD0BIMAC CO.,LTD ACBE75Ufine Technologies Co.,Ltd ACBEB6Visualedge Technology Co., Ltd ACC2ECCLT INT'L IND. CORP ACC595Graphite Systems ACC698Kohzu Precision Co., Ltd ACC935Ness Corporation ACCA54Telldus Technologies AB ACCA8EODA Technologies ACCABAMidokura Co., Ltd ACCB09Hefcom Metering (Pty) Ltd ACCC8EAxis Communications AB ACCE8FHWA YAO TECHNOLOGIES CO., LTD ACCF23Hi-flying electronics technology Co.,Ltd ACCF5CApple ACD180Crexendo Business Solutions, Inc ACD364ABB SPA, ABB SACE DIV ACD657Shaanxi Guolian Digital TV Technology Co., Ltd ACD9D6tci GmbH ACDBDAShenzhen Geniatech Inc, Ltd ACDE48 ACE069ISAAC Instruments ACE215Huawei Technologies Co., Ltd ACE348MadgeTech, Inc ACE42ESK hynix ACE64BShenzhen Baojia Battery Technology Co., Ltd ACE87BHuawei Technologies Co., Ltd ACE87EBytemark Computer Consulting Ltd ACE97FIoT Tech Limited ACE9AAHay Systems Ltd ACEA6AGENIX INFOCOMM CO., LTD ACEE3B6harmonics Inc ACF0B2Becker Electronics Taiwan Ltd ACF1DFD-Link International ACF2C5Cisco ACF7F3XIAOMI CORPORATION ACF97EELESYS INC ACFDCEIntel Corporate ACFDECApple, Inc B000B4Cisco B00594Liteon Technology Corporation B009D3Avizia B01041Hon Hai Precision Ind. Co.,Ltd B01203Dynamics Hong Kong Limited B01266Futaba-Kikaku B01408LIGHTSPEED INTERNATIONAL CO B01743EDISON GLOBAL CIRCUITS LLC B01B7COntrol A.S B01C91Elim Co B01F81IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information B024F3Progeny Systems B025AA B03495Apple B0358DNokia Corporation B03829Siliconware Precision Industries Co., Ltd B03850Nanjing CAS-ZDC IOT SYSTEM CO.,LTD B0435DNuLEDs, Inc B04515mira fitness,LLC B04545YACOUB Automation GmbH B046FCMitraStar Technology Corp B0487ATP-LINK TECHNOLOGIES CO., LTD B04C05Fresenius Medical Care Deutschland GmbH B050BCSHENZHEN BASICOM ELECTRONIC CO.,LTD B0518EHoll technology CO.Ltd B05706Vallox Oy B058C4Broadcast Microwave Services, Inc B05B1FTHERMO FISHER SCIENTIFIC S.P.A B05B67Huawei Technologies Co., Ltd B05CE5Nokia Corporation B061C7Ericsson-LG Enterprise B06563Shanghai Railway Communication Factory B065BDApple B068B6Hangzhou OYE Technology Co. Ltd B06971DEI Sales, Inc B06CBF3ality Digital Systems GmbH B0750CQA Cafe B0754DAlcatel-Lucent B075D5ZTE Corporation B077ACARRIS Group, Inc B07908Cummings Engineering B0793CRevolv Inc B07994Motorola Mobility LLC B07D62Dipl.-Ing. H. Horstmann GmbH B0808CLaser Light Engines B081D8I-sys Corp B083FEDell Inc B0869EChloride S.r.L B08807Strata Worldwide B08991LGE B08E1AURadio Systems Co., Ltd B09074Fulan Electronics Limited B09134Taleo B0973AE-Fuel Corporation B0989FLG CNS B09928Fujitsu Limited B09AE2STEMMER IMAGING GmbH B09BD4GNH Software India Private Limited B09FBAApple B0A10APivotal Systems Corporation B0A37EQingdao Haier Electronics Co.,Ltd B0A72AEnsemble Designs, Inc B0A737Roku, Inc B0A86EJuniper Networks B0AA36GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD B0ACFAFujitsu Limited B0ADAAAvaya, Inc B0B2DCZyxel Communications Corporation B0B32BSlican Sp. z o.o B0B448Texas Instruments B0B8D5Nanjing Nengrui Auto Equipment CO.,Ltd B0BD6DEchostreams Innovative Solutions B0BDA1ZAKLAD ELEKTRONICZNY SIMS B0BF99WIZITDONGDO B0C4E7Samsung Electronics B0C554D-Link International B0C69AJuniper Networks B0C745Buffalo Inc B0C83FJiangsu Cynray IOT Co., Ltd B0C8ADPeople Power Company B0C95BBeijing Symtech CO.,LTD B0CE18Zhejiang shenghui lighting co.,Ltd B0CF4DMI-Zone Technology Ireland B0D09CSamsung Electronics Co.,Ltd B0D2F5Vello Systems, Inc B0D59DShenzhen Zowee Technology Co., Ltd B0D7C5STP KFT B0DA00CERA ELECTRONIQUE B0DF3ASamsung Electronics Co.,Ltd B0E39DCAT SYSTEM CO.,LTD B0E50ENRG SYSTEMS INC B0E7542Wire B0E892SEIKO EPSON CORPORATION B0E97EAdvanced Micro Peripherals B0EC71Samsung Electronics Co.,Ltd B0EC8FGMX SAS B0EE45AzureWave Technologies, Inc B0F1BCDhemax Ingenieros Ltda B0FAEBCisco B0FEBD B4009CCableWorld Ltd B40142GCI Science & Technology Co.,LTD B40418Smartchip Integrated Inc B407F9SAMSUNG ELECTRO-MECHANICS B40832TC Communications B40AC6DEXON Systems Ltd B40B44Smartisan Technology Co., Ltd B40B7ABrusa Elektronik AG B40C25Palo Alto Networks B40E96HERAN B40EDCLG-Ericsson Co.,Ltd B41489CISCO SYSTEMS, INC B41513HUAWEI TECHNOLOGIES CO.,LTD B41780DTI Group Ltd B418D1Apple B41DEFInternet Laboratories, Inc B4211DBeijing GuangXin Technology Co., Ltd B4218ADog Hunter LLC B424E7Codetek Technology Co.,Ltd B428F1E-Prime Co., Ltd B42A39ORBIT MERRET, spol. s r. o B42C92Zhejiang Weirong Electronic Co., Ltd B42CBEDirect Payment Solutions Limited B431B8Aviwest B4346CMATSUNICHI DIGITAL TECHNOLOGY (HONG KONG) LIMITED B43564Fujian Tian Cheng Electron Science & Technical Development Co.,Ltd B435F7Zhejiang Pearmain Electronics Co.ltd B43741Consert, Inc B43934Pen Generations, Inc B439D6ProCurve Networking by HP B43A28Samsung Electronics Co.,Ltd B43DB2Degreane Horizon B43E3BViableware, Inc B4417AShenZhen Gongjin Electronics Co.,Ltd B4430DBroadlink Pty Ltd B4475EAvaya, Inc B44CC2NR ELECTRIC CO., LTD B451F9NB Software B45253Seagate Technology B4527DSony Mobile Communications AB B4527ESony Mobile Communications AB B45570Borea B45861CRemote, LLC B45CA4Thing-talk Wireless Communication Technologies Corporation Limited B461FFLumigon A/S B46238Exablox B46293Samsung Electronics Co.,Ltd B462ADraytest GmbH B46698Zealabs srl B467E9Qingdao GoerTek Technology Co., Ltd B4749Faskey computer corp B4750EBelkin International Inc B479A7Samsung Electro Mechanics co., LTD B47C29Shenzhen Guzidi Technology Co.,Ltd B47F5EForesight Manufacture (S) Pte Ltd B48255Research Products Corporation B4827BAKG Acoustics GmbH B482C5Relay2, Inc B482FEAskey Computer Corp B48547Amptown System Company GmbH B48910Coster T.E. S.P.A B4944EWeTelecom Co., Ltd B49842zte corporation B4994CTexas Instruments B499BAHewlett-Packard Company B49DB4Axion Technologies Inc B49EACImagik Int'l Corp B49EE6SHENZHEN TECHNOLOGY CO LTD B4A4B5Zen Eye Co.,Ltd B4A4E3CISCO SYSTEMS, INC B4A5A9MODI GmbH B4A82BHistar Digital Electronics Co., Ltd B4A95AAvaya, Inc B4AA4DEnsequence, Inc B4AB2CMtM Technology Corporation B4AE6FCircle Reliance, Inc B4B017Avaya, Inc B4B362ZTE Corporation B4B52FHewlett Packard B4B542Hubbell Power Systems, Inc B4B5AFMinsung Electronics B4B676Intel Corporate B4B859Texa Spa B4B88DThuh Company B4C44EVXL eTech Pvt Ltd B4C799Motorola Solutions Inc B4C810UMPI Elettronica B4CCE9PROSYST B4CEF6HTC Corporation B4CFDBShenzhen Jiuzhou Electric Co.,LTD B4D8A9BetterBots B4D8DEiota Computing, Inc B4DD15ControlThings Oy Ab B4DF3BChromlech B4DFFALitemax Electronics Inc B4E0CDFusion-io, Inc B4E1EB B4E9B0Cisco B4ED19Pie Digital, Inc B4ED54Wohler Technologies B4EEB4ASKEY COMPUTER CORP B4EED4Texas Instruments B4F0ABApple B4F2E8Pace plc B4F323PETATEL INC B4FC75SEMA Electronics(HK) CO.,LTD B4FE8CCentro Sicurezza Italia SpA B80305Intel Corporate B80415Bayan Audio B808CFIntel Corporate B80B9DROPEX Industrie-Elektronik GmbH B81413Keen High Holding(HK) Ltd B81619ARRIS Group, Inc B817C2Apple B8186FORIENTAL MOTOR CO., LTD B81999Nesys B820E7Guangzhou Horizontal Information & Network Integration Co. Ltd B82410Magneti Marelli Slovakia s.r.o B8241ASWEDA INFORMATICA LTDA B8266CANOV France B826D4Furukawa Industrial S.A. Produtos Elétricos B827EBRaspberry Pi Foundation B8288BParker Hannifin B829F7Blaster Tech B82A72Dell Inc B82ADCEFR Europäische Funk-Rundsteuerung GmbH B82CA0Honeywell HomMed B830A8Road-Track Telematics Development B836D8Videoswitch B83861Cisco B838CAKyokko Tsushin System CO.,LTD B83A7BWorldplay (Canada) Inc B83D4EShenzhen Cultraview Digital Technology Co.,Ltd Shanghai Branch B83E59Roku, Inc B8415FASP AG B843E4Vlatacom B847C6SanJet Technology Corp B84FD5Microsoft Corporation B85510Zioncom Electronics (Shenzhen) Ltd B85810NUMERA, INC B85AF7Ouya, Inc B85AFEHandaer Communication Technology (Beijing) Co., Ltd B85E7BSamsung Electronics Co.,Ltd B86091Onnet Technologies and Innovations LLC B8616FAccton Wireless Broadband(AWB), Corp B8621FCISCO SYSTEMS, INC B863BCROBOTIS, Co, Ltd B86491CK Telecom Ltd B8653BBolymin, Inc B86B23Toshiba B86CE8Samsung Electronics Co.,Ltd B870F4COMPAL INFORMATION (KUNSHAN) CO., LTD B87424Viessmann Elektronik GmbH B87447Convergence Technologies B875C0PayPal, Inc B8763FHon Hai Precision Ind. Co.,Ltd B877C3Decagon Devices, Inc B8782EApple B8797ESecure Meters (UK) Limited B87AC9Siemens Ltd B87CF2Aerohive Networks Inc B8871EGood Mind Industries Co., Ltd B887A8Step Ahead Innovations Inc B888E3COMPAL INFORMATION (KUNSHAN) CO., LTD B889CAILJIN ELECTRIC Co., Ltd B88A60Intel Corporate B88D12Apple B88E3AInfinite Technologies JLT B88F14Analytica GmbH B8921DBG T&A B894D2Retail Innovation HTT AB B89674AllDSP GmbH & Co. KG B8975ABIOSTAR Microtech Int'l Corp B898B0Atlona Inc B898F7Gionee Communication Equipment Co,Ltd.ShenZhen B899197signal Solutions, Inc B89AEDOceanServer Technology, Inc B89BC9SMC Networks Inc B89BE4ABB Power Systems Power Generation B8A386D-Link International B8A3E0BenRui Technology Co.,Ltd B8A8AFLogic S.p.A B8AC6FDell Inc B8AD3EBLUECOM B8AE6ENintendo Co., Ltd B8AEEDElitegroup Computer Systems Co., Ltd B8AF67Hewlett-Packard Company B8B1C7BT&COM CO.,LTD B8B42EGionee Communication Equipment Co,Ltd.ShenZhen B8B7D72GIG Technologies B8B94EShenzhen iBaby Labs, Inc B8BA68Xi'an Jizhong Digital Communication Co.,Ltd B8BA72Cynove B8BB6DENERES Co.,Ltd B8BD79TrendPoint Systems B8BEBFCISCO SYSTEMS, INC B8BF83Intel Corporate B8C1A2Dragon Path Technologies Co., Limited B8C46FPRIMMCON INDUSTRIES INC B8C68ESamsung Electronics Co.,Ltd B8C716Fiberhome Telecommunication Technologies Co.,LTD B8C75DApple B8C855Shanghai GBCOM Communication Technology Co.,Ltd B8CA3ADell Inc B8CD93Penetek, Inc B8CDA7Maxeler Technologies Ltd B8D06FGUANGZHOU HKUST FOK YING TUNG RESEARCH INSTITUTE B8D49DM Seven System Ltd B8D812IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information B8D9CESamsung Electronics B8DAF1Strahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH B8DAF7Advanced Photonics, Inc B8DC87IAI Corporation B8DF6BSpotCam Co., Ltd B8E589Payter BV B8E6252Wire B8E7799Solutions Oy B8E856Apple B8E937Sonos, Inc B8EE65Liteon Technology Corporation B8EE79YWire Technologies, Inc B8F317iSun Smasher Communications Private Limited B8F4D0Herrmann Ultraschalltechnik GmbH & Co. Kg B8F5E7WayTools, LLC B8F6B1Apple B8F732Aryaka Networks Inc B8F828Changshu Gaoshida Optoelectronic Technology Co. Ltd B8F934Sony Ericsson Mobile Communications AB B8FD32Zhejiang ROICX Microelectronics B8FF61Apple B8FF6FShanghai Typrotech Technology Co.Ltd B8FFFETexas Instruments BC0200Stewart Audio BC0543AVM GmbH BC0DA5Texas Instruments BC0F2BFORTUNE TECHGROUP CO.,LTD BC125EBeijing WisVideo INC BC1401Hitron Technologies. Inc BC14EFITON Technology Limited BC15A6Taiwan Jantek Electronics,Ltd BC1665Cisco BC16F5Cisco BC1A67YF Technology Co., Ltd BC20A4Samsung Electronics BC20BAInspur (Shandong) Electronic Information Co., Ltd BC25F03D Display Technologies Co., Ltd BC261DHONG KONG TECON TECHNOLOGY BC2846NextBIT Computing Pvt. Ltd BC28D6Rowley Associates Limited BC2B6BBeijing Haier IC Design Co.,Ltd BC2BD7Revogi Innovation Co., Ltd BC2C55Bear Flag Design, Inc BC2D98ThinGlobal LLC BC305BDell Inc BC307DWistron Neweb Corp BC3400IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information BC35E5Hydro Systems Company BC38D2Pandachip Limited BC39A6CSUN System Technology Co.,LTD BC3BAFApple BC3E13Accordance Systems Inc BC4100Codaco Electronic s.r.o BC4377Hang Zhou Huite Technology Co.,ltd BC4486Samsung Electronics Co.,Ltd BC4760Samsung Electronics Co.,Ltd BC4B79SensingTek BC4E3CCORE STAFF CO., LTD BC4E5DZhongMiao Technology Co., Ltd BC51FESwann Communications Pty Ltd BC52B7Apple BC5FF4ASRock Incorporation BC629FTelenet Systems P. Ltd BC6641IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information BC671CCisco BC6778Apple BC6784Environics Oy BC6A16tdvine BC6A29Texas Instruments BC6B4DAlcatel-Lucent BC6E76Green Energy Options Ltd BC71C1XTrillion, Inc BC72B1Samsung Electronics Co.,Ltd BC764ERackspace US, Inc BC7670Shenzhen Huawei Communication Technologies Co., Ltd BC7737Intel Corporate BC779FSBM Co., Ltd BC79ADSamsung Electronics Co.,Ltd BC7DD1Radio Data Comms BC811FIngate Systems BC8199BASIC Co.,Ltd BC83A7SHENZHEN CHUANGWEI-RGB ELECTRONICS CO.,LT BC851FSamsung Electronics BC8556Hon Hai Precision Ind. Co.,Ltd BC8893VILLBAU Ltd BC8B55NPP ELIKS America Inc. DBA T&M Atlantic BC8CCDSamsung Electro Mechanics co.,LTD BC8D0EAlcatel-Lucent BC926BApple BC9680Shenzhen Gongjin Electronics Co.,Ltd BC9889Fiberhome Telecommunication Tech.Co.,Ltd BC99BCFonSee Technology Inc BC9CC5Beijing Huafei Technology Co., Ltd BC9DA5DASCOM Europe GmbH BCA4E1Nabto BCA9D6Cyber-Rain, Inc BCAEC5ASUSTek COMPUTER INC BCB181SHARP CORPORATION BCB1F3Samsung Electronics BCB852Cybera, Inc BCBAE1AREC Inc BCBBC9Kellendonk Elektronik GmbH BCC168DinBox Sverige AB BCC23AThomson Video Networks BCC342Panasonic System Networks Co., Ltd BCC61ASPECTRA EMBEDDED SYSTEMS BCC6DBNokia Corporation BCC810Cisco SPVTG BCCAB5ARRIS Group, Inc BCCD45VOISMART BCCFCCHTC Corporation BCD177TP-LINK TECHNOLOGIES CO.,LTD BCD1D3Tinno Mobile Technology Corp BCD5B6d2d technologies BCD940ASR Co,.Ltd BCE09DEoslink BCE59FWATERWORLD Technology Co.,LTD BCEA2BCityCom GmbH BCEAFAHewlett Packard BCEE7BASUSTek COMPUTER INC BCF2AFdevolo AG BCF5ACLG Electronics BCF61CGeomodeling Wuxi Technology Co. Ltd BCF685D-Link International BCFE8CAltronic, LLC BCFFACTOPCON CORPORATION C00D7EAdditech, Inc C011A6Fort-Telecom ltd C01242Alpha Security Products C0143DHon Hai Precision Ind. Co.,Ltd C01885Hon Hai Precision Ind. Co.,Ltd C01E9BPixavi AS C02250 C02506AVM GmbH C0255CCisco C027B9Beijing National Railway Research & Design Institute of Signal & Communication Co., Ltd C02973Audyssey Laboratories Inc C029F3XySystem C02BFCiNES. applied informatics GmbH C02C7AShen Zhen Horn audio Co., Ltd C034B4Gigastone Corporation C03580A&R TECH C035BDVelocytech Aps C03896Hon Hai Precision Ind. Co.,Ltd C038F9Nokia Danmark A/S C03B8FMinicom Digital Signage C03D46Shanghai Mochui Network Technology Co., Ltd C03E0FBSkyB Ltd C03F0ENETGEAR C03F2ABiscotti, Inc C03FD5Elitegroup Computer Systems Co., LTD C041F6LG Electronics Inc C04301Epec Oy C044E3Shenzhen Sinkna Electronics Co., LTD C0493DMAITRISE TECHNOLOGIQUE C04A00TP-LINK TECHNOLOGIES CO.,LTD C04DF7SERELEC C056E3Hangzhou Hikvision Digital Technology Co.,Ltd C057BCAvaya, Inc C058A7Pico Systems Co., Ltd C05E6FV. Stonkaus firma "Kodinis Raktas" C05E79SHENZHEN HUAXUN ARK TECHNOLOGIES CO.,LTD C06118TP-LINK TECHNOLOGIES CO.,LTD C0626BCISCO SYSTEMS, INC C06394Apple C064C6Nokia Corporation C06599Samsung Electronics Co.,Ltd C067AFCisco C06C0FDobbs Stanford C06C6DMagneMotion, Inc C07BBCCisco C07E40SHENZHEN XDK COMMUNICATION EQUIPMENT CO.,LTD C08170Effigis GeoSolutions C0830A2Wire C0847AApple C0885BSnD Tech Co., Ltd C08ADERuckus Wireless C08B6FS I Sistemas Inteligentes Eletrônicos Ltda C08C60Cisco C09132Patriot Memory C09134ProCurve Networking by HP C09879Acer Inc C098E5University of Michigan C09C92COBY C09D26Topicon HK Lmd C09F42Apple C0A0BBD-Link International C0A0C7FAIRFIELD INDUSTRIES C0A0DEMulti Touch Oy C0A0E2Eden Innovations C0A26DAbbott Point of Care C0A3643D Systems Massachusetts C0A39EEarthCam, Inc C0AA68OSASI Technos Inc C0AC54SAGEMCOM C0B339Comigo Ltd C0B357Yoshiki Electronics Industry Ltd C0B8B1BitBox Ltd C0BAE6Application Solutions (Electronics and Vision) Ltd C0BD42ZPA Smart Energy a.s C0C1C0Cisco-Linksys, LLC C0C3B6Automatic Systems C0C520Ruckus Wireless C0C569SHANGHAI LYNUC CNC TECHNOLOGY CO.,LTD C0C687Cisco SPVTG C0C946MITSUYA LABORATORIES INC C0CB38Hon Hai Precision Ind. Co.,Ltd C0CFA3Creative Electronics & Software, Inc C0D044SAGEMCOM C0D962Askey Computer Corp C0DA74Hangzhou Sunyard Technology Co., Ltd C0DF77Conrad Electronic SE C0E422Texas Instruments C0E54EDENX Computer Systems GmbH C0EAE4Sonicwall C0EEFBOnePlus Tech (Shenzhen) Ltd C0F1C4Pacidal Corporation Ltd C0F2FBApple C0F79DPowercode C0F8DAHon Hai Precision Ind. Co.,Ltd C0F991GME Standard Communications P/L C40006Lipi Data Systems Ltd C40142MaxMedia Technology Limited C4017CRuckus Wireless C401B1SeekTech INC C401CEPRESITION (2000) CO., LTD C40415NETGEAR INC., C40528Huawei Technologies Co., Ltd C4084AAlcatel-Lucent C40880Shenzhen UTEPO Tech Co., Ltd C40938Fujian Star-net Communication Co., Ltd C40ACBCISCO SYSTEMS, INC C40E45ACK Networks,Inc C40F09Hermes electronic GmbH C4108ARuckus Wireless C4143CCisco C416FAPrysm Inc C417FEHon Hai Precision Ind. Co.,Ltd C4198BDominion Voting Systems Corporation C419ECQualisys AB C41ECEHMI Sources Ltd C421C8KYOCERA Corporation C4237AWhizNets Inc C4242EGalvanic Applied Sciences Inc C42628Airo Wireless C42795Technicolor USA Inc C4291DKLEMSAN ELEKTRIK ELEKTRONIK SAN.VE TIC.AS C42C03Apple C4346BHewlett Packard C436DARusteletech Ltd C438D3TAGATEC CO.,LTD C4393ASMC Networks Inc C43A9FSiconix Inc C43C3CCYBELEC SA C43DC7NETGEAR C44202Samsung Electronics Co.,Ltd C4438FLG Electronics C44567SAMBON PRECISON and ELECTRONICS C445ECShanghai Yali Electron Co.,LTD C44619Hon Hai Precision Ind. Co.,Ltd C44838Satcom Direct, Inc C44AD0FIREFLIES SYSTEMS C44B44Omniprint Inc C44BD1Wallys Communications Teachnologies Co.,Ltd C44E1FBlueN C44EACShenzhen Shiningworth Technology Co., Ltd C45006Samsung Electronics Co.,Ltd C45444QUANTA COMPUTER INC C455A6Cadac Holdings Ltd C455C2Bach-Simpson C45600Galleon Embedded Computing C456FELava International Ltd C4576ESamsung Electronics Co.,LTD C458C2Shenzhen TATFOOK Technology Co., Ltd C45976Fugoo Coorporation C45DD8HDMI Forum C46044Everex Electronics Limited C4626BZPT Vigantice C462EASamsung Electronics Co.,Ltd C46354U-Raku, Inc C46413CISCO SYSTEMS, INC C467B5Libratone A/S C46AB7Xiaomi Technology,Inc C46BB4myIDkey C46DF1DataGravity C46E1FTP-LINK TECHNOLOGIES CO.,LTD C47130Fon Technology S.L C471FECISCO SYSTEMS, INC C4731ESamsung Eletronics Co., Ltd C47B2FBeijing JoinHope Image Technology Ltd C47BA3NAVIS Inc C47D4FCISCO SYSTEMS, INC C47DCCMotorola Solutions Inc C47DFEA.N. Solutions GmbH C47F51Inventek Systems C4823FFujian Newland Auto-ID Tech. Co,.Ltd C4824EChangzhou Uchip Electronics Co., LTD C48508Intel Corporate C488E5Samsung Electronics Co.,Ltd C4913AShenzhen Sanland Electronic Co., ltd C493008Devices C49313100fio networks technology llc C49380Speedytel technology C495A2SHENZHEN WEIJIU INDUSTRY AND TRADE DEVELOPMENT CO., LTD C49805Minieum Networks, Inc C4A81D D-Link International C4AAA1SUMMIT DEVELOPMENT, spol.s r.o C4AD21MEDIAEDGE Corporation C4B512General Electric Digital Energy C4BA99I+ME Actia Informatik und Mikro-Elektronik GmbH C4BD6ASKF GmbH C4C0AEMIDORI ELECTRONIC CO., LTD C4C19FNational Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO) C4C755Beijing HuaqinWorld Technology Co.,Ltd C4C919Energy Imports Ltd C4C9ECD&D GROUP sp. z o.o C4CAD9Hangzhou H3C Technologies Co., Limited C4CD45Beijing Boomsense Technology CO.,LTD C4D489JiangSu Joyque Information Industry Co.,Ltd C4D655Tercel technology co.,ltd C4D987Intel Corporate C4DA26NOBLEX SA C4E032IEEE 1904.1 Working Group C4E17CU2S co C4E7BESCSpro Co.,Ltd C4E92FAB Sciex C4E984TP-LINK TECHNOLOGIES CO.,LTD C4EBE3RRCN SAS C4EDBATexas Instruments C4EEAEVSS Monitoring C4EEF5Oclaro, Inc C4F464Spica international C4F57CBrocade Communications Systems, Inc C4FCE4DishTV NZ Ltd C80210LG Innotek C80258ITW GSE ApS C802A6Beijing Newmine Technology C80718TDSi C80AA9Quanta Computer Inc C80E77Le Shi Zhi Xin Electronic Technology (Tianjin) Co.,Ltd C80E95OmniLync Inc C81479Samsung Electronics Co.,Ltd C816BDHISENSE ELECTRIC CO.,LTD C819F7Samsung Electronics Co.,Ltd C81AFEDLOGIC GmbH C81E8EADV Security (S) Pte Ltd C81F66Dell Inc C8208EStoragedata C8292ABarun Electronics C82A14Apple C82E94Halfa Enterprise Co., Ltd C83168eZEX corporation C83232Hunting Innova C8334BApple C835B8Ericsson, EAB/RWI/K C83A35Tenda Technology Co., Ltd C83B45JRI-Maxant C83D97Nokia Corporation C83E99Texas Instruments C83EA7KUNBUS GmbH C84529IMK Networks Co.,Ltd C84544Shanghai Enlogic Electric Technology Co., Ltd C848F5MEDISON Xray Co., Ltd C84C75CISCO SYSTEMS, INC C85645Intermas France C85663Sunflex Europe GmbH C86000ASUSTek COMPUTER INC C864C7zte corporation C86C1EDisplay Systems Ltd C86C87Zyxel Communications Corp C86CB6Optcom Co., Ltd C86F1DApple C87248Aplicom Oy C87B5Bzte corporation C87CBCValink Co., Ltd C87D77Shenzhen Kingtech Communication Equipment Co.,Ltd C87E75Samsung Electronics Co.,Ltd C88439Sunrise Technologies C88447Beautiful Enterprise Co., Ltd C88550Apple C8873BNet Optics C88A83Dongguan HuaHong Electronics Co.,Ltd C88B47Nolangroup S.P.A con Socio Unico C8903EPakton Technologies C891F9SAGEMCOM C89346MXCHIP Company Limited C89383Embedded Automation, Inc C894D2Jiangsu Datang Electronic Products Co., Ltd C8979FNokia Corporation C89C1DCISCO SYSTEMS, INC C89CDCELITEGROUP COMPUTER SYSTEM CO., LTD C89F1DSHENZHEN COMMUNICATION TECHNOLOGIES CO.,LTD C89F42VDII Innovation AB C8A030Texas Instruments C8A1B6Shenzhen Longway Technologies Co., Ltd C8A1BANeul Ltd C8A620Nebula, Inc C8A70AVerizon Business C8A729SYStronics Co., Ltd C8AA21ARRIS Group, Inc C8AACC C8AE9CShanghai TYD Elecronic Technology Co. Ltd C8AF40marco Systemanalyse und Entwicklung GmbH C8B373Cisco-Linksys, LLC C8B5B7Apple C8BA94Samsung Electro Mechanics co., LTD C8BBD3Embrane C8BCC8Apple C8BE19D-Link International C8C126ZPM Industria e Comercio Ltda C8C13CRuggedTek Hangzhou Co., Ltd C8C791Zero1.tv GmbH C8CBB8Hewlett Packard C8CD72SAGEMCOM C8D019Shanghai Tigercel Communication Technology Co.,Ltd C8D10BNokia Corporation C8D15EHuawei Technologies Co., Ltd C8D1D1AGAiT Technology Corporation C8D2C1Jetlun (Shenzhen) Corporation C8D3A3D-Link International C8D429Muehlbauer AG C8D590FLIGHT DATA SYSTEMS C8D5FEShenzhen Zowee Technology Co., Ltd C8D719Cisco Consumer Products, LLC C8DDC9Lenovo Mobile Communication Technology Ltd C8DE51Integra Networks, Inc C8DF7CNokia Corporation C8E0EBApple C8E1A7Vertu Corporation Limited C8E42FTechnical Research Design and Development C8E7D8SHENZHEN MERCURY COMMUNICATION TECHNOLOGIES CO.,LTD C8EE08TANGTOP TECHNOLOGY CO.,LTD C8EE75Pishion International Co. Ltd C8EEA6Shenzhen SHX Technology Co., Ltd C8EF2EBeijing Gefei Tech. Co., Ltd C8F36BYamato Scale Co.,Ltd C8F386Shenzhen Xiaoniao Technology Co.,Ltd C8F406Avaya, Inc C8F650Apple C8F68DS.E.TECHNOLOGIES LIMITED C8F704Building Block Video C8F733Intel Corporate C8F981Seneca s.r.l C8F9F9CISCO SYSTEMS, INC C8FB26Cisco SPVTG C8FE30Bejing DAYO Mobile Communication Technology Ltd C8FF77Dyson Limited CC0080BETTINI SRL CC03FATechnicolor CH USA CC047CG-WAY Microwave CC04B4Select Comfort CC051BSamsung Electronics Co.,Ltd CC07ABSamsung Electronics Co.,Ltd CC07E4Lenovo Mobile Communication Technology Ltd CC08E0Apple CC09C8IMAQLIQ LTD CC0CDAMiljovakt AS CC0DECCisco SPVTG CC10A3Beijing Nan Bao Technology Co., Ltd CC14A6Yichun MyEnergy Domain, Inc CC187BManzanita Systems, Inc CC1AFAzte corporation CC1EFFMetrological Group BV CC2218InnoDigital Co., Ltd CC262DVerifi, LLC CC2A80Micro-Biz intelligence solutions Co.,Ltd CC2D8CLG ELECTRONICS INC CC3080VAIO Corporation CC33BBSAGEMCOM SAS CC3429TP-LINK TECHNOLOGIES CO.,LTD CC34D7GEWISS S.P.A CC3540Technicolor USA Inc CC398CShiningtek CC3A61SAMSUNG ELECTRO MECHANICS CO., LTD CC3C3FSA.S.S. Datentechnik AG CC3D82Intel Corporate CC3E5FHewlett Packard CC3F1DIntesis Software SL CC43E3Trump s.a CC4703Intercon Systems Co., Ltd CC4AE1Fourtec -Fourier Technologies CC4BFBHellberg Safety AB CC4E24Brocade Communications Systems, Inc CC501CKVH Industries, Inc CC5076Ocom Communications, Inc CC52AFUniversal Global Scientific Industrial Co., Ltd CC53B5HUAWEI TECHNOLOGIES CO.,LTD CC5459OnTime Networks AS CC55ADRIM CC593ETOUMAZ LTD CC5C75Weightech Com. Imp. Exp. Equip. Pesagem Ltda CC5D4EZyXEL Communications Corporation CC5D57Information System Research Institute,Inc CC60BBEmpower RF Systems CC65ADARRIS Group, Inc CC69B0Global Traffic Technologies, LLC CC6B98Minetec Wireless Technologies CC6BF1Sound Masking Inc CC6DA0Roku, Inc CC6DEFTJK Tietolaite Oy CC720FViscount Systems Inc CC7498Filmetrics Inc CC7669SEETECH CC785FApple CC7A30CMAX Wireless Co., Ltd CC7B35zte corporation CC7D37ARRIS Group, Inc CC7EE7Panasonic AVC Networks Company CC856CSHENZHEN MDK DIGITAL TECHNOLOGY CO.,LTD CC89FDNokia Corporation CC8CE3Texas Instruments CC9093Hansong Tehnologies CC912BTE Connectivity Touch Solutions CC944APfeiffer Vacuum GmbH CC95D7VIZIO, Inc CC96A0Shenzhen Huawei Communication Technologies Co., Ltd CC9E00Nintendo Co., Ltd CC9F35Transbit Sp. z o.o CCA0E5DZG Metering GmbH CCA223Huawei Technologies Co., Ltd CCA374Guangdong Guanglian Electronic Technology Co.Ltd CCA462ARRIS Group, Inc CCA614AIFA TECHNOLOGY CORP CCAF78Hon Hai Precision Ind. Co.,Ltd CCB255D-Link International CCB3F8FUJITSU ISOTEC LIMITED CCB55AFraunhofer ITWM CCB691NECMagnusCommunications CCB888AnB Securite s.a CCB8F1EAGLE KINGDOM TECHNOLOGIES LIMITED CCBD35Steinel GmbH CCBE71OptiLogix BV CCC104Applied Technical Systems CCC3EAMotorola Mobility LLC CCC50ASHENZHEN DAJIAHAO TECHNOLOGY CO.,LTD CCC62BTri-Systems Corporation CCC8D7CIAS Elettronica srl CCCC4ESun Fountainhead USA. Corp CCCC81HUAWEI TECHNOLOGIES CO.,LTD CCCD64SM-Electronic GmbH CCCE40Janteq Corp CCD29BShenzhen Bopengfa Elec&Technology CO.,Ltd CCD539Cisco CCD811Aiconn Technology Corporation CCD8C1Cisco CCD9E9SCR Engineers Ltd CCE17Fjuniper networks CCE1D5Buffalo Inc CCE798My Social Stuff CCE7DFAmerican Magnetics, Inc CCE8ACSOYEA Technology Co.,Ltd CCEA1CDCONWORKS Co., Ltd CCEED9Deto Mechatronic GmbH CCEF48CISCO SYSTEMS, INC CCF3A5Chi Mei Communication Systems, Inc CCF407EUKREA ELECTROMATIQUE SARL CCF5383isysnetworks CCF67AAyecka Communication Systems LTD CCF841Lumewave CCF8F0Xi'an HISU Multimedia Technology Co.,Ltd CCF954Avaya, Inc CCF9E8Samsung Electronics Co.,Ltd CCFA00LG Electronics CCFB65Nintendo Co., Ltd CCFC6DRIZ TRANSMITTERS CCFCB1Wireless Technology, Inc CCFE3CSamsung Electronics D00790Texas Instruments D00AABYokogawa Digital Computer Corporation D00EA4Porsche Cars North America D01242BIOS Corporation D0131ESunrex Technology Corp D0154Azte corporation D0176ASamsung Electronics Co.,Ltd D01AA7UniPrint D01CBBBeijing Ctimes Digital Technology Co., Ltd D022BESamsung Electro Mechanics co.,LTD D023DBApple D02788Hon Hai Precision Ind.Co.Ltd D02C45littleBits Electronics, Inc D02DB3Huawei Technologies Co., Ltd D03110Ingenic Semiconductor Co.,Ltd D03761Texas Instruments D03972Texas Instruments D039B3ARRIS Group, Inc D046DCSouthwest Research Institute D04CC1SINTRONES Technology Corp D05099ASRock Incorporation D05162Sony Mobile Communications AB D052A8Physical Graph Corporation D0542DCambridge Industries(Group) Co.,Ltd D0574CCISCO SYSTEMS, INC D05785Pantech Co., Ltd D057A1Werma Signaltechnik GmbH & Co. KG D05875Active Control Technology Inc D059C3CeraMicro Technology Corporation D059E4Samsung Electronics Co.,Ltd D05A0FI-BT DIGITAL CO.,LTD D05AF1Shenzhen Pulier Tech CO.,Ltd D05FB8Texas Instruments D05FCEHitachi Data Systems D062A0China Essence Technology (Zhumadian) Co., Ltd D0634DMeiko Maschinenbau GmbH & Co. KG D063B4SolidRun Ltd D0667BSamsung Electronics Co., LTD D067E5Dell Inc D0699ELUMINEX Lighting Control Equipment D069D0Verto Medical Solutions, LLC D072DCCisco D0737FMini-Circuits D0738EDONG OH PRECISION CO., LTD D073D5LIFI LABS MANAGEMENT PTY LTD D075BEReno A&E D07650IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information D07AB5Huawei Technologies Co., Ltd D07DE5Forward Pay Systems, Inc D07E28Hewlett Packard D07E35Intel Corporate D084B0Sagemcom D08999APCON, Inc D08A55Skullcandy D08B7EPassif Semiconductor D08CB5Texas Instruments D08CFFUPWIS AB D093F8Stonestreet One LLC D095C7Pantech Co., Ltd D09B05Emtronix D09C30Foster Electric Company, Limited D09D0ALINKCOM D0A0D6Chengdu TD Tech Ltd D0A311Neuberger Gebäudeautomation GmbH D0AEECAlpha Networks Inc D0AFB6Linktop Technology Co., LTD D0B33FSHENZHEN TINNO MOBILE TECHNOLOGY CO.,LTD D0B498Robert Bosch LLC Automotive Electronics D0B523Bestcare Cloucal Corp D0B53DSEPRO ROBOTIQUE D0BB80SHL Telemedicine International Ltd D0BD01DS International D0BE2CCNSLink Co., Ltd D0C1B1Samsung Electronics Co.,Ltd D0C282CISCO SYSTEMS, INC D0C42FTamagawa Seiki Co.,Ltd D0C789Cisco D0C7C0TP-LINK TECHNOLOGIES CO.,LTD D0CDE1Scientech Electronics D0CF5EEnergy Micro AS D0D0FDCISCO SYSTEMS, INC D0D212K2NET Co.,Ltd D0D286Beckman Coulter K.K D0D3FCMios, Ltd D0D412ADB Broadband Italia D0D471MVTECH co., Ltd D0D6CCWintop D0DB32Nokia Corporation D0DF9ALiteon Technology Corporation D0DFB2Genie Networks Limited D0DFC7Samsung Electronics Co.,Ltd D0E140Apple, Inc D0E347Yoga D0E40BWearable Inc D0E54DPace plc D0E782Azurewave Technologies, Inc D0EB03Zhehua technology limited D0EB9ESeowoo Inc D0F0DBEricsson D0F27FSteadyServ Technoligies, LLC D0F73BHelmut Mauell GmbH D0FA1DQihoo 360 Technology Co.,Ltd D0FF50Texas Instruments, Inc D4000DPhoenix Broadband Technologies, LLC D40057MC Technologies GmbH D40129Broadcom Corporation D4016DTP-LINK TECHNOLOGIES CO.,LTD D4024ADelphian Systems LLC D40BB9Solid Semecs bv D40FB2Applied Micro Electronics AME bv D41090iNFORM Systems AG D410CFHuanshun Network Science and Technology Co., Ltd D411D6ShotSpotter, Inc D41296Anobit Technologies Ltd D412BBQuadrant Components Inc. Ltd D4136FAsia Pacific Brands D41C1CRCF S.P.A D41E35TOHO Electronics INC D41F0CTVI Vision Oy D4206DHTC Corporation D42122Sercomm Corporation D4223FLenovo Mobile Communication Technology Ltd D4224EAlcatel Lucent D42751Infopia Co., Ltd D428B2ioBridge, Inc D429EAZimory GmbH D42C3DSky Light Digital Limited D42F23Akenori PTE Ltd D4319DSinwatec D437D7zte corporation D43A65IGRS Engineering Lab Ltd D43AE9DONGGUAN ipt INDUSTRIAL CO., LTD D43D67Carma Industries Inc D43D7EMicro-Star Int'l Co, Ltd D443A8Changzhou Haojie Electric Co., Ltd D44B5ETAIYO YUDEN CO., LTD D44C24Vuppalamritha Magnetic Components LTD D44C9CShenzhen YOOBAO Technology Co.Ltd D44CA7Informtekhnika & Communication, LLC D44F80Kemper Digital GmbH D4507ACEIVA Logic, Inc D45251IBT Ingenieurbureau Broennimann Thun D45297nSTREAMS Technologies, Inc D453AFVIGO System S.A D45AB2Galleon Systems D45C70Wi-Fi Alliance D45D42Nokia Corporation D46132Pro Concept Manufacturer Co.,Ltd D464F7CHENGDU USEE DIGITAL TECHNOLOGY CO., LTD D466A8Riedo Networks GmbH D46761SAHAB TECHNOLOGY D467E7Fiberhome Telecommunication Tech.Co.,Ltd D46867Neoventus Design Group D46A91Snap AV D46AA8HUAWEI TECHNOLOGIES CO.,LTD D46CBFGoodrich ISR D46CDACSM GmbH D46E5CHuawei Technologies Co., Ltd D46F42WAXESS USA Inc D479C3Cameronet GmbH & Co. KG D47B35NEO Monitors AS D47B75HARTING Electronics GmbH D481CAiDevices, LLC D4823EArgosy Technologies, Ltd D48564Hewlett-Packard Company D487D8Samsung Electronics D48890Samsung Electronics Co.,Ltd D48CB5CISCO SYSTEMS, INC D48DD9Meld Technology, Inc D48F33Microsoft Corporation D48FAASogecam Industrial, S.A D491AFElectroacustica General Iberica, S.A D49398Nokia Corporation D493A0Fidelix Oy D4945ACOSMO CO., LTD D494A1Texas Instruments D49524Clover Network, Inc D496DFSUNGJIN C&T CO.,LTD D4970BXIAOMI CORPORATION D49A20Apple D49C28JayBird Gear LLC D49C8EUniversity of FUKUI D49E6DWuhan Zhongyuan Huadian Science & Technology Co., D4A02ACISCO SYSTEMS, INC D4A425SMAX Technology Co., Ltd D4A499InView Technology Corporation D4A928GreenWave Reality Inc D4AAFFMICRO WORLD D4AC4EBODi rS, LLC D4AD2DFiberhome Telecommunication Tech.Co.,Ltd D4AE52Dell Inc D4B110HUAWEI TECHNOLOGIES CO.,LTD D4B43EMesscomp Datentechnik GmbH D4BED9Dell Inc D4BF2DSE Controls Asia Pacific Ltd D4BF7FUPVEL D4C1FCNokia Corporation D4C766Acentic GmbH D4C9EFHewlett Packard D4CA6DRouterboard.com D4CA6Eu-blox AG D4CBAFNokia Corporation D4CEB8Enatel LTD D4CFF9Shenzhen Sen5 Technology Co., Ltd D4D184ADB Broadband Italia D4D249Power Ethernet D4D50DSouthwest Microwave, Inc D4D748CISCO SYSTEMS, INC D4D898Korea CNO Tech Co., Ltd D4D919GoPro D4DF57Alpinion Medical Systems D4E08EValueHD Corporation D4E32CS. Siedle & Sohne D4E33FAlcatel-Lucent D4E8B2Samsung Electronics D4EA0EAvaya, Inc D4EC0CHarley-Davidson Motor Company D4EC86LinkedHope Intelligent Technologies Co., Ltd D4EE07HIWIFI Co., Ltd D4F027Navetas Energy Management D4F0B4Napco Security Technologies D4F143IPROAD.,Inc D4F46FApple D4F63FIEA S.R.L D8004DApple D8052ESkyviia Corporation D806D1Honeywell Fire System (Shanghai) Co,. Ltd D808F5Arcadia Networks Co. Ltd D809C3Cercacor Labs D80CCFC.G.V. S.A.S D80DE3FXI TECHNOLOGIES AS D8150DTP-LINK TECHNOLOGIES CO.,LTD D8160ANippon Electro-Sensory Devices D8182BConti Temic Microelectronic GmbH D819CETelesquare D81BFETWINLINX CORPORATION D81C14Compacta International, Ltd D81EDEB&W Group Ltd D824BDCISCO SYSTEMS, INC D82522Pace plc D826B9Guangdong Coagent Electronics S &T Co., Ltd D8270CMaxTronic International Co., Ltd D828C9General Electric Consumer and Industrial D82916Ascent Communication Technology D82986Best Wish Technology LTD D82A15Leitner SpA D82A7ENokia Corporation D82D9BShenzhen G.Credit Communication Technology Co., Ltd D82DE1Tricascade Inc D83062Apple D831CFSamsung Electronics Co.,Ltd D8337FOffice FA.com Co.,Ltd D842ACShanghai Feixun Communication Co.,Ltd D84606Silicon Valley Global Marketing D8490BHUAWEI TECHNOLOGIES CO.,LTD D8492FCANON INC D84A87OI ELECTRIC CO.,LTD D84B2ACognitas Technologies, Inc D850E6ASUSTek COMPUTER INC D8543ATexas Instruments D857EFSamsung Electronics D858D7CZ.NIC, z.s.p.o D85D4CTP-LINK Technologies Co.,Ltd D85D84CAx soft GmbH D85DFB D86194Objetivos y Sevicios de Valor Añadido D862DBEno Inc D86595Toy's Myth Inc D866C6Shenzhen Daystar Technology Co.,ltd D866EEBOXIN COMMUNICATION CO.,LTD D867D9CISCO SYSTEMS, INC D86960Steinsvik D86BF7Nintendo Co., Ltd D86CE9SAGEMCOM SAS D87157Lenovo Mobile Communication Technology Ltd D87533Nokia Corporation D8760AEscort, Inc D878E5KUHN SA D87988Hon Hai Precision Ind. Co., Ltd D87CDDSANIX INCORPORATED D87EB1x.o.ware, inc D88039Microchip Technology Inc D881CEAHN INC D88A3BUNIT-EM D890E8Samsung Electronics Co.,Ltd D8952FTexas Instruments D89685GoPro D89695Apple D896E0Alibaba Cloud Computing Ltd D8973BArtesyn Embedded Technologies D89760C2 Development, Inc D8977CGrey Innovation D89D67Hewlett Packard D89DB9eMegatech International Corp D89E3FApple D8A25EApple D8AE90Itibia Technologies D8AF3BHangzhou Bigbright Integrated communications system Co.,Ltd D8AFF1Panasonic Appliances Company D8B02EGuangzhou Zonerich Business Machine Co., Ltd D8B04CJinan USR IOT Technology Co., Ltd D8B12APanasonic Mobile Communications Co., Ltd D8B377HTC Corporation D8B6B7Comtrend Corporation D8B6C1NetworkAccountant, Inc D8B6D6Blu Tether Limited D8B8F6Nantworks D8B90ETriple Domain Vision Co.,Ltd D8BF4CVictory Concept Electronics Limited D8C068Netgenetech.co.,ltd D8C3FBDETRACOM D8C691Hichan Technology Corp D8C7C8Aruba Networks D8C99DEA DISPLAY LIMITED D8CF9CApple D8D1CBApple D8D27CJEMA ENERGY, SA D8D385Hewlett-Packard Company D8D43CSony Corporation D8D5B9Rainforest Automation, Inc D8D67EGSK CNC EQUIPMENT CO.,LTD D8DA52APATOR S.A D8DCE9Kunshan Erlab ductless filtration system Co.,Ltd D8DD5FBALMUDA Inc D8DDFDTexas Instruments D8DECEISUNG CO.,LTD D8DF0DberoNet GmbH D8E3AECIRTEC MEDICAL SYSTEMS D8E56DTCT Mobile Limited D8E72BOnPATH Technologies D8E743Wush, Inc D8E952KEOPSYS D8EB97TRENDnet, Inc D8EE78Moog Protokraft D8F0F2Zeebo Inc D8FB11AXACORE D8FC93Intel Corporate D8FE8FIDFone Co., Ltd D8FEE3D-Link International DC0265Meditech Kft DC028Ezte corporation DC052FNational Products Inc DC0575SIEMENS ENERGY AUTOMATION DC05EDNabtesco Corporation DC07C1HangZhou QiYang Technology Co.,Ltd DC0B1AADB Broadband Italia DC0EA1COMPAL INFORMATION (KUNSHAN) CO., LTD DC16A2Medtronic Diabetes DC175AHitachi High-Technologies Corporation DC1792Captivate Network DC1D9FU & B tech DC1DD4Microstep-MIS spol. s r.o DC1EA3Accensus LLC DC2008ASD Electronics Ltd DC2A14Shanghai Longjing Technology Co DC2B61Apple DC2B66InfoBLOCK S.A. de C.V DC2BCAZera GmbH DC2C26Iton Technology Limited DC2E6AHCT. Co., Ltd DC2F03Step forward Group Co., Ltd DC309CHeyrex Limited DC3350TechSAT GmbH DC37D2Hunan HKT Electronic Technology Co., Ltd DC38E1Juniper networks DC3979Skyport Systems DC3A5ERoku, Inc DC3C2EManufacturing System Insights, Inc DC3C84Ticom Geomatics, Inc DC3E51Solberg & Andersen AS DC3EF8Nokia Corporation DC4517ARRIS Group, Inc DC49C9CASCO SIGNAL LTD DC4EDESHINYEI TECHNOLOGY CO., LTD DC537CCompal Broadband Networks, Inc DC5726Power-One DC5E36Paterson Technology DC647CC.R.S. iiMotion GmbH DC663AApacer Technology Inc DC6F00Livescribe, Inc DC6F08Bay Storage Technology DC7014 DC7144Samsung Electro Mechanics DC7B94CISCO SYSTEMS, INC DC825BJANUS, spol. s r.o DC85DEAzurewave Technologies., inc DC86D8Apple, Inc DC9B1EIntercom, Inc DC9B9CApple DC9C52Sapphire Technology Limited DC9FA4Nokia Corporation DC9FDBUbiquiti Networks, Inc DCA5F4Cisco DCA6BDBeijing Lanbo Technology Co., Ltd DCA7D9Compressor Controls Corp DCA8CFNew Spin Golf, LLC DCA971Intel Corporate DCA989MACANDC DCAD9EGreenPriz DCAE04CELOXICA Ltd DCB058Burkert Werke GmbH DCB4C4Microsoft XCG DCBF90HUIZHOU QIAOXING TELECOMMUNICATION INDUSTRY CO.,LTD DCC0DBShenzhen Kaiboer Technology Co., Ltd DCC101SOLiD Technologies, Inc DCC422Systembase Limited DCC622BUHEUNG SYSTEM DCC793Nokia Corporation DCCBA8Explora Technologies Inc DCCE41FE GLOBAL HONG KONG LIMITED DCCEBCShenzhen JSR Technology Co.,Ltd DCCF94Beijing Rongcheng Hutong Technology Co., Ltd DCD0F7Bentek Systems Ltd DCD2FCHUAWEI TECHNOLOGIES CO.,LTD DCD321HUMAX co.,tld DCD52ASunny Heart Limited DCD87FShenzhen JoinCyber Telecom Equipment Ltd DCDA4FGET Technology,INC DCDECAAkyllor DCE2ACLumens Digital Optics Inc DCE578Experimental Factory of Scientific Engineering and Special Design Department DCE71CAUG Elektronik GmbH DCF05DLetta Teknoloji DCF110Nokia Corporation DCF755SITRONIK DCF858Lorent Networks, Inc DCFAD5STRONG Ges.m.b.H DCFB02Buffalo Inc E005C5TP-LINK Technologies Co.,Ltd E006E6Hon Hai Precision Ind. Co.,Ltd E00B28Inovonics E00C7FNintendo Co., Ltd E00DB9 E0107FRuckus Wireless E0143EModoosis Inc E01877Fujitsu Limited E01C41Aerohive Networks Inc E01CEEBravo Tech, Inc E01D38Beijing HuaqinWorld Technology Co.,Ltd E01D3BCambridge Industries(Group) Co.,Ltd E01E07Anite Telecoms US. Inc E01F0AXslent Energy Technologies. LLC E0247FHUAWEI TECHNOLOGIES CO.,LTD E02538Titan Pet Products E02630Intrigue Technologies, Inc E02636Nortel Networks E0271ATTC Next-generation Home Network System WG E02A82Universal Global Scientific Industrial Co., Ltd E02F6DCisco E03005Alcatel-Lucent Shanghai Bell Co., Ltd E031D0SZ Telstar CO., LTD E036E3Stage One International Co., Ltd E039D7Plexxi, Inc E03C5BSHENZHEN JIAXINJIE ELECTRON CO.,LTD E03E4ACavanagh Group International E03E7Ddata-complex GmbH E03F49ASUSTek COMPUTER INC E0469ANETGEAR E05597Emergent Vision Technologies Inc E056F4AxesNetwork Solutions inc E0589ELaerdal Medical E05B70Innovid, Co., Ltd E05DA6Detlef Fink Elektronik & Softwareentwicklung E05FB9CISCO SYSTEMS, INC E061B2HANGZHOU ZENOINTEL TECHNOLOGY CO., LTD E06290Jinan Jovision Science & Technology Co., Ltd E063E5Sony Mobile Communications AB E064BBDigiView S.r.l E06678Apple E067B3C-Data Technology Co., Ltd E06995PEGATRON CORPORATION E0750AALPS ERECTORIC CO.,LTD E0757DMotorola Mobility LLC E07C62Whistle Labs, Inc E07F53TECHBOARD SRL E07F88EVIDENCE Network SIA E08177GreenBytes, Inc E087B1Nata-Info Ltd E08A7EExponent E08FECREPOTEC CO., LTD E09153XAVi Technologies Corp E091F5NETGEAR E09467Intel Corporate E09579ORTHOsoft inc, d/b/a Zimmer CAS E09796HUAWEI TECHNOLOGIES CO.,LTD E097F2Atomax Inc E09D31Intel Corporate E09DB8PLANEX COMMUNICATIONS INC E0A198NOJA Power Switchgear Pty Ltd E0A1D7SFR E0A30FPevco E0A670Nokia Corporation E0AAB0GENERAL VISION ELECTRONICS CO. LTD E0ABFEOrb Networks, Inc E0ACF1Cisco E0AE5EALPS Co,. Ltd E0AEB2Bender GmbH & Co.KG E0AEEDLOENK E0AF4BPluribus Networks, Inc E0B2F1FN-LINK TECHNOLOGY LIMITED E0B52DApple E0B7B1Pace plc E0B9A5Azurewave E0B9BAApple E0BC43C2 Microsystems, Inc E0C286Aisai Communication Technology Co., Ltd E0C2B7Masimo Corporation E0C3F3ZTE Corporation E0C6B3MilDef AB E0C79DTexas Instruments E0C86ASHENZHEN TW-SCIE Co., Ltd E0C922Jireh Energy Tech., Ltd E0C97AApple E0CA4DShenzhen Unistar Communication Co.,LTD E0CA94Askey Computer E0CB1D E0CB4EASUSTek COMPUTER INC E0CBEESamsung Electronics Co.,Ltd E0CEC3ASKEY COMPUTER CORP E0CF2DGemintek Corporation E0D10AKatoudenkikougyousyo co ltd E0D1E6Aliph dba Jawbone E0D31AEQUES Technology Co., Limited E0D7BATexas Instruments E0D9A2Hippih aps E0DADCJVC KENWOOD Corporation E0DB55Dell Inc E0DB88Open Standard Digital-IF Interface for SATCOM Systems E0DCA0Siemens Electrical Apparatus Ltd., Suzhou Chengdu Branch E0E631SNB TECHNOLOGIES LIMITED E0E751Nintendo Co., Ltd E0E8E8Olive Telecommunication Pvt. Ltd E0ED1Avastriver Technology Co., Ltd E0EDC7Shenzhen Friendcom Technology Development Co., Ltd E0EE1BPanasonic Automotive Systems Company of America E0EF25Lintes Technology Co., Ltd E0F211Digitalwatt E0F379Vaddio E0F5C6Apple E0F5CACHENG UEI PRECISION INDUSTRY CO.,LTD E0F847Apple E0F9BECloudena Corp E0FAECPlatan sp. z o.o. sp. k E40439TomTom Software Ltd E4115BHewlett Packard E41218ShenZhen Rapoo Technology Co., Ltd E4121DSamsung Electronics Co.,Ltd E41289topsystem Systemhaus GmbH E41C4BV2 TECHNOLOGY, INC E41D2DMellanox Technologies, Inc E41F13IBM Corp E42354SHENZHEN FUZHI SOFTWARE TECHNOLOGY CO.,LTD E425E7Apple E425E9Color-Chip E42771Smartlabs E42AD3Magneti Marelli S.p.A. Powertrain E42C56Lilee Systems, Ltd E42D02TCT Mobile Limited E42F26Fiberhome Telecommunication Tech.Co.,Ltd E42FF6Unicore communication Inc E432CBSamsung Electronics Co.,Ltd E43593Hangzhou GoTo technology Co.Ltd E435FBSabre Technology (Hull) Ltd E437D7HENRI DEPAEPE S.A.S E438F2Advantage Controls E43FA2Wuxi DSP Technologies Inc E440E2Samsung Electronics Co.,Ltd E441E6Ottec Technology GmbH E446BDC&C TECHNIC TAIWAN CO., LTD E448C7Cisco SPVTG E44C6CShenzhen Guo Wei Electronic Co,. Ltd E44E18Gardasoft VisionLimited E44F29MA Lighting Technology GmbH E44F5FEDS Elektronik Destek San.Tic.Ltd.Sti E455EADedicated Computing E45614Suttle Apparatus E457A8Stuart Manufacturing, Inc E45D52Avaya, Inc E46449ARRIS Group, Inc E467BADanish Interpretation Systems A/S E468A3HUAWEI TECHNOLOGIES CO.,LTD E46C21messMa GmbH E47185Securifi Ltd E4751EGetinge Sterilization AB E47723zte corporation E4776BAARTESYS AG E477D4Minrray Industry Co.,Ltd E47CF9Samsung Electronics Co., LTD E47D5ABeijing Hanbang Technology Corp E47FB2Fujitsu Limited E48184Alcatel-Lucent E481B3Shenzhen ACT Industrial Co.,Ltd E48399ARRIS Group, Inc E48AD5RF WINDOW CO., LTD E48B7FApple E48C0FDiscovery Insure E49069Rockwell Automation E492E7Gridlink Tech. Co.,Ltd E492FBSamsung Electronics Co.,Ltd E4956EIEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information E496AEALTOGRAPHICS Inc E497F0Shanghai VLC Technologies Ltd. Co E498D6Apple, Inc E4A5EFTRON LINK ELECTRONICS CO., LTD E4A7FDCellco Partnership E4AB46UAB Selteka E4AD7DSCL Elements E4AFA1HES-SO E4B021Samsung Electronics Co.,Ltd E4C146Objetivos y Servicios de Valor A E4C62BAirware E4C63DApple, Inc E4C6E6Mophie, LLC E4C722Cisco E4C806Ceiec Electric Technology Inc E4CE8FApple E4D332TP-LINK TECHNOLOGIES CO.,LTD E4D3F1Cisco E4D53DHon Hai Precision Ind. Co.,Ltd E4D71DOraya Therapeutics E4DD79En-Vision America, Inc E4E0C5Samsung Electronics Co., LTD E4E409LEIFHEIT AG E4EC10Nokia Corporation E4EEFDMR&D Manufacturing E4F365Time-O-Matic, Inc E4F3E3Shanghai iComhome Co.,Ltd E4F4C6NETGEAR E4F7A1Datafox GmbH E4FA1DPAD Peripheral Advanced Design Inc E4FFDDELECTRON INDIA E8039ASamsung Electronics CO., LTD E8040BApple E80410 E80462CISCO SYSTEMS, INC E804F3Throughtek Co., Ltd E8056DNortel Networks E80688Apple E8088BHuawei Technologies Co., Ltd E80B13Akib Systems Taiwan, INC E80C38DAEYOUNG INFORMATION SYSTEM CO., LTD E80C75Syncbak, Inc E8102EReally Simple Software, Inc E81132Samsung Electronics CO., LTD E81324GuangZhou Bonsoninfo System CO.,LTD E8150ENokia Corporation E817FCNIFTY Corporation E81863IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information E82877TMY Co., Ltd E828D5Cots Technology E82AEAIntel Corporate E82E24Out of the Fog Research LLC E83935Hewlett Packard E839DFAskey Computer E83A97OCZ Technology Group E83EB6RIM E83EFBGEODESIC LTD E83EFCARRIS Group, Inc E84040CISCO SYSTEMS, INC E840F2PEGATRON CORPORATION E843B6QNAP Systems, Inc E8481FAdvanced Automotive Antennas E84E06EDUP INTERNATIONAL (HK) CO., LTD E84E84Samsung Electronics Co.,Ltd E84ECENintendo Co., Ltd E8516ETSMART Inc E8519DYeonhab Precision Co.,LTD E85484NEO INFORMATION SYSTEMS CO., LTD E856D6NCTech Ltd E85AA7LLC Emzior E85B5BLG ELECTRONICS INC E85BF0Imaging Diagnostics E85D6BLuminate Wireless E85E53Infratec Datentechnik GmbH E8611FDawning Information Industry Co.,Ltd E8617ELiteon Technology Corporation E86183Black Diamond Advanced Technology, LLC E86CDASupercomputers and Neurocomputers Research Center E86D52ARRIS Group, Inc E86D54Digit Mobile Inc E86D6EControl & Display Systems Ltd t/a CDSRail E8718DElsys Equipamentos Eletronicos Ltda E8757FFIRS Technologies(Shenzhen) Co., Ltd E878A1BEOVIEW INTERCOM DOO E87AF3S5 Tech S.r.l E8802EApple E880D8GNTEK Electronics Co.,Ltd E8892CARRIS Group, Inc E88D28Apple E88DF5ZNYX Networks, Inc E89218Arcontia International AB E892A4LG Electronics E8944CCogent Healthcare Systems Ltd E894F6TP-LINK TECHNOLOGIES CO.,LTD E89606testo Instruments (Shenzhen) Co., Ltd E8995APiiGAB, Processinformation i Goteborg AB E899C4HTC Corporation E89A8FQuanta Computer Inc E89AFFFujian Landi Commercial Equipment Co.,Ltd E89D87Toshiba E8A364Signal Path International / Peachtree Audio E8A4C1Deep Sea Electronics PLC E8ABFAShenzhen Reecam Tech.Ltd E8B1FCIntel Corporate E8B4AEShenzhen C&D Electronics Co.,Ltd E8B748CISCO SYSTEMS, INC E8BA70CISCO SYSTEMS, INC E8BB3DSino Prime-Tech Limited E8BBA8GUANGDONG OPPO MOBILE TELECOMMUNICATIONS CORP.,LTD E8BE81SAGEMCOM E8C229H-Displays (MSC) Bhd E8C320Austco Communication Systems Pty Ltd E8CBA1Nokia Corporation E8CC32Micronet LTD E8CD2DHuawei Technologies Co., Ltd E8CE06SkyHawke Technologies, LLC E8D0FAMKS Instruments Deutschland GmbH E8D483ULTIMATE Europe Transportation Equipment GmbH E8D4E0Beijing BenyWave Technology Co., Ltd E8DA96Zhuhai Tianrui Electrical Power Tech. Co., Ltd E8DAAAVideoHome Technology Corp E8DE27TP-LINK TECHNOLOGIES CO.,LTD E8DFF2PRF Co., Ltd E8E08FGRAVOTECH MARKING SAS E8E0B7Toshiba E8E1E2Energotest E8E5D6Samsung Electronics Co.,Ltd E8E732Alcatel-Lucent E8E770Warp9 Tech Design, Inc E8E776Shenzhen Kootion Technology Co., Ltd E8E875iS5 Communications Inc E8EA6AStarTech.com E8EADADenkovi Assembly Electroncs LTD E8ED05ARRIS Group, Inc E8EDF3Cisco E8EF89OPMEX Tech E8F1B0SAGEMCOM SAS E8F226MILLSON CUSTOM SOLUTIONS INC E8F928RFTECH SRL E8FC60ELCOM Innovations Private Limited E8FCAFNETGEAR INC., EC0EC4Hon Hai Precision Ind. Co.,Ltd EC0ED6ITECH INSTRUMENTS SAS EC1120FloDesign Wind Turbine Corporation EC13B2Netonix EC14F6BioControl AS EC172FTP-LINK TECHNOLOGIES CO., LTD EC1766Research Centre Module EC1A59Belkin International Inc EC1D7Fzte corporation EC219FVidaBox LLC EC2257JiangSu NanJing University Electronic Information Technology Co.,Ltd EC2280 D-Link International EC233DHuawei Technologies Co., Ltd EC2368IntelliVoice Co.,Ltd EC2AF0Ypsomed AG EC2C49University of Tokyo EC2E4EHITACHI-LG DATA STORAGE INC EC3091CISCO SYSTEMS, INC EC3586Apple EC3BF0NovelSat EC3C5ASHEN ZHEN HENG SHENG HUI DIGITAL TECHNOLOGY CO.,LTD EC3E09PERFORMANCE DESIGNED PRODUCTS, LLC EC3F05Institute 706, The Second Academy China Aerospace Science & Industry Corp EC42F0ADL Embedded Solutions, Inc EC43E6AWCER Ltd EC43F6ZyXEL Communications Corporation EC4476CISCO SYSTEMS, INC EC4644TTK SAS EC4670Meinberg Funkuhren GmbH & Co. KG EC473CRedwire, LLC EC4993Qihan Technology Co., Ltd EC4C4DZAO NPK RoTeK EC542EShanghai XiMei Electronic Technology Co. Ltd EC55F9Hon Hai Precision Ind. Co.,Ltd EC5C69MITSUBISHI HEAVY INDUSTRIES MECHATRONICS SYSTEMS,LTD EC6264Global411 Internet Services, LLC EC63E5ePBoard Design LLC EC66D1B&W Group LTD EC6C9FChengdu Volans Technology CO.,LTD EC71DBShenzhen Baichuan Digital Technology Co., Ltd EC7C74Justone Technologies Co., Ltd EC7D9DMEI EC836CRM Tech Co., Ltd EC852FApple EC888FTP-LINK TECHNOLOGIES CO., LTD EC89F5Lenovo Mobile Communication Technology Ltd EC8A4Czte corporation EC8EADDLX EC9233Eddyfi NDT Inc EC9327MEMMERT GmbH + Co. KG EC96812276427 Ontario Inc EC986CLufft Mess- und Regeltechnik GmbH EC98C1Beijing Risbo Network Technology Co.,Ltd EC9A74Hewlett Packard EC9B5BNokia Corporation EC9ECDArtesyn Embedded Technologies ECA29BKemppi Oy ECA86BELITEGROUP COMPUTER SYSTEMS CO., LTD ECB106Acuro Networks, Inc ECB541SHINANO E and E Co.Ltd ECB907CloudGenix Inc ECBBAEDigivoice Tecnologia em Eletronica Ltda ECBD09FUSION Electronics Ltd ECC38AAccuenergy (CANADA) Inc ECC882CISCO SYSTEMS, INC ECCB30Huawei Technologies Co., Ltd ECCD6DAllied Telesis, Inc ECD00EMiraeRecognition Co., Ltd ECD040GEA Farm Technologies GmbH ECD19AZhuhai Liming Industries Co., Ltd ECD925RAMI ECD950IRT SA ECD9D1Shenzhen TG-NET Botone Technology Co.,Ltd ECDE3DLamprey Networks, Inc ECE09BSamsung electronics CO., LTD ECE1A9Cisco ECE512tado GmbH ECE555Hirschmann Automation ECE744Omntec mfg. inc ECE90BSISTEMA SOLUCOES ELETRONICAS LTDA - EASYTECH ECE915STI Ltd ECE9F8Guang Zhou TRI-SUN Electronics Technology Co., Ltd ECEA03DARFON LIGHTING CORP ECF00EAbocom ECF236NEOMONTANA ELECTRONICS ECF35BNokia Corporation ECF4BBDell Inc ECF72BHD DIGITAL TECH CO., LTD ECFAAAThe IMS Company ECFC55A. Eberle GmbH & Co. KG ECFE7EBlueRadios, Inc F0007FJanz - Contadores de Energia, SA F0022BChrontel F00248SmarteBuilding F00786Shandong Bittel Electronics Co., Ltd F008F1Samsung Electronics Co.,Ltd F013C3SHENZHEN FENDA TECHNOLOGY CO., LTD F015A0KyungDong One Co., Ltd F01C13LG Electronics F01FAFDell Inc F0219DCal-Comp Electronics & Communications Company Ltd F02329SHOWA DENKI CO.,LTD F02405OPUS High Technology Corporation F02408Talaris (Sweden) AB F02572CISCO SYSTEMS, INC F025B7Samsung Electro Mechanics co., LTD F0264CDr. Sigrist AG F02765Murata Manufactuaring Co.,Ltd F02929Cisco F02A61Waldo Networks, Inc F02FD8Bi2-Vision F0321AMita-Teknik A/S F037A1Huike Electronics (SHENZHEN) CO., LTD F03A4BBloombase, Inc F03A55Omega Elektronik AS F03D29Actility F03FF8R L Drake F04335DVN(Shanghai)Ltd F04A2BPYRAMID Computer GmbH F04B6AScientific Production Association Siberian Arsenal, Ltd F04BF2JTECH Communications, Inc F04DA2Dell Inc F04F7C F05849CareView Communications F05A09Samsung Electronics Co.,Ltd F05D89Dycon Limited F05DC8Duracell Powermat F05F5AGetriebebau NORD GmbH and Co. KG F06130Advantage Pharmacy Services, LLC F0620DShenzhen Egreat Tech Corp.,Ltd F06281ProCurve Networking by HP F065DDPrimax Electronics Ltd F06853Integrated Corporation F06BCASamsung Electronics Co.,Ltd F0728CSamsung Electronics Co.,Ltd F073AEPEAK-System Technik F0761CCOMPAL INFORMATION (KUNSHAN) CO., LTD F07765Sourcefire, Inc F077D0Xcellen F07BCBHon Hai Precision Ind. Co.,Ltd F07D68D-Link Corporation F07F06Cisco F07F0CLeopold Kostal GmbH &Co. KG F081AFIRZ AUTOMATION TECHNOLOGIES LTD F08261SAGEMCOM F0842FADB Broadband Italia F084C9zte corporation F08A28JIANGSU HENGSION ELECTRONIC S and T CO.,LTD F08BFECOSTEL.,CO.LTD F08CFBFiberhome Telecommunication Tech.Co.,Ltd F08EDBVeloCloud Networks F0921CHewlett Packard F0933ANxtConect F093C5Garland Technology F09CBBRaonThink Inc F09CE9Aerohive Networks Inc F09E63Cisco F0A225 F0A764GST Co., Ltd F0ACA4HBC-radiomatic F0AD4EGlobalscale Technologies, Inc F0AE51Xi3 Corp F0B479Apple F0B6EBPoslab Technology Co., Ltd F0BCC8MaxID (Pty) Ltd F0BDF1Sipod Inc F0BF97Sony Corporation F0C1F1Apple, Inc F0C24CZhejiang FeiYue Digital Technology Co., Ltd F0C27CMianyang Netop Telecom Equipment Co.,Ltd F0C88CLeddarTech Inc F0CBA1Apple F0D14FLINEAR LLC F0D1A9Apple F0D3A7CobaltRay Co., Ltd F0D3E7Sensometrix SA F0D767Axema Passagekontroll AB F0DA7CRLH INDUSTRIES,INC F0DB30Yottabyte F0DBF8Apple F0DCE2Apple F0DE71Shanghai EDO Technologies Co.,Ltd F0DEB9ShangHai Y&Y Electronics Co., Ltd F0DEF1Wistron InfoComm (Kunshan)Co F0E5C3Drägerwerk AG & Co. KG aA F0E77ESamsung Electronics Co.,Ltd F0EBD0Shanghai Feixun Communication Co.,Ltd F0EC39Essec F0ED1EBilkon Bilgisayar Kontrollu Cih. Im.Ltd F0EEBBVIPAR GmbH F0F002Hon Hai Precision Ind. Co.,Ltd F0F260Mobitec AB F0F5AEAdaptrum Inc F0F61CApple F0F644Whitesky Science & Technology Co.,Ltd F0F669Motion Analysis Corporation F0F755CISCO SYSTEMS, INC F0F7B3Phorm F0F842KEEBOX, Inc F0F9F7IES GmbH & Co. KG F0FDA0Acurix Networks LP F40321BeNeXt B.V F4044CValenceTech Limited F40669Intel Corporate F4068Ddevolo AG F406A5Hangzhou Bianfeng Networking Technology Co., Ltd F409D8Samsung Electro Mechanics co., LTD F40B93Research In Motion F40E11IEEE REGISTRATION AUTHORITY - Please see MAM public listing for more information F40F1BCisco F40F9BWAVELINK F415FDShanghai Pateo Electronic Equipment Manufacturing Co., Ltd F41BA1Apple F41E26Simon-Kaloi Engineering F41F0BYAMABISHI Corporation F41FC2Cisco F42012Cuciniale GmbH F42833MMPC Inc F42853Zioncom Electronics (Shenzhen) Ltd F42896SPECTO PAINEIS ELETRONICOS LTDA F436E1Abilis Systems SARL F437B7Apple F43814Shanghai Howell Electronic Co.,Ltd F43D80FAG Industrial Services GmbH F43E61Shenzhen Gongjin Electronics Co., Ltd F43E9DBenu Networks, Inc F44227S & S Research Inc F44450BND Co., Ltd F445EDPortable Innovation Technology Ltd F4472ANanjing Rousing Sci. and Tech. Industrial Co., Ltd F44848Amscreen Group Ltd F44EFDActions Semiconductor Co.,Ltd.(Cayman Islands) F450EBTelechips Inc F45214Mellanox Technologies, Inc F45433Rockwell Automation F45595HENGBAO Corporation LTD F4559CHuawei Technologies Co., Ltd F455E0Niceway CNC Technology Co.,Ltd.Hunan Province F45842Boxx TV Ltd F45F69Matsufu Electronics distribution Company F45FD4Cisco SPVTG F45FF7DQ Technology Inc F4600DPanoptic Technology, Inc F46349Diffon Corporation F46ABCAdonit Corp. Ltd F46D04ASUSTek COMPUTER INC F46DE2zte corporation F473CAConversion Sound Inc F47626Viltechmeda UAB F47A4EWoojeon&Handan F47ACCSolidFire, Inc F47B5ESamsung Eletronics Co., Ltd F47F35CISCO SYSTEMS, INC F48139CANON INC F48771Infoblox F48E09Nokia Corporation F490CATensorcom F490EADeciso B.V F49461NexGen Storage F49466CountMax, ltd F499ACWEBER Schraubautomaten GmbH F49F54Samsung Electronics F49FF3Huawei Technologies Co., Ltd F4A294EAGLE WORLD DEVELOPMENT CO., LIMITED F4A52AHawa Technologies Inc F4ACC1CISCO SYSTEMS, INC F4B164Lightning Telecommunications Technology Co. Ltd F4B381WindowMaster A/S F4B52FJuniper networks F4B549Yeastar Technology Co., Ltd F4B6E5TerraSem Co.,Ltd F4B72ATIME INTERCONNECT LTD F4B7E2Hon Hai Precision Ind. Co.,Ltd F4B85ETexas INstruments F4BD7CChengdu jinshi communication Co., LTD F4C447Coagent International Enterprise Limited F4C6D7blackned GmbH F4C714Shenzhen Huawei Communication Technologies Co., Ltd F4C795WEY Elektronik AG F4CAE5FREEBOX SA F4CD90Vispiron Rotec GmbH F4CE46Hewlett-Packard Company F4CFE2Cisco F4D032Yunnan Ideal Information&Technology.,Ltd F4D261SEMOCON Co., Ltd F4D9FBSamsung Electronics CO., LTD F4DC4DBeijing CCD Digital Technology Co., Ltd F4DCDAZhuhai Jiahe Communication Technology Co., limited F4DCF9Huawei Technologies Co., Ltd F4DD9EGoPro F4E142Delta Elektronika BV F4E6D7Solar Power Technologies, Inc F4EA67CISCO SYSTEMS, INC F4EC38TP-LINK TECHNOLOGIES CO., LTD F4F15AApple F4F1E1Motorola Mobility LLC F4F26DTP-LINK TECHNOLOGIES CO.,LTD F4F5A5Nokia corporation F4F5E8Google F4F646Dediprog Technology Co. Ltd F4F951Apple F4FC32Texas Instruments F4FD2BZOYI Company F80113Huawei Technologies Co., Ltd F80332Khomp F8051CDRS Imaging and Targeting Solutions F80BBEARRIS Group, Inc F80BD0Datang Telecom communication terminal (Tianjin) Co., Ltd F80CF3LG Electronics F80D43Hon Hai Precision Ind. Co., Ltd F80DEAZyCast Technology Inc F80F41Wistron InfoComm(ZhongShan) Corporation F80F84Natural Security SAS F81037Atopia Systems, LP F81547Avaya, Inc F81654Intel Corporate F81A67TP-LINK TECHNOLOGIES CO., LTD F81CE5Telefonbau Behnke GmbH F81D93Longdhua(Beijing) Controls Technology Co.,Ltd F81EDFApple F82285Cypress Technology CO., LTD F82441Yeelink F82793Apple, Inc F82BC8Jiangsu Switter Co., Ltd F82EDBRTW GmbH & Co. KG F82F5BeGauge Systems LLC F82FA8Hon Hai Precision Ind. Co.,Ltd F83094Alcatel-Lucent Telecom Limited F8313Eendeavour GmbH F83376Good Mind Innovation Co., Ltd F83553Magenta Research Ltd F835DDGemtek Technology Co., Ltd F83D4ESoftlink Automation System Co., Ltd F83DFFHuawei Technologies Co., Ltd F842FBYasuda Joho Co.,ltd F845ADKonka Group Co., Ltd F8462DSYNTEC Incorporation F8472DX2gen Digital Corp. Ltd F84897Hitachi, Ltd F84A73EUMTECH CO., LTD F84A7FInnometriks Inc F84ABFHUAWEI TECHNOLOGIES CO.,LTD F84F57Cisco F85063Verathon F8516DDenwa Technology Corp F852DFVNL Europe AB F854AFECI Telecom Ltd F8572ECore Brands, LLC F85BC9M-Cube Spa F85C45IC Nexus Co. Ltd F85F2ANokia Corporation F862AAxn systems F86601Suzhou Chi-tek information technology Co., Ltd F866D1Hon Hai Precision Ind. Co., Ltd F866F2CISCO SYSTEMS, INC F86971Seibu Electric Co., F86ECFArcx Inc F871FEThe Goldman Sachs Group, Inc F872EACisco F87394NETGEAR INC., F8769BNeopis Co., Ltd F87B62FASTWEL INTERNATIONAL CO., LTD. Taiwan Branch F87B7AARRIS Group, Inc F87B8CAmped Wireless F8811AOVERKIZ F88479Yaojin Technology(Shenzhen)Co.,Ltd F884F2Samsung Electronics Co.,Ltd F88C1CKAISHUN ELECTRONIC TECHNOLOGY CO., LTD. BEIJING F88DEFTenebraex F88E85COMTREND CORPORATION F88FCAGoogle Fiber, Inc F8912AGLP German Light Products GmbH F893F3VOLANS F89550Proton Products Chengdu Ltd F897CFDAESHIN-INFORMATION TECHNOLOGY CO., LTD F89955Fortress Technology Inc F89D0DControl Technology Inc F89FB8YAZAKI Energy System Corporation F8A03DDinstar Technologies Co., Ltd F8A2B4RHEWA-WAAGENFABRIK August Freudewald GmbH &Co. KG F8A45FBeijing Xiaomi communications co.,ltd F8A963COMPAL INFORMATION (KUNSHAN) CO., LTD F8A9D0LG Electronics F8A9DEPUISSANCE PLUS F8AA8AAxview Technology (Shenzhen) Co.,Ltd F8AC6DDeltenna Ltd F8B156Dell Inc F8B599Guangzhou CHNAVS Digital Technology Co.,Ltd F8BC12Dell Inc F8C001Juniper Networks F8C091Highgates Technology F8C288Cisco F8C678Carefusion F8D0ACSony Computer Entertainment Inc F8D0BDSamsung Electronics Co.,Ltd F8D111TP-LINK TECHNOLOGIES CO., LTD F8D3A9AXAN Networks F8D462Pumatronix Equipamentos Eletronicos Ltda F8D756Simm Tronic Limited F8D7BFREV Ritter GmbH F8DADFEcoTech, Inc F8DAE2Beta LaserMike F8DAF4Taishan Online Technology Co., Ltd F8DB4CPNY Technologies, INC F8DB7FHTC Corporation F8DB88Dell Inc F8DC7AVariscite LTD F8DFA8ZTE Corporation F8E079Motorola Mobility LLC F8E4FBActiontec Electronics, Inc F8E7B5µTech Tecnologia LTDA F8E811HUAWEI TECHNOLOGIES CO.,LTD F8E903D-Link International F8E968Egker Kft F8EA0ADipl.-Math. Michael Rauch F8EDA5ARRIS Group, Inc F8F005Newport Media Inc F8F014RackWare Inc F8F082Orion Networks International, Inc F8F1B6Motorola Mobility LLC F8F25AG-Lab GmbH F8F7D3International Communications Corporation F8F7FFSYN-TECH SYSTEMS INC F8FB2FSantur Corporation F8FE5CReciprocal Labs Corp F8FEA8Technico Japan Corporation F8FF5FShenzhen Communication Technology Co.,Ltd FC0012Toshiba Samsung Storage Technolgoy Korea Corporation FC019EVIEVU FC01CDFUNDACION TEKNIKER FC0647Cortland Research, LLC FC07A0LRE Medical GmbH FC0877Prentke Romich Company FC09D8ACTEON Group FC09F6GUANGDONG TONZE ELECTRIC CO.,LTD FC0A81Motorola Solutions Inc FC0FE6Sony Computer Entertainment Inc FC10BDControl Sistematizado S.A FC1186Logic3 plc FC1349Global Apps Corp FC15B4Hewlett Packard FC1607Taian Technology(Wuxi) Co.,Ltd FC1794InterCreative Co., Ltd FC1910Samsung Electronics Co.,Ltd FC19D0Cloud Vision Networks Technology Co.,Ltd FC1BFFV-ZUG AG FC1D59I Smart Cities HK Ltd FC1D84Autobase FC1E16IPEVO corp FC1F19SAMSUNG ELECTRO-MECHANICS CO., LTD FC1FC0EURECAM FC229CHan Kyung I Net Co.,Ltd FC2325EosTek (Shenzhen) Co., Ltd FC253FApple FC27A2TRANS ELECTRIC CO., LTD FC2A54Connected Data, Inc FC2E2DLorom Industrial Co.LTD FC2F40Calxeda, Inc FC3598Favite Inc FC35E6Visteon corp FC3FABHenan Lanxin Technology Co., Ltd FC4463Universal Audio, Inc FC4499Swarco LEA d.o.o FC455FJIANGXI SHANSHUI OPTOELECTRONIC TECHNOLOGY CO.,LTD FC48EFHUAWEI TECHNOLOGIES CO.,LTD FC4AE9Castlenet Technology Inc FC4B1CINTERSENSOR S.R.L FC4BBCSunplus Technology Co., Ltd FC4DD4Universal Global Scientific Industrial Co., Ltd FC5090SIMEX Sp. z o.o FC52CEControl iD FC58FAShen Zhen Shi Xin Zhong Xin Technology Co.,Ltd FC5B24Weibel Scientific A/S FC5B26MikroBits FC5B39Cisco FC6018Zhejiang Kangtai Electric Co., Ltd FC6198NEC Personal Products, Ltd FC626EBeijing MDC Telecom FC683EDirected Perception, Inc FC6C31LXinstruments GmbH FC6DC0BME CORPORATION FC7516D-Link International FC75E6Handreamnet FC790BHitachi High Technologies America, Inc FC7CE7FCI USA LLC FC8329Trei technics FC8399Avaya, Inc FC8B97Shenzhen Gongjin Electronics Co.,Ltd FC8E7EPace plc FC8FC4Intelligent Technology Inc FC923BNokia Corporation FC946CUBIVELOX FC94E3Technicolor USA Inc FC9947Cisco FC9FAEFidus Systems Inc FC9FE1CONWIN.Tech. Ltd FCA13ESamsung Electronics FCA841Avaya, Inc FCA9B0MIARTECH (SHANGHAI),INC FCAA14GIGA-BYTE TECHNOLOGY CO.,LTD FCAD0FQTS NETWORKS FCAF6AConemtech AB FCB0C4Shanghai DareGlobal Technologies Co., Ltd FCBBA1Shenzhen Minicreate Technology Co.,Ltd FCC23DAtmel Corporation FCC2DEMurata Manufacturing Co., Ltd FCC734Samsung Electronics Co.,Ltd FCC897ZTE Corporation FCCCE4Ascon Ltd FCCF62IBM Corp FCD4F2The Coca Cola Company FCD4F6Messana Air.Ray Conditioning s.r.l FCD5D9Shenzhen SDMC Technology Co., Ltd FCD6BDRobert Bosch GmbH FCD817Beijing Hesun Technologies Co.Ltd FCDB96ENERVALLEY CO., LTD FCDBB3Murata Manufacturing Co., Ltd FCDD55Shenzhen WeWins wireless Co.,Ltd FCE186A3M Co., LTD FCE192Sichuan Jinwangtong Electronic Science&Technology Co,.Ltd FCE1D9Stable Imaging Solutions LLC FCE23FCLAY PAKY SPA FCE557Nokia Corporation FCE892Hangzhou Lancable Technology Co.,Ltd FCEDB9Arrayent FCF152Sony Corporation FCF1CDOPTEX-FA CO.,LTD FCF528ZyXEL Communications Corporation FCF647Fiberhome Telecommunication Tech.Co.,Ltd FCF8AEIntel Corporate FCF8B7TRONTEQ Electronic FCFAF7Shanghai Baud Data Communication Co.,Ltd FCFBFBCISCO SYSTEMS, INC FCFE77Hitachi Reftechno, Inc FCFFAAIEEE REGISTRATION AUTHORITY - Please see MAL public listing for more information linssid-2.7/qwt-lib/src/qwt_magnifier.cpp000644 001750 001750 00000027047 12151666703 021414 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_magnifier.h" #include "qwt_math.h" #include #include class QwtMagnifier::PrivateData { public: PrivateData(): isEnabled( false ), wheelFactor( 0.9 ), wheelModifiers( Qt::NoModifier ), mouseFactor( 0.95 ), mouseButton( Qt::RightButton ), mouseButtonModifiers( Qt::NoModifier ), keyFactor( 0.9 ), zoomInKey( Qt::Key_Plus ), zoomInKeyModifiers( Qt::NoModifier ), zoomOutKey( Qt::Key_Minus ), zoomOutKeyModifiers( Qt::NoModifier ), mousePressed( false ) { } bool isEnabled; double wheelFactor; Qt::KeyboardModifiers wheelModifiers; double mouseFactor; Qt::MouseButton mouseButton; Qt::KeyboardModifiers mouseButtonModifiers; double keyFactor; int zoomInKey; Qt::KeyboardModifiers zoomInKeyModifiers; int zoomOutKey; Qt::KeyboardModifiers zoomOutKeyModifiers; bool mousePressed; bool hasMouseTracking; QPoint mousePos; }; /*! Constructor \param parent Widget to be magnified */ QwtMagnifier::QwtMagnifier( QWidget *parent ): QObject( parent ) { d_data = new PrivateData(); setEnabled( true ); } //! Destructor QwtMagnifier::~QwtMagnifier() { delete d_data; } /*! \brief En/disable the magnifier When enabled is true an event filter is installed for the observed widget, otherwise the event filter is removed. \param on true or false \sa isEnabled(), eventFilter() */ void QwtMagnifier::setEnabled( bool on ) { if ( d_data->isEnabled != on ) { d_data->isEnabled = on; QObject *o = parent(); if ( o ) { if ( d_data->isEnabled ) o->installEventFilter( this ); else o->removeEventFilter( this ); } } } /*! \return true when enabled, false otherwise \sa setEnabled(), eventFilter() */ bool QwtMagnifier::isEnabled() const { return d_data->isEnabled; } /*! \brief Change the wheel factor The wheel factor defines the ratio between the current range on the parent widget and the zoomed range for each step of the wheel. Use values > 1 for magnification (i.e. 2.0) and values < 1 for scaling down (i.e. 1/2.0 = 0.5). You can use this feature for inverting the direction of the wheel. The default value is 0.9. \param factor Wheel factor \sa wheelFactor(), setWheelButtonState(), setMouseFactor(), setKeyFactor() */ void QwtMagnifier::setWheelFactor( double factor ) { d_data->wheelFactor = factor; } /*! \return Wheel factor \sa setWheelFactor() */ double QwtMagnifier::wheelFactor() const { return d_data->wheelFactor; } /*! Assign keyboard modifiers for zooming in/out using the wheel. The default modifiers are Qt::NoModifiers. \param modifiers Keyboard modifiers \sa wheelModifiers() */ void QwtMagnifier::setWheelModifiers( Qt::KeyboardModifiers modifiers ) { d_data->wheelModifiers = modifiers; } /*! \return Wheel modifiers \sa setWheelModifiers() */ Qt::KeyboardModifiers QwtMagnifier::wheelModifiers() const { return d_data->wheelModifiers; } /*! \brief Change the mouse factor The mouse factor defines the ratio between the current range on the parent widget and the zoomed range for each vertical mouse movement. The default value is 0.95. \param factor Wheel factor \sa mouseFactor(), setMouseButton(), setWheelFactor(), setKeyFactor() */ void QwtMagnifier::setMouseFactor( double factor ) { d_data->mouseFactor = factor; } /*! \return Mouse factor \sa setMouseFactor() */ double QwtMagnifier::mouseFactor() const { return d_data->mouseFactor; } /*! Assign the mouse button, that is used for zooming in/out. The default value is Qt::RightButton. \param button Button \param modifiers Keyboard modifiers \sa getMouseButton() */ void QwtMagnifier::setMouseButton( Qt::MouseButton button, Qt::KeyboardModifiers modifiers ) { d_data->mouseButton = button; d_data->mouseButtonModifiers = modifiers; } //! \sa setMouseButton() void QwtMagnifier::getMouseButton( Qt::MouseButton &button, Qt::KeyboardModifiers &modifiers ) const { button = d_data->mouseButton; modifiers = d_data->mouseButtonModifiers; } /*! \brief Change the key factor The key factor defines the ratio between the current range on the parent widget and the zoomed range for each key press of the zoom in/out keys. The default value is 0.9. \param factor Key factor \sa keyFactor(), setZoomInKey(), setZoomOutKey(), setWheelFactor, setMouseFactor() */ void QwtMagnifier::setKeyFactor( double factor ) { d_data->keyFactor = factor; } /*! \return Key factor \sa setKeyFactor() */ double QwtMagnifier::keyFactor() const { return d_data->keyFactor; } /*! Assign the key, that is used for zooming in. The default combination is Qt::Key_Plus + Qt::NoModifier. \param key \param modifiers \sa getZoomInKey(), setZoomOutKey() */ void QwtMagnifier::setZoomInKey( int key, Qt::KeyboardModifiers modifiers ) { d_data->zoomInKey = key; d_data->zoomInKeyModifiers = modifiers; } /*! \brief Retrieve the settings of the zoom in key \param key Key code, see Qt::Key \param modifiers Keyboard modifiers \sa setZoomInKey() */ void QwtMagnifier::getZoomInKey( int &key, Qt::KeyboardModifiers &modifiers ) const { key = d_data->zoomInKey; modifiers = d_data->zoomInKeyModifiers; } /*! Assign the key, that is used for zooming out. The default combination is Qt::Key_Minus + Qt::NoModifier. \param key \param modifiers \sa getZoomOutKey(), setZoomOutKey() */ void QwtMagnifier::setZoomOutKey( int key, Qt::KeyboardModifiers modifiers ) { d_data->zoomOutKey = key; d_data->zoomOutKeyModifiers = modifiers; } /*! \brief Retrieve the settings of the zoom out key \param key Key code, see Qt::Key \param modifiers Keyboard modifiers \sa setZoomOutKey() */ void QwtMagnifier::getZoomOutKey( int &key, Qt::KeyboardModifiers &modifiers ) const { key = d_data->zoomOutKey; modifiers = d_data->zoomOutKeyModifiers; } /*! \brief Event filter When isEnabled() is true, the mouse events of the observed widget are filtered. \param object Object to be filtered \param event Event \return Forwarded to QObject::eventFilter() \sa widgetMousePressEvent(), widgetMouseReleaseEvent(), widgetMouseMoveEvent(), widgetWheelEvent(), widgetKeyPressEvent() widgetKeyReleaseEvent() */ bool QwtMagnifier::eventFilter( QObject *object, QEvent *event ) { if ( object && object == parent() ) { switch ( event->type() ) { case QEvent::MouseButtonPress: { widgetMousePressEvent( static_cast( event ) ); break; } case QEvent::MouseMove: { widgetMouseMoveEvent( static_cast( event ) ); break; } case QEvent::MouseButtonRelease: { widgetMouseReleaseEvent( static_cast( event ) ); break; } case QEvent::Wheel: { widgetWheelEvent( static_cast( event ) ); break; } case QEvent::KeyPress: { widgetKeyPressEvent( static_cast( event ) ); break; } case QEvent::KeyRelease: { widgetKeyReleaseEvent( static_cast( event ) ); break; } default:; } } return QObject::eventFilter( object, event ); } /*! Handle a mouse press event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMouseReleaseEvent(), widgetMouseMoveEvent() */ void QwtMagnifier::widgetMousePressEvent( QMouseEvent *mouseEvent ) { if ( parentWidget() == NULL ) return; if ( ( mouseEvent->button() != d_data->mouseButton ) || ( mouseEvent->modifiers() != d_data->mouseButtonModifiers ) ) { return; } d_data->hasMouseTracking = parentWidget()->hasMouseTracking(); parentWidget()->setMouseTracking( true ); d_data->mousePos = mouseEvent->pos(); d_data->mousePressed = true; } /*! Handle a mouse release event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseMoveEvent(), */ void QwtMagnifier::widgetMouseReleaseEvent( QMouseEvent *mouseEvent ) { Q_UNUSED( mouseEvent ); if ( d_data->mousePressed && parentWidget() ) { d_data->mousePressed = false; parentWidget()->setMouseTracking( d_data->hasMouseTracking ); } } /*! Handle a mouse move event for the observed widget. \param mouseEvent Mouse event \sa eventFilter(), widgetMousePressEvent(), widgetMouseReleaseEvent(), */ void QwtMagnifier::widgetMouseMoveEvent( QMouseEvent *mouseEvent ) { if ( !d_data->mousePressed ) return; const int dy = mouseEvent->pos().y() - d_data->mousePos.y(); if ( dy != 0 ) { double f = d_data->mouseFactor; if ( dy < 0 ) f = 1 / f; rescale( f ); } d_data->mousePos = mouseEvent->pos(); } /*! Handle a wheel event for the observed widget. \param wheelEvent Wheel event \sa eventFilter() */ void QwtMagnifier::widgetWheelEvent( QWheelEvent *wheelEvent ) { if ( wheelEvent->modifiers() != d_data->wheelModifiers ) { return; } if ( d_data->wheelFactor != 0.0 ) { /* A positive delta indicates that the wheel was rotated forwards away from the user; a negative value indicates that the wheel was rotated backwards toward the user. Most mouse types work in steps of 15 degrees, in which case the delta value is a multiple of 120 (== 15 * 8). */ double f = qPow( d_data->wheelFactor, qAbs( wheelEvent->delta() / 120.0 ) ); if ( wheelEvent->delta() > 0 ) f = 1 / f; rescale( f ); } } /*! Handle a key press event for the observed widget. \param keyEvent Key event \sa eventFilter(), widgetKeyReleaseEvent() */ void QwtMagnifier::widgetKeyPressEvent( QKeyEvent *keyEvent ) { if ( keyEvent->key() == d_data->zoomInKey && keyEvent->modifiers() == d_data->zoomInKeyModifiers ) { rescale( d_data->keyFactor ); } else if ( keyEvent->key() == d_data->zoomOutKey && keyEvent->modifiers() == d_data->zoomOutKeyModifiers ) { rescale( 1.0 / d_data->keyFactor ); } } /*! Handle a key release event for the observed widget. \param keyEvent Key event \sa eventFilter(), widgetKeyReleaseEvent() */ void QwtMagnifier::widgetKeyReleaseEvent( QKeyEvent *keyEvent ) { Q_UNUSED( keyEvent ); } //! \return Parent widget, where the rescaling happens QWidget *QwtMagnifier::parentWidget() { return qobject_cast( parent() ); } //! \return Parent widget, where the rescaling happens const QWidget *QwtMagnifier::parentWidget() const { return qobject_cast( parent() ); } linssid-2.7/qwt-lib/src/qwt_plot_renderer.h000644 001750 001750 00000010635 12151666702 021756 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_RENDERER_H #define QWT_PLOT_RENDERER_H #include "qwt_global.h" #include #include class QwtPlot; class QwtScaleMap; class QRectF; class QPainter; class QPaintDevice; #ifndef QT_NO_PRINTER class QPrinter; #endif #ifndef QWT_NO_SVG #ifdef QT_SVG_LIB class QSvgGenerator; #endif #endif /*! \brief Renderer for exporting a plot to a document, a printer or anything else, that is supported by QPainter/QPaintDevice */ class QWT_EXPORT QwtPlotRenderer: public QObject { Q_OBJECT public: //! Disard flags enum DiscardFlag { //! Render all components of the plot DiscardNone = 0x00, //! Don't render the background of the plot DiscardBackground = 0x01, //! Don't render the title of the plot DiscardTitle = 0x02, //! Don't render the legend of the plot DiscardLegend = 0x04, //! Don't render the background of the canvas DiscardCanvasBackground = 0x08, //! Don't render the footer of the plot DiscardFooter = 0x10, /*! Don't render the frame of the canvas \note This flag has no effect when using style sheets, where the frame is part of the background */ DiscardCanvasFrame = 0x20 }; //! Disard flags typedef QFlags DiscardFlags; /*! \brief Layout flags \sa setLayoutFlag(), testLayoutFlag() */ enum LayoutFlag { //! Use the default layout as on screen DefaultLayout = 0x00, /*! Instead of the scales a box is painted around the plot canvas, where the scale ticks are aligned to. */ FrameWithScales = 0x01 }; //! Layout flags typedef QFlags LayoutFlags; explicit QwtPlotRenderer( QObject * = NULL ); virtual ~QwtPlotRenderer(); void setDiscardFlag( DiscardFlag flag, bool on = true ); bool testDiscardFlag( DiscardFlag flag ) const; void setDiscardFlags( DiscardFlags flags ); DiscardFlags discardFlags() const; void setLayoutFlag( LayoutFlag flag, bool on = true ); bool testLayoutFlag( LayoutFlag flag ) const; void setLayoutFlags( LayoutFlags flags ); LayoutFlags layoutFlags() const; void renderDocument( QwtPlot *, const QString &fileName, const QSizeF &sizeMM, int resolution = 85 ); void renderDocument( QwtPlot *, const QString &fileName, const QString &format, const QSizeF &sizeMM, int resolution = 85 ); #ifndef QWT_NO_SVG #ifdef QT_SVG_LIB #if QT_VERSION >= 0x040500 void renderTo( QwtPlot *, QSvgGenerator & ) const; #endif #endif #endif #ifndef QT_NO_PRINTER void renderTo( QwtPlot *, QPrinter & ) const; #endif void renderTo( QwtPlot *, QPaintDevice &p ) const; virtual void render( QwtPlot *, QPainter *, const QRectF &rect ) const; virtual void renderTitle( const QwtPlot *, QPainter *, const QRectF & ) const; virtual void renderFooter( const QwtPlot *, QPainter *, const QRectF & ) const; virtual void renderScale( const QwtPlot *, QPainter *, int axisId, int startDist, int endDist, int baseDist, const QRectF & ) const; virtual void renderCanvas( const QwtPlot *, QPainter *, const QRectF &canvasRect, const QwtScaleMap* maps ) const; virtual void renderLegend( const QwtPlot *, QPainter *, const QRectF & ) const; bool exportTo( QwtPlot *, const QString &documentName, const QSizeF &sizeMM = QSizeF( 300, 200 ), int resolution = 85 ); private: void buildCanvasMaps( const QwtPlot *, const QRectF &, QwtScaleMap maps[] ) const; bool updateCanvasMargins( QwtPlot *, const QRectF &, const QwtScaleMap maps[] ) const; private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotRenderer::DiscardFlags ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotRenderer::LayoutFlags ) #endif linssid-2.7/qwt-lib/src/qwt_plot_marker.h000644 001750 001750 00000006553 12151666702 021435 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_MARKER_H #define QWT_PLOT_MARKER_H #include #include #include #include #include "qwt_global.h" #include "qwt_plot_item.h" class QRectF; class QwtText; class QwtSymbol; /*! \brief A class for drawing markers A marker can be a horizontal line, a vertical line, a symbol, a label or any combination of them, which can be drawn around a center point inside a bounding rectangle. The setSymbol() member assigns a symbol to the marker. The symbol is drawn at the specified point. With setLabel(), a label can be assigned to the marker. The setLabelAlignment() member specifies where the label is drawn. All the Align*-constants in Qt::AlignmentFlags (see Qt documentation) are valid. The interpretation of the alignment depends on the marker's line style. The alignment refers to the center point of the marker, which means, for example, that the label would be printed left above the center point if the alignment was set to Qt::AlignLeft | Qt::AlignTop. \note QwtPlotTextLabel is intended to align a text label according to the geometry of canvas ( unrelated to plot coordinates ) */ class QWT_EXPORT QwtPlotMarker: public QwtPlotItem { public: /*! Line styles. \sa setLineStyle(), lineStyle() */ enum LineStyle { //! No line NoLine, //! A horizontal line HLine, //! A vertical line VLine, //! A crosshair Cross }; explicit QwtPlotMarker( const QString &title = QString::null ); explicit QwtPlotMarker( const QwtText &title ); virtual ~QwtPlotMarker(); virtual int rtti() const; double xValue() const; double yValue() const; QPointF value() const; void setXValue( double ); void setYValue( double ); void setValue( double, double ); void setValue( const QPointF & ); void setLineStyle( LineStyle st ); LineStyle lineStyle() const; void setLinePen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setLinePen( const QPen &p ); const QPen &linePen() const; void setSymbol( const QwtSymbol * ); const QwtSymbol *symbol() const; void setLabel( const QwtText& ); QwtText label() const; void setLabelAlignment( Qt::Alignment ); Qt::Alignment labelAlignment() const; void setLabelOrientation( Qt::Orientation ); Qt::Orientation labelOrientation() const; void setSpacing( int ); int spacing() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF & ) const; virtual QRectF boundingRect() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: virtual void drawLines( QPainter *, const QRectF &, const QPointF & ) const; virtual void drawLabel( QPainter *, const QRectF &, const QPointF & ) const; private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_picker.cpp000644 001750 001750 00000021661 12151666703 021762 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_picker.h" #include "qwt_plot.h" #include "qwt_scale_div.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include "qwt_picker_machine.h" /*! \brief Create a plot picker The picker is set to those x- and y-axis of the plot that are enabled. If both or no x-axis are enabled, the picker is set to QwtPlot::xBottom. If both or no y-axis are enabled, it is set to QwtPlot::yLeft. \param canvas Plot canvas to observe, also the parent object \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect() */ QwtPlotPicker::QwtPlotPicker( QWidget *canvas ): QwtPicker( canvas ), d_xAxis( -1 ), d_yAxis( -1 ) { if ( !canvas ) return; // attach axes int xAxis = QwtPlot::xBottom; const QwtPlot *plot = QwtPlotPicker::plot(); if ( !plot->axisEnabled( QwtPlot::xBottom ) && plot->axisEnabled( QwtPlot::xTop ) ) { xAxis = QwtPlot::xTop; } int yAxis = QwtPlot::yLeft; if ( !plot->axisEnabled( QwtPlot::yLeft ) && plot->axisEnabled( QwtPlot::yRight ) ) { yAxis = QwtPlot::yRight; } setAxis( xAxis, yAxis ); } /*! Create a plot picker \param xAxis Set the x axis of the picker \param yAxis Set the y axis of the picker \param canvas Plot canvas to observe, also the parent object \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect() */ QwtPlotPicker::QwtPlotPicker( int xAxis, int yAxis, QWidget *canvas ): QwtPicker( canvas ), d_xAxis( xAxis ), d_yAxis( yAxis ) { } /*! Create a plot picker \param xAxis X axis of the picker \param yAxis Y axis of the picker \param rubberBand Rubber band style \param trackerMode Tracker mode \param canvas Plot canvas to observe, also the parent object \sa QwtPicker, QwtPicker::setSelectionFlags(), QwtPicker::setRubberBand(), QwtPicker::setTrackerMode \sa QwtPlot::autoReplot(), QwtPlot::replot(), scaleRect() */ QwtPlotPicker::QwtPlotPicker( int xAxis, int yAxis, RubberBand rubberBand, DisplayMode trackerMode, QWidget *canvas ): QwtPicker( rubberBand, trackerMode, canvas ), d_xAxis( xAxis ), d_yAxis( yAxis ) { } //! Destructor QwtPlotPicker::~QwtPlotPicker() { } //! \return Observed plot canvas QWidget *QwtPlotPicker::canvas() { return parentWidget(); } //! \return Observed plot canvas const QWidget *QwtPlotPicker::canvas() const { return parentWidget(); } //! \return Plot widget, containing the observed plot canvas QwtPlot *QwtPlotPicker::plot() { QWidget *w = canvas(); if ( w ) w = w->parentWidget(); return qobject_cast( w ); } //! \return Plot widget, containing the observed plot canvas const QwtPlot *QwtPlotPicker::plot() const { const QWidget *w = canvas(); if ( w ) w = w->parentWidget(); return qobject_cast( w ); } /*! \return Normalized bounding rectangle of the axes \sa QwtPlot::autoReplot(), QwtPlot::replot(). */ QRectF QwtPlotPicker::scaleRect() const { QRectF rect; if ( plot() ) { const QwtScaleDiv &xs = plot()->axisScaleDiv( xAxis() ); const QwtScaleDiv &ys = plot()->axisScaleDiv( yAxis() ); rect = QRectF( xs.lowerBound(), ys.lowerBound(), xs.range(), ys.range() ); rect = rect.normalized(); } return rect; } /*! Set the x and y axes of the picker \param xAxis X axis \param yAxis Y axis */ void QwtPlotPicker::setAxis( int xAxis, int yAxis ) { const QwtPlot *plt = plot(); if ( !plt ) return; if ( xAxis != d_xAxis || yAxis != d_yAxis ) { d_xAxis = xAxis; d_yAxis = yAxis; } } //! Return x axis int QwtPlotPicker::xAxis() const { return d_xAxis; } //! Return y axis int QwtPlotPicker::yAxis() const { return d_yAxis; } /*! Translate a pixel position into a position string \param pos Position in pixel coordinates \return Position string */ QwtText QwtPlotPicker::trackerText( const QPoint &pos ) const { return trackerTextF( invTransform( pos ) ); } /*! \brief Translate a position into a position string In case of HLineRubberBand the label is the value of the y position, in case of VLineRubberBand the value of the x position. Otherwise the label contains x and y position separated by a ',' . The format for the double to string conversion is "%.4f". \param pos Position \return Position string */ QwtText QwtPlotPicker::trackerTextF( const QPointF &pos ) const { QString text; switch ( rubberBand() ) { case HLineRubberBand: text.sprintf( "%.4f", pos.y() ); break; case VLineRubberBand: text.sprintf( "%.4f", pos.x() ); break; default: text.sprintf( "%.4f, %.4f", pos.x(), pos.y() ); } return QwtText( text ); } /*! Append a point to the selection and update rubber band and tracker. \param pos Additional point \sa isActive, begin(), end(), move(), appended() \note The appended(const QPoint &), appended(const QDoublePoint &) signals are emitted. */ void QwtPlotPicker::append( const QPoint &pos ) { QwtPicker::append( pos ); Q_EMIT appended( invTransform( pos ) ); } /*! Move the last point of the selection \param pos New position \sa isActive, begin(), end(), append() \note The moved(const QPoint &), moved(const QDoublePoint &) signals are emitted. */ void QwtPlotPicker::move( const QPoint &pos ) { QwtPicker::move( pos ); Q_EMIT moved( invTransform( pos ) ); } /*! Close a selection setting the state to inactive. \param ok If true, complete the selection and emit selected signals otherwise discard the selection. \return True if the selection has been accepted, false otherwise */ bool QwtPlotPicker::end( bool ok ) { ok = QwtPicker::end( ok ); if ( !ok ) return false; QwtPlot *plot = QwtPlotPicker::plot(); if ( !plot ) return false; const QPolygon points = selection(); if ( points.count() == 0 ) return false; QwtPickerMachine::SelectionType selectionType = QwtPickerMachine::NoSelection; if ( stateMachine() ) selectionType = stateMachine()->selectionType(); switch ( selectionType ) { case QwtPickerMachine::PointSelection: { const QPointF pos = invTransform( points.first() ); Q_EMIT selected( pos ); break; } case QwtPickerMachine::RectSelection: { if ( points.count() >= 2 ) { const QPoint p1 = points.first(); const QPoint p2 = points.last(); const QRect rect = QRect( p1, p2 ).normalized(); Q_EMIT selected( invTransform( rect ) ); } break; } case QwtPickerMachine::PolygonSelection: { QVector dpa( points.count() ); for ( int i = 0; i < points.count(); i++ ) dpa[i] = invTransform( points[i] ); Q_EMIT selected( dpa ); } default: break; } return true; } /*! Translate a rectangle from pixel into plot coordinates \return Rectangle in plot coordinates \sa transform() */ QRectF QwtPlotPicker::invTransform( const QRect &rect ) const { const QwtScaleMap xMap = plot()->canvasMap( d_xAxis ); const QwtScaleMap yMap = plot()->canvasMap( d_yAxis ); return QwtScaleMap::invTransform( xMap, yMap, rect ); } /*! Translate a rectangle from plot into pixel coordinates \return Rectangle in pixel coordinates \sa invTransform() */ QRect QwtPlotPicker::transform( const QRectF &rect ) const { const QwtScaleMap xMap = plot()->canvasMap( d_xAxis ); const QwtScaleMap yMap = plot()->canvasMap( d_yAxis ); return QwtScaleMap::transform( xMap, yMap, rect ).toRect(); } /*! Translate a point from pixel into plot coordinates \return Point in plot coordinates \sa transform() */ QPointF QwtPlotPicker::invTransform( const QPoint &pos ) const { QwtScaleMap xMap = plot()->canvasMap( d_xAxis ); QwtScaleMap yMap = plot()->canvasMap( d_yAxis ); return QPointF( xMap.invTransform( pos.x() ), yMap.invTransform( pos.y() ) ); } /*! Translate a point from plot into pixel coordinates \return Point in pixel coordinates \sa invTransform() */ QPoint QwtPlotPicker::transform( const QPointF &pos ) const { QwtScaleMap xMap = plot()->canvasMap( d_xAxis ); QwtScaleMap yMap = plot()->canvasMap( d_yAxis ); const QPointF p( xMap.transform( pos.x() ), yMap.transform( pos.y() ) ); return p.toPoint(); } linssid-2.7/qwt-lib/COPYING000644 001750 001750 00000066452 12151666700 016320 0ustar00warrenwarren000000 000000 Qwt License Version 1.0, January 1, 2003 The Qwt library and included programs are provided under the terms of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) with the following exceptions: 1. Widgets that are subclassed from Qwt widgets do not constitute a derivative work. 2. Static linking of applications and widgets to the Qwt library does not constitute a derivative work and does not require the author to provide source code for the application or widget, use the shared Qwt libraries, or link their applications or widgets against a user-supplied version of Qwt. If you link the application or widget to a modified version of Qwt, then the changes to Qwt must be provided under the terms of the LGPL in sections 1, 2, and 4. 3. You do not have to provide a copy of the Qwt license with programs that are linked to the Qwt library, nor do you have to identify the Qwt license in your program or documentation as required by section 6 of the LGPL. However, programs must still identify their use of Qwt. The following example statement can be included in user documentation to satisfy this requirement: [program/widget] is based in part on the work of the Qwt project (http://qwt.sf.net). ---------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! linssid-2.7/qwt-lib/src/qwt_interval.cpp000644 001750 001750 00000020370 12151666703 021267 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_interval.h" #include "qwt_math.h" #include /*! \brief Normalize the limits of the interval If maxValue() < minValue() the limits will be inverted. \return Normalized interval \sa isValid(), inverted() */ QwtInterval QwtInterval::normalized() const { if ( d_minValue > d_maxValue ) { return inverted(); } if ( d_minValue == d_maxValue && d_borderFlags == ExcludeMinimum ) { return inverted(); } return *this; } /*! Invert the limits of the interval \return Inverted interval \sa normalized() */ QwtInterval QwtInterval::inverted() const { BorderFlags borderFlags = IncludeBorders; if ( d_borderFlags & ExcludeMinimum ) borderFlags |= ExcludeMaximum; if ( d_borderFlags & ExcludeMaximum ) borderFlags |= ExcludeMinimum; return QwtInterval( d_maxValue, d_minValue, borderFlags ); } /*! Test if a value is inside an interval \param value Value \return true, if value >= minValue() && value <= maxValue() */ bool QwtInterval::contains( double value ) const { if ( !isValid() ) return false; if ( value < d_minValue || value > d_maxValue ) return false; if ( value == d_minValue && d_borderFlags & ExcludeMinimum ) return false; if ( value == d_maxValue && d_borderFlags & ExcludeMaximum ) return false; return true; } //! Unite 2 intervals QwtInterval QwtInterval::unite( const QwtInterval &other ) const { /* If one of the intervals is invalid return the other one. If both are invalid return an invalid default interval */ if ( !isValid() ) { if ( !other.isValid() ) return QwtInterval(); else return other; } if ( !other.isValid() ) return *this; QwtInterval united; BorderFlags flags = IncludeBorders; // minimum if ( d_minValue < other.minValue() ) { united.setMinValue( d_minValue ); flags &= d_borderFlags & ExcludeMinimum; } else if ( other.minValue() < d_minValue ) { united.setMinValue( other.minValue() ); flags &= other.borderFlags() & ExcludeMinimum; } else // d_minValue == other.minValue() { united.setMinValue( d_minValue ); flags &= ( d_borderFlags & other.borderFlags() ) & ExcludeMinimum; } // maximum if ( d_maxValue > other.maxValue() ) { united.setMaxValue( d_maxValue ); flags &= d_borderFlags & ExcludeMaximum; } else if ( other.maxValue() > d_maxValue ) { united.setMaxValue( other.maxValue() ); flags &= other.borderFlags() & ExcludeMaximum; } else // d_maxValue == other.maxValue() ) { united.setMaxValue( d_maxValue ); flags &= d_borderFlags & other.borderFlags() & ExcludeMaximum; } united.setBorderFlags( flags ); return united; } /*! \brief Intersect 2 intervals \param other Interval to be intersect with \return Intersection */ QwtInterval QwtInterval::intersect( const QwtInterval &other ) const { if ( !other.isValid() || !isValid() ) return QwtInterval(); QwtInterval i1 = *this; QwtInterval i2 = other; // swap i1/i2, so that the minimum of i1 // is smaller then the minimum of i2 if ( i1.minValue() > i2.minValue() ) { qSwap( i1, i2 ); } else if ( i1.minValue() == i2.minValue() ) { if ( i1.borderFlags() & ExcludeMinimum ) qSwap( i1, i2 ); } if ( i1.maxValue() < i2.minValue() ) { return QwtInterval(); } if ( i1.maxValue() == i2.minValue() ) { if ( i1.borderFlags() & ExcludeMaximum || i2.borderFlags() & ExcludeMinimum ) { return QwtInterval(); } } QwtInterval intersected; BorderFlags flags = IncludeBorders; intersected.setMinValue( i2.minValue() ); flags |= i2.borderFlags() & ExcludeMinimum; if ( i1.maxValue() < i2.maxValue() ) { intersected.setMaxValue( i1.maxValue() ); flags |= i1.borderFlags() & ExcludeMaximum; } else if ( i2.maxValue() < i1.maxValue() ) { intersected.setMaxValue( i2.maxValue() ); flags |= i2.borderFlags() & ExcludeMaximum; } else // i1.maxValue() == i2.maxValue() { intersected.setMaxValue( i1.maxValue() ); flags |= i1.borderFlags() & i2.borderFlags() & ExcludeMaximum; } intersected.setBorderFlags( flags ); return intersected; } /*! \brief Unite this interval with the given interval. \param other Interval to be united with \return This interval */ QwtInterval& QwtInterval::operator|=( const QwtInterval &other ) { *this = *this | other; return *this; } /*! \brief Intersect this interval with the given interval. \param other Interval to be intersected with \return This interval */ QwtInterval& QwtInterval::operator&=( const QwtInterval &other ) { *this = *this & other; return *this; } /*! \brief Test if two intervals overlap \param other Interval \return True, when the intervals are intersecting */ bool QwtInterval::intersects( const QwtInterval &other ) const { if ( !isValid() || !other.isValid() ) return false; QwtInterval i1 = *this; QwtInterval i2 = other; // swap i1/i2, so that the minimum of i1 // is smaller then the minimum of i2 if ( i1.minValue() > i2.minValue() ) { qSwap( i1, i2 ); } else if ( i1.minValue() == i2.minValue() && i1.borderFlags() & ExcludeMinimum ) { qSwap( i1, i2 ); } if ( i1.maxValue() > i2.minValue() ) { return true; } if ( i1.maxValue() == i2.minValue() ) { return !( ( i1.borderFlags() & ExcludeMaximum ) || ( i2.borderFlags() & ExcludeMinimum ) ); } return false; } /*! Adjust the limit that is closer to value, so that value becomes the center of the interval. \param value Center \return Interval with value as center */ QwtInterval QwtInterval::symmetrize( double value ) const { if ( !isValid() ) return *this; const double delta = qMax( qAbs( value - d_maxValue ), qAbs( value - d_minValue ) ); return QwtInterval( value - delta, value + delta ); } /*! Limit the interval, keeping the border modes \param lowerBound Lower limit \param upperBound Upper limit \return Limited interval */ QwtInterval QwtInterval::limited( double lowerBound, double upperBound ) const { if ( !isValid() || lowerBound > upperBound ) return QwtInterval(); double minValue = qMax( d_minValue, lowerBound ); minValue = qMin( minValue, upperBound ); double maxValue = qMax( d_maxValue, lowerBound ); maxValue = qMin( maxValue, upperBound ); return QwtInterval( minValue, maxValue, d_borderFlags ); } /*! \brief Extend the interval If value is below minValue(), value becomes the lower limit. If value is above maxValue(), value becomes the upper limit. extend() has no effect for invalid intervals \param value Value \return extended interval \sa isValid() */ QwtInterval QwtInterval::extend( double value ) const { if ( !isValid() ) return *this; return QwtInterval( qMin( value, d_minValue ), qMax( value, d_maxValue ), d_borderFlags ); } /*! Extend an interval \param value Value \return Reference of the extended interval \sa extend() */ QwtInterval& QwtInterval::operator|=( double value ) { *this = *this | value; return *this; } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtInterval &interval ) { const int flags = interval.borderFlags(); debug.nospace() << "QwtInterval(" << ( ( flags & QwtInterval::ExcludeMinimum ) ? "]" : "[" ) << interval.minValue() << "," << interval.maxValue() << ( ( flags & QwtInterval::ExcludeMaximum ) ? "[" : "]" ) << ")"; return debug.space(); } #endif linssid-2.7/qwt-lib/src/qwt_plot_picker.h000644 001750 001750 00000005366 12151666702 021432 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_PICKER_H #define QWT_PLOT_PICKER_H #include "qwt_global.h" #include "qwt_picker.h" #include class QwtPlot; /*! \brief QwtPlotPicker provides selections on a plot canvas QwtPlotPicker is a QwtPicker tailored for selections on a plot canvas. It is set to a x-Axis and y-Axis and translates all pixel coordinates into this coordinate system. */ class QWT_EXPORT QwtPlotPicker: public QwtPicker { Q_OBJECT public: explicit QwtPlotPicker( QWidget *canvas ); virtual ~QwtPlotPicker(); explicit QwtPlotPicker( int xAxis, int yAxis, QWidget * ); explicit QwtPlotPicker( int xAxis, int yAxis, RubberBand rubberBand, DisplayMode trackerMode, QWidget * ); virtual void setAxis( int xAxis, int yAxis ); int xAxis() const; int yAxis() const; QwtPlot *plot(); const QwtPlot *plot() const; QWidget *canvas(); const QWidget *canvas() const; Q_SIGNALS: /*! A signal emitted in case of QwtPickerMachine::PointSelection. \param pos Selected point */ void selected( const QPointF &pos ); /*! A signal emitted in case of QwtPickerMachine::RectSelection. \param rect Selected rectangle */ void selected( const QRectF &rect ); /*! A signal emitting the selected points, at the end of a selection. \param pa Selected points */ void selected( const QVector &pa ); /*! A signal emitted when a point has been appended to the selection \param pos Position of the appended point. \sa append(). moved() */ void appended( const QPointF &pos ); /*! A signal emitted whenever the last appended point of the selection has been moved. \param pos Position of the moved last point of the selection. \sa move(), appended() */ void moved( const QPointF &pos ); protected: QRectF scaleRect() const; QRectF invTransform( const QRect & ) const; QRect transform( const QRectF & ) const; QPointF invTransform( const QPoint & ) const; QPoint transform( const QPointF & ) const; virtual QwtText trackerText( const QPoint & ) const; virtual QwtText trackerTextF( const QPointF & ) const; virtual void move( const QPoint & ); virtual void append( const QPoint & ); virtual bool end( bool ok = true ); private: int d_xAxis; int d_yAxis; }; #endif linssid-2.7/qwt-lib/src/qwt_abstract_scale_draw.h000644 001750 001750 00000007036 12151666701 023101 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SCALE_DRAW_H #define QWT_ABSTRACT_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_scale_div.h" #include "qwt_text.h" class QPalette; class QPainter; class QFont; class QwtTransform; class QwtScaleMap; /*! \brief A abstract base class for drawing scales QwtAbstractScaleDraw can be used to draw linear or logarithmic scales. After a scale division has been specified as a QwtScaleDiv object using setScaleDiv(), the scale can be drawn with the draw() member. */ class QWT_EXPORT QwtAbstractScaleDraw { public: /*! Components of a scale \sa enableComponent(), hasComponent */ enum ScaleComponent { //! Backbone = the line where the ticks are located Backbone = 0x01, //! Ticks Ticks = 0x02, //! Labels Labels = 0x04 }; //! Scale components typedef QFlags ScaleComponents; QwtAbstractScaleDraw(); virtual ~QwtAbstractScaleDraw(); void setScaleDiv( const QwtScaleDiv &s ); const QwtScaleDiv& scaleDiv() const; void setTransformation( QwtTransform * ); const QwtScaleMap &scaleMap() const; QwtScaleMap &scaleMap(); void enableComponent( ScaleComponent, bool enable = true ); bool hasComponent( ScaleComponent ) const; void setTickLength( QwtScaleDiv::TickType, double length ); double tickLength( QwtScaleDiv::TickType ) const; double maxTickLength() const; void setSpacing( double margin ); double spacing() const; void setPenWidth( int width ); int penWidth() const; virtual void draw( QPainter *, const QPalette & ) const; virtual QwtText label( double ) const; /*! Calculate the extent The extent is the distance from the baseline to the outermost pixel of the scale draw in opposite to its orientation. It is at least minimumExtent() pixels. \param font Font used for drawing the tick labels \return Number of pixels \sa setMinimumExtent(), minimumExtent() */ virtual double extent( const QFont &font ) const = 0; void setMinimumExtent( double ); double minimumExtent() const; protected: /*! Draw a tick \param painter Painter \param value Value of the tick \param len Length of the tick \sa drawBackbone(), drawLabel() */ virtual void drawTick( QPainter *painter, double value, double len ) const = 0; /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ virtual void drawBackbone( QPainter *painter ) const = 0; /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone() */ virtual void drawLabel( QPainter *painter, double value ) const = 0; void invalidateCache(); const QwtText &tickLabel( const QFont &, double value ) const; private: QwtAbstractScaleDraw( const QwtAbstractScaleDraw & ); QwtAbstractScaleDraw &operator=( const QwtAbstractScaleDraw & ); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtAbstractScaleDraw::ScaleComponents ) #endif linssid-2.7/qwt-lib/src/qwt_raster_data.h000644 001750 001750 00000005174 12151666701 021404 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_RASTER_DATA_H #define QWT_RASTER_DATA_H 1 #include "qwt_global.h" #include "qwt_interval.h" #include #include #include class QwtScaleMap; /*! \brief QwtRasterData defines an interface to any type of raster data. QwtRasterData is an abstract interface, that is used by QwtPlotRasterItem to find the values at the pixels of its raster. Often a raster item is used to display values from a matrix. Then the derived raster data class needs to implement some sort of resampling, that maps the raster of the matrix into the requested raster of the raster item ( depending on resolution and scales of the canvas ). */ class QWT_EXPORT QwtRasterData { public: //! Contour lines typedef QMap ContourLines; //! Flags to modify the contour algorithm enum ConrecFlag { //! Ignore all vertices on the same level IgnoreAllVerticesOnLevel = 0x01, //! Ignore all values, that are out of range IgnoreOutOfRange = 0x02 }; //! Flags to modify the contour algorithm typedef QFlags ConrecFlags; QwtRasterData(); virtual ~QwtRasterData(); virtual void setInterval( Qt::Axis, const QwtInterval & ); const QwtInterval &interval(Qt::Axis) const; virtual QRectF pixelHint( const QRectF & ) const; virtual void initRaster( const QRectF &, const QSize& raster ); virtual void discardRaster(); /*! \return the value at a raster position \param x X value in plot coordinates \param y Y value in plot coordinates */ virtual double value( double x, double y ) const = 0; virtual ContourLines contourLines( const QRectF &rect, const QSize &raster, const QList &levels, ConrecFlags ) const; class Contour3DPoint; class ContourPlane; private: // Disabled copy constructor and operator= QwtRasterData( const QwtRasterData & ); QwtRasterData &operator=( const QwtRasterData & ); QwtInterval d_intervals[3]; }; /*! \return Bounding interval for a axis \sa setInterval */ inline const QwtInterval &QwtRasterData::interval( Qt::Axis axis) const { return d_intervals[axis]; } Q_DECLARE_OPERATORS_FOR_FLAGS( QwtRasterData::ConrecFlags ) #endif linssid-2.7/linssid-app/linssid.desktop000664 001750 001750 00000000425 12366756254 021173 0ustar00warrenwarren000000 000000 #!/usr/bin/env xdg-open [Desktop Entry] Encoding=UTF-8 Version=2.7 Name=LinSSID GenericName= Comment=Find local wireless attach points Exec=linssid Icon=/usr/share/pixmaps/linssid48.png Terminal=false Type=Application Categories=Application;Network;Internet; Name[en]=LinSSID linssid-2.7/qwt-lib/src/qwt_graphic.cpp000644 001750 001750 00000061475 12151666703 021073 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_graphic.h" #include "qwt_painter_command.h" #include #include #include #include #include #include #include static bool qwtHasScalablePen( const QPainter *painter ) { const QPen pen = painter->pen(); bool scalablePen = false; if ( pen.style() != Qt::NoPen && pen.brush().style() != Qt::NoBrush ) { scalablePen = !pen.isCosmetic(); if ( !scalablePen && pen.widthF() == 0.0 ) { const QPainter::RenderHints hints = painter->renderHints(); if ( hints.testFlag( QPainter::NonCosmeticDefaultPen ) ) scalablePen = true; } } return scalablePen; } static QRectF qwtStrokedPathRect( const QPainter *painter, const QPainterPath &path ) { QPainterPathStroker stroker; stroker.setWidth( painter->pen().widthF() ); stroker.setCapStyle( painter->pen().capStyle() ); stroker.setJoinStyle( painter->pen().joinStyle() ); stroker.setMiterLimit( painter->pen().miterLimit() ); QRectF rect; if ( qwtHasScalablePen( painter ) ) { QPainterPath stroke = stroker.createStroke(path); rect = painter->transform().map(stroke).boundingRect(); } else { QPainterPath mappedPath = painter->transform().map(path); mappedPath = stroker.createStroke( mappedPath ); rect = mappedPath.boundingRect(); } return rect; } static inline void qwtExecCommand( QPainter *painter, const QwtPainterCommand &cmd, QwtGraphic::RenderHints renderHints, const QTransform &transform ) { switch( cmd.type() ) { case QwtPainterCommand::Path: { bool doMap = false; if ( renderHints.testFlag( QwtGraphic::RenderPensUnscaled ) && painter->transform().isScaling() ) { bool isCosmetic = painter->pen().isCosmetic(); if ( isCosmetic && painter->pen().widthF() == 0.0 ) { QPainter::RenderHints hints = painter->renderHints(); if ( hints.testFlag( QPainter::NonCosmeticDefaultPen ) ) isCosmetic = false; } doMap = !isCosmetic; } if ( doMap ) { const QTransform transform = painter->transform(); painter->resetTransform(); painter->drawPath( transform.map( *cmd.path() ) ); painter->setTransform( transform ); } else { painter->drawPath( *cmd.path() ); } break; } case QwtPainterCommand::Pixmap: { const QwtPainterCommand::PixmapData *data = cmd.pixmapData(); painter->drawPixmap( data->rect, data->pixmap, data->subRect ); break; } case QwtPainterCommand::Image: { const QwtPainterCommand::ImageData *data = cmd.imageData(); painter->drawImage( data->rect, data->image, data->subRect, data->flags ); break; } case QwtPainterCommand::State: { const QwtPainterCommand::StateData *data = cmd.stateData(); if ( data->flags & QPaintEngine::DirtyPen ) painter->setPen( data->pen ); if ( data->flags & QPaintEngine::DirtyBrush ) painter->setBrush( data->brush ); if ( data->flags & QPaintEngine::DirtyBrushOrigin ) painter->setBrushOrigin( data->brushOrigin ); if ( data->flags & QPaintEngine::DirtyFont ) painter->setFont( data->font ); if ( data->flags & QPaintEngine::DirtyBackground ) { painter->setBackgroundMode( data->backgroundMode ); painter->setBackground( data->backgroundBrush ); } if ( data->flags & QPaintEngine::DirtyTransform ) { painter->setTransform( data->transform * transform ); } if ( data->flags & QPaintEngine::DirtyClipEnabled ) painter->setClipping( data->isClipEnabled ); if ( data->flags & QPaintEngine::DirtyClipRegion) { painter->setClipRegion( data->clipRegion, data->clipOperation ); } if ( data->flags & QPaintEngine::DirtyClipPath ) { painter->setClipPath( data->clipPath, data->clipOperation ); } if ( data->flags & QPaintEngine::DirtyHints) { const QPainter::RenderHints hints = data->renderHints; painter->setRenderHint( QPainter::Antialiasing, hints.testFlag( QPainter::Antialiasing ) ); painter->setRenderHint( QPainter::TextAntialiasing, hints.testFlag( QPainter::TextAntialiasing ) ); painter->setRenderHint( QPainter::SmoothPixmapTransform, hints.testFlag( QPainter::SmoothPixmapTransform ) ); painter->setRenderHint( QPainter::HighQualityAntialiasing, hints.testFlag( QPainter::HighQualityAntialiasing ) ); painter->setRenderHint( QPainter::NonCosmeticDefaultPen, hints.testFlag( QPainter::NonCosmeticDefaultPen ) ); } if ( data->flags & QPaintEngine::DirtyCompositionMode) painter->setCompositionMode( data->compositionMode ); if ( data->flags & QPaintEngine::DirtyOpacity) painter->setOpacity( data->opacity ); break; } default: break; } } class QwtGraphic::PathInfo { public: PathInfo(): d_scalablePen( false ) { // QVector needs a default constructor } PathInfo( const QRectF &pointRect, const QRectF &boundingRect, bool scalablePen ): d_pointRect( pointRect ), d_boundingRect( boundingRect ), d_scalablePen( scalablePen ) { } inline QRectF scaledBoundingRect( double sx, double sy, bool scalePens ) const { if ( sx == 1.0 && sy == 1.0 ) return d_boundingRect; QTransform transform; transform.scale( sx, sy ); QRectF rect; if ( scalePens && d_scalablePen ) { rect = transform.mapRect( d_boundingRect ); } else { rect = transform.mapRect( d_pointRect ); const double l = qAbs( d_pointRect.left() - d_boundingRect.left() ); const double r = qAbs( d_pointRect.right() - d_boundingRect.right() ); const double t = qAbs( d_pointRect.top() - d_boundingRect.top() ); const double b = qAbs( d_pointRect.bottom() - d_boundingRect.bottom() ); rect.adjust( -l, -t, r, b ); } return rect; } inline double scaleFactorX( const QRectF& pathRect, const QRectF &targetRect, bool scalePens ) const { if ( pathRect.width() <= 0.0 ) return 0.0; const QPointF p0 = d_pointRect.center(); const double l = qAbs( pathRect.left() - p0.x() ); const double r = qAbs( pathRect.right() - p0.x() ); const double w = 2.0 * qMin( l, r ) * targetRect.width() / pathRect.width(); double sx; if ( scalePens && d_scalablePen ) { sx = w / d_boundingRect.width(); } else { const double pw = qMax( qAbs( d_boundingRect.left() - d_pointRect.left() ), qAbs( d_boundingRect.right() - d_pointRect.right() ) ); sx = ( w - 2 * pw ) / d_pointRect.width(); } return sx; } inline double scaleFactorY( const QRectF& pathRect, const QRectF &targetRect, bool scalePens ) const { if ( pathRect.height() <= 0.0 ) return 0.0; const QPointF p0 = d_pointRect.center(); const double t = qAbs( pathRect.top() - p0.y() ); const double b = qAbs( pathRect.bottom() - p0.y() ); const double h = 2.0 * qMin( t, b ) * targetRect.height() / pathRect.height(); double sy; if ( scalePens && d_scalablePen ) { sy = h / d_boundingRect.height(); } else { const double pw = qMax( qAbs( d_boundingRect.top() - d_pointRect.top() ), qAbs( d_boundingRect.bottom() - d_pointRect.bottom() ) ); sy = ( h - 2 * pw ) / d_pointRect.height(); } return sy; } private: QRectF d_pointRect; QRectF d_boundingRect; bool d_scalablePen; }; class QwtGraphic::PrivateData { public: PrivateData(): boundingRect( 0.0, 0.0, -1.0, -1.0 ), pointRect( 0.0, 0.0, -1.0, -1.0 ) { } QSizeF defaultSize; QVector commands; QVector pathInfos; QRectF boundingRect; QRectF pointRect; QwtGraphic::RenderHints renderHints; }; /*! \brief Constructor Initializes a null graphic \sa isNull() */ QwtGraphic::QwtGraphic(): QwtNullPaintDevice() { setMode( QwtNullPaintDevice::PathMode ); d_data = new PrivateData; } /*! \brief Copy constructor \param other Source \sa operator=() */ QwtGraphic::QwtGraphic( const QwtGraphic &other ): QwtNullPaintDevice() { setMode( other.mode() ); d_data = new PrivateData( *other.d_data ); } //! Destructor QwtGraphic::~QwtGraphic() { delete d_data; } /*! \brief Assignment operator \param other Source \return A reference of this object */ QwtGraphic& QwtGraphic::operator=(const QwtGraphic &other) { setMode( other.mode() ); *d_data = *other.d_data; return *this; } /*! \brief Clear all stored commands \sa isNull() */ void QwtGraphic::reset() { d_data->commands.clear(); d_data->pathInfos.clear(); d_data->boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); d_data->pointRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); d_data->defaultSize = QSizeF(); } /*! \return True, when no painter commands have been stored \sa isEmpty(), commands() */ bool QwtGraphic::isNull() const { return d_data->commands.isEmpty(); } /*! \return True, when the bounding rectangle is empty \sa boundingRect(), isNull() */ bool QwtGraphic::isEmpty() const { return d_data->boundingRect.isEmpty(); } /*! Toggle an render hint \param hint Render hint \param on true/false \sa testRenderHint(), RenderHint */ void QwtGraphic::setRenderHint( RenderHint hint, bool on ) { if ( on ) d_data->renderHints |= hint; else d_data->renderHints &= ~hint; } /*! Test a render hint \param hint Render hint \return true/false \sa setRenderHint(), RenderHint */ bool QwtGraphic::testRenderHint( RenderHint hint ) const { return d_data->renderHints.testFlag( hint ); } /*! The bounding rectangle is the controlPointRect() extended by the areas needed for rendering the outlines with unscaled pens. \return Bounding rectangle of the graphic \sa controlPointRect(), scaledBoundingRect() */ QRectF QwtGraphic::boundingRect() const { if ( d_data->boundingRect.width() < 0 ) return QRectF(); return d_data->boundingRect; } /*! The control point rectangle is the bounding rectangle of all control points of the paths and the target rectangles of the images/pixmaps. \return Control point rectangle \sa boundingRect(), scaledBoundingRect() */ QRectF QwtGraphic::controlPointRect() const { if ( d_data->pointRect.width() < 0 ) return QRectF(); return d_data->pointRect; } /*! \brief Calculate the target rectangle for scaling the graphic \param sx Horizontal scaling factor \param sy Vertical scaling factor \note In case of paths that are painted with a cosmetic pen ( see QPen::isCosmetic() ) the target rectangle is different to multiplying the bounding rectangle. \return Scaled bounding rectangle \sa boundingRect(), controlPointRect() */ QRectF QwtGraphic::scaledBoundingRect( double sx, double sy ) const { if ( sx == 1.0 && sy == 1.0 ) return d_data->boundingRect; QTransform transform; transform.scale( sx, sy ); QRectF rect = transform.mapRect( d_data->pointRect ); for ( int i = 0; i < d_data->pathInfos.size(); i++ ) { rect |= d_data->pathInfos[i].scaledBoundingRect( sx, sy, !d_data->renderHints.testFlag( RenderPensUnscaled ) ); } return rect; } //! \return Ceiled defaultSize() QSize QwtGraphic::sizeMetrics() const { const QSizeF sz = defaultSize(); return QSize( qCeil( sz.width() ), qCeil( sz.height() ) ); } /*! \brief Set a default size The default size is used in all methods rendering the graphic, where no size is explicitly specified. Assigning an empty size means, that the default size will be calculated from the bounding rectangle. The default setting is an empty size. \param size Default size \sa defaultSize(), boundingRect() */ void QwtGraphic::setDefaultSize( const QSizeF &size ) { const double w = qMax( qreal( 0.0 ), size.width() ); const double h = qMax( qreal( 0.0 ), size.height() ); d_data->defaultSize = QSizeF( w, h ); } /*! \brief Default size When a non empty size has been assigned by setDefaultSize() this size will be returned. Otherwise the default size is the size of the bounding rectangle. The default size is used in all methods rendering the graphic, where no size is explicitly specified. \return Default size \sa setDefaultSize(), boundingRect() */ QSizeF QwtGraphic::defaultSize() const { if ( !d_data->defaultSize.isEmpty() ) return d_data->defaultSize; return boundingRect().size(); } /*! \brief Replay all recorded painter commands \param painter Qt painter */ void QwtGraphic::render( QPainter *painter ) const { if ( isNull() ) return; const int numCommands = d_data->commands.size(); const QwtPainterCommand *commands = d_data->commands.constData(); const QTransform transform = painter->transform(); painter->save(); for ( int i = 0; i < numCommands; i++ ) { qwtExecCommand( painter, commands[i], d_data->renderHints, transform ); } painter->restore(); } /*! \brief Replay all recorded painter commands The graphic is scaled to fit into the rectangle of the given size starting at ( 0, 0 ). \param painter Qt painter \param size Size for the scaled graphic \param aspectRatioMode Mode how to scale - See Qt::AspectRatioMode */ void QwtGraphic::render( QPainter *painter, const QSizeF &size, Qt::AspectRatioMode aspectRatioMode ) const { const QRectF r( 0.0, 0.0, size.width(), size.height() ); render( painter, r, aspectRatioMode ); } /*! \brief Replay all recorded painter commands The graphic is scaled to fit into the given rectangle \param painter Qt painter \param rect Rectangle for the scaled graphic \param aspectRatioMode Mode how to scale - See Qt::AspectRatioMode */ void QwtGraphic::render( QPainter *painter, const QRectF &rect, Qt::AspectRatioMode aspectRatioMode ) const { if ( isEmpty() || rect.isEmpty() ) return; double sx = 1.0; double sy = 1.0; if ( d_data->pointRect.width() > 0.0 ) sx = rect.width() / d_data->pointRect.width(); if ( d_data->pointRect.height() > 0.0 ) sy = rect.height() / d_data->pointRect.height(); const bool scalePens = !d_data->renderHints.testFlag( RenderPensUnscaled ); for ( int i = 0; i < d_data->pathInfos.size(); i++ ) { const PathInfo info = d_data->pathInfos[i]; const double ssx = info.scaleFactorX( d_data->pointRect, rect, scalePens ); if ( ssx > 0.0 ) sx = qMin( sx, ssx ); const double ssy = info.scaleFactorY( d_data->pointRect, rect, scalePens ); if ( ssy > 0.0 ) sy = qMin( sy, ssy ); } if ( aspectRatioMode == Qt::KeepAspectRatio ) { const double s = qMin( sx, sy ); sx = s; sy = s; } else if ( aspectRatioMode == Qt::KeepAspectRatioByExpanding ) { const double s = qMax( sx, sy ); sx = s; sy = s; } QTransform tr; tr.translate( rect.center().x() - 0.5 * sx * d_data->pointRect.width(), rect.center().y() - 0.5 * sy * d_data->pointRect.height() ); tr.scale( sx, sy ); tr.translate( -d_data->pointRect.x(), -d_data->pointRect.y() ); const QTransform transform = painter->transform(); painter->setTransform( tr, true ); render( painter ); painter->setTransform( transform ); } /*! \brief Replay all recorded painter commands The graphic is scaled to the defaultSize() and aligned to a position. \param painter Qt painter \param pos Reference point, where to render \param alignment Flags how to align the target rectangle to pos. */ void QwtGraphic::render( QPainter *painter, const QPointF &pos, Qt::Alignment alignment ) const { QRectF r( pos, defaultSize() ); if ( alignment & Qt::AlignLeft ) { r.moveLeft( pos.x() ); } else if ( alignment & Qt::AlignHCenter ) { r.moveCenter( QPointF( pos.x(), r.center().y() ) ); } else if ( alignment & Qt::AlignRight ) { r.moveRight( pos.x() ); } if ( alignment & Qt::AlignTop ) { r.moveTop( pos.y() ); } else if ( alignment & Qt::AlignVCenter ) { r.moveCenter( QPointF( r.center().x(), pos.y() ) ); } else if ( alignment & Qt::AlignBottom ) { r.moveBottom( pos.y() ); } render( painter, r ); } /*! \brief Convert the graphic to a QPixmap All pixels of the pixmap get initialized by Qt::transparent before the graphic is scaled and rendered on it. The size of the pixmap is the default size ( ceiled to integers ) of the graphic. \return The graphic as pixmap in default size \sa defaultSize(), toImage(), render() */ QPixmap QwtGraphic::toPixmap() const { if ( isNull() ) return QPixmap(); const QSizeF sz = defaultSize(); const int w = qCeil( sz.width() ); const int h = qCeil( sz.height() ); QPixmap pixmap( w, h ); pixmap.fill( Qt::transparent ); const QRectF r( 0.0, 0.0, sz.width(), sz.height() ); QPainter painter( &pixmap ); render( &painter, r, Qt::KeepAspectRatio ); painter.end(); return pixmap; } /*! \brief Convert the graphic to a QPixmap All pixels of the pixmap get initialized by Qt::transparent before the graphic is scaled and rendered on it. \param size Size of the image \param aspectRatioMode Aspect ratio how to scale the graphic \return The graphic as pixmap \sa toImage(), render() */ QPixmap QwtGraphic::toPixmap( const QSize &size, Qt::AspectRatioMode aspectRatioMode ) const { QPixmap pixmap( size ); pixmap.fill( Qt::transparent ); const QRect r( 0, 0, size.width(), size.height() ); QPainter painter( &pixmap ); render( &painter, r, aspectRatioMode ); painter.end(); return pixmap; } /*! \brief Convert the graphic to a QImage All pixels of the image get initialized by 0 ( transparent ) before the graphic is scaled and rendered on it. The format of the image is QImage::Format_ARGB32_Premultiplied. \param size Size of the image \param aspectRatioMode Aspect ratio how to scale the graphic \return The graphic as image \sa toPixmap(), render() */ QImage QwtGraphic::toImage( const QSize &size, Qt::AspectRatioMode aspectRatioMode ) const { QImage image( size, QImage::Format_ARGB32_Premultiplied ); image.fill( 0 ); const QRect r( 0, 0, size.width(), size.height() ); QPainter painter( &image ); render( &painter, r, aspectRatioMode ); painter.end(); return image; } /*! \brief Convert the graphic to a QImage All pixels of the image get initialized by 0 ( transparent ) before the graphic is scaled and rendered on it. The format of the image is QImage::Format_ARGB32_Premultiplied. The size of the image is the default size ( ceiled to integers ) of the graphic. \return The graphic as image in default size \sa defaultSize(), toPixmap(), render() */ QImage QwtGraphic::toImage() const { if ( isNull() ) return QImage(); const QSizeF sz = defaultSize(); const int w = qCeil( sz.width() ); const int h = qCeil( sz.height() ); QImage image( w, h, QImage::Format_ARGB32 ); image.fill( 0 ); const QRect r( 0, 0, sz.width(), sz.height() ); QPainter painter( &image ); render( &painter, r, Qt::KeepAspectRatio ); painter.end(); return image; } /*! Store a path command in the command list \param path Painter path \sa QPaintEngine::drawPath() */ void QwtGraphic::drawPath( const QPainterPath &path ) { const QPainter *painter = paintEngine()->painter(); if ( painter == NULL ) return; d_data->commands += QwtPainterCommand( path ); if ( !path.isEmpty() ) { const QPainterPath scaledPath = painter->transform().map( path ); QRectF pointRect = scaledPath.boundingRect(); QRectF boundingRect = pointRect; if ( painter->pen().style() != Qt::NoPen && painter->pen().brush().style() != Qt::NoBrush ) { boundingRect = qwtStrokedPathRect( painter, path ); } updateControlPointRect( pointRect ); updateBoundingRect( boundingRect ); d_data->pathInfos += PathInfo( pointRect, boundingRect, qwtHasScalablePen( painter ) ); } } /*! \brief Store a pixmap command in the command list \param rect target rectangle \param pixmap Pixmap to be painted \param subRect Reactangle of the pixmap to be painted \sa QPaintEngine::drawPixmap() */ void QwtGraphic::drawPixmap( const QRectF &rect, const QPixmap &pixmap, const QRectF &subRect ) { const QPainter *painter = paintEngine()->painter(); if ( painter == NULL ) return; d_data->commands += QwtPainterCommand( rect, pixmap, subRect ); const QRectF r = painter->transform().mapRect( rect ); updateControlPointRect( r ); updateBoundingRect( r ); } /*! \brief Store a image command in the command list \param rect traget rectangle \param image Image to be painted \param subRect Reactangle of the pixmap to be painted \param flags Image conversion flags \sa QPaintEngine::drawImage() */ void QwtGraphic::drawImage( const QRectF &rect, const QImage &image, const QRectF &subRect, Qt::ImageConversionFlags flags) { const QPainter *painter = paintEngine()->painter(); if ( painter == NULL ) return; d_data->commands += QwtPainterCommand( rect, image, subRect, flags ); const QRectF r = painter->transform().mapRect( rect ); updateControlPointRect( r ); updateBoundingRect( r ); } /*! \brief Store a state command in the command list \param state State to be stored \sa QPaintEngine::updateState() */ void QwtGraphic::updateState( const QPaintEngineState &state) { d_data->commands += QwtPainterCommand( state ); } void QwtGraphic::updateBoundingRect( const QRectF &rect ) { QRectF br = rect; const QPainter *painter = paintEngine()->painter(); if ( painter && painter->hasClipping() ) { QRectF cr = painter->clipRegion().boundingRect(); cr = painter->transform().mapRect( br ); br &= cr; } if ( d_data->boundingRect.width() < 0 ) d_data->boundingRect = br; else d_data->boundingRect |= br; } void QwtGraphic::updateControlPointRect( const QRectF &rect ) { if ( d_data->pointRect.width() < 0.0 ) d_data->pointRect = rect; else d_data->pointRect |= rect; } /*! \return List of recorded paint commands \sa setCommands() */ const QVector< QwtPainterCommand > &QwtGraphic::commands() const { return d_data->commands; } /*! \brief Append paint commands \param commands Paint commands \sa commands() */ void QwtGraphic::setCommands( QVector< QwtPainterCommand > &commands ) { reset(); const int numCommands = commands.size(); if ( numCommands <= 0 ) return; // to calculate a proper bounding rectangle we don't simply copy // the commands. const QwtPainterCommand *cmds = commands.constData(); QPainter painter( this ); for ( int i = 0; i < numCommands; i++ ) qwtExecCommand( &painter, cmds[i], RenderHints(), QTransform() ); painter.end(); } linssid-2.7/qwt-lib/src/qwt_compass_rose.cpp000644 001750 001750 00000014743 12151666703 022147 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_compass_rose.h" #include "qwt_point_polar.h" #include "qwt_painter.h" #include static QPointF qwtIntersection( QPointF p11, QPointF p12, QPointF p21, QPointF p22 ) { const QLineF line1( p11, p12 ); const QLineF line2( p21, p22 ); QPointF pos; if ( line1.intersect( line2, &pos ) == QLineF::NoIntersection ) return QPointF(); return pos; } class QwtSimpleCompassRose::PrivateData { public: PrivateData(): width( 0.2 ), numThorns( 8 ), numThornLevels( -1 ), shrinkFactor( 0.9 ) { } double width; int numThorns; int numThornLevels; double shrinkFactor; }; /*! Constructor \param numThorns Number of thorns \param numThornLevels Number of thorn levels */ QwtSimpleCompassRose::QwtSimpleCompassRose( int numThorns, int numThornLevels ) { d_data = new PrivateData(); d_data->numThorns = numThorns; d_data->numThornLevels = numThornLevels; const QColor dark( 128, 128, 255 ); const QColor light( 192, 255, 255 ); QPalette palette; palette.setColor( QPalette::Dark, dark ); palette.setColor( QPalette::Light, light ); setPalette( palette ); } //! Destructor QwtSimpleCompassRose::~QwtSimpleCompassRose() { delete d_data; } /*! Set the Factor how to shrink the thorns with each level The default value is 0.9. \param factor Shrink factor \sa shrinkFactor() */ void QwtSimpleCompassRose::setShrinkFactor( double factor ) { d_data->shrinkFactor = factor; } /*! \return Factor how to shrink the thorns with each level \sa setShrinkFactor() */ double QwtSimpleCompassRose::shrinkFactor() const { return d_data->shrinkFactor; } /*! Draw the rose \param painter Painter \param center Center point \param radius Radius of the rose \param north Position \param cg Color group */ void QwtSimpleCompassRose::draw( QPainter *painter, const QPointF ¢er, double radius, double north, QPalette::ColorGroup cg ) const { QPalette pal = palette(); pal.setCurrentColorGroup( cg ); drawRose( painter, pal, center, radius, north, d_data->width, d_data->numThorns, d_data->numThornLevels, d_data->shrinkFactor ); } /*! Draw the rose \param painter Painter \param palette Palette \param center Center of the rose \param radius Radius of the rose \param north Position pointing to north \param width Width of the rose \param numThorns Number of thorns \param numThornLevels Number of thorn levels \param shrinkFactor Factor to shrink the thorns with each level */ void QwtSimpleCompassRose::drawRose( QPainter *painter, const QPalette &palette, const QPointF ¢er, double radius, double north, double width, int numThorns, int numThornLevels, double shrinkFactor ) { if ( numThorns < 4 ) numThorns = 4; if ( numThorns % 4 ) numThorns += 4 - numThorns % 4; if ( numThornLevels <= 0 ) numThornLevels = numThorns / 4; if ( shrinkFactor >= 1.0 ) shrinkFactor = 1.0; if ( shrinkFactor <= 0.5 ) shrinkFactor = 0.5; painter->save(); painter->setPen( Qt::NoPen ); for ( int j = 1; j <= numThornLevels; j++ ) { double step = qPow( 2.0, j ) * M_PI / numThorns; if ( step > M_PI_2 ) break; double r = radius; for ( int k = 0; k < 3; k++ ) { if ( j + k < numThornLevels ) r *= shrinkFactor; } double leafWidth = r * width; if ( 2.0 * M_PI / step > 32 ) leafWidth = 16; const double origin = qwtRadians( north ); for ( double angle = origin; angle < 2.0 * M_PI + origin; angle += step ) { const QPointF p = qwtPolar2Pos( center, r, angle ); const QPointF p1 = qwtPolar2Pos( center, leafWidth, angle + M_PI_2 ); const QPointF p2 = qwtPolar2Pos( center, leafWidth, angle - M_PI_2 ); const QPointF p3 = qwtPolar2Pos( center, r, angle + step / 2.0 ); const QPointF p4 = qwtPolar2Pos( center, r, angle - step / 2.0 ); QPainterPath darkPath; darkPath.moveTo( center ); darkPath.lineTo( p ); darkPath.lineTo( qwtIntersection( center, p3, p1, p ) ); painter->setBrush( palette.brush( QPalette::Dark ) ); painter->drawPath( darkPath ); QPainterPath lightPath; lightPath.moveTo( center ); lightPath.lineTo( p ); lightPath.lineTo( qwtIntersection( center, p4, p2, p ) ); painter->setBrush( palette.brush( QPalette::Light ) ); painter->drawPath( lightPath ); } } painter->restore(); } /*! Set the width of the rose heads. Lower value make thinner heads. The range is limited from 0.03 to 0.4. \param width Width */ void QwtSimpleCompassRose::setWidth( double width ) { d_data->width = width; if ( d_data->width < 0.03 ) d_data->width = 0.03; if ( d_data->width > 0.4 ) d_data->width = 0.4; } /*! \return Width of the rose \sa setWidth() */ double QwtSimpleCompassRose::width() const { return d_data->width; } /*! Set the number of thorns on one level The number is aligned to a multiple of 4, with a minimum of 4 \param numThorns Number of thorns \sa numThorns(), setNumThornLevels() */ void QwtSimpleCompassRose::setNumThorns( int numThorns ) { if ( numThorns < 4 ) numThorns = 4; if ( numThorns % 4 ) numThorns += 4 - numThorns % 4; d_data->numThorns = numThorns; } /*! \return Number of thorns \sa setNumThorns(), setNumThornLevels() */ int QwtSimpleCompassRose::numThorns() const { return d_data->numThorns; } /*! Set the of thorns levels \param numThornLevels Number of thorns levels \sa setNumThorns(), numThornLevels() */ void QwtSimpleCompassRose::setNumThornLevels( int numThornLevels ) { d_data->numThornLevels = numThornLevels; } /*! \return Number of thorn levels \sa setNumThorns(), setNumThornLevels() */ int QwtSimpleCompassRose::numThornLevels() const { return d_data->numThornLevels; } linssid-2.7/qwt-lib/src/qwt_date.h000644 001750 001750 00000006732 12151666702 020032 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef _QWT_DATE_H_ #define _QWT_DATE_H_ #include "qwt_global.h" #include /*! \brief A collection of methods around date/time values Qt offers convenient classes for dealing with date/time values, but Qwt uses coordinate systems that are based on doubles. QwtDate offers methods to translate from QDateTime to double and v.v. A double is interpreted as the number of milliseconds since 1970-01-01T00:00:00 Universal Coordinated Time - also known as "The Epoch". While the range of the Julian day in Qt4 is limited to [0, MAX_INT], Qt5 stores it as qint64 offering a huge range of valid dates. As the significance of a double is below this ( assuming a fraction of 52 bits ) the translation is not bijective with rounding errors for dates very far from Epoch. For a resolution of 1 ms those start to happen for dates above the year 144683. An axis for a date/time interval is expected to be aligned and divided in time/date units like seconds, minutes, ... QwtDate offers several algorithms that are needed to calculate these axes. \sa QwtDateScaleEngine, QwtDateScaleDraw, QDate, QTime */ class QWT_EXPORT QwtDate { public: /*! How to identify the first week of year differs between countries. */ enum Week0Type { /*! According to ISO 8601 the first week of a year is defined as "the week with the year's first Thursday in it". FirstThursday corresponds to the numbering that is implemented in QDate::weekNumber(). */ FirstThursday, /*! "The week with January 1.1 in it." In the U.S. this definition is more common than FirstThursday. */ FirstDay }; /*! Classification of an time interval Time intervals needs to be classified to decide how to align and divide it. */ enum IntervalType { //! The interval is related to milliseconds Millisecond, //! The interval is related to seconds Second, //! The interval is related to minutes Minute, //! The interval is related to hours Hour, //! The interval is related to days Day, //! The interval is related to weeks Week, //! The interval is related to months Month, //! The interval is related to years Year }; enum { //! The Julian day of "The Epoch" JulianDayForEpoch = 2440588 }; static QDate minDate(); static QDate maxDate(); static QDateTime toDateTime( double value, Qt::TimeSpec = Qt::UTC ); static double toDouble( const QDateTime & ); static QDateTime ceil( const QDateTime &, IntervalType ); static QDateTime floor( const QDateTime &, IntervalType ); static QDate dateOfWeek0( int year, Week0Type ); static int weekNumber( const QDate &, Week0Type ); static int utcOffset( const QDateTime & ); static QString toString( const QDateTime &, const QString & format, Week0Type ); }; #endif linssid-2.7/qwt-lib/src/qwt_plot_canvas.cpp000644 001750 001750 00000067451 12151666703 021767 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_canvas.h" #include "qwt_painter.h" #include "qwt_null_paintdevice.h" #include "qwt_math.h" #include "qwt_plot.h" #include #include #include #include #include class QwtStyleSheetRecorder: public QwtNullPaintDevice { public: QwtStyleSheetRecorder( const QSize &size ): d_size( size ) { } virtual void updateState( const QPaintEngineState &state ) { if ( state.state() & QPaintEngine::DirtyPen ) { d_pen = state.pen(); } if ( state.state() & QPaintEngine::DirtyBrush ) { d_brush = state.brush(); } if ( state.state() & QPaintEngine::DirtyBrushOrigin ) { d_origin = state.brushOrigin(); } } virtual void drawRects(const QRectF *rects, int count ) { for ( int i = 0; i < count; i++ ) border.rectList += rects[i]; } virtual void drawPath( const QPainterPath &path ) { const QRectF rect( QPointF( 0.0, 0.0 ), d_size ); if ( path.controlPointRect().contains( rect.center() ) ) { setCornerRects( path ); alignCornerRects( rect ); background.path = path; background.brush = d_brush; background.origin = d_origin; } else { border.pathList += path; } } void setCornerRects( const QPainterPath &path ) { QPointF pos( 0.0, 0.0 ); for ( int i = 0; i < path.elementCount(); i++ ) { QPainterPath::Element el = path.elementAt(i); switch( el.type ) { case QPainterPath::MoveToElement: case QPainterPath::LineToElement: { pos.setX( el.x ); pos.setY( el.y ); break; } case QPainterPath::CurveToElement: { QRectF r( pos, QPointF( el.x, el.y ) ); clipRects += r.normalized(); pos.setX( el.x ); pos.setY( el.y ); break; } case QPainterPath::CurveToDataElement: { if ( clipRects.size() > 0 ) { QRectF r = clipRects.last(); r.setCoords( qMin( r.left(), el.x ), qMin( r.top(), el.y ), qMax( r.right(), el.x ), qMax( r.bottom(), el.y ) ); clipRects.last() = r.normalized(); } break; } } } } protected: virtual QSize sizeMetrics() const { return d_size; } private: void alignCornerRects( const QRectF &rect ) { for ( int i = 0; i < clipRects.size(); i++ ) { QRectF &r = clipRects[i]; if ( r.center().x() < rect.center().x() ) r.setLeft( rect.left() ); else r.setRight( rect.right() ); if ( r.center().y() < rect.center().y() ) r.setTop( rect.top() ); else r.setBottom( rect.bottom() ); } } public: QVector clipRects; struct Border { QList pathList; QList rectList; QRegion clipRegion; } border; struct Background { QPainterPath path; QBrush brush; QPointF origin; } background; private: const QSize d_size; QPen d_pen; QBrush d_brush; QPointF d_origin; }; static void qwtDrawBackground( QPainter *painter, QwtPlotCanvas *canvas ) { painter->save(); const QPainterPath borderClip = canvas->borderPath( canvas->rect() ); if ( !borderClip.isEmpty() ) painter->setClipPath( borderClip, Qt::IntersectClip ); const QBrush &brush = canvas->palette().brush( canvas->backgroundRole() ); if ( brush.style() == Qt::TexturePattern ) { QPixmap pm( canvas->size() ); QwtPainter::fillPixmap( canvas, pm ); painter->drawPixmap( 0, 0, pm ); } else if ( brush.gradient() ) { QVector rects; if ( brush.gradient()->coordinateMode() == QGradient::ObjectBoundingMode ) { rects += canvas->rect(); } else { rects = painter->clipRegion().rects(); } #if 1 bool useRaster = false; if ( painter->paintEngine()->type() == QPaintEngine::X11 ) { // Qt 4.7.1: gradients on X11 are broken ( subrects + // QGradient::StretchToDeviceMode ) and horrible slow. // As workaround we have to use the raster paintengine. // Even if the QImage -> QPixmap translation is slow // it is three times faster, than using X11 directly useRaster = true; } #endif if ( useRaster ) { QImage::Format format = QImage::Format_RGB32; const QGradientStops stops = brush.gradient()->stops(); for ( int i = 0; i < stops.size(); i++ ) { if ( stops[i].second.alpha() != 255 ) { // don't use Format_ARGB32_Premultiplied. It's // recommended by the Qt docs, but QPainter::drawImage() // is horrible slow on X11. format = QImage::Format_ARGB32; break; } } QImage image( canvas->size(), format ); QPainter p( &image ); p.setPen( Qt::NoPen ); p.setBrush( brush ); p.drawRects( rects ); p.end(); painter->drawImage( 0, 0, image ); } else { painter->setPen( Qt::NoPen ); painter->setBrush( brush ); painter->drawRects( rects ); } } else { painter->setPen( Qt::NoPen ); painter->setBrush( brush ); painter->drawRects( painter->clipRegion().rects() ); } painter->restore(); } static inline void qwtRevertPath( QPainterPath &path ) { if ( path.elementCount() == 4 ) { QPainterPath::Element el0 = path.elementAt(0); QPainterPath::Element el3 = path.elementAt(3); path.setElementPositionAt( 0, el3.x, el3.y ); path.setElementPositionAt( 3, el0.x, el0.y ); } } static QPainterPath qwtCombinePathList( const QRectF &rect, const QList &pathList ) { if ( pathList.isEmpty() ) return QPainterPath(); QPainterPath ordered[8]; // starting top left for ( int i = 0; i < pathList.size(); i++ ) { int index = -1; QPainterPath subPath = pathList[i]; const QRectF br = pathList[i].controlPointRect(); if ( br.center().x() < rect.center().x() ) { if ( br.center().y() < rect.center().y() ) { if ( qAbs( br.top() - rect.top() ) < qAbs( br.left() - rect.left() ) ) { index = 1; } else { index = 0; } } else { if ( qAbs( br.bottom() - rect.bottom() ) < qAbs( br.left() - rect.left() ) ) { index = 6; } else { index = 7; } } if ( subPath.currentPosition().y() > br.center().y() ) qwtRevertPath( subPath ); } else { if ( br.center().y() < rect.center().y() ) { if ( qAbs( br.top() - rect.top() ) < qAbs( br.right() - rect.right() ) ) { index = 2; } else { index = 3; } } else { if ( qAbs( br.bottom() - rect.bottom() ) < qAbs( br.right() - rect.right() ) ) { index = 5; } else { index = 4; } } if ( subPath.currentPosition().y() < br.center().y() ) qwtRevertPath( subPath ); } ordered[index] = subPath; } for ( int i = 0; i < 4; i++ ) { if ( ordered[ 2 * i].isEmpty() != ordered[2 * i + 1].isEmpty() ) { // we don't accept incomplete rounded borders return QPainterPath(); } } const QPolygonF corners( rect ); QPainterPath path; //path.moveTo( rect.topLeft() ); for ( int i = 0; i < 4; i++ ) { if ( ordered[2 * i].isEmpty() ) { path.lineTo( corners[i] ); } else { path.connectPath( ordered[2 * i] ); path.connectPath( ordered[2 * i + 1] ); } } path.closeSubpath(); #if 0 return path.simplified(); #else return path; #endif } static inline void qwtDrawStyledBackground( QWidget *w, QPainter *painter ) { QStyleOption opt; opt.initFrom(w); w->style()->drawPrimitive( QStyle::PE_Widget, &opt, painter, w); } static QWidget *qwtBackgroundWidget( QWidget *w ) { if ( w->parentWidget() == NULL ) return w; if ( w->autoFillBackground() ) { const QBrush brush = w->palette().brush( w->backgroundRole() ); if ( brush.color().alpha() > 0 ) return w; } if ( w->testAttribute( Qt::WA_StyledBackground ) ) { QImage image( 1, 1, QImage::Format_ARGB32 ); image.fill( Qt::transparent ); QPainter painter( &image ); painter.translate( -w->rect().center() ); qwtDrawStyledBackground( w, &painter ); painter.end(); if ( qAlpha( image.pixel( 0, 0 ) ) != 0 ) return w; } return qwtBackgroundWidget( w->parentWidget() ); } static void qwtFillBackground( QPainter *painter, QWidget *widget, const QVector &fillRects ) { if ( fillRects.isEmpty() ) return; QRegion clipRegion; if ( painter->hasClipping() ) clipRegion = painter->transform().map( painter->clipRegion() ); else clipRegion = widget->contentsRect(); // Try to find out which widget fills // the unfilled areas of the styled background QWidget *bgWidget = qwtBackgroundWidget( widget->parentWidget() ); for ( int i = 0; i < fillRects.size(); i++ ) { const QRect rect = fillRects[i].toAlignedRect(); if ( clipRegion.intersects( rect ) ) { QPixmap pm( rect.size() ); QwtPainter::fillPixmap( bgWidget, pm, widget->mapTo( bgWidget, rect.topLeft() ) ); painter->drawPixmap( rect, pm ); } } } static void qwtFillBackground( QPainter *painter, QwtPlotCanvas *canvas ) { QVector rects; if ( canvas->testAttribute( Qt::WA_StyledBackground ) ) { QwtStyleSheetRecorder recorder( canvas->size() ); QPainter p( &recorder ); qwtDrawStyledBackground( canvas, &p ); p.end(); if ( recorder.background.brush.isOpaque() ) rects = recorder.clipRects; else rects += canvas->rect(); } else { const QRectF r = canvas->rect(); const double radius = canvas->borderRadius(); if ( radius > 0.0 ) { QSizeF sz( radius, radius ); rects += QRectF( r.topLeft(), sz ); rects += QRectF( r.topRight() - QPointF( radius, 0 ), sz ); rects += QRectF( r.bottomRight() - QPointF( radius, radius ), sz ); rects += QRectF( r.bottomLeft() - QPointF( 0, radius ), sz ); } } qwtFillBackground( painter, canvas, rects); } class QwtPlotCanvas::PrivateData { public: PrivateData(): focusIndicator( NoFocusIndicator ), borderRadius( 0 ), paintAttributes( 0 ), backingStore( NULL ) { styleSheet.hasBorder = false; } ~PrivateData() { delete backingStore; } FocusIndicator focusIndicator; double borderRadius; QwtPlotCanvas::PaintAttributes paintAttributes; QPixmap *backingStore; struct StyleSheet { bool hasBorder; QPainterPath borderPath; QVector cornerRects; struct StyleSheetBackground { QBrush brush; QPointF origin; } background; } styleSheet; }; /*! \brief Constructor \param plot Parent plot widget \sa QwtPlot::setCanvas() */ QwtPlotCanvas::QwtPlotCanvas( QwtPlot *plot ): QFrame( plot ) { setFrameStyle( QFrame::Panel | QFrame::Sunken ); setLineWidth( 2 ); d_data = new PrivateData; #ifndef QT_NO_CURSOR setCursor( Qt::CrossCursor ); #endif setAutoFillBackground( true ); setPaintAttribute( QwtPlotCanvas::BackingStore, true ); setPaintAttribute( QwtPlotCanvas::Opaque, true ); setPaintAttribute( QwtPlotCanvas::HackStyledBackground, true ); } //! Destructor QwtPlotCanvas::~QwtPlotCanvas() { delete d_data; } //! Return parent plot widget QwtPlot *QwtPlotCanvas::plot() { return qobject_cast( parent() ); } //! Return parent plot widget const QwtPlot *QwtPlotCanvas::plot() const { return qobject_cast( parent() ); } /*! \brief Changing the paint attributes \param attribute Paint attribute \param on On/Off \sa testPaintAttribute(), backingStore() */ void QwtPlotCanvas::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( bool( d_data->paintAttributes & attribute ) == on ) return; if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; switch ( attribute ) { case BackingStore: { if ( on ) { if ( d_data->backingStore == NULL ) d_data->backingStore = new QPixmap(); if ( isVisible() ) { #if QT_VERSION >= 0x050000 *d_data->backingStore = grab( rect() ); #else *d_data->backingStore = QPixmap::grabWidget( this, rect() ); #endif } } else { delete d_data->backingStore; d_data->backingStore = NULL; } break; } case Opaque: { if ( on ) setAttribute( Qt::WA_OpaquePaintEvent, true ); break; } case HackStyledBackground: case ImmediatePaint: { break; } } } /*! Test whether a paint attribute is enabled \param attribute Paint attribute \return true, when attribute is enabled \sa setPaintAttribute() */ bool QwtPlotCanvas::testPaintAttribute( PaintAttribute attribute ) const { return d_data->paintAttributes & attribute; } //! \return Backing store, might be null const QPixmap *QwtPlotCanvas::backingStore() const { return d_data->backingStore; } //! Invalidate the internal backing store void QwtPlotCanvas::invalidateBackingStore() { if ( d_data->backingStore ) *d_data->backingStore = QPixmap(); } /*! Set the focus indicator \sa FocusIndicator, focusIndicator() */ void QwtPlotCanvas::setFocusIndicator( FocusIndicator focusIndicator ) { d_data->focusIndicator = focusIndicator; } /*! \return Focus indicator \sa FocusIndicator, setFocusIndicator() */ QwtPlotCanvas::FocusIndicator QwtPlotCanvas::focusIndicator() const { return d_data->focusIndicator; } /*! Set the radius for the corners of the border frame \param radius Radius of a rounded corner \sa borderRadius() */ void QwtPlotCanvas::setBorderRadius( double radius ) { d_data->borderRadius = qMax( 0.0, radius ); } /*! \return Radius for the corners of the border frame \sa setBorderRadius() */ double QwtPlotCanvas::borderRadius() const { return d_data->borderRadius; } /*! Qt event handler for QEvent::PolishRequest and QEvent::StyleChange \param event Qt Event \return See QFrame::event() */ bool QwtPlotCanvas::event( QEvent *event ) { if ( event->type() == QEvent::PolishRequest ) { if ( testPaintAttribute( QwtPlotCanvas::Opaque ) ) { // Setting a style sheet changes the // Qt::WA_OpaquePaintEvent attribute, but we insist // on painting the background. setAttribute( Qt::WA_OpaquePaintEvent, true ); } } if ( event->type() == QEvent::PolishRequest || event->type() == QEvent::StyleChange ) { updateStyleSheetInfo(); } return QFrame::event( event ); } /*! Paint event \param event Paint event */ void QwtPlotCanvas::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); if ( testPaintAttribute( QwtPlotCanvas::BackingStore ) && d_data->backingStore != NULL ) { QPixmap &bs = *d_data->backingStore; if ( bs.size() != size() ) { bs = QwtPainter::backingStore( this, size() ); if ( testAttribute(Qt::WA_StyledBackground) ) { QPainter p( &bs ); qwtFillBackground( &p, this ); drawCanvas( &p, true ); } else { QPainter p; if ( d_data->borderRadius <= 0.0 ) { QwtPainter::fillPixmap( this, bs ); p.begin( &bs ); drawCanvas( &p, false ); } else { p.begin( &bs ); qwtFillBackground( &p, this ); drawCanvas( &p, true ); } if ( frameWidth() > 0 ) drawBorder( &p ); } } painter.drawPixmap( 0, 0, *d_data->backingStore ); } else { if ( testAttribute(Qt::WA_StyledBackground ) ) { if ( testAttribute( Qt::WA_OpaquePaintEvent ) ) { qwtFillBackground( &painter, this ); drawCanvas( &painter, true ); } else { drawCanvas( &painter, false ); } } else { if ( testAttribute( Qt::WA_OpaquePaintEvent ) ) { if ( autoFillBackground() ) { qwtFillBackground( &painter, this ); qwtDrawBackground( &painter, this ); } } else { if ( borderRadius() > 0.0 ) { QPainterPath clipPath; clipPath.addRect( rect() ); clipPath = clipPath.subtracted( borderPath( rect() ) ); painter.save(); painter.setClipPath( clipPath, Qt::IntersectClip ); qwtFillBackground( &painter, this ); qwtDrawBackground( &painter, this ); painter.restore(); } } drawCanvas( &painter, false ); if ( frameWidth() > 0 ) drawBorder( &painter ); } } if ( hasFocus() && focusIndicator() == CanvasFocusIndicator ) drawFocusIndicator( &painter ); } void QwtPlotCanvas::drawCanvas( QPainter *painter, bool withBackground ) { bool hackStyledBackground = false; if ( withBackground && testAttribute( Qt::WA_StyledBackground ) && testPaintAttribute( HackStyledBackground ) ) { // Antialiasing rounded borders is done by // inserting pixels with colors between the // border color and the color on the canvas, // When the border is painted before the plot items // these colors are interpolated for the canvas // and the plot items need to be clipped excluding // the anialiased pixels. In situations, where // the plot items fill the area at the rounded // borders this is noticeable. // The only way to avoid these annoying "artefacts" // is to paint the border on top of the plot items. if ( d_data->styleSheet.hasBorder && !d_data->styleSheet.borderPath.isEmpty() ) { // We have a border with at least one rounded corner hackStyledBackground = true; } } if ( withBackground ) { painter->save(); if ( testAttribute( Qt::WA_StyledBackground ) ) { if ( hackStyledBackground ) { // paint background without border painter->setPen( Qt::NoPen ); painter->setBrush( d_data->styleSheet.background.brush ); painter->setBrushOrigin( d_data->styleSheet.background.origin ); painter->setClipPath( d_data->styleSheet.borderPath ); painter->drawRect( contentsRect() ); } else { qwtDrawStyledBackground( this, painter ); } } else if ( autoFillBackground() ) { painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( backgroundRole() ) ); if ( d_data->borderRadius > 0.0 && ( rect() == frameRect() ) ) { if ( frameWidth() > 0 ) { painter->setClipPath( borderPath( rect() ) ); painter->drawRect( rect() ); } else { painter->setRenderHint( QPainter::Antialiasing, true ); painter->drawPath( borderPath( rect() ) ); } } else { painter->drawRect( rect() ); } } painter->restore(); } painter->save(); if ( !d_data->styleSheet.borderPath.isEmpty() ) { painter->setClipPath( d_data->styleSheet.borderPath, Qt::IntersectClip ); } else { if ( d_data->borderRadius > 0.0 ) painter->setClipPath( borderPath( frameRect() ), Qt::IntersectClip ); else painter->setClipRect( contentsRect(), Qt::IntersectClip ); } plot()->drawCanvas( painter ); painter->restore(); if ( withBackground && hackStyledBackground ) { // Now paint the border on top QStyleOptionFrame opt; opt.initFrom(this); style()->drawPrimitive( QStyle::PE_Frame, &opt, painter, this); } } /*! Draw the border of the plot canvas \param painter Painter \sa setBorderRadius() */ void QwtPlotCanvas::drawBorder( QPainter *painter ) { if ( d_data->borderRadius > 0 ) { if ( frameWidth() > 0 ) { QwtPainter::drawRoundedFrame( painter, QRectF( frameRect() ), d_data->borderRadius, d_data->borderRadius, palette(), frameWidth(), frameStyle() ); } } else { #if QT_VERSION >= 0x040500 QStyleOptionFrameV3 opt; opt.init(this); int frameShape = frameStyle() & QFrame::Shape_Mask; int frameShadow = frameStyle() & QFrame::Shadow_Mask; opt.frameShape = QFrame::Shape( int( opt.frameShape ) | frameShape ); #if 0 opt.rect = frameRect(); #endif switch (frameShape) { case QFrame::Box: case QFrame::HLine: case QFrame::VLine: case QFrame::StyledPanel: case QFrame::Panel: { opt.lineWidth = lineWidth(); opt.midLineWidth = midLineWidth(); break; } default: { opt.lineWidth = frameWidth(); break; } } if ( frameShadow == Sunken ) opt.state |= QStyle::State_Sunken; else if ( frameShadow == Raised ) opt.state |= QStyle::State_Raised; style()->drawControl(QStyle::CE_ShapedFrame, &opt, painter, this); #else drawFrame( painter ); #endif } } /*! Resize event \param event Resize event */ void QwtPlotCanvas::resizeEvent( QResizeEvent *event ) { QFrame::resizeEvent( event ); updateStyleSheetInfo(); } /*! Draw the focus indication \param painter Painter */ void QwtPlotCanvas::drawFocusIndicator( QPainter *painter ) { const int margin = 1; QRect focusRect = contentsRect(); focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin, focusRect.width() - 2 * margin, focusRect.height() - 2 * margin ); QwtPainter::drawFocusRect( painter, this, focusRect ); } /*! Invalidate the paint cache and repaint the canvas \sa invalidatePaintCache() */ void QwtPlotCanvas::replot() { invalidateBackingStore(); if ( testPaintAttribute( QwtPlotCanvas::ImmediatePaint ) ) repaint( contentsRect() ); else update( contentsRect() ); } //! Update the cached information about the current style sheet void QwtPlotCanvas::updateStyleSheetInfo() { if ( !testAttribute(Qt::WA_StyledBackground ) ) return; QwtStyleSheetRecorder recorder( size() ); QPainter painter( &recorder ); QStyleOption opt; opt.initFrom(this); style()->drawPrimitive( QStyle::PE_Widget, &opt, &painter, this); painter.end(); d_data->styleSheet.hasBorder = !recorder.border.rectList.isEmpty(); d_data->styleSheet.cornerRects = recorder.clipRects; if ( recorder.background.path.isEmpty() ) { if ( !recorder.border.rectList.isEmpty() ) { d_data->styleSheet.borderPath = qwtCombinePathList( rect(), recorder.border.pathList ); } } else { d_data->styleSheet.borderPath = recorder.background.path; d_data->styleSheet.background.brush = recorder.background.brush; d_data->styleSheet.background.origin = recorder.background.origin; } } /*! Calculate the painter path for a styled or rounded border When the canvas has no styled background or rounded borders the painter path is empty. \param rect Bounding rectangle of the canvas \return Painter path, that can be used for clipping */ QPainterPath QwtPlotCanvas::borderPath( const QRect &rect ) const { if ( testAttribute(Qt::WA_StyledBackground ) ) { QwtStyleSheetRecorder recorder( rect.size() ); QPainter painter( &recorder ); QStyleOption opt; opt.initFrom(this); opt.rect = rect; style()->drawPrimitive( QStyle::PE_Widget, &opt, &painter, this); painter.end(); if ( !recorder.background.path.isEmpty() ) return recorder.background.path; if ( !recorder.border.rectList.isEmpty() ) return qwtCombinePathList( rect, recorder.border.pathList ); } else if ( d_data->borderRadius > 0.0 ) { double fw2 = frameWidth() * 0.5; QRectF r = QRectF(rect).adjusted( fw2, fw2, -fw2, -fw2 ); QPainterPath path; path.addRoundedRect( r, d_data->borderRadius, d_data->borderRadius ); return path; } return QPainterPath(); } linssid-2.7/qwt-lib/src/qwt_series_data.h000644 001750 001750 00000021704 12151666701 021373 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SERIES_DATA_H #define QWT_SERIES_DATA_H 1 #include "qwt_global.h" #include "qwt_samples.h" #include "qwt_point_3d.h" #include "qwt_point_polar.h" #include #include /*! \brief Abstract interface for iterating over samples Qwt offers several implementations of the QwtSeriesData API, but in situations, where data of an application specific format needs to be displayed, without having to copy it, it is recommended to implement an individual data access. A subclass of QwtSeriesData must implement: - size()\n Should return number of data points. - sample()\n Should return values x and y values of the sample at specific position as QPointF object. - boundingRect()\n Should return the bounding rectangle of the data series. It is used for autoscaling and might help certain algorithms for displaying the data. You can use qwtBoundingRect() for an implementation but often it is possible to implement a more efficient algorithm depending on the characteristics of the series. The member d_boundingRect is intended for caching the calculated rectangle. */ template class QwtSeriesData { public: //! Constructor QwtSeriesData(); //! Destructor virtual ~QwtSeriesData(); //! \return Number of samples virtual size_t size() const = 0; /*! Return a sample \param i Index \return Sample at position i */ virtual T sample( size_t i ) const = 0; /*! Calculate the bounding rect of all samples The bounding rect is necessary for autoscaling and can be used for a couple of painting optimizations. qwtBoundingRect(...) offers slow implementations iterating over the samples. For large sets it is recommended to implement something faster f.e. by caching the bounding rectangle. \return Bounding rectangle */ virtual QRectF boundingRect() const = 0; /*! Set a the "rect of interest" QwtPlotSeriesItem defines the current area of the plot canvas as "rectangle of interest" ( QwtPlotSeriesItem::updateScaleDiv() ). It can be used to implement different levels of details. The default implementation does nothing. \param rect Rectangle of interest */ virtual void setRectOfInterest( const QRectF &rect ); protected: //! Can be used to cache a calculated bounding rectangle mutable QRectF d_boundingRect; private: QwtSeriesData &operator=( const QwtSeriesData & ); }; template QwtSeriesData::QwtSeriesData(): d_boundingRect( 0.0, 0.0, -1.0, -1.0 ) { } template QwtSeriesData::~QwtSeriesData() { } template void QwtSeriesData::setRectOfInterest( const QRectF & ) { } /*! \brief Template class for data, that is organized as QVector QVector uses implicit data sharing and can be passed around as argument efficiently. */ template class QwtArraySeriesData: public QwtSeriesData { public: //! Constructor QwtArraySeriesData(); /*! Constructor \param samples Array of samples */ QwtArraySeriesData( const QVector &samples ); /*! Assign an array of samples \param samples Array of samples */ void setSamples( const QVector &samples ); //! \return Array of samples const QVector samples() const; //! \return Number of samples virtual size_t size() const; /*! \return Sample at a specific position \param index Index \return Sample at position index */ virtual T sample( size_t index ) const; protected: //! Vector of samples QVector d_samples; }; template QwtArraySeriesData::QwtArraySeriesData() { } template QwtArraySeriesData::QwtArraySeriesData( const QVector &samples ): d_samples( samples ) { } template void QwtArraySeriesData::setSamples( const QVector &samples ) { QwtSeriesData::d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); d_samples = samples; } template const QVector QwtArraySeriesData::samples() const { return d_samples; } template size_t QwtArraySeriesData::size() const { return d_samples.size(); } template T QwtArraySeriesData::sample( size_t i ) const { return d_samples[ static_cast( i ) ]; } //! Interface for iterating over an array of points class QWT_EXPORT QwtPointSeriesData: public QwtArraySeriesData { public: QwtPointSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of 3D points class QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData { public: QwtPoint3DSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of intervals class QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData { public: QwtIntervalSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of samples class QWT_EXPORT QwtSetSeriesData: public QwtArraySeriesData { public: QwtSetSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; /*! Interface for iterating over an array of OHLC samples */ class QWT_EXPORT QwtTradingChartData: public QwtArraySeriesData { public: QwtTradingChartData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData &, int from = 0, int to = -1 ); /*! Binary search for a sorted series of samples qwtUpperSampleIndex returns the index of sample that is the upper bound of value. Is the the value smaller than the smallest value the return value will be 0. Is the value greater or equal than the largest value the return value will be -1. \par Example The following example shows finds a point of curve from an x coordinate \verbatim #include #include struct compareX { inline bool operator()( const double x, const QPointF &pos ) const { return ( x < pos.x() ); } }; QLineF curveLineAt( const QwtPlotCurve *curve, double x ) { int index = qwtUpperSampleIndex( *curve->data(), x, compareX() ); if ( index == -1 && x == curve->sample( curve->dataSize() - 1 ).x() ) { // the last sample is excluded from qwtUpperSampleIndex index = curve->dataSize() - 1; } QLineF line; // invalid if ( index > 0 ) { line.setP1( curve->sample( index - 1 ) ); line.setP2( curve->sample( index ) ); } return line; } \endverbatim \param series Series of samples \param value Value \param lessThan Compare operation \note The samples must be sorted according to the order specified by the lessThan object of the range [begin, end) and returns the position of the one-past-the-last occurrence of value. If no such item is found, returns the position where the item should be inserted. */ template inline int qwtUpperSampleIndex( const QwtSeriesData &series, double value, LessThan lessThan ) { const int indexMax = series.size() - 1; if ( indexMax < 0 || !lessThan( value, series.sample( indexMax ) ) ) return -1; int indexMin = 0; int n = indexMax; while ( n > 0 ) { const int half = n >> 1; const int indexMid = indexMin + half; if ( lessThan( value, series.sample( indexMid ) ) ) { n = half; } else { indexMin = indexMid + 1; n -= half + 1; } } return indexMin; } #endif linssid-2.7/qwt-lib/src/qwt_scale_widget.h000644 001750 001750 00000006727 12151666701 021552 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_WIDGET_H #define QWT_SCALE_WIDGET_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_scale_draw.h" #include #include #include #include class QPainter; class QwtTransform; class QwtScaleDiv; class QwtColorMap; /*! \brief A Widget which contains a scale This Widget can be used to decorate composite widgets with a scale. */ class QWT_EXPORT QwtScaleWidget : public QWidget { Q_OBJECT public: //! Layout flags of the title enum LayoutFlag { /*! The title of vertical scales is painted from top to bottom. Otherwise it is painted from bottom to top. */ TitleInverted = 1 }; //! Layout flags of the title typedef QFlags LayoutFlags; explicit QwtScaleWidget( QWidget *parent = NULL ); explicit QwtScaleWidget( QwtScaleDraw::Alignment, QWidget *parent = NULL ); virtual ~QwtScaleWidget(); Q_SIGNALS: //! Signal emitted, whenever the scale division changes void scaleDivChanged(); public: void setTitle( const QString &title ); void setTitle( const QwtText &title ); QwtText title() const; void setLayoutFlag( LayoutFlag, bool on ); bool testLayoutFlag( LayoutFlag ) const; void setBorderDist( int start, int end ); int startBorderDist() const; int endBorderDist() const; void getBorderDistHint( int &start, int &end ) const; void getMinBorderDist( int &start, int &end ) const; void setMinBorderDist( int start, int end ); void setMargin( int ); int margin() const; void setSpacing( int td ); int spacing() const; void setScaleDiv( const QwtScaleDiv &sd ); void setTransformation( QwtTransform * ); void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; QwtScaleDraw *scaleDraw(); void setLabelAlignment( Qt::Alignment ); void setLabelRotation( double rotation ); void setColorBarEnabled( bool ); bool isColorBarEnabled() const; void setColorBarWidth( int ); int colorBarWidth() const; void setColorMap( const QwtInterval &, QwtColorMap * ); QwtInterval colorBarInterval() const; const QwtColorMap *colorMap() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; int titleHeightForWidth( int width ) const; int dimForLength( int length, const QFont &scaleFont ) const; void drawColorBar( QPainter *painter, const QRectF & ) const; void drawTitle( QPainter *painter, QwtScaleDraw::Alignment, const QRectF &rect ) const; void setAlignment( QwtScaleDraw::Alignment ); QwtScaleDraw::Alignment alignment() const; QRectF colorBarRect( const QRectF& ) const; protected: virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); void draw( QPainter *p ) const; void scaleChange(); void layoutScale( bool update = true ); private: void initScale( QwtScaleDraw::Alignment ); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtScaleWidget::LayoutFlags ) #endif linssid-2.7/qwt-lib/src/qwt_transform.cpp000644 001750 001750 00000006270 12151666703 021461 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_transform.h" #include "qwt_math.h" #if QT_VERSION < 0x040601 #define qExp(x) ::exp(x) #endif //! Smallest allowed value for logarithmic scales: 1.0e-150 QT_STATIC_CONST_IMPL double QwtLogTransform::LogMin = 1.0e-150; //! Largest allowed value for logarithmic scales: 1.0e150 QT_STATIC_CONST_IMPL double QwtLogTransform::LogMax = 1.0e150; //! Constructor QwtTransform::QwtTransform() { } //! Destructor QwtTransform::~QwtTransform() { } /*! \param value Value to be bounded \return value unmodified */ double QwtTransform::bounded( double value ) const { return value; } //! Constructor QwtNullTransform::QwtNullTransform(): QwtTransform() { } //! Destructor QwtNullTransform::~QwtNullTransform() { } /*! \param value Value to be transformed \return value unmodified */ double QwtNullTransform::transform( double value ) const { return value; } /*! \param value Value to be transformed \return value unmodified */ double QwtNullTransform::invTransform( double value ) const { return value; } //! \return Clone of the transformation QwtTransform *QwtNullTransform::copy() const { return new QwtNullTransform(); } //! Constructor QwtLogTransform::QwtLogTransform(): QwtTransform() { } //! Destructor QwtLogTransform::~QwtLogTransform() { } /*! \param value Value to be transformed \return log( value ) */ double QwtLogTransform::transform( double value ) const { return ::log( value ); } /*! \param value Value to be transformed \return exp( value ) */ double QwtLogTransform::invTransform( double value ) const { return qExp( value ); } /*! \param value Value to be bounded \return qBound( LogMin, value, LogMax ) */ double QwtLogTransform::bounded( double value ) const { return qBound( LogMin, value, LogMax ); } //! \return Clone of the transformation QwtTransform *QwtLogTransform::copy() const { return new QwtLogTransform(); } /*! Constructor \param exponent Exponent */ QwtPowerTransform::QwtPowerTransform( double exponent ): QwtTransform(), d_exponent( exponent ) { } //! Destructor QwtPowerTransform::~QwtPowerTransform() { } /*! \param value Value to be transformed \return Exponentiation preserving the sign */ double QwtPowerTransform::transform( double value ) const { if ( value < 0.0 ) return -qPow( -value, 1.0 / d_exponent ); else return qPow( value, 1.0 / d_exponent ); } /*! \param value Value to be transformed \return Inverse exponentiation preserving the sign */ double QwtPowerTransform::invTransform( double value ) const { if ( value < 0.0 ) return -qPow( -value, d_exponent ); else return qPow( value, d_exponent ); } //! \return Clone of the transformation QwtTransform *QwtPowerTransform::copy() const { return new QwtPowerTransform( d_exponent ); } linssid-2.7/qwt-lib/src/qwt_plot_rasteritem.h000644 001750 001750 00000011273 12151666701 022325 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_RASTERITEM_H #define QWT_PLOT_RASTERITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_interval.h" #include #include #include /*! \brief A class, which displays raster data Raster data is a grid of pixel values, that can be represented as a QImage. It is used for many types of information like spectrograms, cartograms, geographical maps ... Often a plot has several types of raster data organized in layers. ( f.e a geographical map, with weather statistics ). Using setAlpha() raster items can be stacked easily. QwtPlotRasterItem is only implemented for images of the following formats: QImage::Format_Indexed8, QImage::Format_ARGB32. \sa QwtPlotSpectrogram */ class QWT_EXPORT QwtPlotRasterItem: public QwtPlotItem { public: /*! \brief Cache policy The default policy is NoCache */ enum CachePolicy { /*! renderImage() is called each time the item has to be repainted */ NoCache, /*! renderImage() is called, whenever the image cache is not valid, or the scales, or the size of the canvas has changed. This type of cache is useful for improving the performance of hide/show operations or manipulations of the alpha value. All other situations are handled by the canvas backing store. */ PaintCache }; /*! Attributes to modify the drawing algorithm. \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { /*! When the image is rendered according to the data pixels ( QwtRasterData::pixelHint() ) it can be expanded to paint device resolution before it is passed to QPainter. The expansion algorithm rounds the pixel borders in the same way as the axis ticks, what is usually better than the scaling algorithm implemented in Qt. Disabling this flag might make sense, to reduce the size of a document/file. If this is possible for a document format depends on the implementation of the specific QPaintEngine. */ PaintInDeviceResolution = 1 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotRasterItem( const QString& title = QString::null ); explicit QwtPlotRasterItem( const QwtText& title ); virtual ~QwtPlotRasterItem(); void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setAlpha( int alpha ); int alpha() const; void setCachePolicy( CachePolicy ); CachePolicy cachePolicy() const; void invalidateCache(); virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) const; virtual QRectF pixelHint( const QRectF & ) const; virtual QwtInterval interval(Qt::Axis) const; virtual QRectF boundingRect() const; protected: /*! \brief Render an image An implementation of render() might iterate over all pixels of imageRect. Each pixel has to be translated into the corresponding position in scale coordinates using the maps. This position can be used to look up a value in a implementation specific way and to map it into a color. \param xMap X-Scale Map \param yMap Y-Scale Map \param area Requested area for the image in scale coordinates \param imageSize Requested size of the image \return Rendered image */ virtual QImage renderImage( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &area, const QSize &imageSize ) const = 0; virtual QwtScaleMap imageMap( Qt::Orientation, const QwtScaleMap &map, const QRectF &area, const QSize &imageSize, double pixelSize) const; private: QwtPlotRasterItem( const QwtPlotRasterItem & ); QwtPlotRasterItem &operator=( const QwtPlotRasterItem & ); void init(); QImage compose( const QwtScaleMap &, const QwtScaleMap &, const QRectF &imageArea, const QRectF &paintRect, const QSize &imageSize, bool doCache) const; class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotRasterItem::PaintAttributes ) #endif linssid-2.7/qwt-lib/src/qwt_dyngrid_layout.h000644 001750 001750 00000004450 12151666701 022144 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DYNGRID_LAYOUT_H #define QWT_DYNGRID_LAYOUT_H #include "qwt_global.h" #include #include #include /*! \brief The QwtDynGridLayout class lays out widgets in a grid, adjusting the number of columns and rows to the current size. QwtDynGridLayout takes the space it gets, divides it up into rows and columns, and puts each of the widgets it manages into the correct cell(s). It lays out as many number of columns as possible (limited by maxColumns()). */ class QWT_EXPORT QwtDynGridLayout : public QLayout { Q_OBJECT public: explicit QwtDynGridLayout( QWidget *, int margin = 0, int space = -1 ); explicit QwtDynGridLayout( int space = -1 ); virtual ~QwtDynGridLayout(); virtual void invalidate(); void setMaxColumns( uint maxCols ); uint maxColumns() const; uint numRows () const; uint numColumns () const; virtual void addItem( QLayoutItem * ); virtual QLayoutItem *itemAt( int index ) const; virtual QLayoutItem *takeAt( int index ); virtual int count() const; void setExpandingDirections( Qt::Orientations ); virtual Qt::Orientations expandingDirections() const; QList layoutItems( const QRect &, uint numCols ) const; virtual int maxItemWidth() const; virtual void setGeometry( const QRect &rect ); virtual bool hasHeightForWidth() const; virtual int heightForWidth( int ) const; virtual QSize sizeHint() const; virtual bool isEmpty() const; uint itemCount() const; virtual uint columnsForWidth( int width ) const; protected: void layoutGrid( uint numCols, QVector& rowHeight, QVector& colWidth ) const; void stretchGrid( const QRect &rect, uint numCols, QVector& rowHeight, QVector& colWidth ) const; private: void init(); int maxRowWidth( int numCols ) const; class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/linssid-app/AboutBox.ui000664 001750 001750 00000007047 12366767316 020225 0ustar00warrenwarren000000 000000 aboutBox 0 0 379 387 About linssid... linssid.pnglinssid.png true Version: Qt::Horizontal 447 20 0 0 Close 0 0 64 64 QFrame::StyledPanel ../../../../usr/share/pixmaps/linssid.png Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop LinSSID is authored by Warren Severin. It borrows from the graphic design ideas of the Windows program Inssider, but it is otherwise completely built from scratch. The LinSSID program is licensed under the terms of the GPL version 3. LinSSID version 2.2 and above are built using Qt5. LinSSID links to libraries of the Qwt project (http://qwt.sf.net). The LinSSID program also links to the Boost C++ libraries. The license to use these components is included in the program binary distribution. Hint: LinSSID will run faster when your interface is not connected to an attach point. Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true aboutCloseBtn clicked() aboutBox close() 340 263 199 149 linssid-2.7/qwt-lib/src/qwt_plot_seriesitem.cpp000644 001750 001750 00000005024 12151666703 022651 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_seriesitem.h" class QwtPlotSeriesItem::PrivateData { public: PrivateData(): orientation( Qt::Vertical ) { } Qt::Orientation orientation; }; /*! Constructor \param title Title of the curve */ QwtPlotSeriesItem::QwtPlotSeriesItem( const QwtText &title ): QwtPlotItem( title ) { d_data = new PrivateData(); setItemInterest( QwtPlotItem::ScaleInterest, true ); } /*! Constructor \param title Title of the curve */ QwtPlotSeriesItem::QwtPlotSeriesItem( const QString &title ): QwtPlotItem( QwtText( title ) ) { d_data = new PrivateData(); } //! Destructor QwtPlotSeriesItem::~QwtPlotSeriesItem() { delete d_data; } /*! Set the orientation of the item. The orientation() might be used in specific way by a plot item. F.e. a QwtPlotCurve uses it to identify how to display the curve int QwtPlotCurve::Steps or QwtPlotCurve::Sticks style. \sa orientation() */ void QwtPlotSeriesItem::setOrientation( Qt::Orientation orientation ) { if ( d_data->orientation != orientation ) { d_data->orientation = orientation; legendChanged(); itemChanged(); } } /*! \return Orientation of the plot item \sa setOrientation() */ Qt::Orientation QwtPlotSeriesItem::orientation() const { return d_data->orientation; } /*! \brief Draw the complete series \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas */ void QwtPlotSeriesItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { drawSeries( painter, xMap, yMap, canvasRect, 0, -1 ); } QRectF QwtPlotSeriesItem::boundingRect() const { return dataRect(); } void QwtPlotSeriesItem::updateScaleDiv( const QwtScaleDiv &xScaleDiv, const QwtScaleDiv &yScaleDiv ) { const QRectF rect = QRectF( xScaleDiv.lowerBound(), yScaleDiv.lowerBound(), xScaleDiv.range(), yScaleDiv.range() ); setRectOfInterest( rect ); } void QwtPlotSeriesItem::dataChanged() { itemChanged(); } linssid-2.7/linssid.pro000664 001750 001750 00000000155 12345217430 016060 0ustar00warrenwarren000000 000000 TEMPLATE = subdirs CONFIG += ordered SUBDIRS = qwt-lib \ linssid-app linssid-app.depends = qwt-lib linssid-2.7/qwt-lib/src/qwt_column_symbol.h000644 001750 001750 00000007360 12151666701 021774 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COLUMN_SYMBOL_H #define QWT_COLUMN_SYMBOL_H #include "qwt_global.h" #include "qwt_interval.h" #include #include #include class QPainter; class QPalette; class QRect; class QwtText; /*! \brief Directed rectangle representing bounding rectangle and orientation of a column. */ class QWT_EXPORT QwtColumnRect { public: //! Direction of the column enum Direction { //! From left to right LeftToRight, //! From right to left RightToLeft, //! From bottom to top BottomToTop, //! From top to bottom TopToBottom }; //! Build an rectangle with invalid intervals directed BottomToTop. QwtColumnRect(): direction( BottomToTop ) { } //! \return A normalized QRect built from the intervals QRectF toRect() const { QRectF r( hInterval.minValue(), vInterval.minValue(), hInterval.maxValue() - hInterval.minValue(), vInterval.maxValue() - vInterval.minValue() ); r = r.normalized(); if ( hInterval.borderFlags() & QwtInterval::ExcludeMinimum ) r.adjust( 1, 0, 0, 0 ); if ( hInterval.borderFlags() & QwtInterval::ExcludeMaximum ) r.adjust( 0, 0, -1, 0 ); if ( vInterval.borderFlags() & QwtInterval::ExcludeMinimum ) r.adjust( 0, 1, 0, 0 ); if ( vInterval.borderFlags() & QwtInterval::ExcludeMaximum ) r.adjust( 0, 0, 0, -1 ); return r; } //! \return Orientation Qt::Orientation orientation() const { if ( direction == LeftToRight || direction == RightToLeft ) return Qt::Horizontal; return Qt::Vertical; } //! Interval for the horizontal coordinates QwtInterval hInterval; //! Interval for the vertical coordinates QwtInterval vInterval; //! Direction Direction direction; }; //! A drawing primitive for columns class QWT_EXPORT QwtColumnSymbol { public: /*! Style \sa setStyle(), style() */ enum Style { //! No Style, the symbol draws nothing NoStyle = -1, /*! The column is painted with a frame depending on the frameStyle() and lineWidth() using the palette(). */ Box, /*! Styles >= QwtColumnSymbol::UserStyle are reserved for derived classes of QwtColumnSymbol that overload draw() with additional application specific symbol types. */ UserStyle = 1000 }; /*! Frame Style used in Box style(). \sa Style, setFrameStyle(), frameStyle(), setStyle(), setPalette() */ enum FrameStyle { //! No frame NoFrame, //! A plain frame style Plain, //! A raised frame style Raised }; public: QwtColumnSymbol( Style = NoStyle ); virtual ~QwtColumnSymbol(); void setFrameStyle( FrameStyle style ); FrameStyle frameStyle() const; void setLineWidth( int width ); int lineWidth() const; void setPalette( const QPalette & ); const QPalette &palette() const; void setStyle( Style ); Style style() const; virtual void draw( QPainter *, const QwtColumnRect & ) const; protected: void drawBox( QPainter *, const QwtColumnRect & ) const; private: class PrivateData; PrivateData* d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_tradingcurve.h000644 001750 001750 00000012150 12151666701 022636 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_TRADING_CURVE_H #define QWT_PLOT_TRADING_CURVE_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" /*! \brief QwtPlotTradingCurve illustrates movements in the price of a financial instrument over time. QwtPlotTradingCurve supports candlestick or bar ( OHLC ) charts that are used in the domain of technical analysis. While the length ( height or width depending on orientation() ) of each symbol depends on the corresponding OHLC sample the size of the other dimension can be controlled using: - setSymbolExtent() - setSymbolMinWidth() - setSymbolMaxWidth() The extent is a size in scale coordinates, so that the symbol width is increasing when the plot is zoomed in. Minimum/Maximum width is in widget coordinates independent from the zoom level. When setting the minimum and maximum to the same value, the width of the symbol is fixed. */ class QWT_EXPORT QwtPlotTradingCurve: public QwtPlotSeriesItem, QwtSeriesStore { public: /*! \brief Symbol styles. The default setting is QwtPlotSeriesItem::CandleStick. \sa setSymbolStyle(), symbolStyle() */ enum SymbolStyle { //! Nothing is displayed NoSymbol = -1, /*! A line on the chart shows the price range (the highest and lowest prices) over one unit of time, e.g. one day or one hour. Tick marks project from each side of the line indicating the opening and closing price. */ Bar, /*! The range between opening/closing price are displayed as a filled box. The fill brush depends on the direction of the price movement. The box is connected to the highest/lowest values by lines. */ CandleStick, /*! SymbolTypes >= UserSymbol are displayed by drawUserSymbol(), that needs to be overloaded and implemented in derived curve classes. \sa drawUserSymbol() */ UserSymbol = 100 }; /*! \brief Direction of a price movement */ enum Direction { //! The closing price is higher than the opening price Increasing, //! The closing price is lower than the opening price Decreasing }; /*! Attributes to modify the drawing algorithm. \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { //! Check if a symbol is on the plot canvas before painting it. ClipSymbols = 0x01 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotTradingCurve( const QString &title = QString::null ); explicit QwtPlotTradingCurve( const QwtText &title ); virtual ~QwtPlotTradingCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); void setSymbolStyle( SymbolStyle style ); SymbolStyle symbolStyle() const; void setSymbolPen( const QColor &, qreal width = 0.0, Qt::PenStyle = Qt::SolidLine ); void setSymbolPen( const QPen & ); QPen symbolPen() const; void setSymbolBrush( Direction, const QBrush & ); QBrush symbolBrush( Direction ) const; void setSymbolExtent( double width ); double symbolExtent() const; void setMinSymbolWidth( double ); double minSymbolWidth() const; void setMaxSymbolWidth( double ); double maxSymbolWidth() const; virtual void drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual QRectF boundingRect() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: void init(); virtual void drawSymbols( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawUserSymbol( QPainter *, SymbolStyle, const QwtOHLCSample &, Qt::Orientation, bool inverted, double width ) const; void drawBar( QPainter *painter, const QwtOHLCSample &, Qt::Orientation, bool inverted, double width ) const; void drawCandleStick( QPainter *, const QwtOHLCSample &, Qt::Orientation, double width ) const; virtual double scaledSymbolWidth( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const; private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotTradingCurve::PaintAttributes ) #endif linssid-2.7/qwt-lib/src/qwt_plot_spectrocurve.h000644 001750 001750 00000004141 12151666701 022666 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CURVE_3D_H #define QWT_PLOT_CURVE_3D_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" class QwtSymbol; class QwtColorMap; /*! \brief Curve that displays 3D points as dots, where the z coordinate is mapped to a color. */ class QWT_EXPORT QwtPlotSpectroCurve: public QwtPlotSeriesItem, QwtSeriesStore { public: //! Paint attributes enum PaintAttribute { //! Clip points outside the canvas rectangle ClipPoints = 1 }; //! Paint attributes typedef QFlags PaintAttributes; explicit QwtPlotSpectroCurve( const QString &title = QString::null ); explicit QwtPlotSpectroCurve( const QwtText &title ); virtual ~QwtPlotSpectroCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setSamples( const QVector & ); void setSamples( QwtSeriesData * ); void setColorMap( QwtColorMap * ); const QwtColorMap *colorMap() const; void setColorRange( const QwtInterval & ); QwtInterval & colorRange() const; virtual void drawSeries( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void setPenWidth(double width); double penWidth() const; protected: virtual void drawDots( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; private: void init(); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotSpectroCurve::PaintAttributes ) #endif linssid-2.7/qwt-lib/src/qwt_round_scale_draw.h000644 001750 001750 00000003642 12151666701 022424 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ROUND_SCALE_DRAW_H #define QWT_ROUND_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_abstract_scale_draw.h" #include /*! \brief A class for drawing round scales QwtRoundScaleDraw can be used to draw round scales. The circle segment can be adjusted by setAngleRange(). The geometry of the scale can be specified with moveCenter() and setRadius(). After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtRoundScaleDraw: public QwtAbstractScaleDraw { public: QwtRoundScaleDraw(); virtual ~QwtRoundScaleDraw(); void setRadius( double radius ); double radius() const; void moveCenter( double x, double y ); void moveCenter( const QPointF & ); QPointF center() const; void setAngleRange( double angle1, double angle2 ); virtual double extent( const QFont & ) const; protected: virtual void drawTick( QPainter *, double val, double len ) const; virtual void drawBackbone( QPainter * ) const; virtual void drawLabel( QPainter *, double val ) const; private: QwtRoundScaleDraw( const QwtRoundScaleDraw & ); QwtRoundScaleDraw &operator=( const QwtRoundScaleDraw &other ); class PrivateData; PrivateData *d_data; }; //! Move the center of the scale draw, leaving the radius unchanged inline void QwtRoundScaleDraw::moveCenter( double x, double y ) { moveCenter( QPointF( x, y ) ); } #endif linssid-2.7/linssid-app/linssid-start.png000644 001750 001750 00000002231 12355414341 021416 0ustar00warrenwarren000000 000000 PNG  IHDR ssBITUF pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATx}kU}3IMk L[ BF+fU4-~P\JHi6(KM[EjkBDDE63Nׇ0C$/$k׉?$"fÅф5kX)p@+E&pe|M_hBBdɱ Qq76R_c}0RgYetM<1n>>`pїTel"ogBJCv~[en_: la%3 &q;l,v76x':.2‰xBgJݾ~ l<9mw-6O*2í .E^e{K<+Ѵ,j,pZL=|A:,ԩ3HYlAd˫Kf!N[Yc~d_ @]qnק"?-6bujTcG#+O5ZC) $@)>bmY c1sT2(e|ɓcw·?I[xbkk,r #h%[v`1ʼn`dB%xK]<܇_.'e93k-O' :i;S_q}P\.g[zvǵc rJ傻|6a9ßъIENDB`linssid-2.7/000775 001750 001750 00000000000 12357037614 013677 5ustar00warrenwarren000000 000000 linssid-2.7/qwt-lib/src/qwt_plot_item.cpp000644 001750 001750 00000037146 12151666703 021450 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_item.h" #include "qwt_text.h" #include "qwt_plot.h" #include "qwt_legend_data.h" #include "qwt_scale_div.h" #include "qwt_graphic.h" #include class QwtPlotItem::PrivateData { public: PrivateData(): plot( NULL ), isVisible( true ), attributes( 0 ), interests( 0 ), renderHints( 0 ), renderThreadCount( 1 ), z( 0.0 ), xAxis( QwtPlot::xBottom ), yAxis( QwtPlot::yLeft ), legendIconSize( 8, 8 ) { } mutable QwtPlot *plot; bool isVisible; QwtPlotItem::ItemAttributes attributes; QwtPlotItem::ItemInterests interests; QwtPlotItem::RenderHints renderHints; uint renderThreadCount; double z; int xAxis; int yAxis; QwtText title; QSize legendIconSize; }; /*! Constructor \param title Title of the item */ QwtPlotItem::QwtPlotItem( const QwtText &title ) { d_data = new PrivateData; d_data->title = title; } //! Destroy the QwtPlotItem QwtPlotItem::~QwtPlotItem() { attach( NULL ); delete d_data; } /*! \brief Attach the item to a plot. This method will attach a QwtPlotItem to the QwtPlot argument. It will first detach the QwtPlotItem from any plot from a previous call to attach (if necessary). If a NULL argument is passed, it will detach from any QwtPlot it was attached to. \param plot Plot widget \sa detach() */ void QwtPlotItem::attach( QwtPlot *plot ) { if ( plot == d_data->plot ) return; if ( d_data->plot ) d_data->plot->attachItem( this, false ); d_data->plot = plot; if ( d_data->plot ) d_data->plot->attachItem( this, true ); } /*! \brief This method detaches a QwtPlotItem from any QwtPlot it has been associated with. detach() is equivalent to calling attach( NULL ) \sa attach() */ void QwtPlotItem::detach() { attach( NULL ); } /*! Return rtti for the specific class represented. QwtPlotItem is simply a virtual interface class, and base classes will implement this method with specific rtti values so a user can differentiate them. The rtti value is useful for environments, where the runtime type information is disabled and it is not possible to do a dynamic_cast<...>. \return rtti value \sa RttiValues */ int QwtPlotItem::rtti() const { return Rtti_PlotItem; } //! Return attached plot QwtPlot *QwtPlotItem::plot() const { return d_data->plot; } /*! Plot items are painted in increasing z-order. \return setZ(), QwtPlotDict::itemList() */ double QwtPlotItem::z() const { return d_data->z; } /*! \brief Set the z value Plot items are painted in increasing z-order. \param z Z-value \sa z(), QwtPlotDict::itemList() */ void QwtPlotItem::setZ( double z ) { if ( d_data->z != z ) { if ( d_data->plot ) // update the z order d_data->plot->attachItem( this, false ); d_data->z = z; if ( d_data->plot ) d_data->plot->attachItem( this, true ); itemChanged(); } } /*! Set a new title \param title Title \sa title() */ void QwtPlotItem::setTitle( const QString &title ) { setTitle( QwtText( title ) ); } /*! Set a new title \param title Title \sa title() */ void QwtPlotItem::setTitle( const QwtText &title ) { if ( d_data->title != title ) { d_data->title = title; legendChanged(); #if 0 itemChanged(); #endif } } /*! \return Title of the item \sa setTitle() */ const QwtText &QwtPlotItem::title() const { return d_data->title; } /*! Toggle an item attribute \param attribute Attribute type \param on true/false \sa testItemAttribute(), ItemInterest */ void QwtPlotItem::setItemAttribute( ItemAttribute attribute, bool on ) { if ( d_data->attributes.testFlag( attribute ) != on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; if ( attribute == QwtPlotItem::Legend ) legendChanged(); itemChanged(); } } /*! Test an item attribute \param attribute Attribute type \return true/false \sa setItemAttribute(), ItemInterest */ bool QwtPlotItem::testItemAttribute( ItemAttribute attribute ) const { return d_data->attributes.testFlag( attribute ); } /*! Toggle an item interest \param interest Interest type \param on true/false \sa testItemInterest(), ItemAttribute */ void QwtPlotItem::setItemInterest( ItemInterest interest, bool on ) { if ( d_data->interests.testFlag( interest ) != on ) { if ( on ) d_data->interests |= interest; else d_data->interests &= ~interest; itemChanged(); } } /*! Test an item interest \param interest Interest type \return true/false \sa setItemInterest(), ItemAttribute */ bool QwtPlotItem::testItemInterest( ItemInterest interest ) const { return d_data->interests.testFlag( interest ); } /*! Toggle an render hint \param hint Render hint \param on true/false \sa testRenderHint(), RenderHint */ void QwtPlotItem::setRenderHint( RenderHint hint, bool on ) { if ( d_data->renderHints.testFlag( hint ) != on ) { if ( on ) d_data->renderHints |= hint; else d_data->renderHints &= ~hint; itemChanged(); } } /*! Test a render hint \param hint Render hint \return true/false \sa setRenderHint(), RenderHint */ bool QwtPlotItem::testRenderHint( RenderHint hint ) const { return d_data->renderHints.testFlag( hint ); } /*! On multi core systems rendering of certain plot item ( f.e QwtPlotRasterItem ) can be done in parallel in several threads. The default setting is set to 1. \param numThreads Number of threads to be used for rendering. If numThreads is set to 0, the system specific ideal thread count is used. The default thread count is 1 ( = no additional threads ) */ void QwtPlotItem::setRenderThreadCount( uint numThreads ) { d_data->renderThreadCount = numThreads; } /*! \return Number of threads to be used for rendering. If numThreads() is set to 0, the system specific ideal thread count is used. */ uint QwtPlotItem::renderThreadCount() const { return d_data->renderThreadCount; } /*! Set the size of the legend icon The default setting is 8x8 pixels \param size Size \sa legendIconSize(), legendIcon() */ void QwtPlotItem::setLegendIconSize( const QSize &size ) { if ( d_data->legendIconSize != size ) { d_data->legendIconSize = size; legendChanged(); } } /*! \return Legend icon size \sa setLegendIconSize(), legendIcon() */ QSize QwtPlotItem::legendIconSize() const { return d_data->legendIconSize; } /*! \return Icon representing the item on the legend The default implementation returns an invalid icon \param index Index of the legend entry ( usually there is only one ) \param size Icon size \sa setLegendIconSize(), legendData() */ QwtGraphic QwtPlotItem::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ) Q_UNUSED( size ) return QwtGraphic(); } /*! \brief Return a default icon from a brush The default icon is a filled rectangle used in several derived classes as legendIcon(). \param brush Fill brush \param size Icon size \return A filled rectangle */ QwtGraphic QwtPlotItem::defaultIcon( const QBrush &brush, const QSizeF &size ) const { QwtGraphic icon; if ( !size.isEmpty() ) { icon.setDefaultSize( size ); QRectF r( 0, 0, size.width(), size.height() ); QPainter painter( &icon ); painter.fillRect( r, brush ); } return icon; } //! Show the item void QwtPlotItem::show() { setVisible( true ); } //! Hide the item void QwtPlotItem::hide() { setVisible( false ); } /*! Show/Hide the item \param on Show if true, otherwise hide \sa isVisible(), show(), hide() */ void QwtPlotItem::setVisible( bool on ) { if ( on != d_data->isVisible ) { d_data->isVisible = on; itemChanged(); } } /*! \return true if visible \sa setVisible(), show(), hide() */ bool QwtPlotItem::isVisible() const { return d_data->isVisible; } /*! Update the legend and call QwtPlot::autoRefresh() for the parent plot. \sa QwtPlot::legendChanged(), QwtPlot::autoRefresh() */ void QwtPlotItem::itemChanged() { if ( d_data->plot ) d_data->plot->autoRefresh(); } /*! Update the legend of the parent plot. \sa QwtPlot::updateLegend(), itemChanged() */ void QwtPlotItem::legendChanged() { if ( testItemAttribute( QwtPlotItem::Legend ) && d_data->plot ) d_data->plot->updateLegend( this ); } /*! Set X and Y axis The item will painted according to the coordinates of its Axes. \param xAxis X Axis ( QwtPlot::xBottom or QwtPlot::xTop ) \param yAxis Y Axis ( QwtPlot::yLeft or QwtPlot::yRight ) \sa setXAxis(), setYAxis(), xAxis(), yAxis(), QwtPlot::Axis */ void QwtPlotItem::setAxes( int xAxis, int yAxis ) { if ( xAxis == QwtPlot::xBottom || xAxis == QwtPlot::xTop ) d_data->xAxis = xAxis; if ( yAxis == QwtPlot::yLeft || yAxis == QwtPlot::yRight ) d_data->yAxis = yAxis; itemChanged(); } /*! Set the X axis The item will painted according to the coordinates its Axes. \param axis X Axis ( QwtPlot::xBottom or QwtPlot::xTop ) \sa setAxes(), setYAxis(), xAxis(), QwtPlot::Axis */ void QwtPlotItem::setXAxis( int axis ) { if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { d_data->xAxis = axis; itemChanged(); } } /*! Set the Y axis The item will painted according to the coordinates its Axes. \param axis Y Axis ( QwtPlot::yLeft or QwtPlot::yRight ) \sa setAxes(), setXAxis(), yAxis(), QwtPlot::Axis */ void QwtPlotItem::setYAxis( int axis ) { if ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) { d_data->yAxis = axis; itemChanged(); } } //! Return xAxis int QwtPlotItem::xAxis() const { return d_data->xAxis; } //! Return yAxis int QwtPlotItem::yAxis() const { return d_data->yAxis; } /*! \return An invalid bounding rect: QRectF(1.0, 1.0, -2.0, -2.0) \note A width or height < 0.0 is ignored by the autoscaler */ QRectF QwtPlotItem::boundingRect() const { return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid } /*! \brief Calculate a hint for the canvas margin When the QwtPlotItem::Margins flag is enabled the plot item indicates, that it needs some margins at the borders of the canvas. This is f.e. used by bar charts to reserve space for displaying the bars. The margins are in target device coordinates ( pixels on screen ) \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas in painter coordinates \param left Returns the left margin \param top Returns the top margin \param right Returns the right margin \param bottom Returns the bottom margin \return The default implementation returns 0 for all margins \sa QwtPlot::getCanvasMarginsHint(), QwtPlot::updateCanvasMargins() */ void QwtPlotItem::getCanvasMarginHint( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, double &left, double &top, double &right, double &bottom ) const { Q_UNUSED( xMap ); Q_UNUSED( yMap ); Q_UNUSED( canvasRect ); // use QMargins, when we don't need to support Qt < 4.6 anymore left = top = right = bottom = 0.0; } /*! \brief Return all information, that is needed to represent the item on the legend Most items are represented by one entry on the legend showing an icon and a text, but f.e. QwtPlotMultiBarChart displays one entry for each bar. QwtLegendData is basically a list of QVariants that makes it possible to overload and reimplement legendData() to return almost any type of information, that is understood by the receiver that acts as the legend. The default implementation returns one entry with the title() of the item and the legendIcon(). \return Data, that is needed to represent the item on the legend \sa title(), legendIcon(), QwtLegend, QwtPlotLegendItem */ QList QwtPlotItem::legendData() const { QwtLegendData data; QwtText label = title(); label.setRenderFlags( label.renderFlags() & Qt::AlignLeft ); QVariant titleValue; qVariantSetValue( titleValue, label ); data.setValue( QwtLegendData::TitleRole, titleValue ); const QwtGraphic graphic = legendIcon( 0, legendIconSize() ); if ( !graphic.isNull() ) { QVariant iconValue; qVariantSetValue( iconValue, graphic ); data.setValue( QwtLegendData::IconRole, iconValue ); } QList list; list += data; return list; } /*! \brief Update the item to changes of the axes scale division Update the item, when the axes of plot have changed. The default implementation does nothing, but items that depend on the scale division (like QwtPlotGrid()) have to reimplement updateScaleDiv() updateScaleDiv() is only called when the ScaleInterest interest is enabled. The default implementation does nothing. \param xScaleDiv Scale division of the x-axis \param yScaleDiv Scale division of the y-axis \sa QwtPlot::updateAxes(), ScaleInterest */ void QwtPlotItem::updateScaleDiv( const QwtScaleDiv &xScaleDiv, const QwtScaleDiv &yScaleDiv ) { Q_UNUSED( xScaleDiv ); Q_UNUSED( yScaleDiv ); } /*! \brief Update the item to changes of the legend info Plot items that want to display a legend ( not those, that want to be displayed on a legend ! ) will have to implement updateLegend(). updateLegend() is only called when the LegendInterest interest is enabled. The default implementation does nothing. \param item Plot item to be displayed on a legend \param data Attributes how to display item on the legend \sa QwtPlotLegendItem \note Plot items, that want to be displayed on a legend need to enable the QwtPlotItem::Legend flag and to implement legendData() and legendIcon() */ void QwtPlotItem::updateLegend( const QwtPlotItem *item, const QList &data ) { Q_UNUSED( item ); Q_UNUSED( data ); } /*! \brief Calculate the bounding scale rectangle of 2 maps \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \return Bounding scale rect of the scale maps, not normalized */ QRectF QwtPlotItem::scaleRect( const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { return QRectF( xMap.s1(), yMap.s1(), xMap.sDist(), yMap.sDist() ); } /*! \brief Calculate the bounding paint rectangle of 2 maps \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \return Bounding paint rectangle of the scale maps, not normalized */ QRectF QwtPlotItem::paintRect( const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { const QRectF rect( xMap.p1(), yMap.p1(), xMap.pDist(), yMap.pDist() ); return rect; } linssid-2.7/qwt-lib/src/qwt_point_mapper.h000644 001750 001750 00000005202 12151666702 021601 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_POINT_MAPPER_H #define QWT_POINT_MAPPER_H #include "qwt_global.h" #include "qwt_series_data.h" #include class QwtScaleMap; class QPolygonF; class QPolygon; /*! \brief A helper class for translating a series of points QwtPointMapper is a collection of methods and optimizations for translating a series of points into paint device coordinates. It is used by QwtPlotCurve but might also be useful for similar plot items displaying a QwtSeriesData. */ class QWT_EXPORT QwtPointMapper { public: /*! \brief Flags affecting the transformation process \sa setFlag(), setFlags() */ enum TransformationFlag { //! Round points to integer values RoundPoints = 0x01, /*! Try to remove points, that are translated to the same position. */ WeedOutPoints = 0x02 }; /*! \brief Flags affecting the transformation process \sa setFlag(), setFlags() */ typedef QFlags TransformationFlags; QwtPointMapper(); ~QwtPointMapper(); void setFlags( TransformationFlags ); TransformationFlags flags() const; void setFlag( TransformationFlag, bool on = true ); bool testFlag( TransformationFlag ) const; void setBoundingRect( const QRectF & ); QRectF boundingRect() const; QPolygonF toPolygonF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const; QPolygon toPolygon( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const; QPolygon toPoints( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const; QPolygonF toPointsF( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to ) const; QImage toImage( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData *series, int from, int to, const QPen &, bool antialiased, uint numThreads ) const; private: class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPointMapper::TransformationFlags ) #endif linssid-2.7/linssid-app/linssid-app.pro000664 001750 001750 00000002223 12366770601 021066 0ustar00warrenwarren000000 000000 TEMPLATE = app DESTDIR = dist/Release/GNU-Linux-x86 TARGET = linssid VERSION = 2.7 CONFIG -= debug_and_release app_bundle lib_bundle CONFIG += release PKGCONFIG += QT = core gui widgets svg SOURCES += AboutBox.cpp Getter.cpp MainForm.cpp main.cpp passBox.cpp prefsDialog.cpp HEADERS += AboutBox.h Custom.h Getter.h MainForm.h passBox.h prefsDialog.h FORMS += AboutBox.ui MainForm.ui passBox.ui prefsDialog.ui RESOURCES += TRANSLATIONS += OBJECTS_DIR = build/Release/GNU-Linux-x86 MOC_DIR = RCC_DIR = UI_DIR = QMAKE_CC = gcc QMAKE_CXX = g++ DEFINES += INCLUDEPATH += /usr/include/qt5 # /usr/local/qwt-6.1.0/include INCLUDEPATH += ../qwt-lib/src # LIBS += /usr/lib/x86_64-linux-gnu/libboost_regex.a # LIBS += -lboost_regex LIBS += -l:libboost_regex.a # /usr/local/qwt-6.1.0/lib/libqwt.a LIBS += ../qwt-lib/lib/libqwt.a QMAKE_CXXFLAGS += -std=c++11 # TARGET = linssid target.path = /usr/bin INSTALLS += target dtop.path = /usr/share/applications dtop.files = linssid.desktop INSTALLS += dtop icons.path = /usr/share/pixmaps icons.files = *.png INSTALLS += icons data.path = /usr/share/linssid data.files = oui.datb linssid-pause.png linssid-start.png INSTALLS += data linssid-2.7/qwt-lib/src/qwt_plot_magnifier.h000644 001750 001750 00000002561 12151666702 022110 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_MAGNIFIER_H #define QWT_PLOT_MAGNIFIER_H 1 #include "qwt_global.h" #include "qwt_magnifier.h" class QwtPlot; /*! \brief QwtPlotMagnifier provides zooming, by magnifying in steps. Using QwtPlotMagnifier a plot can be zoomed in/out in steps using keys, the mouse wheel or moving a mouse button in vertical direction. Together with QwtPlotZoomer and QwtPlotPanner it is possible to implement individual and powerful navigation of the plot canvas. \sa QwtPlotZoomer, QwtPlotPanner, QwtPlot */ class QWT_EXPORT QwtPlotMagnifier: public QwtMagnifier { Q_OBJECT public: explicit QwtPlotMagnifier( QWidget * ); virtual ~QwtPlotMagnifier(); void setAxisEnabled( int axis, bool on ); bool isAxisEnabled( int axis ) const; QWidget *canvas(); const QWidget *canvas() const; QwtPlot *plot(); const QwtPlot *plot() const; protected: virtual void rescale( double factor ); private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_arrow_button.cpp000644 001750 001750 00000020202 12151666703 022162 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_arrow_button.h" #include "qwt_math.h" #include #include #include #include #include static const int MaxNum = 3; static const int Margin = 2; static const int Spacing = 1; class QwtArrowButton::PrivateData { public: int num; Qt::ArrowType arrowType; }; static QStyleOptionButton styleOpt( const QwtArrowButton* btn ) { QStyleOptionButton option; option.init( btn ); option.features = QStyleOptionButton::None; if ( btn->isFlat() ) option.features |= QStyleOptionButton::Flat; if ( btn->menu() ) option.features |= QStyleOptionButton::HasMenu; if ( btn->autoDefault() || btn->isDefault() ) option.features |= QStyleOptionButton::AutoDefaultButton; if ( btn->isDefault() ) option.features |= QStyleOptionButton::DefaultButton; if ( btn->isDown() ) option.state |= QStyle::State_Sunken; if ( !btn->isFlat() && !btn->isDown() ) option.state |= QStyle::State_Raised; return option; } /*! \param num Number of arrows \param arrowType see Qt::ArrowType in the Qt docs. \param parent Parent widget */ QwtArrowButton::QwtArrowButton( int num, Qt::ArrowType arrowType, QWidget *parent ): QPushButton( parent ) { d_data = new PrivateData; d_data->num = qBound( 1, num, MaxNum ); d_data->arrowType = arrowType; setAutoRepeat( true ); setAutoDefault( false ); switch ( d_data->arrowType ) { case Qt::LeftArrow: case Qt::RightArrow: setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); break; default: setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ); } } //! Destructor QwtArrowButton::~QwtArrowButton() { delete d_data; d_data = NULL; } /*! \brief The direction of the arrows */ Qt::ArrowType QwtArrowButton::arrowType() const { return d_data->arrowType; } /*! \brief The number of arrows */ int QwtArrowButton::num() const { return d_data->num; } /*! \return the bounding rectangle for the label */ QRect QwtArrowButton::labelRect() const { const int m = Margin; QRect r = rect(); r.setRect( r.x() + m, r.y() + m, r.width() - 2 * m, r.height() - 2 * m ); if ( isDown() ) { QStyleOptionButton option = styleOpt( this ); const int ph = style()->pixelMetric( QStyle::PM_ButtonShiftHorizontal, &option, this ); const int pv = style()->pixelMetric( QStyle::PM_ButtonShiftVertical, &option, this ); r.translate( ph, pv ); } return r; } /*! Paint event handler \param event Paint event */ void QwtArrowButton::paintEvent( QPaintEvent *event ) { QPushButton::paintEvent( event ); QPainter painter( this ); drawButtonLabel( &painter ); } /*! \brief Draw the button label \param painter Painter \sa The Qt Manual for QPushButton */ void QwtArrowButton::drawButtonLabel( QPainter *painter ) { const bool isVertical = d_data->arrowType == Qt::UpArrow || d_data->arrowType == Qt::DownArrow; const QRect r = labelRect(); QSize boundingSize = labelRect().size(); if ( isVertical ) boundingSize.transpose(); const int w = ( boundingSize.width() - ( MaxNum - 1 ) * Spacing ) / MaxNum; QSize arrow = arrowSize( Qt::RightArrow, QSize( w, boundingSize.height() ) ); if ( isVertical ) arrow.transpose(); QRect contentsSize; // aligned rect where to paint all arrows if ( d_data->arrowType == Qt::LeftArrow || d_data->arrowType == Qt::RightArrow ) { contentsSize.setWidth( d_data->num * arrow.width() + ( d_data->num - 1 ) * Spacing ); contentsSize.setHeight( arrow.height() ); } else { contentsSize.setWidth( arrow.width() ); contentsSize.setHeight( d_data->num * arrow.height() + ( d_data->num - 1 ) * Spacing ); } QRect arrowRect( contentsSize ); arrowRect.moveCenter( r.center() ); arrowRect.setSize( arrow ); painter->save(); for ( int i = 0; i < d_data->num; i++ ) { drawArrow( painter, arrowRect, d_data->arrowType ); int dx = 0; int dy = 0; if ( isVertical ) dy = arrow.height() + Spacing; else dx = arrow.width() + Spacing; arrowRect.translate( dx, dy ); } painter->restore(); if ( hasFocus() ) { QStyleOptionFocusRect option; option.init( this ); option.backgroundColor = palette().color( QPalette::Window ); style()->drawPrimitive( QStyle::PE_FrameFocusRect, &option, painter, this ); } } /*! Draw an arrow int a bounding rectangle \param painter Painter \param r Rectangle where to paint the arrow \param arrowType Arrow type */ void QwtArrowButton::drawArrow( QPainter *painter, const QRect &r, Qt::ArrowType arrowType ) const { QPolygon pa( 3 ); switch ( arrowType ) { case Qt::UpArrow: pa.setPoint( 0, r.bottomLeft() ); pa.setPoint( 1, r.bottomRight() ); pa.setPoint( 2, r.center().x(), r.top() ); break; case Qt::DownArrow: pa.setPoint( 0, r.topLeft() ); pa.setPoint( 1, r.topRight() ); pa.setPoint( 2, r.center().x(), r.bottom() ); break; case Qt::RightArrow: pa.setPoint( 0, r.topLeft() ); pa.setPoint( 1, r.bottomLeft() ); pa.setPoint( 2, r.right(), r.center().y() ); break; case Qt::LeftArrow: pa.setPoint( 0, r.topRight() ); pa.setPoint( 1, r.bottomRight() ); pa.setPoint( 2, r.left(), r.center().y() ); break; default: break; } painter->save(); painter->setRenderHint( QPainter::Antialiasing, true ); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::ButtonText ) ); painter->drawPolygon( pa ); painter->restore(); } /*! \return a size hint */ QSize QwtArrowButton::sizeHint() const { const QSize hint = minimumSizeHint(); return hint.expandedTo( QApplication::globalStrut() ); } /*! \brief Return a minimum size hint */ QSize QwtArrowButton::minimumSizeHint() const { const QSize asz = arrowSize( Qt::RightArrow, QSize() ); QSize sz( 2 * Margin + ( MaxNum - 1 ) * Spacing + MaxNum * asz.width(), 2 * Margin + asz.height() ); if ( d_data->arrowType == Qt::UpArrow || d_data->arrowType == Qt::DownArrow ) sz.transpose(); QStyleOption styleOption; styleOption.init( this ); sz = style()->sizeFromContents( QStyle::CT_PushButton, &styleOption, sz, this ); return sz; } /*! Calculate the size for a arrow that fits into a rectangle of a given size \param arrowType Arrow type \param boundingSize Bounding size \return Size of the arrow */ QSize QwtArrowButton::arrowSize( Qt::ArrowType arrowType, const QSize &boundingSize ) const { QSize bs = boundingSize; if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow ) bs.transpose(); const int MinLen = 2; const QSize sz = bs.expandedTo( QSize( MinLen, 2 * MinLen - 1 ) ); // minimum int w = sz.width(); int h = 2 * w - 1; if ( h > sz.height() ) { h = sz.height(); w = ( h + 1 ) / 2; } QSize arrSize( w, h ); if ( arrowType == Qt::UpArrow || arrowType == Qt::DownArrow ) arrSize.transpose(); return arrSize; } /*! \brief autoRepeat for the space keys */ void QwtArrowButton::keyPressEvent( QKeyEvent *event ) { if ( event->isAutoRepeat() && event->key() == Qt::Key_Space ) Q_EMIT clicked(); QPushButton::keyPressEvent( event ); } linssid-2.7/qwt-lib/src/qwt_compass_rose.h000644 001750 001750 00000004245 12151666701 021606 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COMPASS_ROSE_H #define QWT_COMPASS_ROSE_H 1 #include "qwt_global.h" #include class QPainter; /*! \brief Abstract base class for a compass rose */ class QWT_EXPORT QwtCompassRose { public: //! Destructor virtual ~QwtCompassRose() {}; //! Assign a palette virtual void setPalette( const QPalette &p ) { d_palette = p; } //! \return Current palette const QPalette &palette() const { return d_palette; } /*! Draw the rose \param painter Painter \param center Center point \param radius Radius of the rose \param north Position \param colorGroup Color group */ virtual void draw( QPainter *painter, const QPointF ¢er, double radius, double north, QPalette::ColorGroup colorGroup = QPalette::Active ) const = 0; private: QPalette d_palette; }; /*! \brief A simple rose for QwtCompass */ class QWT_EXPORT QwtSimpleCompassRose: public QwtCompassRose { public: QwtSimpleCompassRose( int numThorns = 8, int numThornLevels = -1 ); virtual ~QwtSimpleCompassRose(); void setWidth( double w ); double width() const; void setNumThorns( int count ); int numThorns() const; void setNumThornLevels( int count ); int numThornLevels() const; void setShrinkFactor( double factor ); double shrinkFactor() const; virtual void draw( QPainter *, const QPointF ¢er, double radius, double north, QPalette::ColorGroup = QPalette::Active ) const; static void drawRose( QPainter *, const QPalette &, const QPointF ¢er, double radius, double origin, double width, int numThorns, int numThornLevels, double shrinkFactor ); private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/linssid-app/AboutBox.cpp000664 001750 001750 00000000602 12355414341 020341 0ustar00warrenwarren000000 000000 /* * File: aboutBox.cpp * Author: warren * * Created on November 20, 2012, 8:12 PM */ #include #include "AboutBox.h" #include "Custom.h" using namespace std; AboutBox::AboutBox() { widget.setupUi(this); std::string version = std::string("Version ") + std::string(LINSSIDVERSION); widget.aboutVersion->setText(version.c_str()); } AboutBox::~AboutBox() { } linssid-2.7/linssid-app/README_2.7000664 001750 001750 00000006473 12366755677 017422 0ustar00warrenwarren000000 000000 ©2012-2014 Warren Severin This program is released under the terms of the GNU Public License (version 3). Version 2.7 * Hopefully fixes an occassional problem in some configurations where LinSSID hangs during scan when the wifi interface is connected to an attach point * Updated vendor database Version 2.6: * Fixes a possible bug in interface detection * Static link to libboost-regex * Update vendor database Version 2.5: * Fixes an issue with how the zsh shell interprets command lines. Huge thanks to Alex Stelmachonak. Version 2.4: * Same as 2.3 code but necessary to get a i386 build through Canonical. Long story. Version 2.3: * Fixed issue with RTL8187SE card and driver not providing frequency resulting in LinSSID crash. * Renamed the column that displays WEP, WPA2, etc., to "Privacy". * Added column for protocol {a,b,g,n}. (Note that many drivers do not report protocol.) * Modified data logging format to reflect as above * Added buttons for immediate clear or set of plotting of all visible attach points * Improved response to Plot column check boxes * Cleaned up a few minor bugs * Updated vendor database Version 2.2: * Fixes several small bugs * Adds a status display line to top panel * Now built with QT5 and Qwt 6.1 * Updated wifi vendor database Version 2.1: * Fixes issue with not finding some interfaces when they are 'up' but not connected to an attach point. * Updated wifi vendor database Version 2.0: * Hopefully fixes the problem with not finding some wireless interfaces. Version 1.9: * Added data logging to "~/LinSSID.datalog" * Anti-aliased plots * Updated wifi vendor database Version 1.8a: * Minor ooopps fix in password handling Version 1.8: * Stability improvement build * - Improved odd character handling in password verification * - Improved handling of default values on initial install or upgrade * - Improved wireless port discovery Version 1.7: * Adds horizontal grid to plots * Adds a Preferences menu item under the File menu. * - Adjust plot scale * - Toggle grid lines on/off Version 1.6: * Attempts to fix frequent crashing with some wifi drivers. Also some cosmetic changes. * - Fixes problem of some drivers reporting attach points (based on MAC address) more than once per scan. (Go figure...) * - Fixes code problem handling recalcitrant drivers that don't want to do a scan when requested to do so. * Centers most text alignment in cells Version 1.5: * Saves window layout between sessions. Keeps ".linssid.prefs" in home folder. If things go haywire delete the prefs file. Version 1.4: * Imposes minimum 0.5 second "nap time" between scans so that poorly written drivers crash less. * Updates the UOI vendor database * Improves concurrency of wifi scanning and main form updating. The wireless tools that LinSSID uses require root privilege to access. If your machine has sudo, the best way to run is to launch the program and let it ask you for a password. That way it will only use root privilege to execute a few privileged system commands, but LinSSID itself will not run as a root process. The other way to run LinSSID is to launch it from a root account or with su or sudo. It will run, but in my opinion that's a bit more dangerous. One never knows what nasty bugs may be waiting to damage. Please report bugs on the discussion tab at the project web page: https://sourceforge.net/projects/linssid/ linssid-2.7/qwt-lib/src/qwt_plot_seriesitem.h000644 001750 001750 00000003704 12151666701 022317 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_SERIES_ITEM_H #define QWT_PLOT_SERIES_ITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_scale_div.h" #include "qwt_series_data.h" #include "qwt_series_store.h" /*! \brief Base class for plot items representing a series of samples */ class QWT_EXPORT QwtPlotSeriesItem: public QwtPlotItem, public virtual QwtAbstractSeriesStore { public: explicit QwtPlotSeriesItem( const QString &title = QString::null ); explicit QwtPlotSeriesItem( const QwtText &title ); virtual ~QwtPlotSeriesItem(); void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF & ) const; /*! Draw a subset of the samples \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rectangle of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. */ virtual void drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const = 0; virtual QRectF boundingRect() const; virtual void updateScaleDiv( const QwtScaleDiv &, const QwtScaleDiv & ); protected: virtual void dataChanged(); private: class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_widget_overlay.cpp000644 001750 001750 00000020376 12151666703 022475 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_widget_overlay.h" #include "qwt_painter.h" #include #include #include #include static QImage::Format qwtMaskImageFormat() { if ( QwtPainter::isX11GraphicsSystem() ) return QImage::Format_ARGB32; return QImage::Format_ARGB32_Premultiplied; } static QRegion qwtAlphaMask( const QImage& image, const QVector rects ) { const int w = image.width(); const int h = image.height(); QRegion region; QRect rect; for ( int i = 0; i < rects.size(); i++ ) { int x1, x2, y1, y2; rects[i].getCoords( &x1, &y1, &x2, &y2 ); x1 = qMax( x1, 0 ); x2 = qMin( x2, w - 1 ); y1 = qMax( y1, 0 ); y2 = qMin( y2, h - 1 ); for ( int y = y1; y <= y2; ++y ) { bool inRect = false; int rx0 = -1; const uint *line = reinterpret_cast ( image.scanLine( y ) ) + x1; for ( int x = x1; x <= x2; x++ ) { const bool on = ( ( *line++ >> 24 ) != 0 ); if ( on != inRect ) { if ( inRect ) { rect.setCoords( rx0, y, x - 1, y ); region += rect; } else { rx0 = x; } inRect = on; } } if ( inRect ) { rect.setCoords( rx0, y, x2, y ); region = region.united( rect ); } } } return region; } class QwtWidgetOverlay::PrivateData { public: PrivateData(): maskMode( QwtWidgetOverlay::MaskHint ), renderMode( QwtWidgetOverlay::AutoRenderMode ), rgbaBuffer( NULL ) { } ~PrivateData() { resetRgbaBuffer(); } void resetRgbaBuffer() { if ( rgbaBuffer ) { ::free( rgbaBuffer ); rgbaBuffer = NULL; } } MaskMode maskMode; RenderMode renderMode; uchar *rgbaBuffer; }; /*! \brief Constructor \param widget Parent widget, where the overlay is aligned to */ QwtWidgetOverlay::QwtWidgetOverlay( QWidget* widget ): QWidget( widget ) { d_data = new PrivateData; setAttribute( Qt::WA_TransparentForMouseEvents ); setAttribute( Qt::WA_NoSystemBackground ); setFocusPolicy( Qt::NoFocus ); if ( widget ) { resize( widget->size() ); widget->installEventFilter( this ); } } //! Destructor QwtWidgetOverlay::~QwtWidgetOverlay() { delete d_data; } /*! \brief Specify how to find the mask for the overlay \param mode New mode \sa maskMode() */ void QwtWidgetOverlay::setMaskMode( MaskMode mode ) { if ( mode != d_data->maskMode ) { d_data->maskMode = mode; d_data->resetRgbaBuffer(); } } /*! \return Mode how to find the mask for the overlay \sa setMaskMode() */ QwtWidgetOverlay::MaskMode QwtWidgetOverlay::maskMode() const { return d_data->maskMode; } /*! Set the render mode \param mode Render mode \sa RenderMode, renderMode() */ void QwtWidgetOverlay::setRenderMode( RenderMode mode ) { d_data->renderMode = mode; } /*! \return Render mode \sa RenderMode, setRenderMode() */ QwtWidgetOverlay::RenderMode QwtWidgetOverlay::renderMode() const { return d_data->renderMode; } /*! Recalculate the mask and repaint the overlay */ void QwtWidgetOverlay::updateOverlay() { updateMask(); update(); } void QwtWidgetOverlay::updateMask() { d_data->resetRgbaBuffer(); QRegion mask; if ( d_data->maskMode == QwtWidgetOverlay::MaskHint ) { mask = maskHint(); } else if ( d_data->maskMode == QwtWidgetOverlay::AlphaMask ) { // TODO: the image doesn't need to be larger than // the bounding rectangle of the hint !! QRegion hint = maskHint(); if ( hint.isEmpty() ) hint += QRect( 0, 0, width(), height() ); // A fresh buffer from calloc() is usually faster // than reinitializing an existing one with // QImage::fill( 0 ) or memset() d_data->rgbaBuffer = ( uchar* )::calloc( width() * height(), 4 ); QImage image( d_data->rgbaBuffer, width(), height(), qwtMaskImageFormat() ); QPainter painter( &image ); draw( &painter ); painter.end(); mask = qwtAlphaMask( image, hint.rects() ); if ( d_data->renderMode == QwtWidgetOverlay::DrawOverlay ) { // we don't need the buffer later d_data->resetRgbaBuffer(); } } // A bug in Qt initiates a full repaint of the widget // when we change the mask, while we are visible ! setVisible( false ); if ( mask.isEmpty() ) clearMask(); else setMask( mask ); setVisible( true ); } /*! Paint event \param event Paint event \sa drawOverlay() */ void QwtWidgetOverlay::paintEvent( QPaintEvent* event ) { const QRegion clipRegion = event->region(); QPainter painter( this ); bool useRgbaBuffer = false; if ( d_data->renderMode == QwtWidgetOverlay::CopyAlphaMask ) { useRgbaBuffer = true; } else if ( d_data->renderMode == QwtWidgetOverlay::AutoRenderMode ) { if ( painter.paintEngine()->type() == QPaintEngine::Raster ) useRgbaBuffer = true; } if ( d_data->rgbaBuffer && useRgbaBuffer ) { const QImage image( d_data->rgbaBuffer, width(), height(), qwtMaskImageFormat() ); QVector rects; if ( clipRegion.rects().size() > 2000 ) { // the region is to complex painter.setClipRegion( clipRegion ); rects += clipRegion.boundingRect(); } else { rects = clipRegion.rects(); } for ( int i = 0; i < rects.size(); i++ ) { const QRect r = rects[i]; painter.drawImage( r.topLeft(), image, r ); } } else { painter.setClipRegion( clipRegion ); draw( &painter ); } } /*! Resize event \param event Resize event */ void QwtWidgetOverlay::resizeEvent( QResizeEvent* event ) { Q_UNUSED( event ); d_data->resetRgbaBuffer(); } void QwtWidgetOverlay::draw( QPainter *painter ) const { QWidget *widget = const_cast< QWidget *>( parentWidget() ); if ( widget ) { painter->setClipRect( parentWidget()->contentsRect() ); // something special for the plot canvas QPainterPath clipPath; ( void )QMetaObject::invokeMethod( widget, "borderPath", Qt::DirectConnection, Q_RETURN_ARG( QPainterPath, clipPath ), Q_ARG( QRect, rect() ) ); if (!clipPath.isEmpty()) { painter->setClipPath( clipPath, Qt::IntersectClip ); } } drawOverlay( painter ); } /*! \brief Calculate an approximation for the mask - MaskHint The hint is used as mask. - AlphaMask The hint is used to speed up the algorithm for calculating a mask from non transparent pixels - NoMask The hint is unused. The default implementation returns an invalid region indicating no hint. \return Hint for the mask */ QRegion QwtWidgetOverlay::maskHint() const { return QRegion(); } /*! \brief Event filter Resize the overlay according to the size of the parent widget. \param object Object to be filtered \param event Event \return See QObject::eventFilter() */ bool QwtWidgetOverlay::eventFilter( QObject* object, QEvent* event ) { if ( object == parent() && event->type() == QEvent::Resize ) { QResizeEvent *resizeEvent = static_cast( event ); resize( resizeEvent->size() ); } return QObject::eventFilter( object, event ); } linssid-2.7/debian/rules000755 001750 001750 00000000152 12345401746 016173 0ustar00warrenwarren000000 000000 #!/usr/bin/make -f include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/qmake.mk linssid-2.7/qwt-lib/src/qwt_plot.h000644 001750 001750 00000020252 12151666701 020063 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_H #define QWT_PLOT_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_plot_dict.h" #include "qwt_scale_map.h" #include "qwt_interval.h" #include #include #include class QwtPlotLayout; class QwtAbstractLegend; class QwtScaleWidget; class QwtScaleEngine; class QwtScaleDiv; class QwtScaleDraw; class QwtTextLabel; /*! \brief A 2-D plotting widget QwtPlot is a widget for plotting two-dimensional graphs. An unlimited number of plot items can be displayed on its canvas. Plot items might be curves (QwtPlotCurve), markers (QwtPlotMarker), the grid (QwtPlotGrid), or anything else derived from QwtPlotItem. A plot can have up to four axes, with each plot item attached to an x- and a y axis. The scales at the axes can be explicitly set (QwtScaleDiv), or are calculated from the plot items, using algorithms (QwtScaleEngine) which can be configured separately for each axis. The simpleplot example is a good starting point to see how to set up a plot widget. \image html plot.png \par Example The following example shows (schematically) the most simple way to use QwtPlot. By default, only the left and bottom axes are visible and their scales are computed automatically. \verbatim #include #include QwtPlot *myPlot = new QwtPlot("Two Curves", parent); // add curves QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1"); QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2"); // connect or copy the data to the curves curve1->setData(...); curve2->setData(...); curve1->attach(myPlot); curve2->attach(myPlot); // finally, refresh the plot myPlot->replot(); \endverbatim */ class QWT_EXPORT QwtPlot: public QFrame, public QwtPlotDict { Q_OBJECT Q_PROPERTY( QBrush canvasBackground READ canvasBackground WRITE setCanvasBackground ) Q_PROPERTY( bool autoReplot READ autoReplot WRITE setAutoReplot ) #if 0 // This property is intended to configure the plot // widget from a special dialog in the deigner plugin. // Disabled until such a dialog has been implemented. Q_PROPERTY( QString propertiesDocument READ grabProperties WRITE applyProperties ) #endif public: //! \brief Axis index enum Axis { //! Y axis left of the canvas yLeft, //! Y axis right of the canvas yRight, //! X axis below the canvas xBottom, //! X axis above the canvas xTop, //! Number of axes axisCnt }; /*! Position of the legend, relative to the canvas. \sa insertLegend() */ enum LegendPosition { //! The legend will be left from the QwtPlot::yLeft axis. LeftLegend, //! The legend will be right from the QwtPlot::yRight axis. RightLegend, //! The legend will be below the footer BottomLegend, //! The legend will be above the title TopLegend }; explicit QwtPlot( QWidget * = NULL ); explicit QwtPlot( const QwtText &title, QWidget * = NULL ); virtual ~QwtPlot(); void applyProperties( const QString & ); QString grabProperties() const; void setAutoReplot( bool = true ); bool autoReplot() const; // Layout void setPlotLayout( QwtPlotLayout * ); QwtPlotLayout *plotLayout(); const QwtPlotLayout *plotLayout() const; // Title void setTitle( const QString & ); void setTitle( const QwtText &t ); QwtText title() const; QwtTextLabel *titleLabel(); const QwtTextLabel *titleLabel() const; // Footer void setFooter( const QString & ); void setFooter( const QwtText &t ); QwtText footer() const; QwtTextLabel *footerLabel(); const QwtTextLabel *footerLabel() const; // Canvas void setCanvas( QWidget * ); QWidget *canvas(); const QWidget *canvas() const; void setCanvasBackground( const QBrush & ); QBrush canvasBackground() const; virtual QwtScaleMap canvasMap( int axisId ) const; double invTransform( int axisId, int pos ) const; double transform( int axisId, double value ) const; // Axes QwtScaleEngine *axisScaleEngine( int axisId ); const QwtScaleEngine *axisScaleEngine( int axisId ) const; void setAxisScaleEngine( int axisId, QwtScaleEngine * ); void setAxisAutoScale( int axisId, bool on = true ); bool axisAutoScale( int axisId ) const; void enableAxis( int axisId, bool tf = true ); bool axisEnabled( int axisId ) const; void setAxisFont( int axisId, const QFont &f ); QFont axisFont( int axisId ) const; void setAxisScale( int axisId, double min, double max, double step = 0 ); void setAxisScaleDiv( int axisId, const QwtScaleDiv & ); void setAxisScaleDraw( int axisId, QwtScaleDraw * ); double axisStepSize( int axisId ) const; QwtInterval axisInterval( int axisId ) const; const QwtScaleDiv &axisScaleDiv( int axisId ) const; const QwtScaleDraw *axisScaleDraw( int axisId ) const; QwtScaleDraw *axisScaleDraw( int axisId ); const QwtScaleWidget *axisWidget( int axisId ) const; QwtScaleWidget *axisWidget( int axisId ); void setAxisLabelAlignment( int axisId, Qt::Alignment ); void setAxisLabelRotation( int axisId, double rotation ); void setAxisTitle( int axisId, const QString & ); void setAxisTitle( int axisId, const QwtText & ); QwtText axisTitle( int axisId ) const; void setAxisMaxMinor( int axisId, int maxMinor ); int axisMaxMinor( int axisId ) const; void setAxisMaxMajor( int axisId, int maxMajor ); int axisMaxMajor( int axisId ) const; // Legend void insertLegend( QwtAbstractLegend *, LegendPosition = QwtPlot::RightLegend, double ratio = -1.0 ); QwtAbstractLegend *legend(); const QwtAbstractLegend *legend() const; void updateLegend(); void updateLegend( const QwtPlotItem * ); // Misc virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void updateLayout(); virtual void drawCanvas( QPainter * ); void updateAxes(); void updateCanvasMargins(); virtual void getCanvasMarginsHint( const QwtScaleMap maps[], const QRectF &canvasRect, double &left, double &top, double &right, double &bottom) const; virtual bool event( QEvent * ); virtual bool eventFilter( QObject *, QEvent * ); virtual void drawItems( QPainter *, const QRectF &, const QwtScaleMap maps[axisCnt] ) const; virtual QVariant itemToInfo( QwtPlotItem * ) const; virtual QwtPlotItem *infoToItem( const QVariant & ) const; Q_SIGNALS: /*! A signal indicating, that an item has been attached/detached \param plotItem Plot item \param on Attached/Detached */ void itemAttached( QwtPlotItem *plotItem, bool on ); /*! A signal with the attributes how to update the legend entries for a plot item. \param itemInfo Info about a plot item, build from itemToInfo() \param data Attributes of the entries ( usually <= 1 ) for the plot item. \sa itemToInfo(), infoToItem(), QwtAbstractLegend::updateLegend() */ void legendDataChanged( const QVariant &itemInfo, const QList &data ); public Q_SLOTS: virtual void replot(); void autoRefresh(); protected: static bool axisValid( int axisId ); virtual void resizeEvent( QResizeEvent *e ); private Q_SLOTS: void updateLegendItems( const QVariant &itemInfo, const QList &data ); private: friend class QwtPlotItem; void attachItem( QwtPlotItem *, bool ); void initAxesData(); void deleteAxesData(); void updateScaleDiv(); void initPlot( const QwtText &title ); class AxisData; AxisData *d_axisData[axisCnt]; class PrivateData; PrivateData *d_data; }; #endif linssid-2.7/qwt-lib/src/qwt_plot_shapeitem.cpp000644 001750 001750 00000026066 12151666703 022470 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_shapeitem.h" #include "qwt_scale_map.h" #include "qwt_painter.h" #include "qwt_curve_fitter.h" #include "qwt_clipper.h" static QPainterPath qwtTransformPath( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QPainterPath &path, bool doAlign ) { QPainterPath shape; shape.setFillRule( path.fillRule() ); for ( int i = 0; i < path.elementCount(); i++ ) { const QPainterPath::Element &element = path.elementAt( i ); double x = xMap.transform( element.x ); double y = yMap.transform( element.y ); switch( element.type ) { case QPainterPath::MoveToElement: { if ( doAlign ) { x = qRound( x ); y = qRound( y ); } shape.moveTo( x, y ); break; } case QPainterPath::LineToElement: { if ( doAlign ) { x = qRound( x ); y = qRound( y ); } shape.lineTo( x, y ); break; } case QPainterPath::CurveToElement: { const QPainterPath::Element& element1 = path.elementAt( ++i ); const double x1 = xMap.transform( element1.x ); const double y1 = yMap.transform( element1.y ); const QPainterPath::Element& element2 = path.elementAt( ++i ); const double x2 = xMap.transform( element2.x ); const double y2 = yMap.transform( element2.y ); shape.cubicTo( x, y, x1, y1, x2, y2 ); break; } case QPainterPath::CurveToDataElement: { break; } } } return shape; } class QwtPlotShapeItem::PrivateData { public: PrivateData(): legendMode( QwtPlotShapeItem::LegendColor ), renderTolerance( 0.0 ) { } QwtPlotShapeItem::PaintAttributes paintAttributes; QwtPlotShapeItem::LegendMode legendMode; double renderTolerance; QRectF boundingRect; QPen pen; QBrush brush; QPainterPath shape; }; /*! \brief Constructor Sets the following item attributes: - QwtPlotItem::AutoScale: true - QwtPlotItem::Legend: false \param title Title */ QwtPlotShapeItem::QwtPlotShapeItem( const QString& title ): QwtPlotItem( QwtText( title ) ) { init(); } /*! \brief Constructor Sets the following item attributes: - QwtPlotItem::AutoScale: true - QwtPlotItem::Legend: false \param title Title */ QwtPlotShapeItem::QwtPlotShapeItem( const QwtText& title ): QwtPlotItem( title ) { init(); } //! Destructor QwtPlotShapeItem::~QwtPlotShapeItem() { delete d_data; } void QwtPlotShapeItem::init() { d_data = new PrivateData(); d_data->boundingRect = QwtPlotItem::boundingRect(); setItemAttribute( QwtPlotItem::AutoScale, true ); setItemAttribute( QwtPlotItem::Legend, false ); setZ( 8.0 ); } //! \return QwtPlotItem::Rtti_PlotShape int QwtPlotShapeItem::rtti() const { return QwtPlotItem::Rtti_PlotShape; } /*! Specify an attribute how to draw the shape \param attribute Paint attribute \param on On/Off \sa testPaintAttribute() */ void QwtPlotShapeItem::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \return True, when attribute is enabled \sa setPaintAttribute() */ bool QwtPlotShapeItem::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Set the mode how to represent the item on the legend \param mode Mode \sa legendMode() */ void QwtPlotShapeItem::setLegendMode( LegendMode mode ) { if ( mode != d_data->legendMode ) { d_data->legendMode = mode; legendChanged(); } } /*! \return Mode how to represent the item on the legend \sa legendMode() */ QwtPlotShapeItem::LegendMode QwtPlotShapeItem::legendMode() const { return d_data->legendMode; } //! Bounding rectangle of the shape QRectF QwtPlotShapeItem::boundingRect() const { return d_data->boundingRect; } /*! \brief Set a path built from a rectangle \param rect Rectangle \sa setShape(), setPolygon(), shape() */ void QwtPlotShapeItem::setRect( const QRectF &rect ) { QPainterPath path; path.addRect( rect ); setShape( path ); } /*! \brief Set a path built from a polygon \param polygon Polygon \sa setShape(), setRect(), shape() */ void QwtPlotShapeItem::setPolygon( const QPolygonF &polygon ) { QPainterPath shape; shape.addPolygon( polygon ); setShape( shape ); } /*! \brief Set the shape to be displayed \param shape Shape \sa setShape(), shape() */ void QwtPlotShapeItem::setShape( const QPainterPath &shape ) { if ( shape != d_data->shape ) { d_data->shape = shape; if ( shape.isEmpty() ) { d_data->boundingRect = QwtPlotItem::boundingRect(); } else { d_data->boundingRect = shape.boundingRect(); } itemChanged(); } } /*! \return Shape to be displayed \sa setShape() */ QPainterPath QwtPlotShapeItem::shape() const { return d_data->shape; } /*! Build and assign a pen In Qt5 the default pen width is 1.0 ( 0.0 in Qt4 ) what makes it non cosmetic ( see QPen::isCosmetic() ). This method has been introduced to hide this incompatibility. \param color Pen color \param width Pen width \param style Pen style \sa pen(), brush() */ void QwtPlotShapeItem::setPen( const QColor &color, qreal width, Qt::PenStyle style ) { setPen( QPen( color, width, style ) ); } /*! \brief Assign a pen The pen is used to draw the outline of the shape \param pen Pen \sa pen(), brush() */ void QwtPlotShapeItem::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; itemChanged(); } } /*! \return Pen used to draw the outline of the shape \sa setPen(), brush() */ QPen QwtPlotShapeItem::pen() const { return d_data->pen; } /*! Assign a brush. The brush is used to fill the path \param brush Brush \sa brush(), pen() */ void QwtPlotShapeItem::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; itemChanged(); } } /*! \return Brush used to fill the shape \sa setBrush(), pen() */ QBrush QwtPlotShapeItem::brush() const { return d_data->brush; } /*! \brief Set the tolerance for the weeding optimization After translating the shape into target device coordinate ( usually widget geometries ) the painter path can be simplified by a point weeding algorithm ( Douglas-Peucker ). For shapes built from curves and ellipses weeding might have the opposite effect because they have to be expanded to polygons. \param tolerance Accepted error when reducing the number of points A value <= 0.0 disables weeding. \sa renderTolerance(), QwtWeedingCurveFitter */ void QwtPlotShapeItem::setRenderTolerance( double tolerance ) { tolerance = qMax( tolerance, 0.0 ); if ( tolerance != d_data->renderTolerance ) { d_data->renderTolerance = tolerance; itemChanged(); } } /*! \return Tolerance for the weeding optimization \sa setRenderTolerance() */ double QwtPlotShapeItem::renderTolerance() const { return d_data->renderTolerance; } /*! Draw the shape item \param painter Painter \param xMap X-Scale Map \param yMap Y-Scale Map \param canvasRect Contents rect of the plot canvas */ void QwtPlotShapeItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { if ( d_data->shape.isEmpty() ) return; if ( d_data->pen.style() == Qt::NoPen && d_data->brush.style() == Qt::NoBrush ) { return; } const QRectF cRect = QwtScaleMap::invTransform( xMap, yMap, canvasRect.toRect() ); if ( d_data->boundingRect.intersects( cRect ) ) { const bool doAlign = QwtPainter::roundingAlignment( painter ); QPainterPath path = qwtTransformPath( xMap, yMap, d_data->shape, doAlign ); if ( testPaintAttribute( QwtPlotShapeItem::ClipPolygons ) ) { qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF()); QRectF clipRect = canvasRect.adjusted( -pw, -pw, pw, pw ); QPainterPath clippedPath; clippedPath.setFillRule( path.fillRule() ); const QList polygons = path.toSubpathPolygons(); for ( int i = 0; i < polygons.size(); i++ ) { const QPolygonF p = QwtClipper::clipPolygonF( clipRect, polygons[i], true ); clippedPath.addPolygon( p ); } path = clippedPath; } if ( d_data->renderTolerance > 0.0 ) { QwtWeedingCurveFitter fitter( d_data->renderTolerance ); QPainterPath fittedPath; fittedPath.setFillRule( path.fillRule() ); const QList polygons = path.toSubpathPolygons(); for ( int i = 0; i < polygons.size(); i++ ) fittedPath.addPolygon( fitter.fitCurve( polygons[ i ] ) ); path = fittedPath; } painter->setPen( d_data->pen ); painter->setBrush( d_data->brush ); painter->drawPath( path ); } } /*! \return A rectangle filled with the color of the brush ( or the pen ) \param index Index of the legend entry ( usually there is only one ) \param size Icon size \sa setLegendIconSize(), legendData() */ QwtGraphic QwtPlotShapeItem::legendIcon( int index, const QSizeF &size ) const { Q_UNUSED( index ); QwtGraphic icon; icon.setDefaultSize( size ); if ( size.isEmpty() ) return icon; if ( d_data->legendMode == QwtPlotShapeItem::LegendShape ) { const QRectF &br = d_data->boundingRect; QPainter painter( &icon ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); painter.translate( -br.topLeft() ); painter.setPen( d_data->pen ); painter.setBrush( d_data->brush ); painter.drawPath( d_data->shape ); } else { QColor iconColor; if ( d_data->brush.style() != Qt::NoBrush ) iconColor = d_data->brush.color(); else iconColor = d_data->pen.color(); icon = defaultIcon( iconColor, size ); } return icon; } linssid-2.7/qwt-lib/src/qwt_plot_item.h000644 001750 001750 00000020233 12151666701 021100 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ITEM_H #define QWT_PLOT_ITEM_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_legend_data.h" #include "qwt_graphic.h" #include #include #include class QPainter; class QwtScaleMap; class QwtScaleDiv; class QwtPlot; /*! \brief Base class for items on the plot canvas A plot item is "something", that can be painted on the plot canvas, or only affects the scales of the plot widget. They can be categorized as: - Representator\n A "Representator" is an item that represents some sort of data on the plot canvas. The different representator classes are organized according to the characteristics of the data: - QwtPlotMarker Represents a point or a horizontal/vertical coordinate - QwtPlotCurve Represents a series of points - QwtPlotSpectrogram ( QwtPlotRasterItem ) Represents raster data - ... - Decorators\n A "Decorator" is an item, that displays additional information, that is not related to any data: - QwtPlotGrid - QwtPlotScaleItem - QwtPlotSvgItem - ... Depending on the QwtPlotItem::ItemAttribute flags, an item is included into autoscaling or has an entry on the legend. Before misusing the existing item classes it might be better to implement a new type of plot item ( don't implement a watermark as spectrogram ). Deriving a new type of QwtPlotItem primarily means to implement the YourPlotItem::draw() method. \sa The cpuplot example shows the implementation of additional plot items. */ class QWT_EXPORT QwtPlotItem { public: /*! \brief Runtime type information RttiValues is used to cast plot items, without having to enable runtime type information of the compiler. */ enum RttiValues { //! Unspecific value, that can be used, when it doesn't matter Rtti_PlotItem = 0, //! For QwtPlotGrid Rtti_PlotGrid, //! For QwtPlotScaleItem Rtti_PlotScale, //! For QwtPlotLegendItem Rtti_PlotLegend, //! For QwtPlotMarker Rtti_PlotMarker, //! For QwtPlotCurve Rtti_PlotCurve, //! For QwtPlotSpectroCurve Rtti_PlotSpectroCurve, //! For QwtPlotIntervalCurve Rtti_PlotIntervalCurve, //! For QwtPlotHistogram Rtti_PlotHistogram, //! For QwtPlotSpectrogram Rtti_PlotSpectrogram, //! For QwtPlotSvgItem Rtti_PlotSVG, //! For QwtPlotTradingCurve Rtti_PlotTradingCurve, //! For QwtPlotBarChart Rtti_PlotBarChart, //! For QwtPlotMultiBarChart Rtti_PlotMultiBarChart, //! For QwtPlotShapeItem Rtti_PlotShape, //! For QwtPlotTextLabel Rtti_PlotTextLabel, //! For QwtPlotZoneItem Rtti_PlotZone, /*! Values >= Rtti_PlotUserItem are reserved for plot items not implemented in the Qwt library. */ Rtti_PlotUserItem = 1000 }; /*! \brief Plot Item Attributes Various aspects of a plot widget depend on the attributes of the attached plot items. If and how a single plot item participates in these updates depends on its attributes. \sa setItemAttribute(), testItemAttribute(), ItemInterest */ enum ItemAttribute { //! The item is represented on the legend. Legend = 0x01, /*! The boundingRect() of the item is included in the autoscaling calculation as long as its width or height is >= 0.0. */ AutoScale = 0x02, /*! The item needs extra space to display something outside its bounding rectangle. \sa getCanvasMarginHint() */ Margins = 0x04 }; //! Plot Item Attributes typedef QFlags ItemAttributes; /*! \brief Plot Item Interests Plot items might depend on the situation of the corresponding plot widget. By enabling an interest the plot item will be notified, when the corresponding attribute of the plot widgets has changed. \sa setItemAttribute(), testItemAttribute(), ItemInterest */ enum ItemInterest { /*! The item is interested in updates of the scales \sa updateScaleDiv() */ ScaleInterest = 0x01, /*! The item is interested in updates of the legend ( of other items ) This flag is intended for items, that want to implement a legend for displaying entries of other plot item. \note If the plot item wants to be represented on a legend enable QwtPlotItem::Legend instead. \sa updateLegend() */ LegendInterest = 0x02 }; //! Plot Item Interests typedef QFlags ItemInterests; //! Render hints enum RenderHint { //! Enable antialiasing RenderAntialiased = 0x1 }; //! Render hints typedef QFlags RenderHints; explicit QwtPlotItem( const QwtText &title = QwtText() ); virtual ~QwtPlotItem(); void attach( QwtPlot *plot ); void detach(); QwtPlot *plot() const; void setTitle( const QString &title ); void setTitle( const QwtText &title ); const QwtText &title() const; virtual int rtti() const; void setItemAttribute( ItemAttribute, bool on = true ); bool testItemAttribute( ItemAttribute ) const; void setItemInterest( ItemInterest, bool on = true ); bool testItemInterest( ItemInterest ) const; void setRenderHint( RenderHint, bool on = true ); bool testRenderHint( RenderHint ) const; void setRenderThreadCount( uint numThreads ); uint renderThreadCount() const; void setLegendIconSize( const QSize & ); QSize legendIconSize() const; double z() const; void setZ( double z ); void show(); void hide(); virtual void setVisible( bool ); bool isVisible () const; void setAxes( int xAxis, int yAxis ); void setXAxis( int axis ); int xAxis() const; void setYAxis( int axis ); int yAxis() const; virtual void itemChanged(); virtual void legendChanged(); /*! \brief Draw the item \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas in painter coordinates */ virtual void draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const = 0; virtual QRectF boundingRect() const; virtual void getCanvasMarginHint( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasSize, double &left, double &top, double &right, double &bottom) const; virtual void updateScaleDiv( const QwtScaleDiv&, const QwtScaleDiv& ); virtual void updateLegend( const QwtPlotItem *, const QList & ); QRectF scaleRect( const QwtScaleMap &, const QwtScaleMap & ) const; QRectF paintRect( const QwtScaleMap &, const QwtScaleMap & ) const; virtual QList legendData() const; virtual QwtGraphic legendIcon( int index, const QSizeF & ) const; protected: QwtGraphic defaultIcon( const QBrush &, const QSizeF & ) const; private: // Disabled copy constructor and operator= QwtPlotItem( const QwtPlotItem & ); QwtPlotItem &operator=( const QwtPlotItem & ); class PrivateData; PrivateData *d_data; }; Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotItem::ItemAttributes ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotItem::ItemInterests ) Q_DECLARE_OPERATORS_FOR_FLAGS( QwtPlotItem::RenderHints ) Q_DECLARE_METATYPE( QwtPlotItem * ) #endif linssid-2.7/qwt-lib/src/qwt_plot_layout.h000644 001750 001750 00000006224 12151666702 021464 0ustar00warrenwarren000000 000000 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_LAYOUT_H #define QWT_PLOT_LAYOUT_H #include "qwt_global.h" #include "qwt_plot.h" /*! \brief Layout engine for QwtPlot. It is used by the QwtPlot widget to organize its internal widgets or by QwtPlot::print() to render its content to a QPaintDevice like a QPrinter, QPixmap/QImage or QSvgRenderer. \sa QwtPlot::setPlotLayout() */ class QWT_EXPORT QwtPlotLayout { public: /*! Options to configure the plot layout engine \sa activate(), QwtPlotRenderer */ enum Option { //! Unused AlignScales = 0x01, /*! Ignore the dimension of the scrollbars. There are no scrollbars, when the plot is not rendered to widgets. */ IgnoreScrollbars = 0x02, //! Ignore all frames. IgnoreFrames = 0x04, //! Ignore the legend. IgnoreLegend = 0x08, //! Ignore the title. IgnoreTitle = 0x10, //! Ignore the footer. IgnoreFooter = 0x20 }; //! Layout options typedef QFlags