1// Aseprite Render Library
2// Copyright (c) 2019 Igara Studio S.A.
3// Copyright (c) 2001-2017 David Capello
4//
5// This file is released under the terms of the MIT license.
6// Read LICENSE.txt for more information.
7
8#ifndef RENDER_ORDERED_DITHER_H_INCLUDED
9#define RENDER_ORDERED_DITHER_H_INCLUDED
10#pragma once
11
12#include "doc/color.h"
13#include "doc/image_impl.h"
14#include "doc/palette.h"
15#include "doc/rgbmap.h"
16#include "gfx/point.h"
17#include "gfx/size.h"
18#include "render/task_delegate.h"
19
20namespace render {
21
22 class Dithering;
23 class DitheringMatrix;
24
25 class DitheringAlgorithmBase {
26 public:
27 virtual ~DitheringAlgorithmBase() { }
28
29 virtual int dimensions() const { return 1; }
30 virtual bool zigZag() const { return false; }
31
32 virtual void start(
33 const doc::Image* srcImage,
34 doc::Image* dstImage,
35 const double factor) { }
36
37 virtual void finish() { }
38
39 virtual doc::color_t ditherRgbPixelToIndex(
40 const DitheringMatrix& matrix,
41 const doc::color_t color,
42 const int x, const int y,
43 const doc::RgbMap* rgbmap,
44 const doc::Palette* palette) { return 0; }
45
46 virtual doc::color_t ditherRgbToIndex2D(
47 const int x, const int y,
48 const doc::RgbMap* rgbmap,
49 const doc::Palette* palette) { return 0; }
50 };
51
52 class OrderedDither : public DitheringAlgorithmBase {
53 public:
54 OrderedDither(int transparentIndex = -1);
55 doc::color_t ditherRgbPixelToIndex(
56 const DitheringMatrix& matrix,
57 const doc::color_t color,
58 const int x,
59 const int y,
60 const doc::RgbMap* rgbmap,
61 const doc::Palette* palette) override;
62 private:
63 int m_transparentIndex;
64 };
65
66 class OrderedDither2 : public DitheringAlgorithmBase {
67 public:
68 OrderedDither2(int transparentIndex = -1);
69 doc::color_t ditherRgbPixelToIndex(
70 const DitheringMatrix& matrix,
71 const doc::color_t color,
72 const int x,
73 const int y,
74 const doc::RgbMap* rgbmap,
75 const doc::Palette* palette) override;
76 private:
77 int m_transparentIndex;
78 };
79
80 void dither_rgb_image_to_indexed(
81 DitheringAlgorithmBase& algorithm,
82 const Dithering& dithering,
83 const doc::Image* srcImage,
84 doc::Image* dstImage,
85 const doc::RgbMap* rgbmap,
86 const doc::Palette* palette,
87 TaskDelegate* delegate = nullptr);
88
89} // namespace render
90
91#endif
92