Optimized and fixed canvas portion merging in final picture
This commit is contained in:
parent
04f6ab732d
commit
1afcb907c4
4 changed files with 48 additions and 11 deletions
|
@ -6,6 +6,8 @@
|
|||
#include "CanvasPreview.h"
|
||||
#include "CanvasPictureWriter.h"
|
||||
|
||||
#define CUTTER_SIZE 800
|
||||
|
||||
Canvas::Canvas()
|
||||
{
|
||||
horizontal_portion_count = 1;
|
||||
|
@ -28,8 +30,8 @@ Canvas::~Canvas()
|
|||
|
||||
void Canvas::setSize(int width, int height)
|
||||
{
|
||||
horizontal_portion_count = 1 + (width - 1) / 800;
|
||||
vertical_portion_count = 1 + (height - 1) / 800;
|
||||
horizontal_portion_count = 1 + (width - 1) / CUTTER_SIZE;
|
||||
vertical_portion_count = 1 + (height - 1) / CUTTER_SIZE;
|
||||
|
||||
int portion_width = width / horizontal_portion_count;
|
||||
int portion_height = height / vertical_portion_count;
|
||||
|
|
|
@ -14,11 +14,19 @@ CanvasPictureWriter::CanvasPictureWriter(const Canvas *canvas):
|
|||
antialias = 1;
|
||||
width = canvas->getWidth();
|
||||
height = canvas->getHeight();
|
||||
|
||||
last_portion = NULL;
|
||||
last_stream = NULL;
|
||||
last_y = 0;
|
||||
}
|
||||
|
||||
CanvasPictureWriter::~CanvasPictureWriter()
|
||||
{
|
||||
delete profile;
|
||||
if (last_stream)
|
||||
{
|
||||
delete last_stream;
|
||||
}
|
||||
}
|
||||
|
||||
void CanvasPictureWriter::setAntialias(int antialias)
|
||||
|
@ -80,15 +88,29 @@ Color CanvasPictureWriter::getRawPixel(int x, int y)
|
|||
// Get the portion this pixel is in
|
||||
CanvasPortion *portion = canvas->atPixel(x, y);
|
||||
|
||||
// Get the pack stream positioned at the pixel
|
||||
PackStream stream;
|
||||
if (not portion->getReadStream(stream, x - portion->getXOffset(), y - portion->getYOffset()))
|
||||
// While we stay in the same portion line, read is sequential in the stream
|
||||
if (portion != last_portion or last_y != y)
|
||||
{
|
||||
return COLOR_BLACK;
|
||||
// Get the pack stream positioned at the pixel
|
||||
if (last_stream)
|
||||
{
|
||||
delete last_stream;
|
||||
}
|
||||
last_stream = new PackStream;
|
||||
if (portion->getReadStream(*last_stream, x - portion->getXOffset(), y - portion->getYOffset()))
|
||||
{
|
||||
last_portion = portion;
|
||||
last_y = y;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Portion has no stream
|
||||
return COLOR_BLACK;
|
||||
}
|
||||
}
|
||||
|
||||
// Load the pixel and apply tone mapping
|
||||
// Load the pixel
|
||||
Color col;
|
||||
col.load(&stream);
|
||||
col.load(last_stream);
|
||||
return col;
|
||||
}
|
||||
|
|
|
@ -46,6 +46,10 @@ private:
|
|||
int width;
|
||||
int height;
|
||||
ColorProfile *profile;
|
||||
|
||||
CanvasPortion *last_portion;
|
||||
int last_y;
|
||||
PackStream *last_stream;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -108,11 +108,20 @@ bool CanvasPortion::getReadStream(PackStream &stream, int x, int y)
|
|||
{
|
||||
if (FileSystem::isFile(filepath))
|
||||
{
|
||||
if (not stream.bindToFile(filepath))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int unused_i;
|
||||
double unused_d;
|
||||
stream.bindToFile(filepath);
|
||||
stream.skip(unused_i, 2);
|
||||
stream.skip(unused_d, (y * width + x - 1) * 4);
|
||||
|
||||
if (x > 0 or y > 0)
|
||||
{
|
||||
double unused_d;
|
||||
stream.skip(unused_d, (y * width + x) * 4);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Reference in a new issue