Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions homework/grayscale-image/compression.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#include "compression.hpp"
#include <algorithm>
#include <array>
#include <cstdint>
#include <numeric>
#include <vector>

std::vector<std::pair<uint8_t, uint8_t>> compressGrayscale(std::array<std::array<uint8_t, width>, height>& array) {
uint8_t val = 0;
uint8_t counter = 0;
std::vector<std::pair<uint8_t, uint8_t>> output;

for (auto& row : array) {
uint8_t current = row[0];
uint8_t counter = 1;

std::accumulate(std::next(begin(row)),
end(row),
0,
[&](int, auto val) {
if (val == current) {
counter++;
} else {
output.emplace_back(current, counter);
current = val;
counter = 1;
}
return 0;
});
output.emplace_back(current, counter);
}

return output;
};

std::array<std::array<uint8_t, width>, height> decompressGrayscale(std::vector<std::pair<uint8_t, uint8_t>>& compressed) {
std::array<std::array<uint8_t, width>, height> array;
auto row = 0;
auto column = 0;

std::for_each(compressed.begin(), compressed.end(), [&](const std::pair<uint8_t, uint8_t>& pair) {
for (auto i = 0; i < pair.second; ++i) {
array[row][column] = pair.first;
column++;
}
if (column == width) {
column = 0;
row++;
}
});

return array;
};
11 changes: 11 additions & 0 deletions homework/grayscale-image/compression.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once
#include <array>
#include <cstdint>
#include <vector>

constexpr std::size_t width = 32U;
constexpr std::size_t height = 32U;

std::vector<std::pair<uint8_t, uint8_t>> compressGrayscale(std::array<std::array<uint8_t, width>, height>& array);

std::array<std::array<uint8_t, width>, height> decompressGrayscale(std::vector<std::pair<uint8_t, uint8_t>>& vec);
4 changes: 2 additions & 2 deletions homework/grayscale-image/main.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#include <array>
#include "compression.hpp"
#include <cstdint>
#include <forward_list>

// TODO: include

std::array<std::array<uint8_t, 32>, 32> generateNinja() {
return {
std::array<uint8_t, 32>{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
Expand Down
2 changes: 1 addition & 1 deletion homework/grayscale-image/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include <utility> // for std::pair<>
#include <vector>

// TODO: include
#include "compression.hpp"
#include "gtest/gtest.h"

void expectBitmap(const std::vector<std::pair<uint8_t, uint8_t>>& bitmap, size_t fraction) {
Expand Down