Scroom  0.14
Scroom::Tiff::Source Class Reference

#include <tiffsource.hh>

Inheritance diagram for Scroom::Tiff::Source:
Inheritance graph
Collaboration diagram for Scroom::Tiff::Source:
Collaboration graph

Public Types

using Ptr = boost::shared_ptr< Source >
 
- Public Types inherited from SourcePresentation
using Ptr = boost::shared_ptr< SourcePresentation >
 

Public Member Functions

bool reset ()
 
void fillTiles (int startLine, int lineCount, int tileWidth, int firstTile, std::vector< Tile::Ptr > &tiles) override
 
void done () override
 
std::string getName () override
 

Static Public Member Functions

static Ptr create (std::string fileName, TIFFPtr tif, BitmapMetaData bmd)
 

Private Member Functions

 Source (std::string fileName, TIFFPtr tif, BitmapMetaData bmd)
 

Private Attributes

std::string fileName
 
TIFFPtr preOpenedTif
 
TIFFPtr tif
 
BitmapMetaData bmd
 

Member Typedef Documentation

◆ Ptr

using Scroom::Tiff::Source::Ptr = boost::shared_ptr<Source>

Constructor & Destructor Documentation

◆ Source()

Scroom::Tiff::Source::Source ( std::string  fileName,
TIFFPtr  tif,
BitmapMetaData  bmd 
)
private
230  : fileName(std::move(fileName_))
231  , preOpenedTif(std::move(tif_))
232  , bmd(std::move(bmd_))
233  {
234  }

Member Function Documentation

◆ create()

Source::Ptr Scroom::Tiff::Source::create ( std::string  fileName,
TIFFPtr  tif,
BitmapMetaData  bmd 
)
static
225  {
226  return Ptr(new Source(std::move(fileName), std::move(tif), std::move(bmd)));
227  }

Referenced by Tiff::open().

Here is the caller graph for this function:

◆ done()

void Scroom::Tiff::Source::done ( )
overridevirtual

Done reading bitmap data

Any open files can be closed now

Implements SourcePresentation.

299 { tif.reset(); }

◆ fillTiles()

void Scroom::Tiff::Source::fillTiles ( int  startLine,
int  lineCount,
int  tileWidth,
int  firstTile,
std::vector< Tile::Ptr > &  tiles 
)
overridevirtual

Provide bitmap data

While the TiledBitmap is loaded, this function will be called several times. Each time, this function has to fill the provided tiles with bitmap data.

The given tiles are horizontally adjacent.

Parameters
startLiney coordinate of the first line in the set of tiles
lineCountThe number of lines that are to be filled. This equals the height of the tiles
tileWidthThe width of one tile
firstTileIndex of the first tile provided. This means that the first x coordinate is firsttile * tileWidth
tilesThe tiles that are to be filled.

Implements SourcePresentation.

266  {
267  auto spp = bmd.samplesPerPixel;
268  auto bps = bmd.bitsPerSample;
269 
270  const auto startLine_ = static_cast<uint32_t>(startLine);
271  const auto firstTile_ = static_cast<size_t>(firstTile);
272  const auto scanLineSize = static_cast<size_t>(TIFFScanlineSize(tif.get()));
273  const auto tileStride = static_cast<size_t>(tileWidth * spp * bps / 8);
274  std::vector<byte> row(scanLineSize);
275 
276  const size_t tileCount = tiles.size();
277  auto dataPtr = std::vector<byte*>(tileCount);
278  for(size_t tile = 0; tile < tileCount; tile++)
279  {
280  dataPtr[tile] = tiles[tile]->data.get();
281  }
282 
283  for(size_t i = 0; i < static_cast<size_t>(lineCount); i++)
284  {
285  TIFFReadScanline(tif.get(), row.data(), static_cast<uint32_t>(i) + startLine_);
286 
287  for(size_t tile = 0; tile < tileCount - 1; tile++)
288  {
289  memcpy(dataPtr[tile], row.data() + (firstTile_ + tile) * tileStride, tileStride);
290  dataPtr[tile] += tileStride;
291  }
292  memcpy(dataPtr[tileCount - 1],
293  row.data() + (firstTile_ + tileCount - 1) * tileStride,
294  scanLineSize - (firstTile_ + tileCount - 1) * tileStride);
295  dataPtr[tileCount - 1] += tileStride;
296  }
297  }

◆ getName()

std::string Scroom::Tiff::Source::getName ( )
inlineoverridevirtual

Implements SourcePresentation.

52 { return fileName; }

◆ reset()

bool Scroom::Tiff::Source::reset ( )
237  {
238  tif = preOpenedTif;
239  preOpenedTif = nullptr;
240 
241  if(!tif)
242  {
243  auto r = Scroom::Tiff::open(fileName);
244  if(r && approx(std::get<0>(*r), bmd))
245  {
246  tif = std::get<1>(*r);
247  }
248  else
249  {
250  if(r)
251  {
252  spdlog::error("Can't reload. Bitmap changed too much");
253  spdlog::info("Previously: {}", to_string(bmd));
254  spdlog::info("Now: {}", to_string(std::get<0>(*r)));
255  }
256  // if (!r) then the error has already been reported by open()
257  return false;
258  }
259  }
260  ensure(tif);
261 
262  return true;
263  }
Here is the call graph for this function:

Member Data Documentation

◆ bmd

BitmapMetaData Scroom::Tiff::Source::bmd
private

Referenced by fillTiles(), and reset().

◆ fileName

std::string Scroom::Tiff::Source::fileName
private

Referenced by reset().

◆ preOpenedTif

TIFFPtr Scroom::Tiff::Source::preOpenedTif
private

Referenced by reset().

◆ tif

TIFFPtr Scroom::Tiff::Source::tif
private

Referenced by done(), fillTiles(), and reset().


The documentation for this class was generated from the following files:
Scroom::TiledBitmap::BitmapMetaData::samplesPerPixel
unsigned int samplesPerPixel
Definition: opentiledbitmapinterface.hh:45
Scroom::Tiff::Source::Source
Source(std::string fileName, TIFFPtr tif, BitmapMetaData bmd)
Definition: tiffsource.cc:229
Scroom::Tiff::Source::bmd
BitmapMetaData bmd
Definition: tiffsource.hh:40
Scroom::TiledBitmap::BitmapMetaData::bitsPerSample
unsigned int bitsPerSample
Definition: opentiledbitmapinterface.hh:44
ensure
#define ensure(expr)
Definition: assertions.hh:32
anonymous_namespace{tiffsource.cc}::approx
bool approx(const BitmapMetaData &left, const BitmapMetaData &right)
Definition: tiffsource.cc:46
Scroom::Tiff::Source::fileName
std::string fileName
Definition: tiffsource.hh:37
Scroom::Tiff::Source::preOpenedTif
TIFFPtr preOpenedTif
Definition: tiffsource.hh:38
Scroom::TiledBitmap::to_string
std::string to_string(const BitmapMetaData &bmd)
Definition: layerspecforbitmap.cc:30
Scroom::Tiff::Source::Ptr
boost::shared_ptr< Source > Ptr
Definition: tiffsource.hh:43
Scroom::Tiff::open
boost::optional< std::tuple< Scroom::TiledBitmap::BitmapMetaData, TIFFPtr > > open(const std::string &fileName)
Definition: tiffsource.cc:119
Scroom::Tiff::Source::tif
TIFFPtr tif
Definition: tiffsource.hh:39