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