Skip to content

Commit

Permalink
testing image::ChannelOffsetFilter (right now it has a segfault relat…
Browse files Browse the repository at this point in the history
…ed to writer subport stuff...)
  • Loading branch information
nical committed Feb 21, 2011
1 parent 8df3aeb commit 8f3ca9e
Show file tree
Hide file tree
Showing 13 changed files with 242 additions and 33 deletions.
3 changes: 2 additions & 1 deletion TEST.sh
Expand Up @@ -9,15 +9,16 @@ cd ./build/test
./generic/PointTest &&
./generic/ValueContainerTest &&
./generic/PointVectorContainerTest &&
./image/CairoImageContainerTest &&
./text/PlainTextContainerTest &&
./utils/ConnectorTest &&
./utils/UnorderedArrayTest &&
./utils/typesTest &&
./utils/randomTest &&
./image/CairoImageContainerTest &&
./image/ImageContainerTest &&
./image/MixedImageTest &&
./image/CopyImageTest &&
./image/ChannelOffsetFilterTest &&
./core/FilterTest &&

echo '\n\n--end of the test suite--\n\n'
6 changes: 2 additions & 4 deletions src/kiwi/core/ReaderInputPort.cpp
Expand Up @@ -53,15 +53,13 @@ bool ReaderInputPort::connect(ReaderOutputPort& outputPort)
{
ScopedBlockMacro( __scop, "ReaderInputPort::connect" )
if( isEnabled() && outputPort.isEnabled() ){
Debug::print() << "youhou\n";
if( isCompatible( outputPort.tags() ) ){ // TODO segfault here
Debug::print() << "zoouuup\n";
if( isCompatible( outputPort.tags() ) ){
return PortConnector::connect( &outputPort );
}else{
Debug::error()
<< "ReaderInputPort::connect error: uncompatible port tags!" <<endl()
<< " input: " << tags().str() <<endl()
<< " soutput: " << outputPort.tags().str() << endl();
<< " output: " << outputPort.tags().str() << endl();
return false;
}
}else{
Expand Down
6 changes: 4 additions & 2 deletions src/kiwi/core/ReaderOutputPort.hpp
Expand Up @@ -88,12 +88,14 @@ friend class WriterInputPort;
bool isComposite() const ;

ReaderOutputPort& subPort(kiwi::uint32_t i){
if(i >= _subPorts.size() )
if(i >= _subPorts.size() ){
Debug::error() << "ReaderOutputPort::subPort: subPort not found!\n";
return *this;
}
return *_subPorts[i];
}

kiwi::uint32_t nbSubPort() const { return _subPorts.size(); }
kiwi::uint32_t nbSubPorts() const { return _subPorts.size(); }

template<class T>
T* getContainer() { return dynamic_cast<T*>(_container); }
Expand Down
4 changes: 2 additions & 2 deletions src/kiwi/core/Tags.cpp
Expand Up @@ -29,13 +29,13 @@ void Tags::init(char const* str)

Tags::Tags(char const* str)
{
ScopedBlockMacro(scop,"Tags::constructor(char*)")
//ScopedBlockMacro(scop,"Tags::constructor(char*)")
init( str );
}

Tags::Tags(const kiwi::string& str)
{
ScopedBlockMacro(scop,"Tags::constructor(string)")
//ScopedBlockMacro(scop,"Tags::constructor(string)")
init( str.c_str() );
}

Expand Down
1 change: 0 additions & 1 deletion src/kiwi/core/WriterInputPort.cpp
Expand Up @@ -59,7 +59,6 @@ bool WriterInputPort::connect(WriterOutputPort& outputPort)
if( _associatedReaderOutputPort
&& outputPort.associatedReaderOutputPort() )
{
Debug::print() << "--- plop --- \n";
_associatedReaderOutputPort->bind(
*outputPort.associatedReaderOutputPort() );
}
Expand Down
16 changes: 12 additions & 4 deletions src/kiwi/core/WriterOutputPort.cpp
Expand Up @@ -43,13 +43,13 @@ namespace core{

WriterOutputPort::WriterOutputPort( Node* myNode, Container* data )
: _node(myNode)
, _container(data)
, _associatedReaderOutputPort(0)
{
ScopedBlockMacro(scop, "WriterOutputPort::constructor")
if(!data){
Debug::print() << "WriterOutputPort::constructor: warning: data = 0\n";
}
setData(data);
}


Expand All @@ -69,11 +69,14 @@ void WriterOutputPort::unBind()

void WriterOutputPort::setData( Container* data )
{
ScopedBlockMacro(scop,"WriterOutputPort::setData")
if(!data) Debug::print() << "warning: param data = 0\n";
for(kiwi::uint32_t i = 0; i < _linkedOutputPorts.size(); ++i )
_linkedOutputPorts[i]->setData( data );

_container = data;
if( data->isComposite() ){
Debug::print() << "the data is composite ("<<data->nbSubContainers()<<")\n";
for(kiwi::uint32_t i = 0; i < data->nbSubContainers(); ++i){
_subPorts.add(new WriterOutputPort(_node, data->subContainer(i)));
}
Expand Down Expand Up @@ -104,7 +107,12 @@ Node* WriterOutputPort::node() const

Tags WriterOutputPort::tags() const
{
return _node->writerOutputTags( index() );
if(_container){
return _container->tags();
}else{
Debug::error() << "WriterOutputPort::tags: warning: no container available\n";
return Tags("#undefined");
}
}


Expand All @@ -116,7 +124,7 @@ bool WriterOutputPort::isCompatible(WriterInputPort& input)

bool WriterOutputPort::connect(WriterInputPort& inputPort)
{
ScopedBlockMacro( __scop, "WriterOutputPort::connect" )
ScopedBlockMacro(scop, "WriterOutputPort::connect" )
if( isEnabled() && inputPort.isEnabled() ){
if( isCompatible( inputPort ) )
return PortConnector::connect( &inputPort);
Expand All @@ -126,7 +134,7 @@ bool WriterOutputPort::connect(WriterInputPort& inputPort)

bool WriterOutputPort::connect(WriterInputPort* inputPort)
{
ScopedBlockMacro( __scop, "WriterOutputPort::connect" )
ScopedBlockMacro(scop, "WriterOutputPort::connect" )
if( (inputPort != 0) && (isEnabled() && inputPort->isEnabled()) ){
if( isCompatible( *inputPort ) )
return PortConnector::connect( inputPort );
Expand Down
2 changes: 2 additions & 0 deletions src/kiwi/core/WriterOutputPort.hpp
Expand Up @@ -91,6 +91,8 @@ friend class WriterInputPort;
return *_subPorts[i];
}

kiwi::uint32_t nbSubPorts() const { return _subPorts.size(); }

template<class T>
T* getContainer() { return dynamic_cast<T*>(_container); }

Expand Down
5 changes: 4 additions & 1 deletion src/kiwi/generic/Point.ih
Expand Up @@ -117,10 +117,12 @@ Point<T,D> Point<T,D>::cube(CoordType val){
template <typename T, unsigned int D>
Point<T,D> Point<T,D>::operator + (const Point<T,D>& point)
{
/*
ScopedBlockMacro(__scop, kiwi::string("Point<")
+types::str<T>()+","
+boost::lexical_cast<kiwi::string>(D)
+">::operator + (Point)")
*/
Point<T,D> res;
for(unsigned int i = 0; i < D; ++i)
{
Expand Down Expand Up @@ -164,11 +166,12 @@ void Point<T,D>::operator -= (const Point<T,D>& point)
template <typename T, unsigned int D>
bool Point<T,D>::operator == (const Point<T,D>& point)
{

/*
ScopedBlockMacro(__scop, kiwi::string("Point<")
+types::str<T>()+","
+boost::lexical_cast<kiwi::string>(D)
+">::operator == (Point)")
*/
for(unsigned int i = 0; i < D; ++ i)
{
if(_coordinates[i] != point._coordinates[i]) return false;
Expand Down
84 changes: 84 additions & 0 deletions src/kiwi/image/ChannelOffsetFilter.hpp
@@ -0,0 +1,84 @@

#pragma once
#ifndef KIWI_IMAGE_CHANNELOFFSETFILTER_HPP
#define KIWI_IMAGE_CHANNELOFFSETFILTER_HPP

#include "kiwi/core/Filter.hpp"
#include "kiwi/generic/PointAccessContainerInterface.hpp"
#include "kiwi/generic/PointVectorContainer.hpp"
#include "kiwi/generic/ArrayContainer.hpp"

namespace kiwi{
namespace image{



class ChannelOffsetFilter : public kiwi::core::Filter
{
public:

ChannelOffsetFilter(){
addReaderInputPort(); // Channel
addReaderInputPort(); // displacement vector

// Result (channel)
kiwi::portIndex_t w_in = addWriterInputPort();
kiwi::portIndex_t r_out = addReaderOutputPort();
associateWriterToReader( writerInputPort(w_in) , readerOutputPort(r_out) );
}

void process(){
ScopedBlockMacro(scop,"ChannelOffsetFilter::process")
typedef kiwi::generic::PointAccessContainerInterface<kiwi::uint8_t,2> ColorBuffer;
typedef kiwi::generic::PointVectorContainer<kiwi::uint32_t, 2> PointVectorContainer;
typedef kiwi::generic::Point<kiwi::uint32_t, 2> CoordinateVector;

ColorBuffer* chan
= readerInputPort(0).connectedOutput()
->getContainer<ColorBuffer>();

PointVectorContainer* vect
= readerInputPort(1).connectedOutput()
->getContainer<PointVectorContainer>();

ColorBuffer* result
= writerInputPort(0).connectedOutput()
->getContainer<ColorBuffer>();

if(!chan) Debug::print() << "input channel not found\n";
if(!vect) Debug::print() << "input offset vector not found\n";
if(!result) Debug::print() << "output channel not found\n";

Debug::print() << vect->toStr() <<"\n";
if(!result){
Debug::print() << "Allocate result container\n";
CoordinateVector size;
if(chan) {
result = new kiwi::generic::ArrayContainer<kiwi::uint8_t,2>(chan->spanSize());
setPortContainer(readerOutputPort(0), result );
}else { return; }
}

CoordinateVector pos;
for(pos(0) = 0; pos(0) < result->spanSize()[0]; ++pos(0))
for(pos(1) = 0; pos(1) < result->spanSize()[1]; ++pos(1)){
kiwi::uint32_t val = chan->getValue(pos);
CoordinateVector newpos = (pos+*vect) % result->spanSize();
result->setValue(newpos, val);
}
}

kiwi::Tags readerInputTags(kiwi::portIndex_t index) const{
return kiwi::Tags("#any");// TODO
}

protected:

};


}//namespace
}//namespace

#endif

22 changes: 4 additions & 18 deletions src/kiwi/image/CopyImageFilter.hpp
Expand Up @@ -32,12 +32,10 @@ class CopyImageFilter : public kiwi::core::Filter

void process(){
ScopedBlockMacro(scop,"CopyImageFilter::process")
//typedef kiwi::generic::PointAccessContainerInterface<kiwi::uint8_t,2> ColorBuffer;
typedef kiwi::generic::ArrayContainer<kiwi::uint8_t,2> ColorBuffer;
typedef kiwi::generic::PointAccessContainerInterface<kiwi::uint8_t,2> ColorBuffer;
//typedef kiwi::generic::ArrayContainer<kiwi::uint8_t,2> ColorBuffer;
typedef kiwi::generic::Point<kiwi::uint32_t, 2> CoordinateVector;

Debug::print() << "\n\n";
Debug::beginBlock();
ColorBuffer* r
= readerInputPort(R).connectedOutput()
->getContainer<ColorBuffer>();
Expand All @@ -50,13 +48,7 @@ class CopyImageFilter : public kiwi::core::Filter
ColorBuffer* a
= readerInputPort(A).connectedOutput()
->getContainer<ColorBuffer>();
Debug::endBlock();
Debug::print() << "\n\n";

Debug::error() << "\n r.stride = " << r->stride().toStr() << endl();
Debug::error() << "\n g.stride = " << g->stride().toStr() << endl();
Debug::error() << "\n b.stride = " << b->stride().toStr() << endl();


kiwi::image::cairo::RGBAImageContainer* result
= writerInputPort(0).connectedOutput()
->getContainer<kiwi::image::cairo::RGBAImageContainer>();
Expand All @@ -66,8 +58,6 @@ class CopyImageFilter : public kiwi::core::Filter
if(!g) Debug::print() << "green channel not found\n";
if(!b) Debug::print() << "blue channel not found\n";

Debug::print() << "looouuutre\n";

if(!result){
Debug::print() << "Allocate result container\n";
CoordinateVector size;
Expand Down Expand Up @@ -96,16 +86,12 @@ class CopyImageFilter : public kiwi::core::Filter
result->setValue(CoordinateVector(x,y), f);
}
cairo_surface_mark_dirty(result->getSurface() );

}

kiwi::Tags readerInputTags(kiwi::portIndex_t index) const{
Debug::print() << "CopyImageFilter::Tags" << endl();
return kiwi::Tags("#any");// TODO
return kiwi::Tags("#any");
}

protected:

};


Expand Down
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Expand Up @@ -40,6 +40,7 @@ SET(KIWI_TESTS_SRC ${KIWI_TESTS_SRC}
image/ImageContainerTest
image/MixedImageTest
image/CopyImageTest
image/ChannelOffsetFilterTest
core/FilterTest
# core/MetaFilterTest
generic/PointTest
Expand Down
57 changes: 57 additions & 0 deletions test/image/ChannelOffsetFilterTest.cpp
@@ -0,0 +1,57 @@

#include "kiwi/image/ChannelOffsetFilter.hpp"
#include "kiwi/image/cairo/ImageContainer.hpp"
#include "kiwi/core/Commons.hpp"
#include "kiwi/core/Filter.hpp"
#include <assert.h>



using namespace kiwi;
using namespace kiwi::image;

void ChannelOffsetTest()
{
typedef cairo::RGBAImageContainer::CoordinateVector CoordinateVector;

cairo::RGBAImageContainer inputData("inputImageTransp.png");
kiwi::core::Node inputDataNode(&inputData);

kiwi::generic::PointVectorContainer<kiwi::uint32_t, 2> displacement1(CoordinateVector(100,15));
kiwi::core::Node displacement1Node(&displacement1);

cairo::RGBAImageContainer result("inputImageTransp.png" );

kiwi::core::Node resultNode(&result);

kiwi::image::ChannelOffsetFilter f1;

Debug::print() << "plop\n" << endl();

assert( inputDataNode.writerOutputPort(0).isComposite() );
assert( inputDataNode.writerOutputPort(0).nbSubPorts() == 4 );

inputDataNode.readerOutputPort(0).subPort(0) >> f1.readerInputPort(0);
displacement1Node.readerOutputPort(0) >> f1.readerInputPort(1);
resultNode.writerOutputPort(0).subPort(0) >> f1.writerInputPort(0);

//typedef kiwi::core::Container TestType;
typedef kiwi::generic::ArrayContainerInterface<kiwi::uint8_t,2> TestType;
TestType* ptr = resultNode.writerOutputPort(0).subPort(0).getContainer<TestType>() ;
assert( ptr );

assert( f1.readerInputPort(0).isConnected() );
assert( f1.readerInputPort(1).isConnected() );
assert( f1.writerInputPort(0).isConnected() );

f1.process();

result.saveToPng("OffsetFilterOutputImage.png");
}


int main()
{
ScopedBlockMacro(scop, "ChannelOffsetFilter::Test")
ChannelOffsetTest();
}

0 comments on commit 8f3ca9e

Please sign in to comment.