arbeit
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

NrroImage.cpp

Go to the documentation of this file.
00001 //------------------------------------------------------------------------
00002 //
00003 //   Joe Kniss
00004 //     6-20-03
00005 //                   ________    ____   ___ 
00006 //                  |        \  /    | /  /
00007 //                  +---+     \/     |/  /
00008 //                  +--+|  |\    /|     < 
00009 //                  |  ||  | \  / |  |\  \ 
00010 //                  |      |  \/  |  | \  \ 
00011 //                   \_____|      |__|  \__\
00012 //                       Copyright  2003 
00013 //                      Joe Michael Kniss
00014 //                   <<< jmk@cs.utah.edu >>>
00015 //               "All Your Base are Belong to Us"
00016 //-------------------------------------------------------------------------
00017 
00018 /// NrroImage.cpp
00019 ///  simianUI
00020 
00021 #include "NrroImage.h"
00022 #include <iostream>
00023 #include <qstring.h>
00024 #include <qcolor.h>
00025 
00026 using namespace std;
00027 using namespace gutz;
00028 
00029 //////////////////////////////////////////////////////////////////////////
00030 /// Factory Nrro -> QImage
00031 //////////////////////////////////////////////////////////////////////////
00032 
00033 QImage *genNrroQImage(const NrroSP n, const vec2d minmax)
00034 {
00035    /// no nrro
00036    if(n.isNull())
00037    {
00038       cerr << "genNrroQImage(), null nrro!!" << endl;
00039       return new QImage();
00040    }
00041    /// not an image
00042    if(Nrro::IMAGE != n->getKind())
00043    {
00044       cerr << "genNrroQImage(), kind not image!" << endl;
00045       return new QImage();
00046    }
00047    /// is a time series
00048    if((n->getKind() & Nrro::TIME_SERIES)) 
00049    {
00050       cerr << "genNrroQImage(), cant handle time series images" << endl;
00051       return new QImage();
00052    }
00053 
00054    /// copy cuz were going to mess with it some
00055    NrroSP imgData = new Nrro(*n);
00056 
00057    /// better be multi-channel, easier this way!!!
00058    if(n->dim() != 3)
00059       imgData->forceMultiChannel();
00060 
00061    imgData->quantize(8, minmax.x, minmax.y);   
00062 
00063    Nrro::NrroIter<char> iter = imgData->begin<char>();
00064 
00065    /// have to use this one, the "yourdata" one doesn't delete 
00066    /// the buffer when it's done, no option to force it, crap!!
00067    /// TODO: figure out how to manage data created our buffers,
00068    ///       can't have memory leaks
00069    QImage *ret = new QImage(imgData->dim(1), imgData->dim(2), 32);
00070 
00071    /// so slow, stupid Qt doesn't have nice ways to load an image from
00072    /// data
00073    if(imgData->dim(0) == 3) /// rgb
00074    {
00075       for(int y=0; y<(int)(imgData->dim(2)); ++y)
00076       {
00077          for(int x=0; x<(int)(imgData->dim(1)); ++x)
00078          {
00079             ret->setPixel(x,y,qRgb((int)(iter(0,x,y)),
00080                                    (int)(iter(1,x,y)), 
00081                                    (int)(iter(2,x,y))));
00082          }
00083       }
00084    }
00085    else if(imgData->dim(0) == 4) ///rgba
00086    {
00087       for(int y=0; y<int(imgData->dim(2)); ++y)
00088       {
00089          for(int x=0; x<int(imgData->dim(1)); ++x)
00090          {
00091             ret->setPixel(x,y,qRgba((int)iter(0,x,y),
00092                                     (int)iter(1,x,y), 
00093                                     (int)iter(2,x,y), 
00094                                     (int)iter(3,x,y)));
00095          }
00096       }
00097    }
00098    else if(imgData->dim(0) == 1) /// scalar scale
00099    {
00100       for(int y=0; y<int(imgData->dim(2)); ++y)
00101       {
00102          for(int x=0; x<int(imgData->dim(1)); ++x)
00103          {
00104             ret->setPixel(x,y,qRgb((int)iter(0,x,y),
00105                                    (int)iter(0,x,y), 
00106                                    (int)iter(0,x,y)));
00107          }
00108       }
00109    }
00110 
00111    return ret;
00112 }
00113 
00114 
00115 //////////////////////////////////////////////////////////////////////////
00116 //////////////////////////////////////////////////////////////////////////
00117 /// NrroCanvasImg
00118 //////////////////////////////////////////////////////////////////////////
00119 //////////////////////////////////////////////////////////////////////////
00120 
00121 
00122 //////////////////////////////////////////////////////////////////////////
00123 /// construct
00124 //////////////////////////////////////////////////////////////////////////
00125 
00126 NrroCanvasImg::NrroCanvasImg(QCanvas *canvas)
00127 : CanvasImage(canvas), _n(0)
00128 {
00129 
00130 }
00131 
00132 void NrroCanvasImg::setNrro(const NrroSP n, const vec2d minmax)
00133 {
00134    _n = n;
00135    if(!_n.isNull())
00136    {
00137       setImage(genNrroQImage(_n,minmax));
00138    }
00139    else
00140    {
00141       setImage(0);
00142    }
00143 
00144 }
00145 
00146 

Send questions, comments, and bug reports to:
jmk