1 //*******************************************************************
2 // Copyright (C) 2000 ImageLinks Inc.
3 //
4 // License:  LGPL
5 //
6 // See LICENSE.txt file in the top level directory for more details.
7 //
8 // Author: Garrett Potts
9 //
10 //*************************************************************************
11 // $Id: ossimRgbToHsvSource.cpp 17195 2010-04-23 17:32:18Z dburken $
12 #include <ossim/imaging/ossimRgbToHsvSource.h>
13 #include <ossim/imaging/ossimImageData.h>
14 #include <ossim/base/ossimConstants.h>
15 #include <ossim/base/ossimCommon.h>
16 #include <ossim/base/ossimHsvVector.h>
17 #include <ossim/base/ossimRgbVector.h>
18 #include <ossim/imaging/ossimImageDataFactory.h>
19 
20 RTTI_DEF1(ossimRgbToHsvSource, "ossimRgbToHsvSource", ossimImageSourceFilter)
21 
ossimRgbToHsvSource()22 ossimRgbToHsvSource::ossimRgbToHsvSource()
23    :ossimImageSourceFilter(),
24     theBlankTile(NULL),
25     theTile(NULL)
26 {
27 }
28 
29 
ossimRgbToHsvSource(ossimImageSource * inputSource)30 ossimRgbToHsvSource::ossimRgbToHsvSource(ossimImageSource* inputSource)
31    : ossimImageSourceFilter(inputSource),
32     theBlankTile(NULL),
33     theTile(NULL)
34 {
35 }
36 
~ossimRgbToHsvSource()37 ossimRgbToHsvSource::~ossimRgbToHsvSource()
38 {
39 }
40 
getTile(const ossimIrect & tileRect,ossim_uint32 resLevel)41 ossimRefPtr<ossimImageData> ossimRgbToHsvSource::getTile(
42    const  ossimIrect& tileRect,
43    ossim_uint32 resLevel)
44 {
45    if(!theInputConnection)
46    {
47       return ossimRefPtr<ossimImageData>();  // This filter requires an input.
48    }
49 
50    ossimRefPtr<ossimImageData> inputTile =
51       theInputConnection->getTile(tileRect, resLevel);
52    if(!isSourceEnabled() || !inputTile.valid())
53    {
54       return inputTile;
55    }
56 
57    if(!theTile.valid())
58    {
59       allocate(); // First time through...
60    }
61 
62    if (!theTile.valid()) // throw exeption...
63    {
64       return inputTile;
65    }
66 
67    if( inputTile->getDataObjectStatus() == OSSIM_NULL ||
68        inputTile->getDataObjectStatus() == OSSIM_EMPTY )
69    {
70       theBlankTile->setImageRectangle(tileRect);
71       return theBlankTile;
72    }
73 
74    if((inputTile->getNumberOfBands()==3)&&
75       (inputTile->getScalarType()==OSSIM_UCHAR)&&
76       (inputTile->getDataObjectStatus()!=OSSIM_NULL))
77    {
78       // Set the origin, resize if needed of the output tile.
79       theTile->setImageRectangle(tileRect);
80 
81       float* outputBands[3];
82       ossim_uint8* inputBands[3];
83       outputBands[0] = static_cast<float*>(theTile->getBuf(0));
84       outputBands[1] = static_cast<float*>(theTile->getBuf(1));
85       outputBands[2] = static_cast<float*>(theTile->getBuf(2));
86       inputBands[0] = static_cast<ossim_uint8*>(inputTile->getBuf(0));
87       inputBands[1] = static_cast<ossim_uint8*>(inputTile->getBuf(1));
88       inputBands[2] = static_cast<ossim_uint8*>(inputTile->getBuf(2));
89 
90       long height = inputTile->getHeight();
91       long width  = inputTile->getWidth();
92       long offset = 0;
93       for(long row = 0; row < height; ++row)
94       {
95          for(long col = 0; col < width; ++col)
96          {
97             ossimRgbVector rgb(inputBands[0][offset],
98                                inputBands[1][offset],
99                                inputBands[2][offset]);
100 
101             ossimHsvVector hsv(rgb);
102 
103             outputBands[0][offset] = hsv.getH();
104             outputBands[1][offset] = hsv.getS();
105             outputBands[2][offset] = hsv.getV();
106 
107             ++offset;
108          }
109       }
110    }
111    else // Input tile not of correct type to process...
112    {
113       return inputTile;
114    }
115    theTile->validate();
116    return theTile;
117 }
118 
initialize()119 void ossimRgbToHsvSource::initialize()
120 {
121    // Base class will recapture "theInputConnection".
122    ossimImageSourceFilter::initialize();
123 }
124 
allocate()125 void ossimRgbToHsvSource::allocate()
126 {
127    theBlankTile = ossimImageDataFactory::instance()->create(this, this);
128    theTile      = (ossimImageData*)theBlankTile->dup();
129    theTile->initialize();
130 }
131 
getOutputScalarType() const132 ossimScalarType ossimRgbToHsvSource::getOutputScalarType() const
133 {
134    return OSSIM_NORMALIZED_FLOAT;
135 }
136 
getNumberOfOutputBands() const137 ossim_uint32 ossimRgbToHsvSource::getNumberOfOutputBands()const
138 {
139    return 3;
140 }
141 
getNullPixelValue() const142 double ossimRgbToHsvSource::getNullPixelValue()const
143 {
144    return ossim::nan();
145 }
146 
getMinPixelValue(ossim_uint32) const147 double ossimRgbToHsvSource::getMinPixelValue(ossim_uint32 /* band */)const
148 {
149    return 0.0;
150 }
151 
getMaxPixelValue(ossim_uint32) const152 double ossimRgbToHsvSource::getMaxPixelValue(ossim_uint32 /* band */)const
153 {
154    return 1.0;
155 }
156