summaryrefslogtreecommitdiffstats
path: root/src/trace/imagemap.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/trace/imagemap.cpp128
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