diff options
Diffstat (limited to 'source/core/StarImageProcessing.hpp')
-rw-r--r-- | source/core/StarImageProcessing.hpp | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/source/core/StarImageProcessing.hpp b/source/core/StarImageProcessing.hpp new file mode 100644 index 0000000..e2008b8 --- /dev/null +++ b/source/core/StarImageProcessing.hpp @@ -0,0 +1,153 @@ +#ifndef STAR_IMAGE_PROCESSING_HPP +#define STAR_IMAGE_PROCESSING_HPP + +#include "StarList.hpp" +#include "StarRect.hpp" +#include "StarJson.hpp" + +namespace Star { + +STAR_CLASS(Image); + +STAR_EXCEPTION(ImageOperationException, StarException); + +Image scaleNearest(Image const& srcImage, Vec2F const& scale); +Image scaleBilinear(Image const& srcImage, Vec2F const& scale); +Image scaleBicubic(Image const& srcImage, Vec2F const& scale); + +StringList colorDirectivesFromConfig(JsonArray const& directives); +String paletteSwapDirectivesFromConfig(Json const& swaps); + +struct HueShiftImageOperation { + // Specify hue shift angle as -360 to 360 rather than -1 to 1 + static HueShiftImageOperation hueShiftDegrees(float degrees); + + // value here is normalized to 1.0 + float hueShiftAmount; +}; + +struct SaturationShiftImageOperation { + // Specify saturation shift as amount normalized to 100 + static SaturationShiftImageOperation saturationShift100(float amount); + + // value here is normalized to 1.0 + float saturationShiftAmount; +}; + +struct BrightnessMultiplyImageOperation { + // Specify brightness multiply as amount where 0 means "no change" and 100 + // means "x2" and -100 means "x0" + static BrightnessMultiplyImageOperation brightnessMultiply100(float amount); + + float brightnessMultiply; +}; + +// Fades R G and B channels to the given color by the given amount, ignores A +struct FadeToColorImageOperation { + FadeToColorImageOperation(Vec3B color, float amount); + + Vec3B color; + float amount; + + Array<uint8_t, 256> rTable; + Array<uint8_t, 256> gTable; + Array<uint8_t, 256> bTable; +}; + +// Applies two FadeToColor operations in alternating rows to produce a scanline effect +struct ScanLinesImageOperation { + FadeToColorImageOperation fade1; + FadeToColorImageOperation fade2; +}; + +// Sets RGB values to the given color, and ignores the alpha channel +struct SetColorImageOperation { + Vec3B color; +}; + +typedef HashMap<Vec4B, Vec4B> ColorReplaceMap; + +struct ColorReplaceImageOperation { + ColorReplaceMap colorReplaceMap; +}; + +struct AlphaMaskImageOperation { + enum MaskMode { + Additive, + Subtractive + }; + + MaskMode mode; + StringList maskImages; + Vec2I offset; +}; + +struct BlendImageOperation { + enum BlendMode { + Multiply, + Screen + }; + + BlendMode mode; + StringList blendImages; + Vec2I offset; +}; + +struct MultiplyImageOperation { + Vec4B color; +}; + +struct BorderImageOperation { + unsigned pixels; + Vec4B startColor; + Vec4B endColor; + bool outlineOnly; +}; + +struct ScaleImageOperation { + enum Mode { + Nearest, + Bilinear, + Bicubic + }; + + Mode mode; + Vec2F scale; +}; + +struct CropImageOperation { + RectI subset; +}; + +struct FlipImageOperation { + enum Mode { + FlipX, + FlipY, + FlipXY + }; + Mode mode; +}; + +typedef Variant<HueShiftImageOperation, SaturationShiftImageOperation, BrightnessMultiplyImageOperation, FadeToColorImageOperation, + ScanLinesImageOperation, SetColorImageOperation, ColorReplaceImageOperation, AlphaMaskImageOperation, BlendImageOperation, + MultiplyImageOperation, BorderImageOperation, ScaleImageOperation, CropImageOperation, FlipImageOperation> ImageOperation; + +ImageOperation imageOperationFromString(String const& string); +String imageOperationToString(ImageOperation const& operation); + +// Each operation is assumed to be separated by '?', with parameters +// separated by ';' or '=' +List<ImageOperation> parseImageOperations(String const& params); + +// Each operation separated by '?', returns string with leading '?' +String printImageOperations(List<ImageOperation> const& operations); + +StringList imageOperationReferences(List<ImageOperation> const& operations); + +typedef function<Image const*(String const& refName)> ImageReferenceCallback; + +Image processImageOperations(List<ImageOperation> const& operations, Image input, ImageReferenceCallback refCallback = {}); + +} + +#endif |