1// Aseprite
2// Copyright (C) 2019 Igara Studio S.A.
3// Copyright (C) 2001-2017 David Capello
4//
5// This program is distributed under the terms of
6// the End-User License Agreement for Aseprite.
7
8#ifndef FILTERS_FILTER_MANAGER_H_INCLUDED
9#define FILTERS_FILTER_MANAGER_H_INCLUDED
10#pragma once
11
12#include "doc/pixel_format.h"
13#include "filters/target.h"
14
15namespace doc {
16 class Image;
17}
18
19namespace filters {
20
21 class FilterIndexedData;
22
23 // Information given to a filter (Filter interface) to apply it to a
24 // single row. Basically an Filter implementation has to obtain
25 // colors from getSourceAddress(), applies some kind of transformation
26 // to that color, and save the result in getDestinationAddress().
27 // This process must be repeated getWidth() times.
28 class FilterManager {
29 public:
30 virtual ~FilterManager() { }
31
32 virtual doc::PixelFormat pixelFormat() const = 0;
33
34 // Gets the address of the first pixel which has the original color
35 // to apply the filter.
36 virtual const void* getSourceAddress() = 0;
37
38 // Gets the address of the first pixel which is destination of the
39 // filter.
40 virtual void* getDestinationAddress() = 0;
41
42 // Returns the width of the row to apply the filter. You must apply
43 // the Filter "getWidth()" times, in each pixel from getSourceAddress().
44 virtual int getWidth() = 0;
45
46 // Returns the target of the Filter, i.e. what channels/components
47 // (e.g. Red, Green, or Blue) will be modified by the filter.
48 virtual Target getTarget() = 0;
49
50 // Returns a interface needed by filters which operate over indexed
51 // images. FilterIndexedData interface provides a Palette and a
52 // RgbMap to help the filter to make its job.
53 virtual FilterIndexedData* getIndexedData() = 0;
54
55 // Returns true if you should skip the current pixel (do not apply
56 // the filter). You must increment all your internal source and
57 // destination address pointers one pixel without applying the
58 // filter.
59 //
60 // This method is used to skip non-selected pixels (when the
61 // selection is actived).
62 virtual bool skipPixel() = 0;
63
64 //////////////////////////////////////////////////////////////////////
65 // Special members for 2D filters like convolution matrices.
66
67 // Returns the source image.
68 virtual const doc::Image* getSourceImage() = 0;
69
70 // Returns the first X coordinate of the row to apply the filter.
71 virtual int x() const = 0;
72
73 // Returns the Y coordinate of the row.
74 virtual int y() const = 0;
75
76 // Returns true if this is the first row. Useful to apply a filter
77 // to the palette in the first row.
78 virtual bool isFirstRow() const = 0;
79
80 // Returns true if the mask is actived (so we are applying the
81 // filter just to a part of the sprite).
82 virtual bool isMaskActive() const = 0;
83
84 };
85
86} // namespace filters
87
88#endif
89