#pragma once #include "StarList.hpp" #include "StarRect.hpp" #include "StarJson.hpp" namespace Star { STAR_CLASS(Image); STAR_EXCEPTION(ImageOperationException, StarException); Image scaleNearest(Image const& srcImage, Vec2F scale); Image scaleBilinear(Image const& srcImage, Vec2F scale); Image scaleBicubic(Image const& srcImage, Vec2F scale); StringList colorDirectivesFromConfig(JsonArray const& directives); String paletteSwapDirectivesFromConfig(Json const& swaps); struct NullImageOperation { bool unloaded = false; }; struct ErrorImageOperation { Variant cause; }; 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 rTable; Array gTable; Array 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 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; bool includeTransparent; }; 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 ImageOperation; ImageOperation imageOperationFromString(StringView string); String imageOperationToString(ImageOperation const& operation); void parseImageOperations(StringView params, function outputter); // Each operation is assumed to be separated by '?', with parameters // separated by ';' or '=' List parseImageOperations(StringView params); // Each operation separated by '?', returns string with leading '?' String printImageOperations(List const& operations); void addImageOperationReferences(ImageOperation const& operation, StringList& out); StringList imageOperationReferences(List const& operations); typedef function ImageReferenceCallback; void processImageOperation(ImageOperation const& operation, Image& input, ImageReferenceCallback refCallback = {}); Image processImageOperations(List const& operations, Image input, ImageReferenceCallback refCallback = {}); }