diff options
Diffstat (limited to 'src/trace/imagemap.cpp')
-rw-r--r-- | src/trace/imagemap.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/trace/imagemap.cpp b/src/trace/imagemap.cpp new file mode 100644 index 0000000..48acd8c --- /dev/null +++ b/src/trace/imagemap.cpp @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/** @file + * TODO: insert short description here + *//* + * Authors: see git history + * + * Copyright (C) 2018 Authors + * Released under GNU GPL v2+, read the file 'COPYING' for more information. + */ +#include <cstdio> +#include "imagemap.h" + +namespace Inkscape { +namespace Trace { + +/* + * GrayMap + */ + +GrayMap::GrayMap(int width, int height) + : MapBase(width, height) +{ +} + +bool GrayMap::writePPM(char const *fileName) +{ + if (!fileName) { + return false; + } + + auto f = std::fopen(fileName, "wb"); + if (!f) { + return false; + } + + std::fprintf(f, "P6 %d %d 255\n", width, height); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + auto pix = getPixel(x, y) / 3; + unsigned char pixb = pix & 0xff; + std::fputc(pixb, f); + std::fputc(pixb, f); + std::fputc(pixb, f); + } + } + + std::fclose(f); + + return true; +} + +/* + * RgbMap + */ + +RgbMap::RgbMap(int width, int height) + : MapBase(width, height) +{ +} + +bool RgbMap::writePPM(char const *fileName) +{ + if (!fileName) { + return false; + } + + auto f = std::fopen(fileName, "wb"); + if (!f) { + return false; + } + + std::fprintf(f, "P6 %d %d 255\n", width, height); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + auto rgb = getPixel(x, y); + std::fputc(rgb.r, f); + std::fputc(rgb.g, f); + std::fputc(rgb.b, f); + } + } + + std::fclose(f); + + return true; +} + +/* + * IndexedMap + */ + +IndexedMap::IndexedMap(int width, int height) + : MapBase(width, height) + , nrColors(0) +{ + clut.fill(RGB{0, 0, 0}); +} + +bool IndexedMap::writePPM(char const *fileName) +{ + if (!fileName) { + return false; + } + + auto f = std::fopen(fileName, "wb"); + if (!f) { + return false; + } + + std::fprintf(f, "P6 %d %d 255\n", width, height); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + auto rgb = getPixelValue(x, y); + std::fputc(rgb.r, f); + std::fputc(rgb.g, f); + std::fputc(rgb.b, f); + } + } + + std::fclose(f); + + return true; +} + +} // namespace Trace +} // namespace Inkscape |