19 #ifndef TRANSFORMIMAGE_H
20 #define TRANSFORMIMAGE_H
23 #include "ImageBuffer.hpp"
24 #include "UpdateInfo.hpp"
27 #include <boost/thread.hpp>
29 namespace FotoSHOCKcore{
31 template <ValueType::Enum InPixelType, ValueType::Enum OutPixelType,
typename Functor>
32 void transformImage_impl(ImageBuffer<InPixelType>& src, ImageBuffer<OutPixelType>& dest, Functor func,
33 const unsigned int srcNumOfTilesHoriz,
const unsigned int destNumOfTilesHoriz,
34 const unsigned int srcNumOfTilesVert,
const unsigned int destNumOfTilesVert,
35 const unsigned int srcTileExtent, ROIinfo &ROI,
const long stamp);
53 template <ValueType::Enum InPixelType, ValueType::Enum OutPixelType,
typename Functor>
55 for (
typename std::vector<UpdateInfo>::iterator ROI = ROIlist.begin(); ROI != ROIlist.end(); ++ROI) {
56 const int level = ROI->ROI->mipmapLevel;
58 const unsigned int srcNumOfTilesHoriz = (*src)[level]->getNumOfTilesHoriz();
59 const unsigned int srcNumOfTilesVert = (*src)[level]->getNumOfTilesVert();
61 const unsigned int destNumOfTilesHoriz = (*dest)[level]->getNumOfTilesHoriz();
62 const unsigned int destNumOfTilesVert = (*dest)[level]->getNumOfTilesVert();
63 const unsigned int destTileExtent = (*dest)[level]->getTileExtent();
66 func, srcNumOfTilesHoriz, destNumOfTilesHoriz, srcNumOfTilesVert,
67 destNumOfTilesVert, destTileExtent, *(ROI->ROI), stamp);
71 template <ValueType::Enum PixelType,
typename Functor>
72 void transformImage(MipMap* src, MipMap* dest, Functor func, std::vector<UpdateInfo>& ROIlist,
const long stamp) {
73 transformImage<PixelType, PixelType>(src, dest, func, ROIlist, stamp);
81 template <ValueType::Enum InPixelType, ValueType::Enum OutPixelType,
typename Functor>
82 void transformImage(ImageBuffer<InPixelType>& src, ImageBuffer<OutPixelType>& dest, Functor func, std::vector<ROIinfo>& ROIlist,
const long stamp) {
83 if ((src.getWidth() != dest.getWidth()) || (src.getHeight() != dest.getHeight())) {
88 const unsigned int srcNumOfTilesHoriz = src.getNumOfTilesHoriz();
89 const unsigned int srcNumOfTilesVert = src.getNumOfTilesVert();
91 const unsigned int destNumOfTilesHoriz = dest.getNumOfTilesHoriz();
92 const unsigned int destNumOfTilesVert = dest.getNumOfTilesVert();
93 const unsigned int destTileExtent = dest.getTileExtent();
95 for (
typename std::vector<ROIinfo>::iterator ROI = ROIlist.begin(); ROI != ROIlist.end(); ++ROI) {
96 transformImage_impl(src, dest, func, srcNumOfTilesHoriz, destNumOfTilesHoriz, srcNumOfTilesVert,
97 destNumOfTilesVert, destTileExtent, *ROI, stamp);
101 template <ValueType::Enum InPixelType, ValueType::Enum OutPixelType,
typename Functor>
102 void transformImage_impl(ImageBuffer<InPixelType>& src, ImageBuffer<OutPixelType>& dest, Functor func,
103 const unsigned int srcNumOfTilesHoriz,
const unsigned int destNumOfTilesHoriz,
104 const unsigned int srcNumOfTilesVert,
const unsigned int destNumOfTilesVert,
105 const unsigned int destTileExtent, ROIinfo &ROI,
const long stamp)
107 const unsigned int startTileVert = ROI.y / destTileExtent;
108 unsigned int endTileVert = std::ceil((ROI.y + ROI.sizeY) / (
double)destTileExtent);
109 const unsigned int startTileHoriz = ROI.x / destTileExtent;
110 unsigned int endTileHoriz = std::ceil((ROI.x + ROI.sizeX) / (
double)destTileExtent);
112 if ((srcNumOfTilesHoriz == destNumOfTilesHoriz) && (srcNumOfTilesVert == destNumOfTilesVert) &&
113 (destTileExtent == src.getTileExtent()))
115 const unsigned int destTilePixels = destTileExtent * destTileExtent;
117 for (
unsigned int tileVert = startTileVert; tileVert < endTileVert; tileVert++) {
118 for (
unsigned int tileHoriz = startTileHoriz; tileHoriz < endTileHoriz; tileHoriz++) {
119 Tile<OutPixelType>* destTile = dest.getTile(tileHoriz, tileVert);
120 if (destTile->getStamp() != stamp) {
121 boost::this_thread::interruption_point();
122 typename Tile<InPixelType>::Iterator srcIt = src.getTile(tileHoriz, tileVert)->upperLeft();
123 typename Tile<OutPixelType>::Iterator destIt = destTile->upperLeft();
125 unsigned int pixel = destTilePixels;
128 func(*srcIt, *destIt);
132 }
while (pixel != 0);
133 destTile->setStamp(stamp);
139 unsigned int yoffset = 0;
140 for (
unsigned int tileVert = startTileVert; tileVert < endTileVert; tileVert++, yoffset += destTileExtent) {
141 unsigned int xoffset = 0;
142 for (
unsigned int tileHoriz = startTileHoriz; tileHoriz < endTileHoriz; tileHoriz++, xoffset += destTileExtent) {
143 Tile<OutPixelType>* destTile = dest.getTile(tileHoriz, tileVert);
144 if (destTile->getStamp() != stamp) {
145 typename ImageBuffer<InPixelType>::Iterator srcIt = src.upperLeft();
146 typename Tile<OutPixelType>::Iterator destIt = destTile->upperLeft();
148 for (
unsigned int y = 0; y < destTileExtent; ++y) {
149 srcIt.moveTo(xoffset, yoffset + y);
150 for (
unsigned int x = 0; x < destTileExtent; ++x) {
151 func(*srcIt, *destIt);
158 destTile->setStamp(stamp);