rename script functions

This commit is contained in:
GenevensiS
2026-01-19 16:46:54 +01:00
parent d421d0d92b
commit ef835e6f46
19 changed files with 202 additions and 164 deletions
+2 -2
View File
@@ -126,10 +126,10 @@ public:
inline RealPoint getPos() const { return RealPoint(left, top); }
inline RealSize getSize() const { return RealSize(width, height); }
inline RealRect getExternalRect() const { return RealRect(left, top, width, height); }
inline std::string getExternalRectString(double scale, Radians angle, double bleed, int img_width, int img_height, int img_offset) { ///< update the style before calling this
inline std::string getExternalRectString(double scale, Radians angle, int offset_x, int offset_y, int img_width, int img_height) { ///< update the style before calling this
RealRect rect(left, top, width, height);
int degrees = lround(rad_to_deg(this->angle));
return transformAndEncodeRectInString(rect, degrees, scale, angle, bleed, img_width, img_height, img_offset);
return transformAndEncodeRectInString(rect, degrees, scale, angle, offset_x, offset_y, img_width, img_height);
}
/// Does this style have a non-zero size (or is it scripted)?
+2 -2
View File
@@ -151,7 +151,7 @@ Image export_image(const SetP& set, const CardP& card, const bool write_metadata
}
// store only crop coordinates
else {
std::string rect = style->getExternalRectString(zoom, angle_radians, bleed_pixels, width, height, 0);
std::string rect = style->getExternalRectString(zoom, angle_radians, bleed_pixels, bleed_pixels, width, height);
cardv_data[field->name.ToStdString()] = rect;
}
}
@@ -243,7 +243,7 @@ Image export_image( const SetP& set, const vector<CardP>& cards,
}
// store only crop coordinates
else {
std::string rect = style->getExternalRectString(zooms[i], angles[i], bleeds[i], widths[i], heights[i], offsets[i]);
std::string rect = style->getExternalRectString(zooms[i], angles[i], bleeds[i] + offsets[i], bleeds[i], widths[i], heights[i]);
cardv_data[field->name.ToStdString()] = rect;
}
}
+10 -8
View File
@@ -78,7 +78,7 @@ inline static bool decodeRectFromString(const String& rectString, wxRect& rect_o
}
/// Apply a transformation to a rect, return true if successful
inline static bool transformEncodedRect(wxRect& rect, int& degrees, double scale, Radians angle, double bleed, int img_width, int img_height, int img_offset) {
inline static bool transformEncodedRect(wxRect& rect, int& degrees, double scale, Radians angle, int offset_x, int offset_y, int img_width, int img_height) {
if (degrees != 0 && degrees != 90 && degrees != 180 && degrees != 270) return false;
rect = wxRect(rect.x * scale, rect.y * scale, rect.width * scale, rect.height * scale);
if (is_rad0(angle)) {
@@ -94,22 +94,22 @@ inline static bool transformEncodedRect(wxRect& rect, int& degrees, double scale
} else {
return false;
}
rect = wxRect(rect.x + bleed + img_offset, rect.y + bleed, rect.width, rect.height);
rect = wxRect(rect.x + offset_x, rect.y + offset_y, rect.width, rect.height);
if (degrees >= 360) degrees -= 360;
return true;
}
/// Retreive a rect encoded in a string, apply a transformation, then encode it back
inline static String transformEncodedRect(const String& rectString, double scale, Radians angle, double bleed, int img_width, int img_height, int img_offset) { ///< update the style before calling this
inline static String transformEncodedRect(const String& rectString, double scale, Radians angle, int offset_x, int offset_y, int img_width, int img_height) {
wxRect rect;
int degrees;
if (!decodeRectFromString(rectString, rect, degrees)) return _("");
if (!transformEncodedRect(rect, degrees, scale, angle, bleed, img_width, img_height, img_offset)) return _("");
if (!transformEncodedRect(rect, degrees, scale, angle, offset_x, offset_y, img_width, img_height)) return _("");
return encodeRectInWxString(rect, degrees);
}
/// Retreive all rects encoded in a string, apply a transformation, then encode them back
inline static String transformAllEncodedRects(const String& rectString, double scale, Radians angle, double bleed, int img_width, int img_height, int img_offset) { ///< update the style before calling this
inline static String transformAllEncodedRects(const String& rectString, double scale, Radians angle, int offset_x, int offset_y, int img_width, int img_height) {
wxRect rect;
int degrees;
size_t start = rectString.find(_("<mse-crop-data>"));
@@ -119,7 +119,9 @@ inline static String transformAllEncodedRects(const String& rectString, double s
while (start != String::npos) {
result = result + rectString.substr(end, start - end);
end = rectString.find(_("</mse-crop-data>"), start + 15);
result = result + transformEncodedRect(rectString.substr(start, end - start), scale, angle, bleed, img_width, img_height, img_offset);
if (end == String::npos) return rectString;
end += 16;
result = result + transformEncodedRect(rectString.substr(start, end - start), scale, angle, offset_x, offset_y, img_width, img_height);
start = rectString.find(_("<mse-crop-data>"), end);
}
result = result + rectString.substr(end);
@@ -127,8 +129,8 @@ inline static String transformAllEncodedRects(const String& rectString, double s
}
/// Apply a transformation to a rect, then encode it in a string
inline static std::string transformAndEncodeRectInString(wxRect rect, int degrees, double scale, Radians angle, double bleed, int img_width, int img_height, int img_offset) {
if (!transformEncodedRect(rect, degrees, scale, angle, bleed, img_width, img_height, img_offset)) return "";
inline static std::string transformAndEncodeRectInString(wxRect rect, int degrees, double scale, Radians angle, int offset_x, int offset_y, int img_width, int img_height) {
if (!transformEncodedRect(rect, degrees, scale, angle, offset_x, offset_y, img_width, img_height)) return "";
return encodeRectInStdString(rect, degrees);
}
+36 -7
View File
@@ -433,6 +433,11 @@ Image BleedEdgedImage::generate(const Options& opt) {
pixels[3 * pixel + 2] = pixels[3 * mirror + 2];
alpha[pixel] = alpha[mirror];
}
}
// transfer metadata
if (base_img.HasOption(wxIMAGE_OPTION_PNG_DESCRIPTION)) {
String desc = transformAllEncodedRects(base_img.GetOption(wxIMAGE_OPTION_PNG_DESCRIPTION), 1.0, 0.0, dw, dh, width, height);
img.SetOption(wxIMAGE_OPTION_PNG_DESCRIPTION, desc);
}
// done
return img;
@@ -460,13 +465,17 @@ Image InsertedImage::generate(const Options& opt) {
Image img = wxImage(width, height, false);
img.InitAlpha();
Byte* data = img.GetData();
Byte* alpha = img.GetAlpha();
Byte* alpha = img.GetAlpha();
Byte r = background_color.Red();
Byte g = background_color.Green();
Byte b = background_color.Blue();
Byte a = background_color.Alpha();
for (UInt i = 0; i < size; ++i) {
data[0] = background_color.Red();
data[1] = background_color.Green();
data[2] = background_color.Blue();
data[0] = r;
data[1] = g;
data[2] = b;
data += 3;
alpha[0] = background_color.Alpha();
alpha[0] = a;
alpha += 1;
}
img.Paste(base_img, base_x, base_y, wxIMAGE_ALPHA_BLEND_COMPOSE);
@@ -488,13 +497,33 @@ bool InsertedImage::operator == (const GeneratedImage& that) const {
// ----------------------------------------------------------------------------- : CropImage
Image CropImage::generate(const Options& opt) {
return image->generate(opt).Size(wxSize((int)width, (int)height), wxPoint(-(int)offset_x, -(int)offset_y));
UInt size = width * height;
Image img = wxImage(width, height, false);
img.InitAlpha();
Byte* data = img.GetData();
Byte* alpha = img.GetAlpha();
Byte r = background_color.Red();
Byte g = background_color.Green();
Byte b = background_color.Blue();
Byte a = background_color.Alpha();
for (UInt i = 0; i < size; ++i) {
data[0] = r;
data[1] = g;
data[2] = b;
data += 3;
alpha[0] = a;
alpha += 1;
}
Image base_img = image->generate(opt);
img.Paste(base_img, -(int)offset_x, -(int)offset_y, wxIMAGE_ALPHA_BLEND_OVER);
return img;
}
bool CropImage::operator == (const GeneratedImage& that) const {
const CropImage* that2 = dynamic_cast<const CropImage*>(&that);
return that2 && *image == *that2->image
&& width == that2->width && height == that2->height
&& offset_x == that2->offset_x && offset_y == that2->offset_y;
&& offset_x == that2->offset_x && offset_y == that2->offset_y
&& background_color == that2->background_color;
}
// ----------------------------------------------------------------------------- : DropShadowImage
+3 -2
View File
@@ -308,14 +308,15 @@ private:
/// Crop an image at a certain point, to a certain size
class CropImage : public SimpleFilterImage {
public:
inline CropImage(const GeneratedImageP& image, double width, double height, double offset_x, double offset_y)
: SimpleFilterImage(image), width(width), height(height), offset_x(offset_x), offset_y(offset_y)
inline CropImage(const GeneratedImageP& image, double width, double height, double offset_x, double offset_y, Color background_color)
: SimpleFilterImage(image), width(width), height(height), offset_x(offset_x), offset_y(offset_y), background_color(background_color)
{}
Image generate(const Options& opt) override;
bool operator == (const GeneratedImage& that) const override;
private:
double width, height;
double offset_x, offset_y;
Color background_color;
};
// ----------------------------------------------------------------------------- : StrokeImage
+15 -3
View File
@@ -8,6 +8,7 @@
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
#include <data/format/image_encoding.hpp>
// ----------------------------------------------------------------------------- : Implementation
@@ -38,6 +39,14 @@ Image rotate_image_impl(const Image& img) {
in += 1;
}
}
}
// transfer metadata
if (img.HasOption(wxIMAGE_OPTION_PNG_DESCRIPTION)) {
if (!almost_equal(Rotater::angle(), rad180)) {
swap(width, height);
}
String desc = transformAllEncodedRects(img.GetOption(wxIMAGE_OPTION_PNG_DESCRIPTION), 1.0, Rotater::angle(), 0, 0, width, height);
ret.SetOption(wxIMAGE_OPTION_PNG_DESCRIPTION, desc);
}
// ret is rotated image
return ret;
@@ -56,7 +65,8 @@ struct Rotate90deg {
int mx = y;
int my = w - x - 1;
return h * my + mx; // note: h, since that is the width of the target image
}
}
inline static Radians angle() { return rad90; }
};
struct Rotate180deg {
@@ -67,7 +77,8 @@ struct Rotate180deg {
UInt mx = w - x - 1;
UInt my = h - y - 1;
return w * my + mx;
}
}
inline static Radians angle() { return rad180; }
};
struct Rotate270deg {
@@ -78,7 +89,8 @@ struct Rotate270deg {
UInt mx = h - y - 1;
UInt my = x;
return h * my + mx;
}
}
inline static Radians angle() { return rad270; }
};
// ----------------------------------------------------------------------------- : Interface
+5 -1
View File
@@ -306,7 +306,11 @@ bool CardListBase::parseImage(Image& image, vector<CardP>& out) {
if (value && !value->filename.empty()) {
wxRect rect = wxRect(0,0,0,0);
int degrees = 0;
value->filename.getExternalRect(rect, degrees);
value->filename.getExternalRect(rect, degrees);
rect.x = max(0, rect.x);
rect.y = max(0, rect.y);
rect.width -= max(0, (rect.x + rect.width) - image.GetWidth());
rect.height -= max(0, (rect.y + rect.height) - image.GetHeight());
if (rect.width > 0 && rect.height > 0) {
Image img = image.GetSubImage(rect);
img = rotate_image(img, deg_to_rad(360-degrees));
+14 -1
View File
@@ -202,7 +202,8 @@ SCRIPT_FUNCTION(crop) {
SCRIPT_PARAM(int, height);
SCRIPT_PARAM(double, offset_x);
SCRIPT_PARAM(double, offset_y);
return make_intrusive<CropImage>(input, width, height, offset_x, offset_y);
SCRIPT_OPTIONAL_PARAM_(Color, background_color);
return make_intrusive<CropImage>(input, width, height, offset_x, offset_y, background_color);
}
SCRIPT_FUNCTION(flip_horizontal) {
@@ -215,6 +216,13 @@ SCRIPT_FUNCTION(flip_vertical) {
return make_intrusive<FlipImageVertical>(input);
}
SCRIPT_FUNCTION(flip_image) {
SCRIPT_PARAM_C(GeneratedImageP, input);
SCRIPT_PARAM(bool, horizontal);
if (horizontal) return make_intrusive<FlipImageHorizontal>(input);
else return make_intrusive<FlipImageVertical>(input);
}
SCRIPT_FUNCTION(rotate) {
SCRIPT_PARAM_C(GeneratedImageP, input);
SCRIPT_PARAM(Degrees, angle);
@@ -314,18 +322,23 @@ void init_script_image_functions(Context& ctx) {
ctx.setVariable(_("set_alpha"), script_set_alpha);
ctx.setVariable(_("set_combine"), script_set_combine);
ctx.setVariable(_("saturate"), script_saturate);
ctx.setVariable(_("saturate_image"), script_saturate);
ctx.setVariable(_("invert_image"), script_invert_image);
ctx.setVariable(_("recolor_image"), script_recolor_image);
ctx.setVariable(_("enlarge"), script_enlarge);
ctx.setVariable(_("enlarge_image"), script_enlarge);
ctx.setVariable(_("add_stroke_effect"),script_add_stroke_effect);
ctx.setVariable(_("add_bleed_edge"), script_add_bleed_edge);
ctx.setVariable(_("resize_image"), script_resize_image);
ctx.setVariable(_("crop"), script_crop);
ctx.setVariable(_("crop_image"), script_crop);
ctx.setVariable(_("flip_horizontal"), script_flip_horizontal);
ctx.setVariable(_("flip_vertical"), script_flip_vertical);
ctx.setVariable(_("flip_image"), script_flip_image);
ctx.setVariable(_("rotate"), script_rotate);
ctx.setVariable(_("rotate_image"), script_rotate);
ctx.setVariable(_("drop_shadow"), script_drop_shadow);
ctx.setVariable(_("add_drop_shadow"), script_drop_shadow);
ctx.setVariable(_("symbol_variation"), script_symbol_variation);
ctx.setVariable(_("built_in_image"), script_built_in_image);
ctx.setVariable(_("import_image"), script_import_image);