Skip to content

Commit 97042ce

Browse files
committed
feat: add layer_mode property to overlays and new transformation options
1 parent db0f71c commit 97042ce

4 files changed

Lines changed: 132 additions & 1 deletion

File tree

lib/imagekitio/helpers/helper.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,10 @@ def safe_get(obj, key)
626626

627627
# Add overlay properties like position, timing, transformations (matching Node.js)
628628
def add_overlay_properties(parts, overlay)
629+
# Add layer_mode property
630+
layer_mode = safe_get(overlay, :layer_mode)
631+
parts << "lm-#{layer_mode}" if layer_mode
632+
629633
# Add position properties
630634
position = safe_get(overlay, :position)
631635
if position

lib/imagekitio/helpers/transformation_utils.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ module TransformationUtils
8282
"unsharp_mask" => "e-usm",
8383
"unsharpMask" => "e-usm",
8484
"gradient" => "e-gradient",
85+
"color_replace" => "cr",
86+
"colorReplace" => "cr",
87+
"distort" => "e-distort",
8588

8689
# Other flags & finishing
8790
"progressive" => "pr",
@@ -109,6 +112,10 @@ module TransformationUtils
109112
"line_height" => "lh",
110113
"lineHeight" => "lh",
111114

115+
# Overlay transformations
116+
"layer_mode" => "lm",
117+
"layerMode" => "lm",
118+
112119
# Subtitles transformations
113120
"font_outline" => "fol",
114121
"fontOutline" => "fol",

test/imagekitio/custom-tests/url-generation/advanced_url_generation_test.rb

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,9 @@ def test_should_generate_the_correct_url_with_many_transformations_including_vid
431431
sharpen: 10.0,
432432
unsharp_mask: "2-2-0.8-0.024",
433433
gradient: "from-red_to-white",
434+
# New transformations
435+
color_replace: "FF0000_50_0000FF",
436+
distort: "p-100_50_200_150_300_250_400_350",
434437
original: true,
435438
page: "2_4",
436439
raw: "h-200,w-300,l-image,i-logo.png,l-end"
@@ -446,7 +449,27 @@ def test_should_generate_the_correct_url_with_many_transformations_including_vid
446449
)
447450
)
448451

449-
expected = "https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,ar-4-3,q-40,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,rt-90,bl-10,n-some_name,pr-true,lo-true,t-5,md-true,cp-true,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,fl-h,o-0.8,z-2,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-bgremove,e-contrast,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end"
452+
expected = "https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=h-300,w-400,ar-4-3,q-40,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,rt-90,bl-10,n-some_name,pr-true,lo-true,t-5,md-true,cp-true,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,fl-h,o-0.8,z-2,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-bgremove,e-contrast,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,cr-FF0000_50_0000FF,e-distort-p-100_50_200_150_300_250_400_350,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end"
453+
assert_equal(expected, url)
454+
end
455+
456+
def test_should_generate_the_correct_url_for_radius_with_string_value
457+
transformation = [
458+
Imagekitio::Models::Transformation.new(
459+
radius: "10_20_30_40"
460+
)
461+
]
462+
463+
url = @client.helper.build_url(
464+
Imagekitio::Models::SrcOptions.new(
465+
src: "/test_path1.jpg",
466+
url_endpoint: "https://ik.imagekit.io/test_url_endpoint",
467+
transformation_position: :query,
468+
transformation: transformation
469+
)
470+
)
471+
472+
expected = "https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=r-10_20_30_40"
450473
assert_equal(expected, url)
451474
end
452475

test/imagekitio/custom-tests/url-generation/overlay_test.rb

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,103 @@ def test_should_properly_encode_overlay_text_when_transformations_are_in_query_p
724724
assert_equal(expected, url)
725725
end
726726

727+
# Layer mode tests
728+
def test_should_generate_url_with_image_overlay_and_multiply_layer_mode
729+
transformation = [
730+
Imagekitio::Models::Transformation.new(
731+
overlay: Imagekitio::Models::ImageOverlay.new(
732+
input: "overlay.png",
733+
layer_mode: :multiply
734+
)
735+
)
736+
]
737+
738+
url = @client.helper.build_url(
739+
Imagekitio::Models::SrcOptions.new(
740+
src: "/base-image.jpg",
741+
url_endpoint: "https://ik.imagekit.io/test_url_endpoint",
742+
transformation_position: :path,
743+
transformation: transformation
744+
)
745+
)
746+
747+
expected = "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-overlay.png,lm-multiply,l-end/base-image.jpg"
748+
assert_equal(expected, url)
749+
end
750+
751+
def test_should_generate_url_with_image_overlay_and_displace_layer_mode
752+
transformation = [
753+
Imagekitio::Models::Transformation.new(
754+
overlay: Imagekitio::Models::ImageOverlay.new(
755+
input: "displacement-map.png",
756+
layer_mode: :displace,
757+
position: Imagekitio::Models::OverlayPosition.new(
758+
x: "10",
759+
y_: "20"
760+
)
761+
)
762+
)
763+
]
764+
765+
url = @client.helper.build_url(
766+
Imagekitio::Models::SrcOptions.new(
767+
src: "/base-image.jpg",
768+
url_endpoint: "https://ik.imagekit.io/test_url_endpoint",
769+
transformation_position: :path,
770+
transformation: transformation
771+
)
772+
)
773+
774+
expected = "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-displacement-map.png,lm-displace,lx-10,ly-20,l-end/base-image.jpg"
775+
assert_equal(expected, url)
776+
end
777+
778+
def test_should_generate_url_with_image_overlay_and_cutout_layer_mode
779+
transformation = [
780+
Imagekitio::Models::Transformation.new(
781+
overlay: Imagekitio::Models::ImageOverlay.new(
782+
input: "mask.png",
783+
layer_mode: :cutout
784+
)
785+
)
786+
]
787+
788+
url = @client.helper.build_url(
789+
Imagekitio::Models::SrcOptions.new(
790+
src: "/base-image.jpg",
791+
url_endpoint: "https://ik.imagekit.io/test_url_endpoint",
792+
transformation_position: :path,
793+
transformation: transformation
794+
)
795+
)
796+
797+
expected = "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-mask.png,lm-cutout,l-end/base-image.jpg"
798+
assert_equal(expected, url)
799+
end
800+
801+
def test_should_generate_url_with_image_overlay_and_cutter_layer_mode
802+
transformation = [
803+
Imagekitio::Models::Transformation.new(
804+
overlay: Imagekitio::Models::ImageOverlay.new(
805+
input: "shape.png",
806+
layer_mode: :cutter
807+
)
808+
)
809+
]
810+
811+
url = @client.helper.build_url(
812+
Imagekitio::Models::SrcOptions.new(
813+
src: "/base-image.jpg",
814+
url_endpoint: "https://ik.imagekit.io/test_url_endpoint",
815+
transformation_position: :path,
816+
transformation: transformation
817+
)
818+
)
819+
820+
expected = "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-shape.png,lm-cutter,l-end/base-image.jpg"
821+
assert_equal(expected, url)
822+
end
823+
727824
# Hash-based API test - verify that plain hashes work for overlays
728825
def test_should_work_with_plain_hashes_for_text_overlay
729826
# Using plain hashes for everything including overlay

0 commit comments

Comments
 (0)