Scroom  0.14
OperationsCMYK8 Class Reference

#include <layeroperations.hh>

Inheritance diagram for OperationsCMYK8:
Inheritance graph
Collaboration diagram for OperationsCMYK8:
Collaboration graph

Public Member Functions

 OperationsCMYK8 ()
 
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
 
- Public Member Functions inherited from PipetteCommonOperationsCMYK
 PipetteCommonOperationsCMYK (int bps_)
 
PipetteLayerOperations::PipetteColor sumPixelValues (Scroom::Utils::Rectangle< int > area, const ConstTile::Ptr &tile) override
 
- Public Member Functions inherited from Scroom::Utils::Base
 Base ()=default
 
 Base (const Base &)=delete
 
 Base (Base &&)=delete
 
Baseoperator= (const Base &)=delete
 
Baseoperator= (Base &&)=delete
 
virtual ~Base ()=default
 
template<typename R >
boost::shared_ptr< R > shared_from_this ()
 
template<typename R >
boost::shared_ptr< R const > shared_from_this () const
 
- 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
 
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
 

Static Public Member Functions

static Ptr create ()
 
- 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)
 

Additional Inherited Members

- Public Types inherited from PipetteCommonOperationsCMYK
using Ptr = boost::shared_ptr< PipetteCommonOperationsCMYK >
 
- Public Types inherited from PipetteLayerOperations
using Ptr = boost::shared_ptr< PipetteLayerOperations >
 
using PipetteColor = std::vector< std::pair< std::string, double > >
 
- Public Types inherited from LayerOperations
using Ptr = boost::shared_ptr< LayerOperations >
 
- Protected Attributes inherited from PipetteCommonOperationsCMYK
int bps
 

Constructor & Destructor Documentation

◆ OperationsCMYK8()

OperationsCMYK8::OperationsCMYK8 ( )
220 {
221 }

Referenced by create().

Here is the caller graph for this function:

Member Function Documentation

◆ cache()

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

Cache the given tile

Reimplemented from LayerOperations.

229 {
230  // Allocate the space for the cache - stride is the height of one row
231  const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, tile->width);
232  boost::shared_ptr<uint8_t> const data = shared_malloc(static_cast<size_t>(stride * tile->height));
233 
234  // Row is a pointer to a row of pixels (destination)
235  auto* row = reinterpret_cast<uint32_t*>(data.get());
236  // Cur is a pointer to the start of the row in the tile (source)
237  const uint8_t* cur = tile->data.get();
238 
239  // assume stride = tile->width * 4
240  for(int i = 0; i < tile->height * tile->width; i++)
241  {
242  // Convert CMYK to ARGB, because cairo doesn't know how to render CMYK.
243  auto C_i = static_cast<uint8_t>(255 - ((cur[i]) >> 6) * 85); // 85 == 255/3
244  auto M_i = static_cast<uint8_t>(255 - ((cur[i] & 0x30) >> 4) * 85);
245  auto Y_i = static_cast<uint8_t>(255 - ((cur[i] & 0x0C) >> 2) * 85);
246  auto K_i = static_cast<uint8_t>(255 - ((cur[i] & 0x03)) * 85);
247 
248  uint32_t const R = static_cast<uint8_t>((C_i * K_i) / 255);
249  uint32_t const G = static_cast<uint8_t>((M_i * K_i) / 255);
250  uint32_t const B = static_cast<uint8_t>((Y_i * K_i) / 255);
251 
252  // Write 255 as alpha (fully opaque)
253  row[i] = 255u << 24 | R << 16 | G << 8 | B;
254  }
255 
256  return Scroom::Bitmap::BitmapSurface::create(tile->width, tile->height, CAIRO_FORMAT_ARGB32, stride, data);
257 }
Here is the call graph for this function:

◆ create()

PipetteCommonOperationsCMYK::Ptr OperationsCMYK8::create ( )
static

Referenced by Scroom::TiledBitmap::CMYKBitmap().

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

◆ getBpp()

int OperationsCMYK8::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.

223 { return 8; }

◆ reduce()

void OperationsCMYK8::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.

260 {
261  // Reducing by a factor 8
262  const int sourceStride = source->width; // stride in bytes
263  const byte* sourceBase = source->data.get();
264 
265  const int targetStride = 8 * target->width / 2; // stride in bytes
266  byte* targetBase = target->data.get() + (target->height * top_left_y + top_left_x) * targetStride / 8;
267 
268  for(int y = 0; y < source->height / 8; y++)
269  {
270  for(int x = 0; x < source->width / 8; x++)
271  {
272  // We want to store the average colour of the 8*8 pixel image
273  // with (x, y) as its top-left corner into targetPtr.
274  const byte* base = sourceBase + 2 * 4 * x; // start of the row
275  const byte* end = base + 8 * sourceStride; // end of the row
276 
277  int sum_c = 0;
278  int sum_m = 0;
279  int sum_y = 0;
280  int sum_k = 0;
281  for(const byte* row = base; row < end; row += sourceStride)
282  {
283  for(size_t current = 0; current < 8; current++)
284  {
285  sum_c += row[current] >> 6;
286  sum_m += (row[current] & 0x30) >> 4;
287  sum_y += (row[current] & 0x0C) >> 2;
288  sum_k += row[current] & 0x03;
289  }
290  }
291 
292  targetBase[4 * x + 0] = static_cast<byte>(sum_c * 255 / 192);
293  targetBase[4 * x + 1] = static_cast<byte>(sum_m * 255 / 192);
294  targetBase[4 * x + 2] = static_cast<byte>(sum_y * 255 / 192);
295  targetBase[4 * x + 3] = static_cast<byte>(sum_k * 255 / 192);
296  }
297 
298  targetBase += targetStride;
299  sourceBase += sourceStride * 8;
300  }
301 }

The documentation for this class was generated from the following files:
OperationsCMYK8::OperationsCMYK8
OperationsCMYK8()
Definition: cmyklayeroperations.cc:218
Scroom::Bitmap::BitmapSurface::create
static Ptr create(int width, int height, cairo_format_t format)
Definition: bitmap-helpers.cc:13
PipetteCommonOperationsCMYK::Ptr
boost::shared_ptr< PipetteCommonOperationsCMYK > Ptr
Definition: layeroperations.hh:41
PipetteCommonOperationsCMYK::PipetteCommonOperationsCMYK
PipetteCommonOperationsCMYK(int bps_)
Definition: layeroperations.hh:44
current
static unsigned int current
Definition: measure-framerate-callbacks.cc:17
anonymous_namespace{cmyklayeroperations.cc}::shared_malloc
boost::shared_ptr< unsigned char > shared_malloc(size_t size)
Definition: cmyklayeroperations.cc:24
B
Definition: threadpool-tests.cc:53