From 26b932683c9a65eb6ee0c750b2eca783445281be Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 16 May 2008 15:27:43 +0000 Subject: [PATCH] Prior to new hviewer --- hurricane/src/CMakeLists.txt | 2 +- hurricane/src/hurricane/BasicLayer.h | 6 + hurricane/src/hurricane/CompositeLayer.cpp | 42 + hurricane/src/hurricane/CompositeLayer.h | 3 + hurricane/src/hurricane/Layer.h | 2 + hurricane/src/hviewer/CMakeLists.txt | 17 - hurricane/src/hviewer/CellViewer.cpp | 144 ---- hurricane/src/hviewer/CellViewer.h | 64 -- hurricane/src/hviewer/CellViewer.qrc | 12 - hurricane/src/hviewer/CellWidget.cpp | 722 ------------------ hurricane/src/hviewer/CellWidget.h | 236 ------ hurricane/src/hviewer/DisplayStyle.cpp | 94 --- hurricane/src/hviewer/DisplayStyle.h | 101 --- hurricane/src/hviewer/LayersList.cpp | 134 ---- hurricane/src/hviewer/LayersList.h | 79 -- hurricane/src/hviewer/ScreenLayer.cpp | 72 -- hurricane/src/hviewer/ScreenLayer.h | 89 --- hurricane/src/hviewer/ScreenUtilities.cpp | 84 -- hurricane/src/hviewer/ScreenUtilities.h | 31 - hurricane/src/hviewer/images/gtk-go-down.png | Bin 536 -> 0 bytes .../src/hviewer/images/gtk-go-forward-ltr.png | Bin 522 -> 0 bytes .../src/hviewer/images/gtk-go-forward-rtl.png | Bin 523 -> 0 bytes hurricane/src/hviewer/images/gtk-go-up.png | Bin 605 -> 0 bytes .../src/hviewer/images/palette_hide_all.png | Bin 923 -> 0 bytes .../src/hviewer/images/palette_show_all.png | Bin 1398 -> 0 bytes hurricane/src/hviewer/images/stock_open.png | Bin 394 -> 0 bytes hurricane/src/hviewer/images/stock_save.png | Bin 850 -> 0 bytes 27 files changed, 54 insertions(+), 1880 deletions(-) delete mode 100644 hurricane/src/hviewer/CMakeLists.txt delete mode 100644 hurricane/src/hviewer/CellViewer.cpp delete mode 100644 hurricane/src/hviewer/CellViewer.h delete mode 100644 hurricane/src/hviewer/CellViewer.qrc delete mode 100644 hurricane/src/hviewer/CellWidget.cpp delete mode 100644 hurricane/src/hviewer/CellWidget.h delete mode 100644 hurricane/src/hviewer/DisplayStyle.cpp delete mode 100644 hurricane/src/hviewer/DisplayStyle.h delete mode 100644 hurricane/src/hviewer/LayersList.cpp delete mode 100644 hurricane/src/hviewer/LayersList.h delete mode 100644 hurricane/src/hviewer/ScreenLayer.cpp delete mode 100644 hurricane/src/hviewer/ScreenLayer.h delete mode 100644 hurricane/src/hviewer/ScreenUtilities.cpp delete mode 100644 hurricane/src/hviewer/ScreenUtilities.h delete mode 100644 hurricane/src/hviewer/images/gtk-go-down.png delete mode 100644 hurricane/src/hviewer/images/gtk-go-forward-ltr.png delete mode 100644 hurricane/src/hviewer/images/gtk-go-forward-rtl.png delete mode 100644 hurricane/src/hviewer/images/gtk-go-up.png delete mode 100644 hurricane/src/hviewer/images/palette_hide_all.png delete mode 100644 hurricane/src/hviewer/images/palette_show_all.png delete mode 100644 hurricane/src/hviewer/images/stock_open.png delete mode 100644 hurricane/src/hviewer/images/stock_save.png diff --git a/hurricane/src/CMakeLists.txt b/hurricane/src/CMakeLists.txt index b25d9854..9349bb14 100644 --- a/hurricane/src/CMakeLists.txt +++ b/hurricane/src/CMakeLists.txt @@ -1,4 +1,4 @@ add_subdirectory(hurricane) add_subdirectory(hinspector) -add_subdirectory(hviewer) +add_subdirectory(viewer) add_subdirectory(pyext) diff --git a/hurricane/src/hurricane/BasicLayer.h b/hurricane/src/hurricane/BasicLayer.h index d5a7f557..4c9fa5b6 100644 --- a/hurricane/src/hurricane/BasicLayer.h +++ b/hurricane/src/hurricane/BasicLayer.h @@ -61,6 +61,8 @@ class BasicLayer : public Layer { private: unsigned short _blueValue; private: string _fillPattern; private: double _displayThreshold; + private: BasicLayer* _connectorLayer; + private: BasicLayer* _obstructionLayer; // Constructors // ************ @@ -80,6 +82,8 @@ class BasicLayer : public Layer { public: const string& getFillPattern() const {return _fillPattern;}; public: double getDisplayThreshold() const {return _displayThreshold;}; public: virtual BasicLayers getBasicLayers() const; + public: virtual BasicLayer* getConnectorLayer() const {return _connectorLayer;}; + public: virtual BasicLayer* getObstructionLayer() const {return _obstructionLayer;}; // Updators // ******** @@ -87,6 +91,8 @@ class BasicLayer : public Layer { public: void setColor(unsigned short redValue, unsigned short greenValue, unsigned short blueValue); public: void setFillPattern(const string& fillPattern); public: void setDisplayThreshold(double threshold) {_displayThreshold = threshold;}; + public: void setConnectorLayer(BasicLayer* layer) {_connectorLayer = layer;}; + public: void setObstructionLayer(BasicLayer* layer) {_obstructionLayer = layer;}; // Others // ****** diff --git a/hurricane/src/hurricane/CompositeLayer.cpp b/hurricane/src/hurricane/CompositeLayer.cpp index 78244c31..3d16248c 100644 --- a/hurricane/src/hurricane/CompositeLayer.cpp +++ b/hurricane/src/hurricane/CompositeLayer.cpp @@ -104,6 +104,48 @@ void CompositeLayer::add(BasicLayer* basicLayer, const Unit& contactSize, const _maximalPadSize = max(padSize, _maximalPadSize); } +void CompositeLayer::setContactSize(BasicLayer* basicLayer, const Unit& contactSize) +// ********************************************************************************* +{ + if (!basicLayer) + throw Error("Can't add basic layer : null basic layer"); + + if (!contains(basicLayer)) + throw Error("Basic layer not part of composite layer"); + + if (contactSize != 0) _contactSizeMap[basicLayer] = contactSize; + + _maximalContactSize = max(contactSize, _maximalContactSize); +} + +void CompositeLayer::setSegmentSize(BasicLayer* basicLayer, const Unit& segmentSize) +// ********************************************************************************* +{ + if (!basicLayer) + throw Error("Can't add basic layer : null basic layer"); + + if (!contains(basicLayer)) + throw Error("Basic layer not part of composite layer"); + + if (segmentSize != 0) _segmentSizeMap[basicLayer] = segmentSize; + + _maximalSegmentSize = max(segmentSize, _maximalSegmentSize); +} + +void CompositeLayer::setSegmentExtention(BasicLayer* basicLayer, const Unit& segmentExtention) +// ********************************************************************************* +{ + if (!basicLayer) + throw Error("Can't add basic layer : null basic layer"); + + if (!contains(basicLayer)) + throw Error("Basic layer not part of composite layer"); + + if (segmentExtention != 0) _segmentExtentionMap[basicLayer] = segmentExtention; + + _maximalSegmentExtention = max(segmentExtention, _maximalSegmentExtention); +} + void CompositeLayer::remove(BasicLayer* basicLayer) // ************************************************ { diff --git a/hurricane/src/hurricane/CompositeLayer.h b/hurricane/src/hurricane/CompositeLayer.h index d364b4a0..3cd227cd 100644 --- a/hurricane/src/hurricane/CompositeLayer.h +++ b/hurricane/src/hurricane/CompositeLayer.h @@ -92,6 +92,9 @@ class CompositeLayer : public Layer { // ******** public: void add(BasicLayer* basicLayer, const Unit& contactSize, const Unit& segmentSize, const Unit& segmentExtention, const Unit& padSize); + public: void setContactSize(BasicLayer* basicLayer, const Unit& contactSize); + public: void setSegmentSize(BasicLayer* basicLayer, const Unit& segmentSize); + public: void setSegmentExtention(BasicLayer* basicLayer, const Unit& segmentExtention); public: void remove(BasicLayer* basicLayer); // Others diff --git a/hurricane/src/hurricane/Layer.h b/hurricane/src/hurricane/Layer.h index aa09974f..21bbe0ab 100644 --- a/hurricane/src/hurricane/Layer.h +++ b/hurricane/src/hurricane/Layer.h @@ -60,6 +60,8 @@ class Layer : public DBo { public: const Unit& getMinimalSpacing() const {return _minimalSpacing;}; public: Unit getPitch() const {return (_pitch==0?(_minimalSize + _minimalSpacing):_pitch);}; public: virtual BasicLayers getBasicLayers() const = 0; + public: virtual Layer* getConnectorLayer() const {return NULL;}; + public: virtual Layer* getObstructionLayer() const {return NULL;}; // Predicates // ********** diff --git a/hurricane/src/hviewer/CMakeLists.txt b/hurricane/src/hviewer/CMakeLists.txt deleted file mode 100644 index 4b4a8171..00000000 --- a/hurricane/src/hviewer/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -include(${QT_USE_FILE}) - -include_directories(${HURRICANE_SOURCE_DIR}/src/hurricane) - -set(includes ScreenUtilities.h DisplayStyle.h) -set(mocincludes ScreenLayer.h LayersList.h CellWidget.h CellViewer.h) -set(exports CellViewer.h) -set(cpps ScreenUtilities.cpp DisplayStyle.cpp ScreenLayer.cpp LayersList.cpp CellWidget.cpp CellViewer.cpp) - -QT4_WRAP_CPP(MOC_SRCS ${mocincludes}) -QT4_ADD_RESOURCES(RCC_SRCS CellViewer.qrc) - -add_library(hviewer SHARED ${cpps} ${MOC_SRCS} ${RCC_SRCS}) -target_link_libraries(hviewer ${QT_LIBRARIES} hurricane) - -install(FILES ${exports} DESTINATION /include/hurricane) -install(TARGETS hviewer DESTINATION /lib) diff --git a/hurricane/src/hviewer/CellViewer.cpp b/hurricane/src/hviewer/CellViewer.cpp deleted file mode 100644 index d5b3c343..00000000 --- a/hurricane/src/hviewer/CellViewer.cpp +++ /dev/null @@ -1,144 +0,0 @@ - - -// -*- C++ -*- - - -# include -# include -# include -# include - -# include "Cell.h" - -# include "CellWidget.h" -//# include "MapView.h" -# include "LayersList.h" -# include "CellViewer.h" - - -namespace Hurricane { - - -CellViewer::CellViewer ( Cell* cell ) : QMainWindow() - , _openAction(NULL) - , _nextCellAction(NULL) - , _previousCellAction(NULL) - , _nextAction(NULL) - , _saveAction(NULL) - , _exitAction(NULL) - , _refreshAction(NULL) - , _fitToContentsAction(NULL) - , _showBoundariesAction(NULL) - , _fileMenu(NULL) - , _viewMenu(NULL) - //, _mapView(NULL) - , _layersList(NULL) - , _cellWidget(NULL) -{ - createMenus (); - createLayout ( cell ); -} - - - - -void CellViewer::createActions () -{ - if ( _openAction ) return; - - _openAction = new QAction ( tr("&Open Cell"), this ); - _openAction->setIcon ( QIcon(":/images/stock_open.png") ); - _openAction->setStatusTip ( tr("Open (load) a new Cell") ); - - _nextCellAction = new QAction ( tr("Next Cell"), this ); - _nextCellAction->setStatusTip ( tr("Go to the next Cell in history") ); - - _previousCellAction = new QAction ( tr("Previous Cell"), this ); - _previousCellAction->setStatusTip ( tr("Go to the previous Cell in history") ); - - _nextAction = new QAction ( tr("&Next Breakpoint"), this ); - _nextAction->setStatusTip ( tr("Proceed to the next breakpoint") ); - - _saveAction = new QAction ( tr("&Save Cell"), this ); - _saveAction->setIcon ( QIcon(":/images/stock_save.png") ); - _saveAction->setStatusTip ( tr("Save the current Cell") ); - - _exitAction = new QAction ( tr("&Exit"), this ); - _exitAction->setStatusTip ( tr("Close Coriolis CellViewer") ); - _exitAction->setShortcut ( QKeySequence(tr("CTRL+Q")) ); - connect ( _exitAction, SIGNAL(triggered()), this, SLOT(close()) ); - - _refreshAction = new QAction ( tr("&Refresh"), this ); - _refreshAction->setStatusTip ( tr("Force full redrawing of the display") ); - _refreshAction->setShortcut ( QKeySequence(tr("CTRL+L")) ); - - _fitToContentsAction = new QAction ( tr("&Fit to Contents"), this ); - _fitToContentsAction->setStatusTip ( tr("Adjust zoom to fit the whole cell's contents") ); - _fitToContentsAction->setShortcut ( Qt::Key_F ); - - _showBoundariesAction = new QAction ( tr("&Boundaries"), this ); - _showBoundariesAction->setCheckable ( true ); - _showBoundariesAction->setStatusTip ( tr("Show/hide cell & instances abutment boxes") ); -} - - - -void CellViewer::createMenus () -{ - if ( _fileMenu ) return; - if ( !_openAction ) createActions (); - - _fileMenu = menuBar()->addMenu ( tr("File") ); - _fileMenu->addAction ( _openAction ); - _fileMenu->addAction ( _nextCellAction ); - _fileMenu->addAction ( _previousCellAction ); - _fileMenu->addAction ( _nextAction ); - _fileMenu->addAction ( _saveAction ); - _fileMenu->addAction ( _exitAction ); - - _viewMenu = menuBar()->addMenu ( tr("View") ); - _viewMenu->addAction ( _refreshAction ); - _viewMenu->addAction ( _fitToContentsAction ); - _viewMenu->addAction ( _showBoundariesAction ); -} - - - -void CellViewer::createLayout ( Cell* cell ) -{ - if ( _cellWidget ) return; - - _cellWidget = new CellWidget ( cell ); - _layersList = _cellWidget->getLayersList (); -//_mapView = _cellWidget->getMapView (); - - setCorner ( Qt::TopLeftCorner , Qt::LeftDockWidgetArea ); - setCorner ( Qt::BottomLeftCorner , Qt::LeftDockWidgetArea ); - setCorner ( Qt::TopRightCorner , Qt::RightDockWidgetArea ); - setCorner ( Qt::BottomRightCorner, Qt::RightDockWidgetArea ); - -// QDockWidget* mapViewDock = new QDockWidget ( tr("Map") ); -// mapViewDock->setObjectName ( "MapView" ); -// mapViewDock->setWidget ( _mapView ); -// mapViewDock->setAllowedAreas ( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); -// addDockWidget ( Qt::RightDockWidgetArea, mapViewDock ); - - QDockWidget* layerMapDock = new QDockWidget ( tr("Layers") ); - layerMapDock->setObjectName ( "LayersList" ); - layerMapDock->setWidget ( _layersList ); - layerMapDock->setAllowedAreas ( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea ); - addDockWidget ( Qt::RightDockWidgetArea, layerMapDock ); - - setCentralWidget ( _cellWidget ); - - connect ( _refreshAction , SIGNAL(triggered()) , _cellWidget, SLOT(redraw ()) ); - connect ( _fitToContentsAction , SIGNAL(triggered()) , _cellWidget, SLOT(fitToContents()) ); - - _showBoundariesAction->setChecked ( _cellWidget->showBoundaries() ); - connect ( _showBoundariesAction, SIGNAL(toggled(bool)), _cellWidget, SLOT(setShowBoundaries(bool)) ); - - _cellWidget->redraw (); -} - - -} // End of Hurricane namespace. diff --git a/hurricane/src/hviewer/CellViewer.h b/hurricane/src/hviewer/CellViewer.h deleted file mode 100644 index 91599265..00000000 --- a/hurricane/src/hviewer/CellViewer.h +++ /dev/null @@ -1,64 +0,0 @@ - -// -*- C++ -*- - - -# ifndef __CELLVIEWER_H__ -# define __CELLVIEWER_H__ - - -using namespace std; - -# include - -class QKeyEvent; -class QAction; -class QMenu; - -# include "Commons.h" - - - - -namespace Hurricane { - - - class Cell; - class LayersList; -//class MapView; - class CellWidget; - - - class CellViewer : public QMainWindow { - Q_OBJECT; - - protected: - QAction* _openAction; - QAction* _nextCellAction; - QAction* _previousCellAction; - QAction* _nextAction; - QAction* _saveAction; - QAction* _exitAction; - QAction* _refreshAction; - QAction* _fitToContentsAction; - QAction* _showBoundariesAction; - QMenu* _fileMenu; - QMenu* _viewMenu; - //MapView* _mapView; - LayersList* _layersList; - CellWidget* _cellWidget; - - public: - CellViewer ( Cell* cell ); - - protected: - void createActions (); - void createMenus (); - void createLayout ( Cell* cell ); - }; - - - -} // End of Hurricane namespace. - - -# endif diff --git a/hurricane/src/hviewer/CellViewer.qrc b/hurricane/src/hviewer/CellViewer.qrc deleted file mode 100644 index 65078a51..00000000 --- a/hurricane/src/hviewer/CellViewer.qrc +++ /dev/null @@ -1,12 +0,0 @@ - - - images/stock_open.png - images/stock_save.png - images/palette_show_all.png - images/palette_hide_all.png - images/gtk-go-up.png - images/gtk-go-down.png - images/gtk-go-forward-rtl.png - images/gtk-go-forward-ltr.png - - diff --git a/hurricane/src/hviewer/CellWidget.cpp b/hurricane/src/hviewer/CellWidget.cpp deleted file mode 100644 index 77f0c339..00000000 --- a/hurricane/src/hviewer/CellWidget.cpp +++ /dev/null @@ -1,722 +0,0 @@ - -// -*- C++ -*- - - -# include -# include -# include -# include -# include -# include - -# include "DataBase.h" -# include "Technology.h" -# include "BasicLayer.h" -# include "Cell.h" -# include "Instance.h" -# include "Slice.h" -# include "Segment.h" -# include "Contact.h" - -# include "ScreenLayer.h" -# include "LayersList.h" -// # include "MapView.h" -# include "CellWidget.h" - - - - -namespace Hurricane { - - -const int CellWidget::_stripWidth = 100; - - - - -CellWidget::CellWidget ( Cell* cell ) : QWidget() - , _styles() - , _activeStyle(NULL) - , _screenLayers() - , _layersList(NULL) - , _displayArea(0,0,6*_stripWidth,6*_stripWidth) - , _visibleArea(_stripWidth,_stripWidth,4*_stripWidth,4*_stripWidth) - , _scale(1.0) - , _offsetVA(_stripWidth,_stripWidth) - , _drawingBuffer(6*_stripWidth,6*_stripWidth) - , _painter() - , _lastMousePosition(0,0) - , _cell(cell) - , _mouseGo(false) - , _openCell(true) - , _showBoundaries(true) - , _redrawRectCount(0) -{ -//setBackgroundRole ( QPalette::Dark ); -//setAutoFillBackground ( false ); - setAttribute ( Qt::WA_OpaquePaintEvent ); -//setAttribute ( Qt::WA_NoSystemBackground ); -//setAttribute ( Qt::WA_PaintOnScreen ); -//setAttribute ( Qt::WA_StaticContents ); - setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Expanding ); - setFocusPolicy ( Qt::StrongFocus ); - - // Build ScreenLayer vector here from BasicLayers. - DataBase* database = getDataBase(); - if (database) { - Technology* technology = database->getTechnology(); - if (technology) { - for_each_basic_layer ( layer, technology->getBasicLayers() ) { - _screenLayers.push_back ( new ScreenLayer(layer,_screenLayers.size(),true) ); - end_for; - } - } - } - -//_mapView = new MapView ( this ); - _layersList = new LayersList ( this ); - - _styles [ "Alliance" ] = DisplayStyle (); - _activeStyle = &_styles [ "Alliance" ]; - - fitToContents (); - _openCell = false; -} - - -CellWidget::~CellWidget () -{ - cerr << "CellWidget::~CellWidget()" << endl; - - for ( size_t i=0 ; i < _screenLayers.size() ; i++ ) - delete _screenLayers[i]; -} - - -void CellWidget::pushCursor ( Qt::CursorShape cursor ) -{ - setCursor ( cursor ); - _cursors.push_back ( cursor ); -} - - -void CellWidget::popCursor () -{ - _cursors.pop_back (); - if ( !_cursors.empty() ) - setCursor ( _cursors.back() ); - else - unsetCursor (); -} - - -QSize CellWidget::minimumSizeHint () const -{ - return QSize(_stripWidth*4,_stripWidth*4); -} - - -void CellWidget::redraw ( QRect redrawArea ) -{ -//cerr << "CellWidget::redraw ()" << endl; - - _redrawRectCount = 0; - - pushCursor ( Qt::BusyCursor ); - - _painter.begin ( &_drawingBuffer ); - - _painter.setPen ( Qt::NoPen ); - _painter.setBackground ( _activeStyle->getBrush("background") ); - _painter.setClipRect ( redrawArea ); - _painter.eraseRect ( redrawArea ); - - Box redrawBox = getBox ( redrawArea ); - -// cerr << " Box: " << redrawBox << endl; -// cerr << " Rect: " << redrawArea.x() << "," -// << redrawArea.y() << " " -// << redrawArea.width() << "x" -// << redrawArea.height() << endl; - - for ( size_t i=0 ; i<_screenLayers.size() ; i++ ) { - if ( isDrawable(_screenLayers[i]) ) { - _painter.setBrush ( _screenLayers[i]->getBrush() ); - drawCell ( _cell, _screenLayers[i]->getBasicLayer(), redrawBox, Transformation() ); - } - } - - if ( _showBoundaries ) { - _painter.setPen ( getPen ("boundaries") ); - _painter.setBrush ( getBrush("boundaries") ); - drawBoundaries ( _cell, redrawBox, Transformation() ); - } - - _painter.end (); - - update (); - popCursor (); - - cerr << "Redrawed rectangles: " << _redrawRectCount << endl; -//cerr << "*******************************************************" << endl; -} - - -void CellWidget::addStyle ( const string& key, DisplayStyle& displayStyle ) -{ - if ( _styles.find(key) != _styles.end() ) - cerr << "[WARNING] CellWidget::addStyle(): overriding style \"" << key << "\"." << endl; - - _styles [ key ] = displayStyle; - _activeStyle = & _styles [ key ]; -} - - -void CellWidget::setStyle ( const string& key ) -{ - if ( _styles.find(key) == _styles.end() ) { - cerr << "[WARNING] CellWidget::setStyle(): no style named \"" << key << "\"." << endl; - return; - } - - _activeStyle = & _styles [ key ]; -} - - -void CellWidget::drawBoundaries ( const Cell* cell - , const Box& redrawArea - , const Transformation& transformation - ) -{ -// cerr << "CellWidget::drawBoudaries ()" << endl; - -// QRect rect = getScreenRect(transformation.getBox(cell->getAbutmentBox())); - -// cerr << " Box: " << transformation.getBox(cell->getAbutmentBox()) << endl; -// cerr << " Rect: " << rect.x() << "+" << rect.y() -// << "," << rect.width() << "x" << rect.height() << endl; - - drawBox ( transformation.getBox(cell->getAbutmentBox()) ); - for_each_instance ( instance, cell->getInstances() ) { - drawBoundaries ( instance, redrawArea, transformation ); - end_for; - } -} - - -void CellWidget::drawBoundaries ( const Instance* instance - , const Box& redrawArea - , const Transformation& transformation - ) -{ - Box masterArea = redrawArea; - Transformation masterTransformation = instance->getTransformation(); - - instance->getTransformation().getInvert().applyOn ( masterArea ); - transformation.applyOn ( masterTransformation ); - - drawBoundaries ( instance->getMasterCell(), masterArea, masterTransformation ); -} - - -bool CellWidget::isDrawable ( const ScreenLayer* screenLayer ) -{ - return screenLayer->isVisible() - && ( screenLayer->getBasicLayer()->getDisplayThreshold() < _scale*100 ); -} - - -void CellWidget::drawCell ( const Cell* cell - , const BasicLayer* basicLayer - , const Box& redrawArea - , const Transformation& transformation - ) -{ - for_each_instance ( instance, cell->getInstancesUnder(redrawArea) ) { - drawInstance ( instance, basicLayer, redrawArea, transformation ); - end_for; - } - - for_each_slice ( slice, cell->getSlices() ) { - drawSlice ( slice, basicLayer, redrawArea, transformation ); - end_for; - } -} - - -void CellWidget::drawInstance ( const Instance* instance - , const BasicLayer* basicLayer - , const Box& redrawArea - , const Transformation& transformation - ) -{ - Box masterArea = redrawArea; - Transformation masterTransformation = instance->getTransformation(); - - instance->getTransformation().getInvert().applyOn ( masterArea ); - transformation.applyOn ( masterTransformation ); - - drawCell ( instance->getMasterCell(), basicLayer, masterArea, masterTransformation ); -} - - -void CellWidget::drawSlice ( const Slice* slice - , const BasicLayer* basicLayer - , const Box& redrawArea - , const Transformation& transformation - ) -{ - if ( slice->getLayer()->contains(basicLayer) ) { - if ( slice->getBoundingBox().intersect(redrawArea) ) { - for_each_go ( go, slice->getGosUnder(redrawArea) ) { - drawGo ( go, basicLayer, redrawArea, transformation ); - end_for; - } - } - } -} - - -void CellWidget::drawGo ( const Go* go - , const BasicLayer* basicLayer - , const Box& redrawArea - , const Transformation& transformation - ) -{ - const Segment* segment = dynamic_cast(go); - if (segment) { - drawSegment ( segment, basicLayer, redrawArea, transformation ); - return; - } - - const Contact* contact = dynamic_cast(go); - if (contact) { - drawContact ( contact, basicLayer, redrawArea, transformation ); - return; - } -} - - -void CellWidget::drawSegment ( const Segment* segment - , const BasicLayer* basicLayer - , const Box& redrawArea - , const Transformation& transformation - ) -{ - if ( 1 < getScreenLength(segment->getWidth()) ) { - drawBox ( transformation.getBox(segment->getBoundingBox(basicLayer)) ); - } else { - drawLine ( transformation.getPoint(segment->getSourcePosition()), - transformation.getPoint(segment->getTargetPosition()) ); - } -} - - -void CellWidget::drawContact ( const Contact* contact - , const BasicLayer* basicLayer - , const Box& redrawArea - , const Transformation& transformation - ) -{ - drawBox ( transformation.getBox(contact->getBoundingBox(basicLayer)) ); -} - - -void CellWidget::drawBox ( const Box& box ) -{ - _redrawRectCount++; - _painter.drawRect ( getScreenRect(box) ); -} - - -void CellWidget::drawLine ( const Point& p1, const Point& p2 ) -{ - _painter.drawLine ( getScreenPoint(p1), getScreenPoint(p2) ); -} - - -void CellWidget::goLeft ( int dx ) -{ - if ( !dx ) dx = geometry().size().width() / 4; - if ( _offsetVA.rx() - dx >= 0 ) { - _offsetVA.rx() -= dx; - update (); - } else { - shiftLeft ( dx ); - } -} - - -void CellWidget::goRight ( int dx ) -{ - if ( !dx ) dx = geometry().size().width() / 4; - -//cerr << "CellWidget::goRight() - dx: " << dx << " (offset: " << _offsetVA.rx() << ")" << endl; - - if ( _offsetVA.rx() + dx < 2*_stripWidth ) { - _offsetVA.rx() += dx; - update (); - } else { - shiftRight ( dx ); - } -} - - -void CellWidget::goUp ( int dy ) -{ - if ( !dy ) dy = geometry().size().height() / 4; - if ( _offsetVA.ry() - dy >= 0 ) { - _offsetVA.ry() -= dy; - update (); - } else { - shiftUp ( dy ); - } -} - - -void CellWidget::goDown ( int dy ) -{ - if ( !dy ) dy = geometry().size().height() / 4; - if ( _offsetVA.ry() + dy < 2*_stripWidth ) { - _offsetVA.ry() += dy; - update (); - } else { - shiftDown ( dy ); - } -} - - -void CellWidget::screenReframe () -{ - _offsetVA.rx() = _stripWidth; - _offsetVA.ry() = _stripWidth; - - Unit xmin = (Unit)( _visibleArea.getXMin() - ((float)_offsetVA.x()/_scale) ); - Unit xmax = (Unit)( xmin + ((float)_drawingBuffer.width()/_scale) ) ; - Unit ymax = (Unit)( _visibleArea.getYMax() + ((float)_offsetVA.y()/_scale) ); - Unit ymin = (Unit)( ymax - ((float)_drawingBuffer.height()/_scale) ) ; - - _displayArea = Box ( xmin, ymin, xmax, ymax ); - - redraw (); -} - - -void CellWidget::setScale ( float scale ) -{ - _scale = scale; - - Point center = _visibleArea.getCenter(); - - _visibleArea.makeEmpty (); - _visibleArea.merge ( (Unit)( center.getX() - width () / (_scale*2) ) - , (Unit)( center.getY() - height() / (_scale*2) ) - , (Unit)( center.getX() + width () / (_scale*2) ) - , (Unit)( center.getY() + height() / (_scale*2) ) - ); - -//cerr << "_visibleArea: " << _visibleArea << " (offset: " << _offsetVA.x() << ")" << endl; -//cerr << " " << center << endl; - - screenReframe (); -} - - -void CellWidget::reframe ( const Box& box ) -{ -//cerr << "CellWidget::reframe() - " << box << endl; -//cerr << " widget size := " << _drawingBuffer.width() << "x" << _drawingBuffer.height() << endl; - - int width = this->width (); - int height = this->height (); - - float scaleX = width / (float)box.getWidth (); - float scaleY = height / (float)box.getHeight(); - _scale = min ( scaleX, scaleY ); - -//cerr << " _scale := " << _scale << endl; - - Point center = box.getCenter(); - - width /= 2; - height /= 2; - - _visibleArea = Box ( (Unit)( center.getX() - width / _scale ) - , (Unit)( center.getY() - height / _scale ) - , (Unit)( center.getX() + width / _scale ) - , (Unit)( center.getY() + height / _scale ) - ); - screenReframe (); - -//cerr << " _displayArea: " << _displayArea << " (offset: " << _offsetVA.x() << ")" << endl; -} - - -void CellWidget::fitToContents () -{ - reframe ( _cell->getBoundingBox() ); -} - - -void CellWidget::shiftLeft ( int dx ) -{ -//cerr << "CellWidget::shiftLeft() - " << dx << " (offset: " << _offsetVA.rx() << ")" << endl; - - int leftShift = ( 1 + ( dx - _offsetVA.rx() ) / _stripWidth ) * _stripWidth; - - _displayArea.translate ( - (Unit)( leftShift / _scale ) , 0 ); - _visibleArea.translate ( - (Unit)( leftShift / _scale ) , 0 ); - _offsetVA.rx() -= dx - leftShift; - - if ( leftShift >= _drawingBuffer.width() ) { - redraw (); - } else { - //cerr << "Left Shift " << leftShift << " (offset: " << _offsetVA.rx() << ")" << endl; - _painter.begin ( &_drawingBuffer ); - _painter.drawPixmap ( leftShift, 0 - , _drawingBuffer - , 0, 0 - , _drawingBuffer.width()-leftShift, _drawingBuffer.height() - ); - _painter.end (); - - redraw ( QRect ( QPoint ( 0, 0 ) - , QSize ( leftShift, _drawingBuffer.height() )) ); - } - - assert ( _offsetVA.rx() >= 0 ); -} - - -void CellWidget::shiftRight ( int dx ) -{ -//cerr << "CellWidget::shiftRight() - " << dx << " (offset: " << _offsetVA.rx() << ")" << endl; - - int rightShift = ( ( _offsetVA.rx() + dx ) / _stripWidth ) * _stripWidth; - - _displayArea.translate ( (Unit)( rightShift / _scale ) , 0 ); - _visibleArea.translate ( (Unit)( rightShift / _scale ) , 0 ); - _offsetVA.rx() += dx - rightShift; - -//cerr << " _displayArea: " << _displayArea << endl; - - if ( rightShift >= _drawingBuffer.width() ) { - redraw (); - } else { - //cerr << " Right Shift " << rightShift << " (offset: " << _offsetVA.rx() << ")" << endl; - _painter.begin ( &_drawingBuffer ); - _painter.drawPixmap ( 0, 0 - , _drawingBuffer - , rightShift, 0 - , _drawingBuffer.width()-rightShift, _drawingBuffer.height() - ); - _painter.end (); - - redraw ( QRect ( QPoint ( _drawingBuffer.width()-rightShift, 0 ) - , QSize ( rightShift, _drawingBuffer.height() )) ); - } - - assert ( _offsetVA.rx() >= 0 ); -} - - -void CellWidget::shiftUp ( int dy ) -{ -//cerr << "CellWidget::shiftUp() - " << dy << " (offset: " << _offsetVA.ry() << ")" << endl; - - int upShift = ( 1 + ( dy - _offsetVA.ry() ) / _stripWidth ) * _stripWidth; - - _displayArea.translate ( 0, (Unit)( upShift / _scale ) ); - _visibleArea.translate ( 0, (Unit)( upShift / _scale ) ); - _offsetVA.ry() -= dy - upShift; - - if ( upShift >= _drawingBuffer.height() ) { - redraw (); - } else { - //cerr << "Left Shift " << upShift << " (offset: " << _offsetVA.ry() << ")" << endl; - _painter.begin ( &_drawingBuffer ); - _painter.drawPixmap ( 0, upShift - , _drawingBuffer - , 0, 0 - , _drawingBuffer.width(), _drawingBuffer.height()-upShift - ); - _painter.end (); - - redraw ( QRect ( QPoint ( 0, 0 ) - , QSize ( _drawingBuffer.width(), upShift )) ); - } - - assert ( _offsetVA.ry() >= 0 ); -} - - -void CellWidget::shiftDown ( int dy ) -{ -//cerr << "CellWidget::shiftDown() - " << dy << " (offset: " << _offsetVA.ry() << ")" << endl; - - int downShift = ( ( _offsetVA.ry() + dy ) / _stripWidth ) * _stripWidth; - - _displayArea.translate ( 0, - (Unit)( downShift / _scale ) ); - _visibleArea.translate ( 0, - (Unit)( downShift / _scale ) ); - _offsetVA.ry() += dy - downShift; - - if ( downShift >= _drawingBuffer.height() ) { - redraw (); - } else { - //cerr << "Right Shift " << downShift << " (offset: " << _offsetVA.ry() << ")" << endl; - _painter.begin ( &_drawingBuffer ); - _painter.drawPixmap ( 0, 0 - , _drawingBuffer - , 0, downShift - , _drawingBuffer.width(), _drawingBuffer.height()-downShift - ); - _painter.end (); - - redraw ( QRect ( QPoint ( 0, _drawingBuffer.height()-downShift ) - , QSize ( _drawingBuffer.width(), downShift )) ); - } - - assert ( _offsetVA.ry() >= 0 ); -} - - -void CellWidget::paintEvent ( QPaintEvent* ) -{ -//cerr << "CellWidget::paintEvent()" << endl; - - QPainter painter ( this ); - painter.drawPixmap ( 0, 0, _drawingBuffer, _offsetVA.rx(), _offsetVA.ry(), width(), height() ); -} - - -void CellWidget::resizeEvent ( QResizeEvent* ) -{ - QSize uaDelta ( 0, 0 ); - QSize uaSize = geometry().size(); - - uaSize.rwidth () += 2*_stripWidth; - uaSize.rheight() += 2*_stripWidth; - - if ( uaSize.width () > _drawingBuffer.width () ) - uaDelta.rwidth () = uaSize.width () - _drawingBuffer.width (); - - if ( uaSize.height() > _drawingBuffer.height() ) - uaDelta.rheight() = uaSize.height() - _drawingBuffer.height(); - -//cerr << "New UA widget size: " << uaSize.width() << "x" << uaSize.height() << endl; - - if ( uaDelta.width() || uaDelta.height() ) { - _displayArea.inflate ( 0, 0, (Unit)(uaDelta.width()/_scale), (Unit)(uaDelta.height()/_scale) ); - _visibleArea.inflate ( 0, 0, (Unit)(uaDelta.width()/_scale), (Unit)(uaDelta.height()/_scale) ); - //cerr << "new " << _displayArea << endl; - - //cerr << "Previous buffer size: " << _drawingBuffer.width () << "x" - // << _drawingBuffer.height() << endl; - - QSize bufferSize ( ( ( uaSize.width () / _stripWidth ) + 1 ) * _stripWidth - , ( ( uaSize.height() / _stripWidth ) + 1 ) * _stripWidth ); - _drawingBuffer = QPixmap ( bufferSize ); - - //cerr << "Effective buffer resize to: " << bufferSize.width() << "x" - // << bufferSize.height() << endl; - } - redraw (); -} - - -void CellWidget::keyPressEvent ( QKeyEvent* event ) -{ - switch ( event->key() ) { - case Qt::Key_Up: goUp (); break; - case Qt::Key_Down: goDown (); break; - case Qt::Key_Left: goLeft (); break; - case Qt::Key_Right: goRight (); break; - case Qt::Key_Z: setScale ( _scale*2.0 ); break; - case Qt::Key_M: setScale ( _scale/2.0 ); break; - } -} - - -void CellWidget::mouseMoveEvent ( QMouseEvent* event ) -{ -//cerr << "CellWidget::mouseMoveEvent()" << endl; - - if ( _mouseGo ) { - int dx = event->x() - _lastMousePosition.x(); - dx <<= 1; - //cerr << "dX (px): " << dx << " _offsetVA.rx() " << _offsetVA.rx() << endl; - if ( dx > 0 ) goLeft ( dx ); - if ( dx < 0 ) goRight ( -dx ); - - int dy = event->y() - _lastMousePosition.y(); - dy <<= 1; - //cerr << "dY (px): " << dy << " _offsetVA.ry() " << _offsetVA.ry() << endl; - if ( dy > 0 ) goUp ( dy ); - if ( dy < 0 ) goDown ( -dy ); - - _lastMousePosition = event->pos(); - } -} - - -void CellWidget::mousePressEvent ( QMouseEvent* event ) -{ - if ( ( event->button() == Qt::LeftButton ) && !_mouseGo ) { - _mouseGo = true; - _lastMousePosition = event->pos(); - pushCursor ( Qt::ClosedHandCursor ); - } -} - - -void CellWidget::mouseReleaseEvent ( QMouseEvent* event ) -{ - if ( ( event->button() == Qt::LeftButton ) && _mouseGo ) { - _mouseGo = false; - popCursor (); - } -} - - -QPoint CellWidget::getScreenPoint ( Unit x, Unit y ) const -{ - return QPoint ( getScreenX(x), getScreenY(y) ); -} - - -QPoint CellWidget::getScreenPoint ( const Point& point ) const -{ - return getScreenPoint ( point.getX(), point.getY() ); -} - - -QRect CellWidget::getScreenRect ( Unit x1, Unit y1, Unit x2, Unit y2 ) const -{ - return QRect ( getScreenX(x1) - , getScreenY(y2) - , getScreenX(x2) - getScreenX(x1) - , getScreenY(y1) - getScreenY(y2) - ); -} - - -QRect CellWidget::getScreenRect ( const Box& box ) const -{ - return getScreenRect ( box.getXMin() - , box.getYMin() - , box.getXMax() - , box.getYMax() - ); -} - - -void CellWidget::setShowBoundaries ( bool state ) -{ - if ( _showBoundaries != state ) { - _showBoundaries = state; - redraw (); - } -} - - -} // End of Hurricane namespace. diff --git a/hurricane/src/hviewer/CellWidget.h b/hurricane/src/hviewer/CellWidget.h deleted file mode 100644 index d8831a2d..00000000 --- a/hurricane/src/hviewer/CellWidget.h +++ /dev/null @@ -1,236 +0,0 @@ - -// -*- C++ -*- - - -# ifndef __CELLWIDGET_H__ -# define __CELLWIDGET_H__ - -# include - -# include -# include - -# include -# include -# include -# include -# include - -class QCursor; -class QResizeEvent; -class QMouseEvent; -class QKeyEvent; -class QAction; - - -# include "Commons.h" -# include "Point.h" -# include "Box.h" -# include "Transformation.h" - -# include "DisplayStyle.h" - - - - -namespace Hurricane { - - class BasicLayer; - class Go; - class Cell; - class Instance; - class Slice; - class Segment; - class Contact; - - class ScreenLayer; - class LayersList; -//class MapView; - - - class CellWidget : public QWidget { - Q_OBJECT; - - // Attributes. - protected: - static const int _stripWidth; - map _styles; - DisplayStyle* _activeStyle; - vector _screenLayers; - vector _cursors; -// MapView* _mapView; - LayersList* _layersList; - Box _displayArea; - Box _visibleArea; - float _scale; - QPoint _offsetVA; - QPixmap _drawingBuffer; - QPainter _painter; - QPoint _lastMousePosition; - Cell* _cell; - bool _mouseGo; - bool _openCell; - bool _showBoundaries; - size_t _redrawRectCount; - - public: - CellWidget ( Cell* cell ); - virtual ~CellWidget (); - - public slots: - void redraw ( QRect redrawArea ); - inline void redraw (); - void goLeft ( int dx = 0 ); - void goRight ( int dx = 0 ); - void goUp ( int dy = 0 ); - void goDown ( int dy = 0 ); - void fitToContents (); - void setScale ( float scale ); - void setShowBoundaries ( bool state ); - void reframe ( const Box& box ); - void screenReframe (); - void shiftLeft ( int dx ); - void shiftRight ( int dx ); - void shiftUp ( int dy ); - void shiftDown ( int dy ); - - // Qt QWidget Overloads. - public: - void pushCursor ( Qt::CursorShape cursor ); - void popCursor (); - QSize minimumSizeHint () const; - void paintEvent ( QPaintEvent* ); - void resizeEvent ( QResizeEvent* ); - void keyPressEvent ( QKeyEvent* ); - void mouseMoveEvent ( QMouseEvent* ); - void mousePressEvent ( QMouseEvent* ); - void mouseReleaseEvent ( QMouseEvent* ); - - // Geometric conversions. - public: - QRect getScreenRect ( Unit x1, Unit y1, Unit x2, Unit y2 ) const; - QRect getScreenRect ( const Box& box ) const; - QPoint getScreenPoint ( Unit x, Unit y ) const; - QPoint getScreenPoint ( const Point& point ) const; - inline int getScreenX ( Unit x ) const; - inline int getScreenY ( Unit y ) const; - inline int getScreenLength ( Unit length ) const; - inline Unit getX ( int x ) const; - inline Unit getY ( int y ) const; - inline Unit getLength ( int length ) const; - inline Box getBox ( const QRect& rect ) const; - - // Painter control & Hurricane objects drawing primitives. - public: - void addStyle ( const string& key, DisplayStyle& displayStyle ); - void setStyle ( const string& key ); - inline const QPen& getPen ( const string& key ); - inline const QBrush& getBrush ( const string& key ); - void drawBoundaries ( const Cell* , const Box&, const Transformation& ); - void drawBoundaries ( const Instance*, const Box&, const Transformation& ); - bool isDrawable ( const ScreenLayer* screenLayer ); - void drawCell ( const Cell* , const BasicLayer*, const Box&, const Transformation& ); - void drawInstance ( const Instance*, const BasicLayer*, const Box&, const Transformation& ); - void drawSlice ( const Slice* , const BasicLayer*, const Box&, const Transformation& ); - void drawGo ( const Go* , const BasicLayer*, const Box&, const Transformation& ); - void drawSegment ( const Segment* , const BasicLayer*, const Box&, const Transformation& ); - void drawContact ( const Contact* , const BasicLayer*, const Box&, const Transformation& ); - void drawBox ( const Box& ); - void drawLine ( const Point&, const Point& ); - - // Accessors. - public: -// MapView* getMapView () { return _mapView; }; - LayersList* getLayersList () { return _layersList; }; - vector& getScreenLayers () { return _screenLayers; }; - inline Cell* getCell () const; - inline bool showBoundaries () const; - - // Modifiers. - public: - }; - - - - -inline void CellWidget::redraw () -{ - redraw ( QRect(QPoint(0,0),_drawingBuffer.size()) ); -} - - -inline int CellWidget::getScreenX ( Unit x ) const -{ - return (int)rint ( (float)( x - _displayArea.getXMin() ) * _scale ); -} - - -inline int CellWidget::getScreenY ( Unit y ) const -{ - return (int)rint ( (float)( _displayArea.getYMax() - y ) * _scale ); -} - - -inline int CellWidget::getScreenLength ( Unit length ) const -{ - return (int)rint ( (float)length * _scale ); -} - - -inline Unit CellWidget::getX ( int x ) const -{ - return (Unit)(x/_scale) + _displayArea.getXMin(); -} - - -inline Unit CellWidget::getY ( int y ) const -{ - return _displayArea.getYMax() - (Unit)(y/_scale); -} - - -inline Unit CellWidget::getLength ( int length ) const -{ - return (int)( (float)length / _scale ); -} - - -inline Box CellWidget::getBox ( const QRect& rect ) const -{ - return Box ( getX(rect.x()) - , getY(rect.y()) - , getX(rect.x()+rect.width ()) - , getY(rect.y()+rect.height())); -} - - -inline const QPen& CellWidget::getPen ( const string& key ) -{ - return _activeStyle->getPen ( key ); -} - - -inline const QBrush& CellWidget::getBrush ( const string& key ) -{ - return _activeStyle->getBrush ( key ); -} - - -inline Cell* CellWidget::getCell () const -{ - return _cell; -} - - -inline bool CellWidget::showBoundaries () const -{ - return _showBoundaries; -} - - - - -} // End of Hurricane namespace. - - -# endif diff --git a/hurricane/src/hviewer/DisplayStyle.cpp b/hurricane/src/hviewer/DisplayStyle.cpp deleted file mode 100644 index e60c859d..00000000 --- a/hurricane/src/hviewer/DisplayStyle.cpp +++ /dev/null @@ -1,94 +0,0 @@ - -// -*- C++ -*- - - -# include "DisplayStyle.h" - - - - -namespace Hurricane { - - - -DisplayStyle::DrawingStyle::DrawingStyle ( const string& pattern - , int red - , int green - , int blue - , int borderWidth - ) : _pattern(pattern) - , _color(QColor(red,green,blue)) - , _pen(_color) - , _brush(Hurricane::getBrush(_pattern,red,green,blue)) -{ - if ( borderWidth ) { - _pen.setWidth ( borderWidth ); - } else { - _pen.setStyle ( Qt::NoPen ); - } -} - - -DisplayStyle::DisplayStyle () : _drawingStyles() -{ - addDrawingStyle ( "fallback" , "FFFFFFFFFFFFFFFF", 0, 0, 0, 1 ); - addDrawingStyle ( "background" , "FFFFFFFFFFFFFFFF", 50, 50, 50, 1 ); - addDrawingStyle ( "foreground" , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1 ); - addDrawingStyle ( "rubber" , "FFFFFFFFFFFFFFFF", 192, 0, 192, 1 ); - addDrawingStyle ( "phantom" , "FFFFFFFFFFFFFFFF", 139, 134, 130, 1 ); - addDrawingStyle ( "boundaries" , "0000000000000000", 208, 199, 192, 1 ); - addDrawingStyle ( "marker" , "FFFFFFFFFFFFFFFF", 80, 250, 80, 1 ); - addDrawingStyle ( "selectionDraw", "FFFFFFFFFFFFFFFF", 255, 255, 255, 1 ); - addDrawingStyle ( "selectionFill", "FFFFFFFFFFFFFFFF", 255, 255, 255, 1 ); - addDrawingStyle ( "grid" , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1 ); - addDrawingStyle ( "spot" , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1 ); - addDrawingStyle ( "ghost" , "FFFFFFFFFFFFFFFF", 255, 255, 255, 1 ); -} - - -const string& DisplayStyle::getPattern ( const string& key ) const -{ - return findDrawingStyle(key).getPattern(); -} - - -const QColor& DisplayStyle::getColor ( const string& key ) const -{ - return findDrawingStyle(key).getColor(); -} - - -const QPen& DisplayStyle::getPen ( const string& key ) const -{ - return findDrawingStyle(key).getPen(); -} - - -const QBrush& DisplayStyle::getBrush ( const string& key ) const -{ - return findDrawingStyle(key).getBrush(); -} - - -const DisplayStyle::DrawingStyle& DisplayStyle::findDrawingStyle ( const string& key ) const -{ - StyleIterator it = _drawingStyles.find ( key ); - if ( it != _drawingStyles.end() ) return it->second; - - return _drawingStyles.find("fallback")->second; -} - - -void DisplayStyle::addDrawingStyle ( const string& key - , const string& pattern - , int red - , int green - , int blue - , int borderWidth - ) -{ - _drawingStyles [ key ] = DrawingStyle ( pattern, red, green, blue, borderWidth ); -} - - -} diff --git a/hurricane/src/hviewer/DisplayStyle.h b/hurricane/src/hviewer/DisplayStyle.h deleted file mode 100644 index acf65c02..00000000 --- a/hurricane/src/hviewer/DisplayStyle.h +++ /dev/null @@ -1,101 +0,0 @@ - -// -*- C++ -*- - - -# ifndef __DISPLAYSTYLE_H__ -# define __DISPLAYSTYLE_H__ - - -# include -# include - -# include -# include -# include - -# include "Commons.h" - -# include "ScreenUtilities.h" - - -namespace Hurricane { - - - - - class DisplayStyle { - - // Sub-Class. - protected: - class DrawingStyle { - // Attributes. - protected: - string _pattern; - QColor _color; - QPen _pen; - QBrush _brush; - // Constructor. - public: - DrawingStyle ( const string& pattern ="FFFFFFFFFFFFFFFF" - , int red =0 - , int green =0 - , int blue =0 - , int borderWidth=0 - ); - // Accessors. - public: - inline const string& getPattern () const; - inline const QColor& getColor () const; - inline const QPen& getPen () const; - inline const QBrush& getBrush () const; - }; - - - typedef map StyleMap; - typedef map::const_iterator StyleIterator; - - // Attributes. - protected: - StyleMap _drawingStyles; - - // Constructor. - public: - DisplayStyle (); - - // Accessors. - public: - const string& getPattern ( const string& key ) const; - const QColor& getColor ( const string& key ) const; - const QPen& getPen ( const string& key ) const; - const QBrush& getBrush ( const string& key ) const; - - // Methods. - protected: - const DrawingStyle& findDrawingStyle ( const string& key ) const; - - - // Modifiers. - public: - void addDrawingStyle ( const string& key - , const string& pattern - , int red - , int green - , int blue - , int borderWidth - ); - - }; - - - - - // Functions. - inline const string& DisplayStyle::DrawingStyle::getPattern () const { return _pattern; } - inline const QColor& DisplayStyle::DrawingStyle::getColor () const { return _color; } - inline const QPen& DisplayStyle::DrawingStyle::getPen () const { return _pen; } - inline const QBrush& DisplayStyle::DrawingStyle::getBrush () const { return _brush; } - -} - - -# endif diff --git a/hurricane/src/hviewer/LayersList.cpp b/hurricane/src/hviewer/LayersList.cpp deleted file mode 100644 index 52c178c6..00000000 --- a/hurricane/src/hviewer/LayersList.cpp +++ /dev/null @@ -1,134 +0,0 @@ - -// -*- C++ -*- - - -# include - -# include -# include -# include -# include -# include -# include - -# include "Name.h" - -# include "ScreenLayer.h" -# include "LayersList.h" -# include "CellWidget.h" - - -namespace Hurricane { - - -ScreenLayerEntry::ScreenLayerEntry ( ScreenLayer* layer, LayersList* layersList ) - : QWidget() - , _layersList(layersList) -{ - QHBoxLayout* layout = new QHBoxLayout (); - layout->setContentsMargins ( 0, 0, 0, 0 ); - - _sample = layer->getSample(); - layout->addWidget ( _sample ); - - _checkBox = new QCheckBox ( this ); - _checkBox->setText ( getString(layer->getName()).c_str() ); - _checkBox->setChecked ( true ); - layout->addWidget ( _checkBox ); - - setLayout ( layout ); -} - - -void ScreenLayerEntry::setChecked ( bool state ) -{ - _checkBox->setChecked ( state ); - _sample ->setVisible ( state ); -} - - -bool ScreenLayerEntry::isChecked () const -{ - return _checkBox->isChecked (); -} - - -void ScreenLayerEntry::toggle () -{ - _sample->setVisible ( _checkBox->isChecked() ); - _layersList->getCellWidget()->redraw(); -} - - - -LayersList::LayersList ( CellWidget* cellWidget ) : QScrollArea() - , _cellWidget(cellWidget) - , _entries() - , _showAll(NULL) - , _hideAll(NULL) -{ - QWidget* adaptator = new QWidget (); - QVBoxLayout* layout = new QVBoxLayout (); - - vector& screenLayers = _cellWidget->getScreenLayers (); - - for ( size_t i=0 ; i < screenLayers.size() ; i++ ) { - _entries.push_back ( new ScreenLayerEntry(screenLayers[i],this) ); - layout->addWidget ( _entries.back() ); - connect ( _entries.back()->getCheckBox(), SIGNAL(clicked()), _entries.back(), SLOT(toggle()) ); - } - layout->addStretch (); - - _showAll = new QPushButton ( this ); - _showAll->setIcon ( QIcon(":/images/palette_show_all.png") ); - _showAll->setFlat ( true ); - - _hideAll = new QPushButton ( this ); - _hideAll->setIcon ( QIcon(":/images/palette_hide_all.png") ); - _hideAll->setFlat ( true ); - - connect ( _showAll, SIGNAL(clicked()), this, SLOT(showAll()) ); - connect ( _hideAll, SIGNAL(clicked()), this, SLOT(hideAll()) ); - - QHBoxLayout* bottomEntry = new QHBoxLayout (); - bottomEntry->setContentsMargins ( 0, 0, 0, 0 ); - bottomEntry->addWidget ( _showAll ); - bottomEntry->addWidget ( _hideAll ); - layout->addLayout ( bottomEntry ); - - adaptator->setLayout ( layout ); - setWidget ( adaptator ); - setHorizontalScrollBarPolicy ( Qt::ScrollBarAlwaysOff ); - setVerticalScrollBarPolicy ( Qt::ScrollBarAsNeeded ); - setFrameStyle ( QFrame::Plain ); -} - - -bool LayersList::isVisible ( size_t index ) -{ - if ( index < _entries.size() ) - return _entries[index]->isChecked (); - - return false; -} - - -void LayersList::showAll () -{ - for ( size_t i=0 ; i<_entries.size() ; i++ ) - _entries[i]->setChecked ( true ); - - _cellWidget->redraw (); -} - - -void LayersList::hideAll () -{ - for ( size_t i=0 ; i<_entries.size() ; i++ ) - _entries[i]->setChecked ( false ); - - _cellWidget->redraw (); -} - - -} // End of Hurricane namespace. diff --git a/hurricane/src/hviewer/LayersList.h b/hurricane/src/hviewer/LayersList.h deleted file mode 100644 index d3abed24..00000000 --- a/hurricane/src/hviewer/LayersList.h +++ /dev/null @@ -1,79 +0,0 @@ - -// -*- C++ -*- - - -# ifndef __LAYERSLIST__ -# define __LAYERSLIST__ - -# include -# include -# include -# include - -# include "Commons.h" - - - class QCheckBox; - class QPushButton; - - -namespace Hurricane { - - - using namespace std; - - - class LayerSample; - class ScreenLayer; - class LayersList; - class CellWidget; - - - class ScreenLayerEntry : public QWidget { - Q_OBJECT; - - protected: - LayersList* _layersList; - LayerSample* _sample; - QCheckBox* _checkBox; - - public: - ScreenLayerEntry ( ScreenLayer* layer, LayersList* layerList ); - - public: - bool isChecked () const; - void setChecked ( bool state ); - QCheckBox* getCheckBox () { return _checkBox; }; - - public slots: - void toggle (); - }; - - - class LayersList : public QScrollArea { - Q_OBJECT; - - protected: - CellWidget* _cellWidget; - vector _entries; - QPushButton* _showAll; - QPushButton* _hideAll; - - public: - LayersList ( CellWidget* cellWidget ); - - public: - CellWidget* getCellWidget () { return _cellWidget; }; - vector& getEntries () { return _entries; }; - bool isVisible ( size_t index ); - - public slots: - void showAll (); - void hideAll (); - }; - - -} // End of Hurricane namespace. - - -# endif diff --git a/hurricane/src/hviewer/ScreenLayer.cpp b/hurricane/src/hviewer/ScreenLayer.cpp deleted file mode 100644 index 6d3c0a2e..00000000 --- a/hurricane/src/hviewer/ScreenLayer.cpp +++ /dev/null @@ -1,72 +0,0 @@ - -// -*- C++ -*- - - -# include - -# include "BasicLayer.h" - -# include "ScreenUtilities.h" -# include "ScreenLayer.h" - - - - -namespace Hurricane { - - -LayerSample::LayerSample ( ScreenLayer* layer ) - : QWidget() - , _sample(QSize(20,20)) - , _layer(layer) -{ - setAttribute ( Qt::WA_StaticContents ); - setSizePolicy ( QSizePolicy::Fixed, QSizePolicy::Fixed ); - setFixedSize ( 20, 20 ); - - redraw (); -} - - -void LayerSample::redraw () -{ - QPainter painter ( &_sample ); - - painter.setPen ( Qt::NoPen ); - painter.setBackground ( QBrush(Qt::black,Qt::SolidPattern) ); - painter.eraseRect ( 0, 0, 20, 20 ); - painter.setBrush ( _layer->getBrush() ); - painter.drawRect ( 2, 2, 16, 16 ); -} - - -void LayerSample::paintEvent ( QPaintEvent* ) -{ - QPainter painter ( this ); - painter.drawPixmap ( 0, 0, _sample ); -} - - -ScreenLayer::ScreenLayer ( BasicLayer* basicLayer - , size_t index - , bool isVisible - ) : _layer(basicLayer) - , _index(index) - , _isVisible(isVisible) - , _brush(Hurricane::getBrush(_layer)) -{} - - -const Name& ScreenLayer::getName () const -{ - return _layer->getName (); -} - - -LayerSample* ScreenLayer::getSample () -{ - return new LayerSample ( this ); -} - - -} // End of Hurricane namespace. diff --git a/hurricane/src/hviewer/ScreenLayer.h b/hurricane/src/hviewer/ScreenLayer.h deleted file mode 100644 index 520fe1a8..00000000 --- a/hurricane/src/hviewer/ScreenLayer.h +++ /dev/null @@ -1,89 +0,0 @@ - -// -*- C++ -*- - - -# ifndef __SCREENLAYER_H__ -# define __SCREENLAYER_H__ - -# include -# include -# include -# include - -class QPaintEvent; - -# include "Commons.h" - - -namespace Hurricane { - - - class Name; - class BasicLayer; - class ScreenLayer; - - - class LayerSample : public QWidget { - Q_OBJECT; - - protected: - QPixmap _sample; - ScreenLayer* _layer; - - public: - LayerSample ( ScreenLayer* layer ); - - protected: - void redraw (); - void paintEvent ( QPaintEvent* ); - - public: - - inline void setVisible ( bool state ); - }; - - - class ScreenLayer { - - protected: - BasicLayer* _layer; - size_t _index; - bool _isVisible; - QBrush _brush; - - // Constructor. - public: - ScreenLayer ( BasicLayer* layer, size_t index, bool isVisible ); - - // Predicates. - public: - bool isVisible () const { return _isVisible; }; - // Accessors. - public: - size_t getIndex () const { return _index; }; - BasicLayer* getBasicLayer () const { return _layer; }; - const Name& getName () const; - - // Methods. - public: - const QBrush& getBrush () const { return _brush; }; - LayerSample* getSample (); - - // Modifiers. - public: - inline void setVisible ( bool state ) { _isVisible=state; }; - }; - - - - - inline void LayerSample::setVisible ( bool state ) - { - _layer->setVisible ( state ); - } - - -} // End of Hurricane namespace. - - -# endif diff --git a/hurricane/src/hviewer/ScreenUtilities.cpp b/hurricane/src/hviewer/ScreenUtilities.cpp deleted file mode 100644 index ba63a9c4..00000000 --- a/hurricane/src/hviewer/ScreenUtilities.cpp +++ /dev/null @@ -1,84 +0,0 @@ - -// -*- C++ -*- - - -# include - -# include "BasicLayer.h" - -# include "ScreenUtilities.h" - - - - -namespace { - - - inline bool charToBits ( uchar& b, char c, bool low=true ) - { - bool isValid = true; - uchar value = 0xF; - - if ( (c >= '0') && (c <= '9') ) value = (uchar)( c - '0' ); - else { - if ( (c >= 'a') && (c <= 'f') ) value = (uchar)( c - 'a' + 10 ); - else { - if ( (c >= 'A') && (c <= 'F') ) value = (uchar)( c - 'A' + 10 ); - else - isValid = false; - } - } - - b &= (low) ? 0xF0 : 0x0F; - b += (low) ? value : (value<<4); - - return isValid; - } - - - bool getPattern ( uchar bits[], const string& pattern ) - { - bool isValid = true; - - for ( size_t i=0 ; i 15 ) { isValid = false; break; } - isValid &= charToBits ( bits[i/2], pattern[i], i%2 ); - } - return isValid; - } - - -} - - - - -namespace Hurricane { - - -QBrush getBrush ( const string& pattern, int red, int green, int blue ) -{ - if ( pattern != "FFFFFFFFFFFFFFFF" ) { - uchar bits[8]; - - if ( !getPattern(bits,pattern) ) - cerr << "[WARNING] Invalid stipple pattern: \"0x" << pattern << "\"." << endl; - - return QBrush ( QColor(red,green,blue), QBitmap::fromData(QSize(8,8),bits,QImage::Format_Mono) ); - } - - return QBrush ( QColor(red,green,blue), Qt::SolidPattern ); -} - - -QBrush getBrush ( const BasicLayer* layer ) -{ - return getBrush ( layer->getFillPattern() - , layer->getRedValue() - , layer->getGreenValue() - , layer->getBlueValue() - ); -} - - -} // End of Hurricane namespace. diff --git a/hurricane/src/hviewer/ScreenUtilities.h b/hurricane/src/hviewer/ScreenUtilities.h deleted file mode 100644 index 6f349fc7..00000000 --- a/hurricane/src/hviewer/ScreenUtilities.h +++ /dev/null @@ -1,31 +0,0 @@ - -// -*- C++ -*- - - -# ifndef __SCREENUTILITIES_H__ -# define __SCREENUTILITIES_H__ - -# include -# include - -# include "Commons.h" - - -namespace Hurricane { - - - class BasicLayer; - - - // Functions. - - QBrush getBrush ( const string& pattern, int red, int green, int blue ); - QBrush getBrush ( const BasicLayer* layer ); - - - - -} // End of Hurricane namespace. - - -# endif diff --git a/hurricane/src/hviewer/images/gtk-go-down.png b/hurricane/src/hviewer/images/gtk-go-down.png deleted file mode 100644 index c8f54fb919a106efbda7efc3896fb5be03bfd8a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmV+z0_XjSP)P*DMoq#*3HX#RY^SdIdxGYjiHtvw--f=I`N z+8_md*!s@Z`Ed^^nWU?;WA-+d0LFm}pqnU3ON*U?iTBgb`Lw&wO*cYHi3(({$q$A{ z)8G@XK2EnOty=>v;1^I|ntj2_c7sl+(Q*DZI6wH7fY)7JE8U(ffdxX~x9e+tdHyA< zI}IWo_r~=e@TRK^vnFSqyF>E%?Q6DwoN(QVN`n`Dg#s7?Mu5k_-qhS8#u$#ita*d` ztnw-_2229B{_IsU=acS!)nny*lhhn|tqi#EBpCvRfrr42n-;IOh!RSaJGyB9|LtGw azmHp`TEWigP)-(u5Kah1Y#(wqittcB1&SRcHOpJnggNao`k4 ztb_T0cWXP8q7aqoKVcbzF$NJK3I&yEQkAi}d%*j}3V;*htU;V8wAN^?QQ5B@Ktzy$ z-{67166MJWDz83x(-pY@U$*y1+A$JFh1yGN&9j*~Y8%xCFlr-7y@1P$7ICXtxPK47 zf1|ch1$Yh&05PBdBY%52I>e`eAJ)`W9h?!UG@*Td;uP#38up2w0!P5P1^Bxt&*K-f zOY{#7yTqHWE^pc|lpOZ&q~SA+s^*4QsBp7*u~p7f>mT(-H+ z755go<5_mCNxL84B;MG=V1|7@|mtz&QLB$Oa?Zx4T2Z9$@R_I}sy_tTfW?+|GRa?e2U7|LchIE>y2b zEI=P%dJPZ(K70=ckf>Jx5#Tp>ekSuFpwKIT2=F^U$~0Ow@fAaCnzezNyvhHZRS}WI zzt<(^BhUomtk>|A{P?1V(FzekDTUDr>pWULhSwW0yQK=Ni(dgIfh*u1@FpwyVfmW= zqM;c(L?t9^#Q1MyMt(AX4dcSpYW@4gVBmsY>BPIdBJ(X=tmX> zqX8%wjnXEyM$#Dgg{2iXz8|7g_8U+UI4@Msk8%M-z`*kSm;0%?Z;XAK$z3Fk+EuP+ zDu4w>OIvGP{@(j%O-VZ<3)}(YrLDD#DV~|suTQDpT&5=~6mtUz&;n{{AP3v)S)2BG z3N006V0bk7{~2fmww=lANs(nqMJGtxorYri3!J>LO7J&3nPkaDA21d`1(*g#!U=TM zqC8^P#w7S!VTWlZuj));Z4np@QhgirMtaivUaU8O4i{|Sy(hotz4{ diff --git a/hurricane/src/hviewer/images/gtk-go-up.png b/hurricane/src/hviewer/images/gtk-go-up.png deleted file mode 100644 index da3eab90988542f48fadcb32d030cede59b619f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmV-j0;2tiP)a(NT8p+&hT=jHK|yN~v7k#AiZ9?>b^d<>Va+zA%cm5Lxt zDTtfFL8_gh+ID6-G08bD?wzC)lS#63;Rkn--Qd2f)oLg@U2f@Q?mij^DxG+cIgJ|cORBQ@&E>q z!*LpJjD1gZ*4VzdQ3}Zd3?SRxK5sic8oqt(d+9qOf{1X`?=jr}&f-d&%?D2kA&m?` z0IpqVCpX@7dJGQ6$+b!hDvb7ju=DC!w)#GH2_FGr7GQuyU>P`r-B8<03rz+GpsI)p zDzSy6x(x&_FmM(4Km_PXfV!JQVB$=SCShWTMN!R6gbf`4V<2`Jk<0t5MUgWZ-2AAj z`}#saO&?6vyA1h9D3X6(xF@Zo-R8&+T5GNXPf-FtbEX{JFp+9lCwJY@3!hXNslHW_3S1!HxKJR<4*8|{x zH9-&rK?uW2rBbO>!jS*|X|7D*kB|3v*9}A0eS6z%!q9bHce4q@PN&mR)$bR;^CW%N zytA}GzVCUC0}up3KEYS_1d!L^Jtt9LTnr0=BC^2 z_tWDF{H9*7*X#8>z(EiM9Q|~K3BlMj0gA;^38Bc>YKqcq0xTBu`FI>Xp9+pK#u!Jy z7_Zlh1%M>Ua=9FN+s1ggjGl8G$Fc471ZkF4HbSzDP?i9()}WM9-v?+kTCLmLXsNj8 z_Eu^eBbj3VJo5Q*~(KI1iqi0r&MC^4nhb? z(g7i&+o-2c>t1Hb0=Vbn$C@NbQmF*cY&II_=Lf*~F2TANz%+GzIz7I3lLbV;-;o2r zFidl`Itb2yxtC>x6a~PtOmn#eC=?2XLLm%QRaI4$DadvOQ7n}XClkeZ-0z|%V#mQ* ztB7K;$dZa8fGo46;-I1!tx$ZWL=m7^WcTrw<8k)EzvesEJ{9K)c&qGRY@AZ=DfK*- zp3->X@shr(&n~_~`G7so^L!sbQEIhv`2e_WZ?_o7^@v_pQQQy60rI!NY06USd6WXI z*BBEL1LxaYyWMWz-tH@ujgwR`%^zouv)!&%0He`lqG|h|ejzy_sr*lwuIsvG0W6oy zC+!oQS2P?B29J-dw`}|01J7nJFPa80ojyO$=jn&6)YBZ_zb(r!G>x5A6y@&$FBY$_ zvl#$Fk|aq0-EOaUcXtAKS^?btR3Y0fA(jQ;ID~j!HgIlmZr9gWR~HvyIGK#cgF!SN z|6s*G$!UPxIOuRV8cikumStHO=Reoy22ZX)tJQ2?UIGjT{eG_pfKat6%fAD+ZN~w4 xco>hTQvh8zjMeJ+KOiTArxlX-`BOoY_6sUuZ>tv?-5vk{002ovPDHLkV1g2Br9S`w diff --git a/hurricane/src/hviewer/images/palette_show_all.png b/hurricane/src/hviewer/images/palette_show_all.png deleted file mode 100644 index 712566bfed59230064c4a106e07b40493a5637ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmV-+1&R8JP)O4EabgM)*EG?mZ)HLjh2fBg9VeZ5Z8_4?blr>8Vsuh;9Rr!+k| zIXUTc{@nq2PI27z-rly27^5_f0nRy3lFb)67niQNfJu)Gm4@p*^_kO z_XOmmkt9jN7|?1R9bH^xp^~GVCnOAQ`(KzAKxeZcP!youUM$LGAc`2vM|wKFzrVfR zB<2_6j4>9+y8#p(V2n~iL?kS0H}grtIb*UoR-l}e-0Y5{}6>1nG4oS)mat^>oN z>v9elhGA&hD@43hnY?>DlSL~!AV)bbZ8Y+IMFA+~Tv32HP7(oB*EJ1zeDwV!0W?k1 zR24AIR;$r?1-PsdLcM_FSk`3n=h`hgkO6*4hiNKG6ak~ra_M=%o}_wu)n{*zrUZRold9I=?DfL2Pl^nMO9x1uPFI_ zUqT-YnoYqlA;Ll1wyX^B&5ddPj+i~kXb|}RY9&&pTo#Asvs@;VoXdmAmq*Tlmt{1Y z&%Y!0ilQhA0)R0g8ATB}psMAvI7^&cEEc8WMp7!9m*coDz}R>^oo3}s*59n|OL#A( zA@`S;Ow#*%#>!>D_r>}mU`i=v45-&@wMyj`sf3~MJTILj0TjjeMSUNSXEVTYCKK_c z>-UGlO(u7l1l;R+9;JY$8Ai1VJU()+s=#s?$C3yUJxY@V@ckelBu9j#zTIxOFD}wF z41M3SGG;96^78f;I6J$$ySV|R*PeHGcYhB=(R^-MK)KxQ*6YA*CL|X{oKp(4+p1cx z1C55NR;z$vh$_)+8irv2$H#_|XL34St$ZKob`3*Sf#Fa@xcKQ;ii}9+t5w6O)$&ZO zR+a^DPDm61K@f(72u&slFrN#+7Z;}4>j8vt9)`ed=DLdoz&WLy1Bw#InkMF>2;ltq zxZ4Fhj}StDBoPs|EY70{SgkC}bvGmTODfW%>+7qlyE~z+Fa$L1?Cj_Wu&l+xvVi4M zl%+5fj3|n(t193)zVCT}>oVrLnS>Z)j4^;xLgE-OP4Ql(BJ1^Hv0MT{uw1TIK)+wB zsVXp;JUq$>@zE85OBRF+HWK+&>p zQP}0>WHKIauKW10R%^9@Zr3!M&CTEAm=H>V)6-sWFxcHDzqx<@@ZtUYckj}4JRXg% zuC@cGR7fKTq9}?0QAdDgvtG~Vj0AdpJsgh58N+Yw>)#B#7=fcB!Q9nVzu)TthEc5w z$-Hh-GM_$;Mw1C(S+?zYfBpyLuYqrK|Y%jXFDfG=t4(p`m)62M5P7>I??YT`S@4UagsS7R(c3f9>;?rb! zaD#~=cX2m%tv4U#pK&Ly7=bDDum7bcu7UV&G2G#_q6WpOz#}2z+Wen!_+^N z#Taji$^5tT&yA+YbD}>A-*rc>&@J$O`1HN~g=HtCw8Y${CTbluS^x9doozvTU7fB! z+IjKLB91AqPxdZu)ogUlaV?!?t+!9b*osfeS7U5qaw$oIWxDE!~|t56N=tVO=-^N+z96f&eKJ0q`7yi=*}O! z7w7Pv|MNWO|2zkl`HzU7pDc>M6|U6kIB@cGa2=MoKNQAd>&NBwvMWEA+d%W92mf4w z0EETXkFLEFfRf^!C=(I@qN*a2u+X)43X82@EN0O4Ra9zqvR=f65vKZyfgJUkP{vD< zo|=LxC7I$wN9btM3m_(9*7b%K@%&AOHYgH9^+ya zvR*6>5Ockv993!(lhZS@!r!K*85(m_r#AsmuPda^V{NY-Amw{EAVtaO2H*g1G@HuJc>3zyf&(3qR*r%f~%+pt<%(Imz5 z@Mbl4Zrvc!=U#Abu@`b}CF%_=43AF$AX$4UKUIQea}M+K^Z5OKW@l%4YwJVXXrQoo z4^~Sno>3<~FO4B>*-3Ud?5s>w0&wowVT!ioai-!b4yTJiAV44xpm0+*d$$z;Fg-CI z6c5`)zY@jS^Zewf_w%)s2-9K#MfjXm%1`TZyq3M5J5VP$xP1I%P&d?0DNi>`FQpe z!T?(ZeetFa%BJjc-k{gOEyh2H%Ll0F|;r