diff options
Diffstat (limited to 'src/knutanalog.cpp')
-rw-r--r-- | src/knutanalog.cpp | 911 |
1 files changed, 911 insertions, 0 deletions
diff --git a/src/knutanalog.cpp b/src/knutanalog.cpp new file mode 100644 index 0000000..c240523 --- /dev/null +++ b/src/knutanalog.cpp @@ -0,0 +1,911 @@ + /*************************************************************************** + * Copyright (C) 2007 by Daniel Prynych * + * Daniel.Prynych@buzuluk.cz * + * * + * 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 2 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, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "knutanalog.h" + +/* pocitani uhlu */ +/* nula je ve 3 hodiny */ +/* prirustek je kladny ve smeru hod rucicek */ + +#include <stdio.h> +#include <math.h> + +#include <qpainter.h> +#include <qframe.h> +#include <qfontmetrics.h> +#include <qfont.h> +#include <qbitmap.h> +#include <qpaintdevice.h> +#include <qcolor.h> + +#include <kapp.h> + + + +KNutAnalog::KNutAnalog( QWidget *parent, const char *name, int bottomLimit, int topLimit, int typeOfView, int countOfParts, int countOfSubParts, QColor pointerColor, QColor scaleColor, QColor textColor, QFont *analogFonts, int qualityOfPointer, bool makeBG ) + : QFrame( parent, name ), m_bottomLimit(bottomLimit), m_topLimit(topLimit), m_typeOfView(typeOfView), m_countOfParts(countOfParts), m_countOfSubParts(countOfSubParts), m_pointerColor(pointerColor), m_scaleColor(scaleColor) ,m_textColor(textColor) { + + + if ( qualityOfPointer==0) { + m_speedOfAAlias=none; + m_makeBlurMotion=false; + } + else { + if ((qualityOfPointer==2) || (qualityOfPointer== 4)) m_speedOfAAlias=slow; else m_speedOfAAlias=fast; + if ((qualityOfPointer==3) || (qualityOfPointer== 4)) m_makeBlurMotion=true; else m_makeBlurMotion=false; + } + +// m_showBackGround = true; +// m_showPointer = true; + + if (m_countOfParts > 6) m_countOfParts=6; + else if (m_countOfParts < 2) m_countOfParts=2; + + + if ( m_countOfSubParts > 6 ) m_countOfSubParts = 6; + if ( m_countOfSubParts == 0 ) { + if (m_countOfParts < 4) m_countOfSubParts =5; + else { + if (m_countOfParts < 6) m_countOfSubParts=4; + else m_countOfSubParts =3; + } + } + + m_valueOfPointer=m_bottomLimit; + /* hodnoty zavisle na typu zobrazeni */ + switch (m_typeOfView) { + case 1 : + m_direction = 1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ + m_angleOfViewer=270; + m_startAngle=225; + m_centerX=m_widthOfBackGround/2; + m_centerY=m_widthOfBackGround/2; + m_widthOfScale=118; + m_radiusOfScaleNumbers=37; + break; + case 2 : + m_direction = -1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ + m_angleOfViewer=90; + m_startAngle=0; + m_centerX=13; + m_centerY=110; + m_widthOfScale=210; + m_radiusOfScaleNumbers=83; + break; + case 3 : + m_direction = 1; /* smer =1 ve smeru (clockwise), smer =-1 proti smeru hod. rucicek */ + m_angleOfViewer=90; + m_startAngle=135; + m_centerX=m_widthOfBackGround/2; + m_centerY=m_widthOfBackGround-15; + m_widthOfScale=170; + m_radiusOfScaleNumbers=65; + break; + } + // konec hodnot zavislych na typu zobrazeni + + if (analogFonts == 0) { // pokud neni predan font nastavi se systemovy font + m_scaleFont = kapp->font(); + m_textFont = kapp->font(); + } + else { + m_scaleFont= *analogFonts; + m_textFont= *analogFonts; + } + + m_countOfColorParts = 0; + setMinimumSize( AnalogWidth, AnalogWidth ); + setMaximumSize( AnalogWidth, AnalogWidth ); + setFrameStyle( QFrame::Box | QFrame::Raised ); + setLineWidth( 2 ); + + m_backgroudLayerBig = new QPixmap( (AnalogWidth-8) * 3,(AnalogWidth-8)*3 ); + + m_scaleLayerBig = new QPixmap ( (AnalogWidth-8)*3, (AnalogWidth-8)*3 ); // + m_scaleLayerSmall = new QPixmap ( (AnalogWidth-8), (AnalogWidth-8)); // + + m_wholeLayer = new QPixmap ( AnalogWidth-8, AnalogWidth-8 ); // + + m_pointerLayerBig = new QPixmap ( (AnalogWidth-8)*3, (AnalogWidth-8)*3 ); // + m_pointerLayerSmall = new QPixmap ( (AnalogWidth-8), (AnalogWidth-8)); // + + setDefaultArcColor(false); // sets standard registers // nastavime standartni registry + + if (makeBG) { + paintBackGround(); + m_showBackGround = true; + m_showPointer = true; + } + } + +KNutAnalog::~KNutAnalog() { + + delete (m_backgroudLayerBig); + + delete (m_scaleLayerBig); + delete (m_scaleLayerSmall); + + delete (m_pointerLayerBig); + delete (m_pointerLayerSmall); + + delete (m_wholeLayer); +} + + +void KNutAnalog::makeBackground (bool run) { + + paintBackGround(); + m_showBackGround = true; + if (run) { + repaint(); + } + } + + +void KNutAnalog::setText (QString inscription, QString text_up, bool run) { + + m_inscription=inscription; + AnMJ=text_up; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint(); + } + } + +void KNutAnalog::setDefaultArcColor(bool run) { + + m_arcColors[0] = Qt::white; + m_arcColors[1] = Qt::green; + m_arcColors[2] = Qt::yellow; + m_arcColors[3] = Qt::red; + m_arcColors[4] = Qt::blue; + m_arcColors[5] = Qt::cyan; + m_arcColors[6] = Qt::magenta; + m_arcColors[7] = Qt::gray; + m_arcColors[8] = Qt::black; + if (run) { + paintBackGround(); + m_showBackGround=true; + repaint(); + } + } + + +void KNutAnalog::setArcColor(int reg, QColor color ) { + if ((reg > -1) && (reg < 9)) m_arcColors[reg] = color; + } + + +void KNutAnalog::addArc (double startOfCircle, double endOfCircle, int regColor, bool run) { + + if (m_countOfColorParts < 5) { + m_extentOfDye[m_countOfColorParts].start=startOfCircle; + m_extentOfDye[m_countOfColorParts].end=endOfCircle; + if ((regColor <0) || (regColor > 8)) regColor=0; + m_extentOfDye[m_countOfColorParts++].color=regColor; + } + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + +void KNutAnalog::delArc (bool run) { + + m_countOfColorParts = 0; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + + +void KNutAnalog::setRange (int Astart, int Aend , bool run) { + + m_bottomLimit=Astart; + m_topLimit=Aend; + // pokud zmenime rozasah musime prekrelit i rucicku + m_showPointer = true; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + + +void KNutAnalog::setMember (int Count, bool run) { + + m_countOfParts=Count; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + + +void KNutAnalog::setPointerColor (QColor pointerColor, bool run ) { + + m_pointerColor = pointerColor; + paintPointer(); + m_showPointer = true; + if (run) { + repaint (); + } + } + + +void KNutAnalog::repaintPointer ( bool run ) { + + paintPointer(); + m_showPointer = true; + if (run) { + repaint (); + } + } + + +void KNutAnalog::setFontColor (QColor fontColor, bool run ) { + + m_textColor = fontColor; +// paintBackGround(); +// m_showBackGround = true; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + +void KNutAnalog::setScaleColor (QColor scaleColor, bool run) { + + m_scaleColor = scaleColor; + if (run) { + paintBackGround(); + m_showBackGround = true; + repaint (); + } + } + + +void KNutAnalog::setDigitalProcesing (int qualityOfPointer, bool run ) { + + if (qualityOfPointer < 0) qualityOfPointer = 0; + if (qualityOfPointer > 4) qualityOfPointer = 4; + if ( qualityOfPointer==0) { + m_speedOfAAlias=none; + m_makeBlurMotion=false; + } + else { + if ((qualityOfPointer==2) || (qualityOfPointer== 4)) m_speedOfAAlias=slow; else m_speedOfAAlias=fast; + if ((qualityOfPointer==3) || (qualityOfPointer== 4)) m_makeBlurMotion=true; else m_makeBlurMotion=false; + } + paintPointer(); + m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku + if (run) repaint (); +} + + + +void KNutAnalog::setPointer (double pointerValue, bool run ) { + if (m_valueOfPointer != pointerValue) { + m_valueOfPointer = pointerValue; + paintPointer(); + m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku + if (run) { +// paintPointer(); + m_showPointer = true; // pri jakemkoliv prekresleni prekreslime rucicku + repaint (); + } + } +} + + + +//************** PUBLIC SLOTS ********************************** + +void KNutAnalog::slotSetScaleFont(QFont newScaleFont){ + m_scaleFont = newScaleFont; + paintBackGround(); + m_showBackGround=true; + repaint(); + } + +void KNutAnalog::slotSetTextFont(QFont newTextFont){ + m_textFont = newTextFont; + paintBackGround(); + paintPointer(); // repaint values if pointer + m_showBackGround=true; + m_showPointer=true; + repaint(); + } + +void KNutAnalog::slotSetAllFont(QFont newAllFont){ + m_scaleFont = newAllFont; + m_textFont = newAllFont; + paintBackGround(); + paintPointer(); // repaint values if pointer + m_showBackGround=true; + m_showPointer=true; + repaint(); + } + + +void KNutAnalog::repaintAll (void) { + paintBackGround(); + m_showBackGround = true; + m_showPointer = true; + repaint (); + } + + +//************** protected **************************** + +void KNutAnalog::resizeEvent( QResizeEvent * ) { +} + + +void KNutAnalog::paintEvent( QPaintEvent *e ) { + + if (isVisible()) { + QFrame::paintEvent(e); + if ((m_showBackGround) || (m_showPointer)) { // novou kompletni vrstvu sestavime jen pokud doslo ke zmene + bitBlt( m_wholeLayer, 0, 0, m_scaleLayerSmall, 0, 0, m_widthOfBackGround, m_widthOfBackGround, CopyROP); //nakopirujeme vrstvu + bitBlt( m_wholeLayer, 0, 0, m_pointerLayerSmall, 0, 0, m_widthOfBackGround, m_widthOfBackGround, AndROP ); //nakopirujeme rucicku + } + bitBlt( this , m_startOfBackGround, m_startOfBackGround, m_wholeLayer, 0, 0, m_widthOfBackGround, m_widthOfBackGround, CopyROP); //nakopirujeme vrstvu + m_showBackGround = false; + m_showPointer = false; + } + } + + +//***************private ************************ + +void KNutAnalog::paintBackGround ( void ) { + QPainter paint; + QImage myImage; //big image + +//qDebug ("KNutAnalog::paintBackGround"); + + m_scaleLayerBig->fill( this,0,0); //color if background + + paint.begin ( m_scaleLayerBig ); + paint.setBackgroundMode(Qt::OpaqueMode); + paint.setBackgroundColor(backgroundColor()); + paintPartOfCircle(&paint, m_centerX*3, m_centerY*3,m_widthOfScale*3); //CMK pro inter + paintScale(&paint, m_centerX*3, m_centerY*3,m_widthOfScale*3); // Scale + paint.end(); + + myImage = m_scaleLayerBig->convertToImage(); + + makeMotionBlur(&myImage,myImage.pixel(1,1),m_typeOfView); + makeAntialiasing(&myImage,m_scaleLayerSmall,myImage.pixel(1,1),slow,m_typeOfView); + + paint.begin( m_scaleLayerSmall ); // paint on layer of scale + // painting numbers + paintScaleNumbers( &paint ); //painting of numbers + // painting texts + paintText( &paint ); + paint.end (); + } + + + +void KNutAnalog::paintPointer ( void ) { + + +//qDebug ("KNutAnalog::paintPointer"); + if (m_speedOfAAlias == none) paintPointerFastly (m_valueOfPointer); + else paintPointerSlowly ( m_valueOfPointer, m_centerX*3, m_centerY*3,m_widthOfScale*3); +} + + +void KNutAnalog::paintPointerSlowly ( double position, int centerX , int centerY, int widthOfCircle) { + QPainter paint; + + QImage myImage; //big image + double angle; + int lengthOfPointer = widthOfCircle / 2 - 12; + + if (position < m_bottomLimit) position=m_bottomLimit; + else { + if (position > m_topLimit) position = m_topLimit; + } + // painting of pointer + angle = ((m_angleOfViewer/(m_topLimit-m_bottomLimit))*(position-m_bottomLimit))*((-1)*m_direction)+m_startAngle; + + m_pointerLayerBig->fill( Qt::white ); //color if beckground + paint.begin( m_pointerLayerBig ); // paints of pointer + paint.setBackgroundMode(Qt::TransparentMode); + + paint.setBrush( m_pointerColor ); // sets color + paint.setPen ( m_pointerColor ); + QPointArray pts; + // k posuvu a k otoceni pouziva funkce paintu + // for rotate and translate uses functions of paint + paint.translate (centerX, centerY); + paint.rotate(-angle); + pts.setPoints( 4, -6, 0, 0, -6, lengthOfPointer, 0, 0, 6 ); + paint.drawConvexPolygon( pts ); + + paint.end (); + //m_pointerMutex.lock(); + + myImage = m_pointerLayerBig->convertToImage(); + + if (m_makeBlurMotion) makeMotionBlur(&myImage,myImage.pixel(1,1)); + makeAntialiasing(&myImage,m_pointerLayerSmall,myImage.pixel(1,1),m_speedOfAAlias,0); + + paint.begin( m_pointerLayerSmall ); // paints on layer's background + paintValueOfPointer ( &paint, m_valueOfPointer); + paint.end (); + // m_pointerMutex.unlock(); + } + + + +void KNutAnalog::paintPointerFastly (double position) { + QPainter paint; + double uhel; + + int delka = m_widthOfScale / 2 - 4; + + //m_pointerMutex.lock(); + m_pointerLayerSmall->fill( Qt::white ); //background color + paint.begin( m_pointerLayerSmall ); // kreslime na plochu rucicky + paint.setBackgroundMode(Qt::TransparentMode); + paintValueOfPointer ( &paint, m_valueOfPointer); + + + if (position < m_bottomLimit) position=m_bottomLimit; + else { + if (position > m_topLimit) position = m_topLimit; + } + /* painting of pointer*/ + uhel = ((m_angleOfViewer/(m_topLimit-m_bottomLimit))*(position-m_bottomLimit))*((-1)*m_direction)+m_startAngle; + + paint.setBrush( m_pointerColor ); // nastavime barvu + paint.setPen ( m_pointerColor ); + QPointArray pts; + // for translate a rotate uses functions of paint // k posuvu a k otoceni pouziva funkce paintu + paint.translate (m_centerX, m_centerY); + paint.rotate(-uhel); + pts.setPoints( 4, -2, 0, 0, -2, delka, 0, 0, 2 ); + paint.drawPolygon( pts ); + + paint.end(); + //m_pointerMutex.unlock(); + } + + + +void KNutAnalog::paintPartOfCircle ( QPainter *paint, int centerX , int centerY, int widthOfCircle ) { + double Astart, Aend; + + // pocitani uhlu + //nula je ve 3 hodiny + // prirustek je kladny proti smeru hod rucicek + + //int extent = m_topLimit-m_bottomLimit; //rozsah +// double extent = m_topLimit-m_bottomLimit; //rozsah +// double jednotka = ((double)m_angleOfViewer/extent); + double jednotka = ((double)m_angleOfViewer/(m_topLimit-m_bottomLimit)); + bool painted = false; + +// int smerMK = (-1)*m_direction; + // paints parts of circle + for (int i=0;i<m_countOfColorParts;i++) { + if ((m_extentOfDye[i].start < m_topLimit) && (m_extentOfDye[i].end > m_bottomLimit)) { + if (m_extentOfDye[i].start < m_bottomLimit) Astart = m_bottomLimit; else Astart = m_extentOfDye[i].start; + if (m_extentOfDye[i].end > m_topLimit) Aend = m_topLimit; else Aend = m_extentOfDye[i].end; + paint->setBrush ( m_arcColors[m_extentOfDye[i].color] ); + paint->setPen (NoPen); + paint->drawPie((centerX-widthOfCircle/2),(centerY-widthOfCircle/2),widthOfCircle,widthOfCircle,(int)((((Astart-m_bottomLimit)*jednotka)*((-1)*m_direction)+m_startAngle)*16),(int)(((-1)*m_direction)*((Aend-Astart)*jednotka)*16)); + painted = true; // bylo provedeno vykresleni + } + } + if ((m_countOfColorParts > 0) && (painted)) { // kreslime jen pokud bylo kreslena kruhova vysec + // musime vybarvit stred kotouce + //fills center of circle + paint->setBrush ( paint->backgroundColor() ); //The angles are 1/16th of a degree + paint->drawPie((centerX-(widthOfCircle/2)+18),(centerY-(widthOfCircle/2)+18),widthOfCircle-36,widthOfCircle-36,(int)(m_startAngle*16+90*m_direction),(int)((-m_direction)*(m_angleOfViewer*16+180))); + } + } + + + +void KNutAnalog::paintScale ( QPainter *paint , int centerX , int centerY, int widthOfCircle) { + + int bottomMax = widthOfCircle/2 - 29; + int bottom = widthOfCircle/2 -17 ; + int smer_stup = (-1)*m_direction; + paint->save(); + paint->setPen ( m_scaleColor); + + paint->translate( centerX, centerY ); + + double stupne = smer_stup * (m_angleOfViewer/(m_countOfParts*(m_countOfSubParts))); + + // nakresleni prvni linky + //paints of the first line + paint->rotate( -m_startAngle); + paint->setBrush ( m_scaleColor ); + paint->drawRect( bottomMax,-1,30,3 ); + + for ( int i=0; i<(m_countOfParts); i++ ) { + for ( int j=0; j<(m_countOfSubParts-1); j++) { + paint->rotate( -stupne ); + paint->drawRect( bottom,-1,18,2 ); + } + paint->rotate( -stupne ); + paint->drawRect( bottomMax,-1,30,3 ); + } + paint->restore(); + } + + + +void KNutAnalog::makeAntialiasing (QImage* bigImage, QPixmap* smallPixmap, const QRgb colorOfBG, speedOfAAlias speed, int typeOfView) { + ulong imageRed, imageGreen, imageBlue; + QRgb imageRgb; + QImage* smallImage; + bool computeAverage; + ulong sumOfRed, sumOfGreen, sumOfBlue; + + if (speed == slow) { + sumOfRed = (qRed ( colorOfBG ))*9; + sumOfGreen = (qGreen ( colorOfBG ))*9; + sumOfBlue = (qBlue ( colorOfBG ))*9; + } + else { + sumOfRed = (qRed ( colorOfBG ))*16; + sumOfGreen = (qGreen ( colorOfBG ))*16; + sumOfBlue = (qBlue ( colorOfBG ))*16; + } + int smallImageWidth=bigImage->width()/3; + int smallImageHeight=bigImage->height()/3; + + + smallImage = new QImage(smallImageWidth,smallImageHeight, bigImage->depth()); + +// imageRgb = bigImage->pixel(1,1); + + for (int x = 0; x < smallImageWidth; x++) { + for (int y = 0; y < smallImageHeight; y++) { + imageRed = 0; + imageGreen = 0; + imageBlue = 0; + + switch (typeOfView) { + case 0: + //nothing + computeAverage=true; + break; + case 1: + if ((y>25) and (x >30) and (x < 92)) computeAverage=false; + else computeAverage=true; + break; + case 2: + if ((y < 15) || ((x+15) > y)) computeAverage=true; + else computeAverage=false; + break; + case 3: + //computes top part only + if ((y < 60) && (y>15)) computeAverage=true; + else computeAverage=false; + break; + default: + computeAverage=true; + } + + if (speed == slow) { +//// uses divide, slowly compute + if (computeAverage) { + for (int xi = 0 ; xi < 3; xi ++) { + for (int yi = 0 ; yi < 3; yi ++) { + imageRgb = bigImage->pixel(x*3+xi,y*3+yi); + imageRed += qRed ( imageRgb ); + imageGreen += qGreen ( imageRgb ); + imageBlue += qBlue ( imageRgb ); + } + } + if (((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue))) { + smallImage->setPixel (x,y,colorOfBG); + } + else { + imageRed = imageRed / 9; + imageGreen = imageGreen/9; + imageBlue = imageBlue/9; + smallImage->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); + } + } + else { + smallImage->setPixel (x,y,bigImage->pixel(x*3,y*3)); + } + } + else { +//// uses bitmove, fastly compute + if (computeAverage) { + for (int xi = 0 ; xi < 3; xi ++) { + for (int yi = 0 ; yi < 3; yi ++) { + if ((xi == 1) && (yi == 1)) { // center of 3x3 area + imageRgb = bigImage->pixel(x*3+xi,y*3+yi); + imageRed += qRed ( imageRgb )*4; + imageGreen += qGreen ( imageRgb )*4; + imageBlue += qBlue ( imageRgb )*4; + } + else { + if ((xi == 1) || (yi == 1)) { + imageRgb = bigImage->pixel(x*3+xi,y*3+yi); + imageRed += qRed ( imageRgb )*2; + imageGreen += qGreen ( imageRgb )*2; + imageBlue += qBlue ( imageRgb )*2; + } + else { + imageRgb = bigImage->pixel(x*3+xi,y*3+yi); + imageRed += qRed ( imageRgb ); + imageGreen += qGreen ( imageRgb ); + imageBlue += qBlue ( imageRgb ); + } + } + } + } + if ((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue)) { + smallImage->setPixel (x,y,colorOfBG); + } + else { + imageRed = imageRed >> 4; + imageGreen = imageGreen >> 4; + imageBlue = imageBlue >> 4; + smallImage->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); + } + } + else { + smallImage->setPixel (x,y,bigImage->pixel(x*3,y*3)); + } + } //end of fastly + } + } + smallPixmap->convertFromImage(*smallImage); + delete smallImage; +} + + +void KNutAnalog::makeMotionBlur (QImage* image, const QRgb colorOfBG, int typeOfView) { + + ulong imageRed, imageGreen, imageBlue; + QRgb imageRgb; + QImage *layerImageBlur; + bool computeAverage; + int startHeight, stopHeight; + ulong sumOfRed, sumOfGreen, sumOfBlue; + + sumOfRed = (qRed ( colorOfBG ))*9; + sumOfGreen = (qGreen ( colorOfBG ))*9; + sumOfBlue = (qBlue ( colorOfBG ))*9; + + int imageWidth=image->width(); + int imageHeight=image->height(); + + layerImageBlur = new QImage(*image); + layerImageBlur->detach(); //costructor makes swallow copy, have to use detach + + + switch (typeOfView) { + case 0: + //nothing + startHeight =1; + stopHeight =imageHeight-2; + break; + case 2: + startHeight =1; + stopHeight =imageHeight-2; + break; + case 3: + startHeight =45; + stopHeight =180; + break; + default: + startHeight =1; + stopHeight =imageHeight-2; + } + + + for (int x = 1; x < imageWidth-2; x++) { + for (int y = startHeight; y < stopHeight; y++) { + imageRed = 0; + imageGreen = 0; + imageBlue = 0; + + switch (typeOfView) { + case 0: + //nothing + computeAverage=true; + break; + case 1: + if ((y>75) and (x >90) and (x < 274)) computeAverage=false; + else computeAverage=true; + break; + case 2: + if ((y < 45) || ((x+45) > y)) computeAverage=true; + else computeAverage=false; + break; + case 3: + //computes top part only + if ((y < 180) && (y>45)) computeAverage=true; + else computeAverage=false; + break; + default: + computeAverage=true; + } + + + if (computeAverage) { + for (int xi = -1 ; xi < 2; xi ++) { + for (int yi = -1 ; yi < 2; yi ++) { + imageRgb = layerImageBlur->pixel(x+xi,y+yi); + imageRed += qRed ( imageRgb ); + imageGreen += qGreen ( imageRgb ); + imageBlue += qBlue ( imageRgb ); + } + } + + if (!((imageRed == sumOfRed) && (imageGreen == sumOfGreen) && (imageBlue == sumOfBlue))) { + imageRed = (int)(imageRed / 9); + imageGreen = (int)(imageGreen/9); + imageBlue = (int)(imageBlue/9); + image->setPixel (x,y,qRgb(imageRed,imageGreen,imageBlue)); + } + } + } + } + delete layerImageBlur; +} + + + + + + +void KNutAnalog::paintScaleNumbers ( QPainter *paint ) { + //paintig of scaleNumbers + + int poz_x, poz_y, r_vyska, r_sirka; + double posun, angle; + + double upi = 0.0174532; + int smer_st = -m_direction; + + paint->save(); // ulozime + QString cislo; + paint->setPen(m_textColor); + paint->setFont(m_scaleFont); + + QFontMetrics fm = paint->fontMetrics(); + r_vyska = ((fm.ascent()) / 2); + posun = ((double)(m_topLimit-m_bottomLimit))/m_countOfParts; + for (int i=0; i<=(m_countOfParts);i++) { + cislo.sprintf( "%3.0f",m_bottomLimit+i*posun); + cislo=cislo.stripWhiteSpace(); + r_sirka = (fm.width(cislo))/2; + angle = (m_startAngle+ ((m_angleOfViewer/m_countOfParts)*i*smer_st))*upi; + poz_x = (int)((cos(angle)*m_radiusOfScaleNumbers+m_centerX) - r_sirka); + poz_y = (int)((m_centerY-sin(angle)*m_radiusOfScaleNumbers) + r_vyska); + paint->drawText (poz_x,poz_y,cislo); + } + paint->restore(); + } + + +void KNutAnalog::paintText ( QPainter *paint ) { + QString nadpis1; + QString nadpis2; + int index; + + if (m_inscription.length() >1) { + if ((index = m_inscription.find(" ")) != -1) { + // mezera nalezena space found + nadpis1 = m_inscription.left(index); + nadpis2 = m_inscription.mid(index+1,(uint)(m_inscription.length() - index - 1)); + } + } else index = -1; + + paint->setPen(m_textColor); + paint->setFont(m_textFont); + QFontMetrics fm = paint->fontMetrics(); + int r_vyska = fm.height()/ 2; + switch (m_typeOfView) { + // kruznice - kreslime dve radky nad sebou cemtrovane + case 1 : + if (index == -1 ) paint->drawText( m_centerX - fm.width(m_inscription)/2, 104 + r_vyska , m_inscription); + else { + // mame dve slova + paint->drawText( m_centerX - fm.width(nadpis1)/2, 106 + r_vyska/2 - 2, nadpis1); + paint->drawText( m_centerX - fm.width(nadpis2)/2, 106 + (r_vyska*3)/2 + 2, nadpis2); + } + paint->drawText( m_centerX - fm.width(AnMJ)/2, 44 + r_vyska , AnMJ); + break; + // ctvrt oblouk kreslime dve radky nad sebou centrovane v pravem hornim rohu + case 2 : + if (index == -1 ) paint->drawText( 121 - fm.width(m_inscription) , 6 + r_vyska , m_inscription); + else { + paint->drawText( 121 - fm.width(nadpis1) , 6 + r_vyska , nadpis1); + paint->drawText( 121 - fm.width(nadpis2) , 10 + r_vyska*2 , nadpis2); + } + paint->drawText( m_centerX , 68 + r_vyska*2 , AnMJ); + break; + // horni oblouk + case 3 : + paint->drawText( m_centerX - fm.width(m_inscription)/2, 6 + r_vyska , m_inscription); + paint->drawText( m_widthOfBackGround -5 -fm.width(AnMJ), m_widthOfBackGround -r_vyska, AnMJ); + + break; + } + } + + + +void KNutAnalog::paintValueOfPointer ( QPainter *p, double value) { + + QString cislo; + cislo.sprintf( "%5.1f",value); + cislo=cislo.stripWhiteSpace(); + + if (value < m_bottomLimit) value=m_bottomLimit; + else { + if (value > m_topLimit) value = m_topLimit; + } + /* nakresleni rucicky*/ +// uhel = ((uhel_zobrazeni/(horni_mez-dolni_mez))*(value-dolni_mez))*((-1)*smer)+m_startAngle; + + p->setPen(m_textColor); + p->setFont(m_textFont); + QFontMetrics fm = p->fontMetrics(); + int r_vyska = fm.height()/ 2; + + + switch (m_typeOfView) { + case 1 : + p->drawText( m_centerX - fm.width(cislo)/2, 75 + r_vyska , cislo); + break; + case 2 : + p->drawText( m_centerX , 57 + r_vyska , cislo); + break; + case 3 : + p->drawText( 5, m_widthOfBackGround -r_vyska, cislo); + break; + } + } + + + +#include "knutanalog.moc" + + + |