22 #include "ImageBufferBase.hpp"
27 namespace FotoSHOCKcore{
38 template <ValueType::Enum PixelFormat>
53 ImageBuffer(
unsigned int width,
unsigned int height,
PixelData pixelData,
unsigned int tileExtent,
bool allocateTiles =
true);
136 template <ValueType::Enum PixelFormat>
139 assert((tileExtent & (tileExtent - 1)) == 0);
143 m_tileExtent = tileExtent;
144 m_numOfTilesHorizontal = std::ceil((
double) width/(
double) tileExtent);
145 m_numOfTilesVertical = std::ceil((
double) height/(
double) tileExtent);
146 m_pixelData = pixelData;
149 for (
unsigned int i = 0; i < m_numOfTilesVertical; i++) {
151 for (
unsigned int j = 0; j < m_numOfTilesHorizontal; j++) {
153 m_tileGrid[i][j] =
new Tile<PixelFormat>(m_tileExtent, m_pixelData.numOfBands());
155 m_tileGrid[i][j] = 0;
162 m_tileGrid[m_numOfTilesVertical][0] =
new Tile<PixelFormat>(1, m_pixelData.numOfBands());
165 template <ValueType::Enum PixelFormat>
167 m_width = other.m_width;
168 m_height = other.m_height;
169 m_tileExtent = other.m_tileExtent;
170 m_numOfTilesHorizontal = other.m_numOfTilesHorizontal;
171 m_numOfTilesVertical = other.m_numOfTilesVertical;
172 m_pixelData = other.m_pixelData;
175 for (
unsigned int i = 0; i < m_numOfTilesVertical; i++) {
177 for (
unsigned int j = 0; j < m_numOfTilesHorizontal; j++) {
178 if (other.m_tileGrid[i][j]) {
181 m_tileGrid[i][j] = 0;
191 template <ValueType::Enum PixelFormat>
193 for (
unsigned int i = 0; i < m_numOfTilesVertical; i++) {
195 for (
unsigned int j = 0; j < m_numOfTilesHorizontal; j++) {
196 if (m_tileGrid[i][j]) {
197 delete m_tileGrid[i][j];
201 delete[] m_tileGrid[i];
204 delete m_tileGrid[m_numOfTilesVertical][0];
205 delete[] m_tileGrid[m_numOfTilesVertical];
210 template <ValueType::Enum PixelFormat>
212 if (
this != &other) {
213 if (m_width == other.m_width && m_height == other.m_height &&
214 m_tileExtent == other.m_tileExtent && m_pixelData.numOfBands() == other.m_pixelData.
numOfBands())
218 for (
unsigned int i = 0; i < m_numOfTilesVertical; i++) {
219 for (
unsigned int j = 0; j < m_numOfTilesHorizontal; j++) {
220 if (other.m_tileGrid[i][j]) {
221 *m_tileGrid[i][j] = *(other.m_tileGrid[i][j]);
223 m_tileGrid[i][j] = 0;
229 m_pixelData = other.m_pixelData;
234 std::swap(m_width, tmp.m_width);
235 std::swap(m_height, tmp.m_height);
236 std::swap(m_tileExtent, tmp.m_tileExtent);
237 std::swap(m_numOfTilesHorizontal, tmp.m_numOfTilesHorizontal);
238 std::swap(m_numOfTilesVertical, tmp.m_numOfTilesVertical);
239 std::swap(m_pixelData, tmp.m_pixelData);
240 std::swap(m_tileGrid, tmp.m_tileGrid);
247 template <ValueType::Enum PixelFormat>
249 for (
unsigned int i = 0; i < m_numOfTilesVertical; i++) {
250 for (
unsigned int j = 0; j < m_numOfTilesHorizontal; j++) {
251 if (m_tileGrid[i][j]) {
252 m_tileGrid[i][j]->setStamp(stamp);
258 template <ValueType::Enum PixelFormat>
260 if (m_tileGrid[vertical][horizontal] == 0) {
261 m_tileGrid[vertical][horizontal] =
new Tile<PixelFormat>(m_tileExtent, m_pixelData.numOfBands());
263 return m_tileGrid[vertical][horizontal];
266 template <ValueType::Enum PixelFormat>
269 unsigned int horiz = x / m_tileExtent;
270 unsigned int vert = y / m_tileExtent;
272 if (m_tileGrid[vert][horiz] == 0) {
273 m_tileGrid[vert][horiz] =
new Tile<PixelFormat>(m_tileExtent, m_pixelData.numOfBands());
275 return m_tileGrid[vert][horiz];
284 template <ValueType::Enum PixelFormat>
365 format*
operator()(
unsigned int x,
unsigned int y);
375 const format*
operator()(
unsigned int x,
unsigned int y)
const;
388 const format
operator[](
unsigned int n)
const;
395 format
getValue(
unsigned int band)
const;
401 void setValue(
unsigned int band, format value);
409 const unsigned int getX()
const;
416 const unsigned int getY()
const;
423 unsigned int m_currentTileHorizPos;
424 unsigned int m_currentTileVertPos;
425 unsigned int m_currentXoffset;
426 unsigned int m_currentYoffset;
427 unsigned int m_currentXpos;
428 unsigned int m_currentYpos;
430 unsigned int m_width;
431 unsigned int m_tileExtent;
432 unsigned int m_power;
435 unsigned int m_horiz;
439 template <ValueType::Enum PixelFormat>
446 for (
unsigned int i = 0; i < m_vert; i++) {
448 for (
unsigned int j = 0; j < m_horiz; j++) {
449 m_tileIteratorGrid[i][j] = buffer->
getTile(j, i)->upperLeft();
454 m_tileIteratorGrid[m_vert][0] = buffer->
getTile(0, m_vert)->upperLeft();
458 m_tileExtent = buffer->m_tileExtent;
461 for (
unsigned int tmp = m_tileExtent; tmp > 1; tmp >>= 1) {
466 m_currentIterator = &m_tileIteratorGrid[0][0];
467 m_currentTileHorizPos = 0;
468 m_currentTileVertPos = 0;
469 m_currentXoffset = 0;
470 m_currentYoffset = 0;
475 template <ValueType::Enum PixelFormat>
478 m_horiz = other.m_horiz;
479 m_vert = other.m_vert;
482 for (
unsigned int i = 0; i < m_vert; i++) {
484 for (
unsigned int j = 0; j < m_horiz; j++) {
485 m_tileIteratorGrid[i][j] =
TileIterator(other.m_tileIteratorGrid[i][j]);
490 m_tileIteratorGrid[m_vert][0] =
TileIterator(other.m_tileIteratorGrid[m_vert][0]);
493 m_width = other.m_width;
494 m_tileExtent = other.m_tileExtent;
495 m_power = other.m_power;
497 m_currentTileHorizPos = other.m_currentTileHorizPos;
498 m_currentTileVertPos = other.m_currentTileVertPos;
499 m_currentXoffset = other.m_currentXoffset;
500 m_currentYoffset = other.m_currentYoffset;
501 m_currentXpos = other.m_currentXpos;
502 m_currentYpos = other.m_currentYpos;
504 m_currentIterator = &m_tileIteratorGrid[m_currentTileVertPos][m_currentTileHorizPos];
505 m_currentIterator->moveTo(m_currentXoffset, m_currentYoffset);
508 template <ValueType::Enum PixelFormat>
510 for (
unsigned int i = 0; i < m_vert; i++) {
511 delete[] m_tileIteratorGrid[i];
514 delete[] m_tileIteratorGrid[m_vert];
516 delete[] m_tileIteratorGrid;
519 template <ValueType::Enum PixelFormat>
521 if (
this != &other) {
524 std::swap(m_horiz, tmp.m_horiz);
525 std::swap(m_vert, tmp.m_vert);
526 std::swap(m_tileIteratorGrid, tmp.m_tileIteratorGrid);
527 std::swap(m_width, tmp.m_width);
528 std::swap(m_tileExtent, tmp.m_tileExtent);
529 std::swap(m_power, tmp.m_power);
530 std::swap(m_currentIterator, tmp.m_currentIterator);
531 std::swap(m_currentTileHorizPos, tmp.m_currentTileHorizPos);
532 std::swap(m_currentTileVertPos, tmp.m_currentTileVertPos);
533 std::swap(m_currentXoffset, tmp.m_currentXoffset);
534 std::swap(m_currentYoffset, tmp.m_currentYoffset);
535 std::swap(m_currentXpos, tmp.m_currentXpos);
536 std::swap(m_currentYpos, tmp.m_currentYpos);
542 template <ValueType::Enum PixelFormat>
546 if (m_currentXpos >= m_width) {
548 m_currentTileHorizPos = 0;
549 m_currentXoffset = 0;
557 if (m_currentYoffset >= m_tileExtent) {
558 m_currentYoffset = 0;
559 m_currentTileVertPos++;
561 m_currentIterator = &m_tileIteratorGrid[m_currentTileVertPos][m_currentTileHorizPos];
562 m_currentIterator->moveTo(m_currentXoffset, m_currentYoffset);
563 }
else if (m_currentXoffset >= m_tileExtent) {
564 m_currentTileHorizPos++;
566 m_currentXoffset = 0;
568 m_currentIterator = &m_tileIteratorGrid[m_currentTileVertPos][m_currentTileHorizPos];
569 m_currentIterator->moveTo(m_currentXoffset, m_currentYoffset);
571 ++(*m_currentIterator);
577 template <ValueType::Enum PixelFormat>
580 if (m_currentXoffset == 0) {
582 if (m_currentTileHorizPos == 0) {
583 m_currentXoffset = (m_width - 1) & (m_tileExtent - 1);
584 m_currentTileHorizPos = m_horiz - 1;
585 m_currentXpos = m_width - 1;
588 if (m_currentYoffset == 0) {
589 if (m_currentTileVertPos != 0) {
591 m_currentTileVertPos--;
592 m_currentYoffset = m_tileExtent - 1;
599 m_currentXoffset = m_tileExtent - 1;
601 m_currentTileHorizPos--;
604 m_currentIterator = &m_tileIteratorGrid[m_currentTileVertPos][m_currentTileHorizPos];
605 m_currentIterator->moveTo(m_currentXoffset, m_currentYoffset);
609 --(*m_currentIterator);
615 template <ValueType::Enum PixelFormat>
618 m_currentTileHorizPos = x >> m_power;
619 m_currentTileVertPos = y >> m_power;
620 m_currentXoffset = x & (m_tileExtent - 1);
621 m_currentYoffset = y & (m_tileExtent - 1);
625 m_currentIterator = &m_tileIteratorGrid[m_currentTileVertPos][m_currentTileHorizPos];
626 m_currentIterator->moveTo(m_currentXoffset, m_currentYoffset);
631 template <ValueType::Enum PixelFormat>
633 return **m_currentIterator;
636 template <ValueType::Enum PixelFormat>
638 return **m_currentIterator;
641 template <ValueType::Enum PixelFormat>
643 unsigned int tileHorizPos = x >> m_power;
644 unsigned int tileVertPos = y >> m_power;
645 unsigned int Xoffset = x & (m_tileExtent - 1);
646 unsigned int Yoffset = y & (m_tileExtent - 1);
648 return m_tileIteratorGrid[tileVertPos][tileHorizPos].operator()(Xoffset, Yoffset);
651 template <ValueType::Enum PixelFormat>
653 unsigned int tileHorizPos = x >> m_power;
654 unsigned int tileVertPos = y >> m_power;
655 unsigned int Xoffset = x & (m_tileExtent - 1);
656 unsigned int Yoffset = y & (m_tileExtent - 1);
658 return m_tileIteratorGrid[tileVertPos][tileHorizPos].operator()(Xoffset, Yoffset);
661 template <ValueType::Enum PixelFormat>
663 return (*m_currentIterator)[n];
666 template <ValueType::Enum PixelFormat>
668 return (*m_currentIterator)[n];
671 template <ValueType::Enum PixelFormat>
673 return m_currentIterator->getValue(band);
676 template <ValueType::Enum PixelFormat>
678 m_currentIterator->setValue(band, value);
682 template <ValueType::Enum PixelFormat>
684 return m_currentXpos;
687 template <ValueType::Enum PixelFormat>
689 return m_currentYpos;
692 template <ValueType::Enum PixelFormat>
694 return *m_currentIterator == *(other.m_currentIterator);
697 template <ValueType::Enum PixelFormat>
699 return *m_currentIterator != *(other.m_currentIterator);
703 template <ValueType::Enum PixelFormat>
708 template <ValueType::Enum PixelFormat>
712 iterator.
moveTo(0, m_height);
716 template <ValueType::Enum PixelFormat>