00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef QTPIXELCANVAS_H
00028 #define QTPIXELCANVAS_H
00029
00030 #include <casa/aips.h>
00031 #include <casa/Arrays/Matrix.h>
00032 #include <display/Display/DisplayEnums.h>
00033 #include <display/Display/PixelCanvas.h>
00034
00035 #include <casa/BasicMath/Math.h>
00036 #include <display/QtViewer/QtPCColorTable.h>
00037
00038 #include <list>
00039
00040 #include <graphics/X11/X_enter.h>
00041 # include <QWidget>
00042 # include <QPainter>
00043 # include <QPixmap>
00044 # include <QPicture>
00045 # include <QImage>
00046 # include <QPen>
00047 #include <graphics/X11/X_exit.h>
00048
00049
00050 namespace casa {
00051
00052 class q_draw;
00053
00054 class QtPixelCanvas : public QWidget, public PixelCanvas {
00055
00056
00057
00058
00059 Q_OBJECT
00060
00061
00062
00063 public:
00064
00065
00066
00067
00068 QtPixelCanvas(QWidget *parent=0);
00069 QtPixelCanvas( const QtPixelCanvas *, QWidget *parent=0 );
00070 ~QtPixelCanvas();
00071
00072 void beginLabelAndAxisCaching( ) {
00073 cache_label_and_axis = True;
00074 }
00075 void endLabelAndAxisCaching( QPainter &qp );
00076
00077 protected:
00078
00079 std::list<q_draw*> label_and_axis_cache;
00080
00081
00082
00083 void paintEvent(QPaintEvent* e);
00084 void resizeEvent(QResizeEvent* e);
00085 void mouseMoveEvent(QMouseEvent* e);
00086 void mousePressEvent(QMouseEvent* e);
00087 void mouseReleaseEvent(QMouseEvent* e);
00088 void keyPressEvent(QKeyEvent* e );
00089 void enterEvent( QEvent* e );
00090
00091
00092 Bool cache_label_and_axis;
00093
00094 public:
00095
00096
00097
00098
00099
00100
00101 virtual QSize sizeHint() const {
00102 return QSize(400, 300);
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 virtual void refresh(const Display::RefreshReason &reason =
00117 Display::UserCommand,
00118 const Bool &explicitrequest = True);
00119
00120 static void colorTableResizeCB(PixelCanvasColorTable *, uInt,
00121 QtPixelCanvas * qtpc,
00122 Display::RefreshReason reason);
00123
00124
00125
00126
00127
00128
00129 virtual void setDrawBuffer(Display::DrawBuffer buf) {
00130 if(buf==Display::FrontBuffer) setDrawBuffer_(buf);
00131 else setDrawBuffer_(Display::BackBuffer);
00132 p_begin_();
00133 }
00134
00135
00136
00137
00138 virtual void copyBackBufferToFrontBuffer();
00139 virtual void copyFrontBufferToBackBuffer();
00140 virtual void swapBuffers();
00141
00142
00143
00144
00145 virtual void copyBackBufferToFrontBuffer(Int x1, Int y1, Int x2, Int y2);
00146 virtual void copyFrontBufferToBackBuffer(Int x1, Int y1, Int x2, Int y2);
00147 virtual void swapBuffers(Int x1, Int y1, Int x2, Int y2);
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 virtual void clear();
00161 virtual void clear(Int x1, Int y1, Int x2, Int y2);
00162
00163
00164
00165
00166
00167 virtual void drawImage(const Matrix<uInt> &data, Int x, Int y);
00168
00169
00170
00171
00172
00173
00174 virtual void drawImage(const Int &x, const Int &y,
00175 const Matrix<uInt> &data,
00176 const Matrix<Bool> &mask,
00177 Bool opaqueMask=False) ;
00178
00179
00180 virtual void drawLines(const Matrix<Float> &verts);
00181
00182 virtual void drawRectangle(Int x1, Int y1, Int x2, Int y2);
00183
00184 virtual void drawFilledRectangle(Int x1, Int y1, Int x2, Int y2);
00185
00186 virtual void drawPolygon(const Vector<Float> &x,
00187 const Vector<Float> &y);
00188
00189 virtual void drawFilledPolygon(const Vector<Float> &x,
00190 const Vector<Float> &y);
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 virtual void setDeviceForegroundColor(const String colorname);
00256 virtual String deviceForegroundColor() const;
00257 virtual void setDeviceBackgroundColor(const String colorname);
00258 virtual String deviceBackgroundColor() const;
00259
00260
00261 virtual void setColor(const String &colorname);
00262 virtual void setRGBColor(float r, float g, float b);
00263
00264
00265
00266
00267
00268 virtual void setClipWindow(Int x1, Int y1, Int x2, Int y2);
00269 virtual Bool enable(Display::Option option);
00270 virtual Bool disable(Display::Option option);
00271
00272
00273
00274
00275
00276
00277
00278
00279 virtual uInt width() const {
00280 return uInt(QWidget::width());
00281 }
00282
00283
00284 virtual uInt height() const {
00285 return uInt(QWidget::height());
00286 }
00287
00288
00289 virtual uInt depth() const {
00290 return itspcctbl->depth();
00291 }
00292
00293
00294 virtual void pixelDensity(Float &xdpi, Float &ydpi) const;
00295
00296
00297
00298
00299
00300 virtual Bool getColorComponents(const String &colorname,
00301 Float &r,
00302 Float &g, Float &b);
00303
00304
00305 virtual PixelCanvasColorTable * pcctbl() const {
00306 return itspcctbl;
00307 };
00308
00309
00310
00311
00312
00313
00314
00315 virtual Bool supportsLists();
00316 virtual uInt newList();
00317 virtual void endList();
00318 virtual void drawList(uInt list);
00319 virtual void deleteList(uInt list);
00320 virtual void deleteLists();
00321 virtual Bool validList(uInt list);
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332 virtual QPixmap* contents() {
00333 return new QPixmap(*frontBuffer_);
00334 }
00335 virtual QPixmap* getBackBuffer() {
00336 return backBuffer_;
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363 virtual void setAllowBackToFront(Bool allowed=True) {
00364 allowBackToFront_ = allowed;
00365 }
00366
00367 virtual void setUpdateAllowed(Bool allowed=True) {
00368 if(allowed) {
00369 if(saveBuf_!=0) {
00370 delete saveBuf_;
00371 saveBuf_ = 0;
00372 }
00373 } else if(saveBuf_==0) saveBuf_ = contents();
00374 }
00375
00376
00377
00378
00379 signals:
00380
00381
00382 void resizing(QResizeEvent* ev);
00383
00384
00385
00386 private:
00390 void construct_( );
00391
00392
00393
00394
00395
00396
00397
00398
00399 void p_end_();
00400 void p_begin_();
00401
00402
00403
00404
00405
00406
00407 Int q_(Int pY) {
00408 return QWidget::height()-1 - pY;
00409 }
00410 Float q_(Float pY) {
00411 return QWidget::height()-1 - pY;
00412 }
00413 Double q_(Double pY) {
00414 return QWidget::height()-1 - pY;
00415 }
00416
00417
00418 void qFromPC_(Int x1, Int y1, Int x2, Int y2,
00419 Int& qx, Int& qy, Int& qw, Int& qh) {
00420 qw = abs(x2-x1)+1;
00421 qh = abs(y2-y1)+1;
00422 qx = min(x1,x2);
00423 qy = q_(max(y1,y2));
00424 }
00425
00426
00427 QRect qrect_(Int x1, Int y1, Int x2, Int y2) {
00428 Int qx,qy,qw,qh;
00429 qFromPC_(x1,y1,x2,y2, qx,qy,qw,qh);
00430 return QRect(qx,qy,qw,qh);
00431 }
00432
00433
00434
00435
00436 Int clrByte_(Float f) {
00437 return Int(min( max(0.f,f)*256.f, 255.f ));
00438 }
00439
00440 Bool inDrawMode_() {
00441 return (drawMode()!=Display::Compile);
00442 }
00443
00444 QPixmap* currentBuffer_() {
00445 return (drawBuffer() == Display::FrontBuffer)?
00446 frontBuffer_ : backBuffer_;
00447 }
00448
00449 void clearBuffer_() {
00450 p_.eraseRect(0,0, currentBuffer_()->width(),
00451 currentBuffer_()->height());
00452 }
00453
00454 QPaintDevice* currentPaintDevice_() {
00455 if(inDrawMode_()) return currentBuffer_();
00456 else return drawList_;
00457 }
00458
00459
00460
00461
00462
00463
00464 uInt dlKeyMods_(Qt::KeyboardModifiers);
00465 uInt dlKeyMods_(QMouseEvent* e);
00466
00467
00468
00469
00470
00471
00472
00473
00474 QPixmap* frontBuffer_;
00475 QPixmap* backBuffer_;
00476
00477
00478
00479 QPainter p_;
00480
00481
00482
00483
00484
00485 QPainter pw_;
00486
00487
00488
00489 QPicture* drawList_;
00490
00491 uInt drawListNo_;
00492
00493 SimpleOrderedMap<uInt, void*> drawlists_;
00494
00495
00496
00497
00498 String itsDeviceForegroundColor, itsDeviceBackgroundColor;
00499
00500
00501
00502 QPen itsPen;
00503
00504 QFont itsFont;
00505
00506 QRect clipRect_;
00507 Bool clipEnabled_;
00508
00509 QtPCColorTable* itspcctbl;
00510
00511
00512
00513
00514
00515 Int holdcount_;
00516 Bool needsRefresh_;
00517
00518
00519
00520
00521
00522
00523 bool allowBackToFront_;
00524 QPixmap* saveBuf_;
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552 public:
00553
00554
00555
00556
00557
00558
00559 Display::ColorModel colorModel() const {
00560 return Display::Index;
00561 }
00562
00563
00564
00565 virtual void drawImage(const Matrix<uInt> &, const Int &, const Int &,
00566 const Display::ColorComponent &) { }
00567
00568
00569
00570
00571
00572 void setColorModel(Display::ColorModel colorModel);
00573
00574
00575 virtual void bufferComponent(const Matrix<uInt> &,
00576 const Int &,
00577 const Int &,
00578 const Display::ColorComponent &)
00579 { }
00580
00581
00582 virtual void flushComponentBuffers() { }
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596 Bool refreshActive() const;
00597
00598
00599 virtual Bool refreshAllowed() const;
00600
00601
00602
00603
00604 virtual void drawColoredPoints(const Vector<Int> &, const Vector<Int> &,
00605 const Vector<uInt> &) {
00606
00607 }
00608 virtual void drawColoredPoints(const Matrix<Int> &xy,
00609 const Vector<uInt> &colors) {
00610 drawColoredPoints(xy.column(0), xy.column(1), colors);
00611 }
00612
00613
00614
00615 virtual void flush();
00616
00617 static void drawText(QPainter& painter, const QPoint& p, const QFont& font,
00618 const QPen& pen, const String& text, double angle,
00619 Display::TextAlign alignment);
00620 virtual void drawText(Int x, Int y, const String &text, const Float& angle,
00621 Display::TextAlign alignment = Display::AlignCenter);
00622 virtual void drawText(Int x, Int y, const String &text,
00623 Display::TextAlign alignment = Display::AlignCenter);
00624
00625 virtual Int textWidth(const String& text);
00626
00627 virtual Int textHeight(const String& text);
00628
00629 virtual void setHSVColor(float , float , float ) { }
00630
00631
00632
00633
00634 virtual void drawPoint(Int x1, Int y1);
00635 virtual void drawPoint(Float x1, Float y1);
00636 virtual void drawPoint(Double x1, Double y1);
00637
00638
00639
00640
00641 virtual void drawPoints(const Matrix<Int> &verts);
00642 virtual void drawPoints(const Matrix<Float> &verts);
00643 virtual void drawPoints(const Matrix<Double> &verts);
00644
00645
00646
00647
00648 virtual void drawPoints(const Vector<Int> &x1,
00649 const Vector<Int> &y1);
00650 virtual void drawPoints(const Vector<Float> &x1,
00651 const Vector<Float> &y1);
00652 virtual void drawPoints(const Vector<Double> &x1,
00653 const Vector<Double> &y1);
00654
00655
00656
00657
00658 virtual void drawLine(Int x1, Int y1,
00659 Int x2, Int y2);
00660 virtual void drawLine(Float x1, Float y1,
00661 Float x2, Float y2);
00662 virtual void drawLine(Double x1, Double y1,
00663 Double x2, Double y2);
00664
00665
00666
00667
00668 virtual void drawLines(const Matrix<Int> &verts);
00669 virtual void drawLines(const Matrix<Double> &verts);
00670
00671
00672
00673
00674 virtual void drawLines(const Vector<Int> &x1,
00675 const Vector<Int> &y1,
00676 const Vector<Int> &x2,
00677 const Vector<Int> &y2);
00678 virtual void drawLines(const Vector<Float> &x1,
00679 const Vector<Float> &y1,
00680 const Vector<Float> &x2,
00681 const Vector<Float> &y2);
00682 virtual void drawLines(const Vector<Double> &x1,
00683 const Vector<Double> &y1,
00684 const Vector<Double> &x2,
00685 const Vector<Double> &y2);
00686
00687
00688
00689
00690 virtual void drawPolyline(const Vector<Int> &x1,
00691 const Vector<Int> &y1);
00692 virtual void drawPolyline(const Vector<Float> &x1,
00693 const Vector<Float> &y1);
00694 virtual void drawPolyline(const Vector<Double> &x1,
00695 const Vector<Double> &y1);
00696
00697
00698
00699
00700 virtual void drawPolyline(const Matrix<Int> &verts);
00701 virtual void drawPolyline(const Matrix<Float> &verts);
00702 virtual void drawPolyline(const Matrix<Double> &verts);
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726 virtual void drawPolygon(const Vector<Int> &x1,
00727 const Vector<Int> &y1);
00728 virtual void drawPolygon(const Vector<Double> &x1,
00729 const Vector<Double> &y1);
00730
00731
00732
00733
00734 virtual void drawPolygon(const Matrix<Int> &verts);
00735 virtual void drawPolygon(const Matrix<Float> &verts);
00736 virtual void drawPolygon(const Matrix<Double> &verts);
00737
00738
00739
00740
00741 virtual void drawFilledPolygon(const Vector<Int> &x1,
00742 const Vector<Int> &y1);
00743 virtual void drawFilledPolygon(const Vector<Double> &x1,
00744 const Vector<Double> &y1);
00745
00746
00747
00748
00749 virtual void drawRectangle(Float x1, Float y1,
00750 Float x2, Float y2);
00751 virtual void drawRectangle(Double x1, Double y1,
00752 Double x2, Double y2);
00753
00754
00755
00756
00757 virtual void drawFilledRectangle(Float x1, Float y1,
00758 Float x2, Float y2);
00759 virtual void drawFilledRectangle(Double x1, Double y1,
00760 Double x2, Double y2);
00761
00762
00763
00764
00765
00766 virtual void drawColoredLines(const Vector<Int> &x1,
00767 const Vector<Int> &y1,
00768 const Vector<Int> &x2,
00769 const Vector<Int> &y2,
00770 const Vector<uInt> &colors);
00771 virtual void drawColoredLines(const Vector<Float> &x1,
00772 const Vector<Float> &y1,
00773 const Vector<Float> &x2,
00774 const Vector<Float> &y2,
00775 const Vector<uInt> &colors);
00776 virtual void drawColoredLines(const Vector<Double> &x1,
00777 const Vector<Double> &y1,
00778 const Vector<Double> &x2,
00779 const Vector<Double> &y2,
00780 const Vector<uInt> &colors);
00781
00782
00783
00784
00785
00786
00787
00788
00789 virtual void setDrawFunction(Display::DrawFunction function);
00790 virtual void setForeground(uLong color);
00791 virtual void setBackground(uLong color);
00792 virtual void setLineWidth(Float width);
00793 virtual void setLineStyle(Display::LineStyle style);
00794 virtual void setCapStyle(Display::CapStyle style);
00795 virtual void setJoinStyle(Display::JoinStyle style);
00796 virtual void setFillStyle(Display::FillStyle style);
00797 virtual void setFillRule(Display::FillRule rule);
00798 virtual void setArcMode(Display::ArcMode mode);
00799
00800
00801
00802 virtual void setQtLineStyle(Qt::PenStyle style);
00803 virtual void setQtPenColor( QColor c ) {
00804 itsPen.setColor(c);
00805 }
00806 virtual QColor getQtPenColor( ) const {
00807 return itsPen.color( );
00808 }
00809
00810
00811
00812 virtual Display::DrawFunction getDrawFunction() const;
00813 virtual uLong getForeground() const;
00814 virtual uLong getBackground() const;
00815 virtual Float getLineWidth() const;
00816 virtual Display::LineStyle getLineStyle() const;
00817 virtual Display::CapStyle getCapStyle() const;
00818 virtual Display::JoinStyle getJoinStyle() const;
00819 virtual Display::FillStyle getFillStyle() const;
00820 virtual Display::FillRule getFillRule() const;
00821 virtual Display::ArcMode getArcMode() const;
00822
00823
00824
00825
00826 virtual void setImageCacheStrategy(Display::ImageCacheStrategy strategy);
00827 virtual Display::ImageCacheStrategy imageCacheStrategy() const;
00828
00829
00830
00831
00832
00833
00834 virtual void setClearColor(uInt colorIndex);
00835 virtual void setClearColor(const String &colorname);
00836 virtual void setClearColor(float r, float g, float b);
00837
00838
00839
00840 virtual uInt clearColor() const;
00841 virtual void getClearColor(float &r, float &g, float &b) const;
00842
00843 virtual void enableMotionEvents() { }
00844 virtual void disableMotionEvents() { }
00845 virtual void enablePositionEvents() { }
00846 virtual void disablePositionEvents() { }
00847
00848 virtual void translateAllLists(Int , Int ) { }
00849 virtual void translateList(uInt , Int , Int ) { }
00850
00851 virtual Bool setFont(const String &fontName);
00852 virtual Bool setFont(DLFont* ) {
00853 return False;
00854 }
00855 virtual Bool setFont(const String& fontName, const Int fontSize);
00856
00857
00858
00859 virtual Bool setFont(const String& fontName, bool bold, bool italic);
00860 virtual Bool setFont(const String& fontName, const Int fontSize, bool bold,
00861 bool italic);
00862
00863
00864 virtual void drawImage(const Matrix<Int> &, Int , Int ) { }
00865 virtual void drawImage(const Matrix<uLong> &, Int , Int ) { }
00866 virtual void drawImage(const Matrix<Float> &data, Int x, Int y);
00867 virtual void drawImage(const Matrix<Double> &, Int , Int ) { }
00868
00869 virtual void drawImage(const Matrix<uInt> &, Int , Int ,
00870 uInt , uInt ) { }
00871 virtual void drawImage(const Matrix<Int> &, Int , Int ,
00872 uInt , uInt ) { }
00873 virtual void drawImage(const Matrix<uLong> &, Int , Int ,
00874 uInt , uInt ) { }
00875 virtual void drawImage(const Matrix<Float> &, Int , Int ,
00876 uInt , uInt ) { }
00877 virtual void drawImage(const Matrix<Double> &, Int , Int ,
00878 uInt , uInt ) { }
00879
00880
00881
00882
00883 virtual void setColor(uInt colorIndex);
00884
00885
00886
00887 virtual uInt color() const;
00888
00889
00890 virtual void getColor(float &r, float &g, float &b) const;
00891
00892
00893
00894 virtual Bool getColor(Int x, Int y, uInt &color);
00895 virtual Bool getRGBColor(Int x, Int y,
00896 float &r, float &g, float &b);
00897 virtual Bool getHSVColor(Int x, Int y,
00898 float &h, float &s, float &v);
00899
00900
00901
00902
00903
00904
00905
00906
00907 virtual Bool resizeColorTable(uInt newSize);
00908
00909
00910 virtual Bool resizeColorTable(uInt nReds,
00911 uInt nGreens, uInt nBlues);
00912
00913
00914
00915
00916
00917 virtual void pushMatrix() { }
00918 virtual void popMatrix() { }
00919
00920
00921 virtual void loadIdentity() { }
00922
00923
00924
00925
00926
00927
00928 virtual void translate(Int , Int ) { }
00929 virtual void getTranslation(Int &, Int &) const { }
00930 virtual Int xTranslation() const {
00931 return 0;
00932 }
00933 virtual Int yTranslation() const {
00934 return 0;
00935 }
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945 virtual void drawColoredEllipses(const Matrix<Float> &,
00946 const Vector<Float> &, const Vector<Float> &,
00947 const Vector<Float> &, const Vector<uInt> &,
00948 const Float & = 1.0, const Bool & = True) { }
00949
00950 virtual void drawColoredPoints(const Vector<Float> &,
00951 const Vector<Float> &, const Vector<uInt> &) { }
00952 virtual void drawColoredPoints(const Vector<Double> &,
00953 const Vector<Double> &, const Vector<uInt> &) { }
00954 virtual void drawColoredPoints(const Matrix<Float> &xy,
00955 const Vector<uInt> &colors) {
00956 drawColoredPoints(xy.column(0), xy.column(1), colors);
00957 }
00958 virtual void drawColoredPoints(const Matrix<Double> &xy,
00959 const Vector<uInt> &colors) {
00960 drawColoredPoints(xy.column(0), xy.column(1), colors);
00961 }
00962
00963
00964 virtual void getClipWindow(Int &, Int &, Int &, Int &) { }
00965
00966 virtual void setPcctbl(PixelCanvasColorTable * ) { }
00967
00968 };
00969
00970 }
00971
00972 #endif