Scroom  0.14
Operations8bpp Class Reference

#include <layeroperations.hh>

Inheritance diagram for Operations8bpp:
Inheritance graph
Collaboration diagram for Operations8bpp:
Collaboration graph

Public Member Functions

 Operations8bpp (ColormapProvider::Ptr colormapProvider)
 
int getBpp () override
 
Scroom::Utils::Stuff cache (const ConstTile::Ptr &tile) override
 
void reduce (Tile::Ptr target, ConstTile::Ptr source, int x, int y) override
 
void draw (cairo_t *cr, const ConstTile::Ptr &tile, Scroom::Utils::Rectangle< double > tileArea, Scroom::Utils::Rectangle< double > viewArea, int zoom, Scroom::Utils::Stuff cache) override
 
- Public Member Functions inherited from CommonOperations
void initializeCairo (cairo_t *cr) override
 
void drawState (cairo_t *cr, TileState s, Scroom::Utils::Rectangle< double > viewArea) override
 
Scroom::Utils::Stuff cacheZoom (const ConstTile::Ptr &tile, int zoom, Scroom::Utils::Stuff &cache) override
 

Static Public Member Functions

static Ptr create (ColormapProvider::Ptr colormapProvider)
 
- Static Public Member Functions inherited from CommonOperations
static void drawPixelValue (cairo_t *cr, int x, int y, int size, int value)
 
static void drawPixelValue (cairo_t *cr, int x, int y, int size, int value, Color const &bgColor)
 

Private Attributes

ColormapProvider::Ptr colormapProvider
 

Additional Inherited Members

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

Constructor & Destructor Documentation

◆ Operations8bpp()

Operations8bpp::Operations8bpp ( ColormapProvider::Ptr  colormapProvider)
explicit
384  : colormapProvider(std::move(colormapProvider_))
385 {
386 }

Referenced by create().

Here is the caller graph for this function:

Member Function Documentation

◆ cache()

Scroom::Utils::Stuff Operations8bpp::cache ( const ConstTile::Ptr tile)
overridevirtual

Cache data for use during later cacheZoom() calls.

This function is called for a given tile, and then the results are passed to the cacheZoom() function. Because draw() is called relatively frequently (i.e. when scrolling), it is recommended to do cpu-intensive work in the cache() and cacheZoom() functions, and then re-use the data to make the draw() faster.

The default implementation returns an empty reference, meaning nothing is cached. As a result, the draw() function will receive an empty reference.

Parameters
tilethe Tile for which caching is requested

Reimplemented from LayerOperations.

391 {
392  const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, tile->width);
393  boost::shared_ptr<unsigned char> const data = shared_malloc(stride * tile->height);
394  Colormap::Ptr const colormap = colormapProvider->getColormap();
395  const Color& c1 = colormap->colors[0];
396  const Color& c2 = colormap->colors[1];
397 
398  unsigned char* row = data.get();
399  for(int j = 0; j < tile->height; j++, row += stride)
400  {
401  const byte* cur = tile->data.get() + j * tile->width;
402 
403  auto* pixel = reinterpret_cast<uint32_t*>(row);
404  for(int i = 0; i < tile->width; i++)
405  {
406  *pixel = mix(c2, c1, 1.0 * *cur / 255).getARGB32();
407 
408  pixel++;
409  ++cur;
410  }
411  }
412 
413  return BitmapSurface::create(tile->width, tile->height, CAIRO_FORMAT_ARGB32, stride, data);
414 }

Referenced by draw().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create()

LayerOperations::Ptr Operations8bpp::create ( ColormapProvider::Ptr  colormapProvider)
static
379 {
380  return Ptr(new Operations8bpp(std::move(colormapProvider)));
381 }

Referenced by Scroom::TiledBitmap::GreyscaleBitmap(), setupTest1bpp(), and setupTest8bpp().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ draw()

void Operations8bpp::draw ( cairo_t *  cr,
const ConstTile::Ptr tile,
Scroom::Utils::Rectangle< double >  tileArea,
Scroom::Utils::Rectangle< double >  viewArea,
int  zoom,
Scroom::Utils::Stuff  cache 
)
overridevirtual

Draw the given tileArea into the given viewArea at the requested zoom level

Parameters
crThe canvas on which to draw
tileThe tile to take data from
tileAreaArea of the tile that needs to be drawn
viewAreaArea of the canvas that the tile needs to be drawn in
zoomThe requested zoom level. One pixel of your presentation should have size 2**zoom when drawn. zoom will be negative for all but the first layer.
cacheDepending on whether the cacheZoom() function finished already, this may either be an empty reference, or a reference to the value returned by cacheZoom()

Reimplemented from CommonOperations.

458 {
459  cairo_save(cr);
460  CommonOperations::draw(cr, tile, tileArea, viewArea, zoom, cache);
461  cairo_restore(cr);
462 
463  // Draw pixelvalues at 32:1 zoom
464  if(zoom == 5)
465  {
466  const int multiplier = 1 << zoom;
467  const int stride = tile->width;
468  cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
469  cairo_set_font_size(cr, 12.0);
470 
471  Colormap::Ptr const colormap = colormapProvider->getColormap();
472  const Color& c1 = colormap->colors[0];
473  const Color& c2 = colormap->colors[1];
474  const byte* const data = tile->data.get();
475 
476  auto tileAreaInt = roundOutward(tileArea).to<int>();
477  auto offset = tileAreaInt.getTopLeft() - tileArea.getTopLeft();
478  viewArea += offset * multiplier;
479 
480  for(int x = 0; x < tileAreaInt.width(); x++)
481  {
482  for(int y = 0; y < tileAreaInt.height(); y++)
483  {
484  const int value = data[(tileAreaInt.y() + y) * stride + tileAreaInt.x() + x];
485  Color const c = mix(c2, c1, 1.0 * value / 255);
486 
487  cairo_save(cr);
488  drawPixelValue(cr, viewArea.x() + multiplier * x, viewArea.y() + multiplier * y, multiplier, value, c);
489  cairo_restore(cr);
490  }
491  }
492  }
493 }
Here is the call graph for this function:

◆ getBpp()

int Operations8bpp::getBpp ( )
overridevirtual

Return the number of bits per pixel that the layer will use.

This number will be used to compute the amount of memory required to store one tile

Implements LayerOperations.

388 { return 8; }

◆ reduce()

void Operations8bpp::reduce ( Tile::Ptr  target,
ConstTile::Ptr  source,
int  x,
int  y 
)
overridevirtual

Reduce the source tile by a factor of 8

The target tile will contain data for 8*8 source tiles. Offsets x and y indicate which of those 64 source tiles is currently being processed

Parameters
targetTile that will contain the reduced bitmap
sourceTile that is to be reduced
xx-offset (0..7) of the source tile in the target tile
yy-offset (0..7) of the source tile in the target tile
Note
The target tile belongs to a different layer, and hence possibly has a different bpp than the current one, depending on the LayerSpec given to createTiledBitmap()

Implements LayerOperations.

417 {
418  // Reducing by a factor 8. Source tile is 8bpp. Target tile is 8bpp
419  const int sourceStride = source->width;
420  const byte* sourceBase = source->data.get();
421 
422  const int targetStride = target->width;
423  byte* targetBase = target->data.get() + target->height * y * targetStride / 8 + target->width * x / 8;
424 
425  for(int j = 0; j < source->height / 8; j++, targetBase += targetStride, sourceBase += sourceStride * 8)
426  {
427  // Iterate vertically over target
428  const byte* sourcePtr = sourceBase;
429  byte* targetPtr = targetBase;
430 
431  for(int i = 0; i < source->width / 8; i++, sourcePtr += 8, targetPtr++)
432  {
433  // Iterate horizontally over target
434 
435  // Goal is to compute a 8-bit grey value from a 8*8 grey image.
436  const byte* base = sourcePtr;
437  int sum = 0;
438  for(int k = 0; k < 8; k++, base += sourceStride)
439  {
440  const byte* current = base;
441  for(int l = 0; l < 8; l++, current++)
442  {
443  sum += *current;
444  }
445  }
446 
447  *targetPtr = sum / 64;
448  }
449  }
450 }

Member Data Documentation

◆ colormapProvider

ColormapProvider::Ptr Operations8bpp::colormapProvider
private

Referenced by cache(), create(), and draw().


The documentation for this class was generated from the following files:
Scroom::Utils::Rectangle::getTopLeft
xy_type getTopLeft() const
Definition: rectangle.hh:133
Scroom::Utils::Rectangle::x
value_type x() const
Definition: rectangle.hh:125
Operations8bpp::Operations8bpp
Operations8bpp(ColormapProvider::Ptr colormapProvider)
Definition: layeroperations.cc:383
CommonOperations::draw
void draw(cairo_t *cr, const ConstTile::Ptr &tile, Scroom::Utils::Rectangle< double > tileArea, Scroom::Utils::Rectangle< double > viewArea, int zoom, Scroom::Utils::Stuff cache) override
Definition: layeroperations.cc:161
Operations8bpp::colormapProvider
ColormapProvider::Ptr colormapProvider
Definition: layeroperations.hh:91
mix
Color mix(const Color &a, const Color &b, double alpha)
Definition: color.hh:133
current
static unsigned int current
Definition: measure-framerate-callbacks.cc:17
Color::getARGB32
uint32_t getARGB32() const
Definition: color.hh:112
Operations8bpp::cache
Scroom::Utils::Stuff cache(const ConstTile::Ptr &tile) override
Definition: layeroperations.cc:390
Colormap::Ptr
boost::shared_ptr< Colormap > Ptr
Definition: colormappable.hh:31
colormap
const Colormap::Ptr colormap
Definition: colormaphelpers_test.cc:54
CommonOperations::drawPixelValue
static void drawPixelValue(cairo_t *cr, int x, int y, int size, int value)
Definition: layeroperations.cc:96
LayerOperations::Ptr
boost::shared_ptr< LayerOperations > Ptr
Definition: tiledbitmapinterface.hh:53
Scroom::Utils::Rectangle::y
value_type y() const
Definition: rectangle.hh:127
anonymous_namespace{layeroperations.cc}::shared_malloc
boost::shared_ptr< unsigned char > shared_malloc(size_t size)
Definition: layeroperations.cc:28
Scroom::Utils::roundOutward
Segment< double > roundOutward(Segment< double > s)
Definition: linearsegment.hh:240
Color
Definition: color.hh:34
create
void create(NewPresentationInterface *interface)
Definition: loader.cc:175