Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(Path, Polyline): BREAKING Svg import - cleanup #8857

Merged
merged 22 commits into from May 7, 2023

Conversation

asturur
Copy link
Member

@asturur asturur commented Apr 23, 2023

Motivation

After fixing and investigating why SVG import was broken in #8879, a cleanup possibility was found.
We can remove the specific fromSVG import flag and the stroke offset correction from path parsing

Changes

creating Path/Polyon/Polyline with fromElement OUTSIDE the full svg parsing module will create different positioning, that is the same positioning that you would get using the constructor since now there is no more difference.
Is a breaking change, even if a good one in theory.

fromSVG one shot property is no more needed and is removed

@github-actions
Copy link
Contributor

github-actions bot commented Apr 23, 2023

Build Stats

file / KB (diff) bundled minified
fabric 902.813 (-0.477) 304.635 (-0.183)

'left',
'top'
);
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

had to unwind setBoundingBox in order to apply the correct code or i should have had setBoundingBox returning a point like path does, but if i remember correctly that is not something we want to do.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We really not to sit down and look at open PRs
I believe I fixed this somewhere already

@asturur asturur changed the title fix(Path, Polyline): Svg import fix fix(Path, Polyline): Issue 8856 Svg import fix Apr 23, 2023
@asturur
Copy link
Member Author

asturur commented Apr 23, 2023

Master:
image

image

image

this branch

... can't npm link on the website

@asturur
Copy link
Member Author

asturur commented Apr 23, 2023

this branch:
image

image

image

Everything seems in place

@asturur
Copy link
Member Author

asturur commented Apr 27, 2023

@ShaMan123 i merged the other PR on which there wasn't much to say. But if you can look at this we can see how we see this fix and if we want to open a task for a better fix.
If you don't have time is totally fine i just thought i would give another shout at it.

@ShaMan123
Copy link
Contributor

Did you try #8438?

@asturur
Copy link
Member Author

asturur commented Apr 27, 2023

That seems to me only addressing the non nice code of a setDimension returning a point, that is tangential at the issue here that we are setting the point in the wrong position when originX and originY are different from top/left. It also doens't fix polygon.
So i don't think is related no.

Copy link
Contributor

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let me check something

Comment on lines 80 to 86
if (this.fromSVG) {
// if coming from SVG just assign top and left, those will be fixed
// later by remove removeTransformMatrixForSvgParsing using the weird
// _findCenterFromElement.
// This is not clear and is probably wrong, but as of now it works in conjuction
// with that other parsing function
this.set({ left: pathTL.x, top: pathTL.y });
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't like this.
Can we instead handle the logic in fromElement and set the origin to left/top. Then prev logic should work

Comment on lines 120 to 123
this.set({
left: calculatedLeft,
top: calculatedTop,
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same
should be handled by fromElement
Especially since we want some day to extract all SVG logic to a standalone

'left',
'top'
);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We really not to sit down and look at open PRs
I believe I fixed this somewhere already

@ShaMan123
Copy link
Contributor

Did you try #8438?

It does fix this so it seems, the car test is flawless

@ShaMan123
Copy link
Contributor

Should should be closed in favor of #8438
Where is the gingerbread man svg?

@ShaMan123
Copy link
Contributor

I am not sure the test in #8438 covers what you have found , please double check with origin

@ShaMan123
Copy link
Contributor

I am thinking that originX/Y of a parsed path under a group should always be left/top regardless of anything

@ShaMan123
Copy link
Contributor

@asturur
Copy link
Member Author

asturur commented Apr 29, 2023

I am thinking that originX/Y of a parsed path under a group should always be left/top regardless of anything

No because that is a constrain that doesn't make sense. Is arbitrary. The only thing that should do is look as the SVG. You can't then work with objects that have different origins just because some come from SVG.

I will look and see if i can move the fix logic inside the fromElement, unless is too much extra code because i have basically redo what i do in constructor but in fromElement too.

The correct fix is probably in removeTransformMatrix code, but can't leave this broken too long.
I don't want to go back the easy way and revert a number of old PRs to fix this but not also get locked till i have time to look at a different solution.

@asturur
Copy link
Member Author

asturur commented Apr 29, 2023

try this ts-path...test-path-svg-import-under-group

Try this to do what? what should i try?

@asturur
Copy link
Member Author

asturur commented Apr 29, 2023

This half-way fix seems shaping better, but breaks gradients ( and probably patterns ).
If i can't fix gradients and patterns in a reasonabe amount of time i ll need to take the first fix.

@asturur
Copy link
Member Author

asturur commented Apr 29, 2023

Need to understand if the breakage of unit tests i have now are because tests are now wrong or if this is still wrong.
This is how i think the code should be.

  • svg parsing is independent of positioning becase it can find its own center from object svg data
  • positioning is center based instead of top,left so we can let go the strokeOffsetCorrection and so the fromSVG parameter

@asturur
Copy link
Member Author

asturur commented Apr 29, 2023

Yes, all the test failing have fromElement used outside the svg parser involved.
Before in order to use top and left as values, when the instance created from fromElement was created, the positioning was temporarly broken, waiting to be fixed from the svg parsing process.
Now is correct as soon as it is parsed, but i need to verify that visually for each case, so i will need some time.

@asturur
Copy link
Member Author

asturur commented Apr 29, 2023

Also Rect, Circle, Ellipse and Text are probably wrong when positioned from fromElement It doesn't really matter but if we can get them to work correctly better.

@ShaMan123
Copy link
Contributor

try this ts-path...test-path-svg-import-under-group

Try this to do what? what should i try?

test the svg import module

@ShaMan123
Copy link
Contributor

ShaMan123 commented Apr 29, 2023

Need to understand if the breakage of unit tests i have now are because tests are now wrong or if this is still wrong. This is how i think the code should be.

  • svg parsing is independent of positioning becase it can find its own center from object svg data
  • positioning is center based instead of top,left so we can let go the strokeOffsetCorrection and so the fromSVG parameter

Sounds good. Take into consideration that stroke offset correction will die out with #8767

@asturur asturur changed the title fix(Path, Polyline): Issue 8856 Svg import fix fix(Path, Polyline): Svg import - cleanup Apr 30, 2023
@asturur
Copy link
Member Author

asturur commented Apr 30, 2023

Ok at this point this is ready for me.
Maybe i will add a visual test that is more explanative than numbers.

@asturur asturur changed the title fix(Path, Polyline): Svg import - cleanup fix(Path, Polyline): BREAKING Svg import - cleanup Apr 30, 2023
@github-actions
Copy link
Contributor

github-actions bot commented Apr 30, 2023

Coverage after merging test-svg-import into master will be

83.72%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
index.node.ts7.69%100%0%14.29%17, 20, 23, 29, 32, 35
src
   ClassRegistry.ts100%100%100%100%
   Collection.ts94.71%94.64%86.67%97.09%101, 104, 207–208, 233–234
   CommonMethods.ts96.55%87.50%100%100%10
   Intersection.ts100%100%100%100%
   Observable.ts87.23%85.29%84.62%89.36%144–145, 170–171, 39–40, 48, 57, 91, 99
   Pattern.ts92.21%91.89%90%93.33%114, 138, 149, 158, 51
   Point.ts100%100%100%100%
   Shadow.ts98.36%95.65%100%100%178
   cache.ts97.06%90%100%100%57
   config.ts75%66.67%66.67%82.76%130, 138, 138, 138, 138, 138–140, 151–153
   constants.ts100%100%100%100%
   typedefs.ts100%100%100%100%
src/brushes
   BaseBrush.ts100%100%100%100%
   CircleBrush.ts0%0%0%0%100, 102–104, 113, 113, 113, 115, 117, 119–121, 123–126, 133–134, 141, 143, 28–29, 37–41, 45–49, 56–59, 67–71, 73, 81, 81, 81, 81, 81–82, 84, 84, 84–87, 89, 97–98
   PatternBrush.ts97.06%87.50%100%100%21
   PencilBrush.ts91.01%82.35%100%93.75%122–123, 152, 152–154, 176, 176, 276, 280, 285–286, 68–69, 84–85
   SprayBrush.ts0%0%0%0%100–101, 103–104, 112, 112, 112, 112, 112–113, 115–116, 123–124, 126, 128–132, 141, 145–146, 146, 154, 154, 154–157, 159–162, 166–167, 169, 171–174, 177, 184–185, 187, 189–190, 192, 199–200, 202–203, 206, 206, 213, 213, 217, 22–23, 25–27, 27, 27–29, 33, 42, 49, 56, 63, 70, 89–91, 99
src/canvas
   Canvas.ts78.98%77.54%81.67%79.60%1000–1001, 1001, 1001–1003, 1005–1006, 1006, 1006, 1008, 1016, 1016, 1016–1018, 1018, 1018, 1024–1025, 1033–1034, 1034, 1034–1035, 1040, 1042, 1073–1075, 1078–1079, 1083–1084, 1197–1199, 1202–1203, 1276, 1395, 1518, 1588, 162, 187, 296–297, 300–304, 309, 332–333, 338–343, 363, 363, 363–364, 364, 364–365, 37, 373, 378–379, 379, 379–380, 382, 391, 397–398, 398, 398, 41, 441, 449, 453, 453, 453–454, 456, 538–539, 539, 539–540, 546, 546, 546–548, 568, 570, 570, 570–571, 571, 571, 574, 574, 574–575, 578, 587–588, 590–591, 593, 593–594, 596–597, 609–610, 610, 610–611, 613–617, 623, 630, 670, 670, 670, 672, 674–678, 684, 690, 690, 690–691, 693, 696, 701, 714, 741, 741, 799–800, 800, 800–801, 803, 806–807, 807, 807–808, 810–811, 814, 814–816, 819–820, 890, 902, 909, 930, 962, 983–984
   SelectableCanvas.ts94.39%91.16%94.55%96.63%1112, 1112–1113, 1116, 1136, 1136, 1194, 1247–1248, 1269, 1277, 1402, 1404, 1406–1407, 511, 691–692, 694–695, 695, 695, 744–745, 806–807, 860–862, 894, 899–900, 927–928
   StaticCanvas.ts96.01%91.48%100%97.93%1128–1129, 1129, 1129–1130, 1250, 1260, 1314–1315, 1318, 1353–1354, 1431, 1440, 1440, 1444, 1444, 1491–1492, 1706–1707, 327–328, 345, 425–426, 428–429, 790, 802–803, 888
   TextEditingManager.ts100%100%100%100%
src/color
   Color.ts92.16%86.49%100%94.29%330–331, 335–336, 339–340, 58, 88–89, 89, 91, 91, 91–92, 94–95
   color_map.ts100%100%100%100%
   constants.ts100%100%100%100%
   util.ts100%100%100%100%
src/controls
   Control.ts93.90%88.89%90.91%97.73%235, 322, 322, 357
   changeWidth.ts100%100%100%100%
   commonControls.ts100%100%100%100%
   controlRendering.ts81.63%78%100%84.78%106, 111, 121, 121, 45, 50, 61, 61, 65–72, 81–82
   drag.ts100%100%100%100%
   polyControl.ts5.97%0%0%11.11%100, 105, 119, 119, 119, 119, 119, 121–124, 124, 127, 134, 17, 25–29, 29, 29, 29, 29, 29, 29, 29, 50–56, 56, 56, 56, 56, 58, 63–64, 66, 76, 82–83, 83, 83–84, 88–90, 90, 90, 90, 90, 92
   rotate.ts19.57%12.50%50%21.43%41, 45, 51, 51, 51–52, 55–57, 59, 59, 59, 59, 59–61, 61, 61–63, 65, 65, 65–67, 67, 67–68, 73, 73, 73–74, 76, 78, 80–81
   scale.ts93.57%92.94%100%93.67%129–130, 132–134, 148–149, 181–183, 42
   scaleSkew.ts78.79%64.29%100%85.71%27, 29, 29, 29, 31, 33, 35
   skew.ts91.03%79.31%100%97.67%130–131, 162–163, 170, 176, 178
   util.ts100%100%100%100%
   wrapWithFireEvent.ts100%100%100%100%
   wrapWithFixedAnchor.ts100%100%100%100%
src/env
   browser.ts84.21%77.78%50%100%14, 17
   index.ts100%100%100%100%
   node.ts76.92%50%66.67%88.24%27, 31–32, 32, 32
src/filters
   BaseFilter.ts21.93%22.81%32%19.05%106–109, 109, 109–110, 116, 116, 116–119, 137, 155, 169–174, 178–179, 179, 179–182, 182, 182,

@asturur
Copy link
Member Author

asturur commented Apr 30, 2023

Added small test that position polygon/path on a grid

@asturur
Copy link
Member Author

asturur commented Apr 30, 2023

@ShaMan123 in the test there is a green line, that is there to represent how broken is the line currently, and that probably will be fixed with the line clean up.

@asturur
Copy link
Member Author

asturur commented Apr 30, 2023

I won't do anything anymore here unless there are comment to address

@asturur asturur requested a review from ShaMan123 April 30, 2023 20:57
@asturur
Copy link
Member Author

asturur commented May 6, 2023

Those changes overlap with the SVG parse fromElement from callback to promise.
Those changes the position of the parsed path, the other the fact that the parsing is async and addressing tests will be a mess

@asturur
Copy link
Member Author

asturur commented May 6, 2023

Before line improvements:
image

After line improvements:
image

@asturur asturur changed the title fix(Path, Polyline): BREAKING Svg import - cleanup refactor(Path, Polyline): BREAKING Svg import - cleanup May 6, 2023
@ShaMan123
Copy link
Contributor

Well done!

Copy link
Contributor

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks good


var polygon = new fabric.Polygon(getPoints(), { strokeWidth: 2, originX: 'left', originY: 'top' });

assert.equal(polygon.left, 9);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ohh snapshot testing, I wish you were here!!

@asturur asturur merged commit d4eb484 into master May 7, 2023
18 checks passed
@asturur asturur deleted the test-svg-import branch May 7, 2023 14:56
@asturur asturur mentioned this pull request May 19, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants