Scroom 0.14-49-gb7ae7a6d
Loading...
Searching...
No Matches
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 >
std::shared_ptr< R > shared_from_this ()
 
template<typename R >
std::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 = std::shared_ptr< PipetteCommonOperationsCMYK >
 
- Public Types inherited from PipetteLayerOperations
using Ptr = std::shared_ptr< PipetteLayerOperations >
 
using PipetteColor = std::vector< std::pair< std::string, double > >
 
- Public Types inherited from LayerOperations
using Ptr = std::shared_ptr< LayerOperations >
 
- Protected Attributes inherited from PipetteCommonOperationsCMYK
int bps
 

Constructor & Destructor Documentation

◆ OperationsCMYK8()

OperationsCMYK8::OperationsCMYK8 ( )
213{
214}
Definition layeroperations.hh:38

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.

222{
223 // Allocate the space for the cache - stride is the height of one row
224 const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, tile->width);
225 std::shared_ptr<uint8_t> const data = Scroom::Utils::shared_malloc(static_cast<size_t>(stride * tile->height));
226
227 // Row is a pointer to a row of pixels (destination)
228 auto* row = reinterpret_cast<uint32_t*>(data.get());
229 // Cur is a pointer to the start of the row in the tile (source)
230 const uint8_t* cur = tile->data.get();
231
232 // assume stride = tile->width * 4
233 for(int i = 0; i < tile->height * tile->width; i++)
234 {
235 // Convert CMYK to ARGB, because cairo doesn't know how to render CMYK.
236 auto C_i = static_cast<uint8_t>(255 - ((cur[i]) >> 6) * 85); // 85 == 255/3
237 auto M_i = static_cast<uint8_t>(255 - ((cur[i] & 0x30) >> 4) * 85);
238 auto Y_i = static_cast<uint8_t>(255 - ((cur[i] & 0x0C) >> 2) * 85);
239 auto K_i = static_cast<uint8_t>(255 - ((cur[i] & 0x03)) * 85);
240
241 uint32_t const R = static_cast<uint8_t>((C_i * K_i) / 255);
242 uint32_t const G = static_cast<uint8_t>((M_i * K_i) / 255);
243 uint32_t const B = static_cast<uint8_t>((Y_i * K_i) / 255);
244
245 // Write 255 as alpha (fully opaque)
246 row[i] = 255u << 24 | R << 16 | G << 8 | B;
247 }
248
249 return Scroom::Bitmap::BitmapSurface::create(tile->width, tile->height, CAIRO_FORMAT_ARGB32, stride, data);
250}
uint8_t data
Definition blob-tests.cc:36
Definition threadpool-tests.cc:55
static Ptr create(int width, int height, cairo_format_t format)
Definition bitmap-helpers.cc:13
std::shared_ptr< unsigned char > shared_malloc(size_t size)
Definition utilities.hh:123
Here is the call graph for this function:

◆ create()

PipetteCommonOperationsCMYK::Ptr OperationsCMYK8::create ( )
static
OperationsCMYK8()
Definition cmyklayeroperations.cc:211
std::shared_ptr< PipetteCommonOperationsCMYK > Ptr
Definition layeroperations.hh:43

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.

216{ 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.

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

The documentation for this class was generated from the following files: