emf-converter 4.6.5 → 4.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/browser.js CHANGED
@@ -28728,7 +28728,119 @@ var HOBBY = [
28728
28728
  [[8, -48], [-8, -48], [-24, -40], [-40, -24], [-48, -8], [-48, 8], [-40, 24], [-24, 40], [-8, 48], [8, 48], [24, 40], [40, 24], [48, 8], [48, -8], [40, -24], [24, -40]]
28729
28729
  ];
28730
28730
  var HOBBY_LIMIT = 104;
28731
- var FLAT_VECTOR_OFFSET = { 7: [0, 0.5], 8: [0, 0.5], 9: [0.5, 0.5], 10: [0.5, 0] };
28731
+ var FLAT_SECTOR_BIAS = {
28732
+ 7: [9, "cf..", "edededEdcDcdcd"],
28733
+ 8: [9, "dFee", "ededededbdbdbd"],
28734
+ 9: [9, "df..", "ddddddddbDbdbd"],
28735
+ 10: [9, "de..", "dededeDebEbebE"],
28736
+ 11: [9, "ce..", "eeeeeeEececece"],
28737
+ 12: [13, "ce..", "eeeeeeeeeeeececEcecece"],
28738
+ 13: [17, "ce..", "eeeeededdddddeDebebebdbdcdcdce"],
28739
+ 14: [17, "df..", "ddedeeeededeeeedcDcebebecececd"],
28740
+ 15: [17, "dF..", "ddedeeeeeeeedeDdbdbecececececd"],
28741
+ 16: [17, "ce..", "eeeededededeeeeececebebebebece"],
28742
+ 17: [17, "df..", "ddedededededdeddbdbebdbdbdbdcd"],
28743
+ 18: [17, "de..", "deeededeededeeEdcDcecdcdbebece"],
28744
+ 19: [17, "cf..", "ededeeeedddddeDebEbecdcdbebecd"],
28745
+ 20: [17, "ce..", "eeeeddddeeeeddDdbdbdcecebdbdce"],
28746
+ 21: [17, "dF..", "ddddededededddDdbdbdcdcdcdcdbd"],
28747
+ 22: [17, "ce..", "eeeededeeeeedeDebebececebebece"],
28748
+ 23: [17, "cf..", "edededededededEdcDcdcdcdcdcdcD"],
28749
+ 24: [17, "dF..", "ddddddddddddddDdbdbdbdbdbdbdbd"],
28750
+ 25: [17, "cE..", "eeeeededededeeEecEcecdcdcdcdce"],
28751
+ 26: [17, "cf..", "ededdedeededdedebEbecdcdbebecd"],
28752
+ 27: [17, "de..", "dedeededdedeededcDcdbebecdcdbe"],
28753
+ 28: [17, "cf..", "ededddddeeeedeDebEbebebecdcdcd"],
28754
+ 29: [17, "ce..", "eeeeeeeededededebebebebececece"],
28755
+ 30: [17, "dF..", "dddddedeeeeeedEdcdcdcecebebebd"],
28756
+ 31: [17, "de..", "dedeededededdeDebebecdcdcdcdbe"],
28757
+ 32: [17, "cf..", "ededdededdddeeeecEcebdbdbebecd"],
28758
+ 33: [17, "de..", "dedeeeeeededddDdbdbdcdcdcecebe"],
28759
+ 34: [17, "de..", "dedeeeeeddddedEdcdcdbdbdcecebe"],
28760
+ 35: [17, "cf..", "ededededdededeDebebebebecdcdcd"],
28761
+ 36: [17, "deee", "eeeeeeeeddddddDdcdcdcdcDbebebe"],
28762
+ 37: [17, "dF..", "dddddededededdDdbdbdcecececebd"],
28763
+ 38: [17, "ce..", "eeeeddddddddeeEececebdbdbdbdce"],
28764
+ 39: [17, "cF..", "ededddddddddededcdcdbdbDbdbdcd"],
28765
+ 40: [17, "de..", "dededededdddddddbdbdbdbdbebebe"],
28766
+ 41: [17, "ce..", "eeeeeeeeeeeeeeEececececececece"],
28767
+ 42: [17, "cf..", "ededeeeedddddedebebebdbdcececd"],
28768
+ 43: [17, "df..", "ddddeeeededeedEdcdcdbebececebd"],
28769
+ 44: [17, "cF..", "ededdedeededdeDebebecdcdbebecd"],
28770
+ 45: [17, "ce..", "eeeededededeeeeecEcebebebebece"],
28771
+ 46: [17, "dF..", "ddddededddddedEdcDcdcdcdbdbdbd"],
28772
+ 47: [17, "ce..", "dedededededededececececececece"],
28773
+ 48: [25, "cf..", "ededeeeeeeeeededeeeeeeEecececececdcdcececececd"],
28774
+ 49: [25, "cF..", "ededddddededeeeeededdeDebebecdcdcececdcdbdbdcd"],
28775
+ 50: [25, "ce..", "eeeeddddededdededededeDebebebebebEbecdcdbdbdce"],
28776
+ 51: [25, "ce..", "eeeeededddddeeeededeeeEececebebececebdbdcdcdce"],
28777
+ 52: [25, "ce..", "eeeededededeededededeeEecececdcdcdcdbebebebece"],
28778
+ 53: [25, "dF..", "ddedeeeedddddddddedeeeEdcdcebebebdbDbdbdcececd"],
28779
+ 54: [25, "dF..", "ddedddddededededdddddEDdbdbebdbdcdcdcdcdbdbdcd"],
28780
+ 55: [25, "dF..", "ddeddedeeeeeeeeedededeDdbdbebebebebebebebebecd"],
28781
+ 56: [25, "dE..", "deeeeeeeededeeeededeeEedcdcebebecececdcdcecece"],
28782
+ 57: [25, "de..", "deeedddddddddedeededeeEdcDcecDcdcececdcdbdbDce"],
28783
+ 58: [25, "dF..", "ddedddddeeeedddddedeeeEdcdcebebebdbdcecebdbdcd"],
28784
+ 59: [33, "cF..", "ededdedeededddddeeeeeeeedddddeDebebebdbdcecececebdbdcdcdbebecd"],
28785
+ 60: [33, "cf..", "ededeeeeededededddddeeeeeeeedeDebebececececebdbdcdcdcdcdcececd"],
28786
+ 61: [33, "ce..", "eeeeeeeeddddeeeeeeeeddddeeeeeeeececececebdbdcecececebdbdcecece"],
28787
+ 62: [33, "ce..", "eeeeddddeeeeededededeeeeddddeeEecEcebdbdcececdcdcdcdcecebdbdce"],
28788
+ 63: [33, "cf..", "ededededeeeededededeeeeeeeeeeeEececececececebebEbebecececdcdcd"],
28789
+ 64: [33, "cF..", "ededeeeedddddedeeeeededeeeeedeDebebececebebececebebebdbdcececd"],
28790
+ 65: [33, "df..", "ddedededededddddddddeeeeeeeedeDdbdbececececebdbdbdbdcdcdcdcdcd"],
28791
+ 66: [33, "de..", "deeeededdedeeeeedddddededddddeDdbdbebdbdbebecdcdbebebebecdcdce"],
28792
+ 67: [33, "de..", "deeeddddddddededdddddededdddeeEdcDcebdbdbebebdbdcdcdbdbdbdbdce"],
28793
+ 68: [33, "dE..", "deeeeeeeeeeeeeeeddddeeeeeeeeeeEdcdcececececebdbdcecececececece"],
28794
+ 69: [33, "df..", "ddedededdedeeeeeddddededededdeDdbdbecdcdcdcdbdbdcecebebecdcdcd"],
28795
+ 70: [33, "dF..", "ddeddddddddddddddededededddddeDdbdbebdbdbebebebebdbdbdbdbdbDcd"],
28796
+ 71: [33, "ce..", "eeeeddddeeeededeeeeededeededdeDebebecdcdbebececebebececebdbdce"],
28797
+ 72: [33, "ce..", "eeeededededeededededddddddddeeEececebdbdbdbdcdcdcdcdbebebebece"],
28798
+ 73: [33, "ce..", "eeeeededededddddededdedeeeeeeeEececececebebecdcdbdbdcdcDcdcdce"],
28799
+ 74: [33, "cf..", "ededddddededededededdededddddeDebebebdbdbebecdcDcdcdcdcdbdbdcd"],
28800
+ 75: [33, "cF..", "ededdededededdddddddeeeedddddeDebebebdbdcececdcdcdcdbebebebecd"],
28801
+ 76: [33, "ce..", "eeeeeeeeeeeeeeeeeeeededeeeeedeDebebececebebecececececececececE"],
28802
+ 77: [33, "ce..", "eeeeeeeedededddddededdddedededEdcDcdcdcdbdbdbebebdbdbebececece"],
28803
+ 78: [33, "de..", "dedeededdedededeeeeeeeeededeedEdcdcdbebececececebebebebecdcdbe"],
28804
+ 79: [33, "dF..", "ddddddddededdededdddeeeeedededEdcDcdcdcdcecebdbdbebecdcdbdbdbd"],
28805
+ 80: [33, "dF..", "dddddededdddeeeeddddddddededddDdbdbdcdcdbdbdbdbDcecebdbdbebEbd"],
28806
+ 81: [33, "de..", "dedeeeeeeeeededeededeeeedededdDdbdbdbebecececdcdbebececececebe"],
28807
+ 82: [33, "de..", "dedeededdedeededdedededeedededEdcdcdcdcdbebebebecdcdbebecdcDbe"],
28808
+ 83: [33, "de..", "dededededddddededdddeeeededeeeEececebebececebdbdbebebdbdbebebe"],
28809
+ 84: [33, "cF..", "ededddddeeeeddddeeeeeeeeededeeEecececdcdcecebebecdcdcecebdbdcd"],
28810
+ 85: [33, "cf..", "ededdddddededddddddddedeeeeedeDebebececebebebdbdbdbdbebebdbdcd"],
28811
+ 86: [33, "ce..", "eeeeededddddeeeeeeeedededededeDebebebebebebebebebebebdbdcdcdce"],
28812
+ 87: [33, "ce..", "eeeeddddeeeeddddddddeeeeddddeeeececebdbdcecebdbDbdbdcecebdbdce"],
28813
+ 88: [33, "ce..", "eeeedededdddeeeeededededededeeeecececdcdcdcdcdcdcecebdbdbebece"],
28814
+ 89: [33, "cF..", "ededeeeeddddddddededdedededeeeEecEcebebEbebecdcdbdbdbdbdcececd"],
28815
+ 90: [33, "dF..", "ddddededeeeeededeeeedededededdDdbdbdbebebEbecececdcdcececdcdbd"],
28816
+ 91: [33, "df..", "ddddeeeededededeededdddddededdDdbdbdbebebdbdcdcdbebebebececebd"],
28817
+ 92: [33, "de..", "dedededeededdddddededededdddedEdcdcdbdbdbebebebebdbdcdcdbebebe"],
28818
+ 93: [33, "de..", "dededddddddddedeededeeeeeeeeededcdcdcececececdcdbebebdbdbdbdbe"],
28819
+ 94: [33, "dF..", "ddddeeeeddddeeeeddddeeeededeedEdcDcdbebececebdbDcecebdbdcecebd"],
28820
+ 95: [33, "df..", "ddddddddededeeeedddddededdddddDdbdbDbdbdbebecdcdbebecdcdbdbdbd"],
28821
+ 96: [33, "cf..", "ededeeeededeeeeedededdddeeeedeDebebececebdbdbebececebebecececd"],
28822
+ 97: [33, "ce..", "eeeedededededededdddeeeedddddeDebebebdbdcEcebdbdbebebEbebebece"],
28823
+ 98: [33, "ce..", "eeeeededededeeeeeeeededededeeeEececebebebebecececececdcdcdcdce"],
28824
+ 99: [33, "cf..", "ededededddddddddddddededdedeeeEececebebecdcdbdbdbdbdbdbdcdcdcd"],
28825
+ 100: [33, "cf..", "ededdedeeeeededededeeeeeededdeDebebecdcdcecebebebebececebebecd"]
28826
+ };
28827
+ function sectorBias(code) {
28828
+ return code >= 97 ? (code - 97) / 2 - 1.5 : (code - 65) / 2 - 1.5 - 1 / 64;
28829
+ }
28830
+ var VERTICAL_STEP_EARLY = "120002002002002002202200200200200220220020000022222220000002222220000002222220000";
28831
+ var VERTICAL_STEP_FIRST = 7;
28832
+ function verticalSideOffset(width) {
28833
+ if (width < HOBBY_LIMIT || width > 1400) {
28834
+ return void 0;
28835
+ }
28836
+ let m = VERTICAL_STEP_FIRST;
28837
+ for (let i = 1; i < VERTICAL_STEP_EARLY.length; i++) {
28838
+ if (width >= 16 * (i + VERTICAL_STEP_FIRST) - 7 - +VERTICAL_STEP_EARLY[i]) {
28839
+ m = i + VERTICAL_STEP_FIRST;
28840
+ }
28841
+ }
28842
+ return 8 * m;
28843
+ }
28732
28844
  var penCache = /* @__PURE__ */ new Map();
28733
28845
  function penPolygon(width) {
28734
28846
  const cached = penCache.get(width);
@@ -28741,7 +28853,7 @@ function penPolygon(width) {
28741
28853
  pen = HOBBY[n - 1];
28742
28854
  } else {
28743
28855
  const rx = Math.ceil(width / 2);
28744
- const ry = 8 * Math.floor((width + 9) / 16);
28856
+ const ry = rx;
28745
28857
  const f = flattenBezierPath(ellipseBeziers(-rx, -ry, rx, ry));
28746
28858
  const half = [];
28747
28859
  for (let i = 0; i + 1 < f.length; i += 2) {
@@ -28807,13 +28919,20 @@ function perpendicularVectors(width, dx0, dy0) {
28807
28919
  const [B, hB, hS] = hP >= hN ? [P, hP, hN] : [N, hN, hP];
28808
28920
  const den = 2 * (bh - hB + (bh - hS));
28809
28921
  const w = den === 0 ? 0 : (hB - hS) / den;
28810
- const off = width % 16 === 0 && width >= HOBBY_LIMIT ? FLAT_VECTOR_OFFSET[width / 16] : void 0;
28811
- const sgn = best < n / 2 ? 1 : -1;
28812
- const ox = off ? sgn * off[0] : 0;
28813
- const oy = off ? sgn * off[1] : 0;
28814
28922
  const r = (v) => 8 * Math.floor((v + 4) / 8);
28815
28923
  const x = D[0] + (B[0] - D[0]) * w, y = D[1] + (B[1] - D[1]) * w;
28816
- const vx = r(x + 0.5 * Math.sign(dy) + ox), vy = r(y + 0.5 * Math.sign(dx) + oy);
28924
+ let cx = 0.5 * Math.sign(dy), cy = 0.5 * Math.sign(dx);
28925
+ const table = width % 16 === 0 ? FLAT_SECTOR_BIAS[width / 16] : void 0;
28926
+ if (table) {
28927
+ const key = best * 2 + (hP >= hN ? 0 : 1);
28928
+ const pair = key === 0 ? table[1].slice(0, 2) : key >= table[0] ? table[2].slice((key - table[0]) * 2, (key - table[0]) * 2 + 2) : "..";
28929
+ if (pair[0] !== ".") {
28930
+ cx = sectorBias(pair.charCodeAt(0));
28931
+ cy = sectorBias(pair.charCodeAt(1));
28932
+ }
28933
+ }
28934
+ const side = dx === 0 ? verticalSideOffset(width) : void 0;
28935
+ const vx = side === void 0 ? r(x + cx) : -side, vy = r(y + cy);
28817
28936
  return { v: flip ? [-vx, -vy] : [vx, vy], ray: flip ? [-x, -y] : [x, y] };
28818
28937
  }
28819
28938
  function squareExtension(width, dx, dy) {
@@ -29467,6 +29586,14 @@ function brushPaint2(rCtx) {
29467
29586
  ...state.bkMode === 1 && state.brushPattern?.kind === "hatch" ? { skip: hatchBackgroundMask(state.brushPattern.hatch) } : {}
29468
29587
  };
29469
29588
  }
29589
+ function withoutCurveTangents(path) {
29590
+ if (!path.figures.some((f) => f.tangents)) {
29591
+ return path;
29592
+ }
29593
+ const plain = new GdiRasterPath();
29594
+ plain.figures = path.figures.map((f) => ({ pts: f.pts, closed: f.closed, roundWiden: f.roundWiden }));
29595
+ return plain;
29596
+ }
29470
29597
  function layoutRasterPath(rCtx, path, boxShape = false) {
29471
29598
  if (!rCtx.wmfLayoutRtl || boxShape) return path;
29472
29599
  const shift = Math.round(16 * (rCtx.wholeDevicePixels?.[0] ?? 1));
@@ -29477,9 +29604,11 @@ function layoutRasterPath(rCtx, path, boxShape = false) {
29477
29604
  function paintRasterPath(rCtx, path, opts) {
29478
29605
  path = layoutRasterPath(rCtx, path, opts.rectangle || opts.roundPen);
29479
29606
  const { ctx, state } = rCtx;
29607
+ let filled = !!opts.filled;
29480
29608
  if (opts.fill) {
29481
29609
  const paint = brushPaint2(rCtx);
29482
29610
  if (paint) {
29611
+ filled = true;
29483
29612
  const fillPath = opts.fillPath ? layoutRasterPath(rCtx, opts.fillPath, opts.rectangle || opts.roundPen) : path;
29484
29613
  const spans = fillPathSpans(fillPath, !!opts.winding);
29485
29614
  paintSpansDeferred(rCtx, spans, paint, state.rop2);
@@ -29492,7 +29621,7 @@ function paintRasterPath(rCtx, path, opts) {
29492
29621
  if (!penIsWidened(rCtx)) {
29493
29622
  return false;
29494
29623
  }
29495
- const polys = widenPath(path, penWidenOptions(rCtx, opts));
29624
+ const polys = widenPath(filled ? withoutCurveTangents(path) : path, penWidenOptions(rCtx, opts));
29496
29625
  paintSpansDeferred(rCtx, fillPolygonSpans(polys, true), { kind: "solid", rgb: rgbOf(state.penColor) }, state.rop2);
29497
29626
  return true;
29498
29627
  }
@@ -29809,7 +29938,7 @@ function paintGdiShape(rCtx, shape) {
29809
29938
  return;
29810
29939
  }
29811
29940
  if ((cosmetic || penIsWidened(rCtx)) && (aliased || bitwise)) {
29812
- paintRasterPath(rCtx, getPath(), { fill: false, stroke: true, style: shape.style, rectangle: shape.rectangle, roundPen: shape.roundPen });
29941
+ paintRasterPath(rCtx, getPath(), { fill: false, stroke: true, style: shape.style, rectangle: shape.rectangle, roundPen: shape.roundPen, filled: !!shape.fill && state.brushStyle !== 1 });
29813
29942
  return;
29814
29943
  }
29815
29944
  const pattern = cosmeticPattern(rCtx);
@@ -38714,7 +38843,7 @@ function compatCorner(p, w, h, box) {
38714
38843
  if ((p.rCtx.state.penStyle & 15) === PS_INSIDEFRAME && !penIsCosmetic(p.rCtx)) {
38715
38844
  const penWidth = p.rCtx.state.penWidth * Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2])) * 16;
38716
38845
  const width = box.x1 - box.x0, height = box.y1 - box.y0;
38717
- return [Math.min(cw, width + penWidth) * width / (width + penWidth), Math.min(ch, height + penWidth) * height / (height + penWidth)];
38846
+ return [Math.floor(Math.min(cw, width + penWidth) * width / (width + penWidth)), Math.floor(Math.min(ch, height + penWidth) * height / (height + penWidth))];
38718
38847
  }
38719
38848
  if (!penIsNull(p) && penIsCosmetic(p.rCtx)) {
38720
38849
  const width = box.x1 - box.x0, height = box.y1 - box.y0;
package/dist/browser.mjs CHANGED
@@ -28726,7 +28726,119 @@ var HOBBY = [
28726
28726
  [[8, -48], [-8, -48], [-24, -40], [-40, -24], [-48, -8], [-48, 8], [-40, 24], [-24, 40], [-8, 48], [8, 48], [24, 40], [40, 24], [48, 8], [48, -8], [40, -24], [24, -40]]
28727
28727
  ];
28728
28728
  var HOBBY_LIMIT = 104;
28729
- var FLAT_VECTOR_OFFSET = { 7: [0, 0.5], 8: [0, 0.5], 9: [0.5, 0.5], 10: [0.5, 0] };
28729
+ var FLAT_SECTOR_BIAS = {
28730
+ 7: [9, "cf..", "edededEdcDcdcd"],
28731
+ 8: [9, "dFee", "ededededbdbdbd"],
28732
+ 9: [9, "df..", "ddddddddbDbdbd"],
28733
+ 10: [9, "de..", "dededeDebEbebE"],
28734
+ 11: [9, "ce..", "eeeeeeEececece"],
28735
+ 12: [13, "ce..", "eeeeeeeeeeeececEcecece"],
28736
+ 13: [17, "ce..", "eeeeededdddddeDebebebdbdcdcdce"],
28737
+ 14: [17, "df..", "ddedeeeededeeeedcDcebebecececd"],
28738
+ 15: [17, "dF..", "ddedeeeeeeeedeDdbdbecececececd"],
28739
+ 16: [17, "ce..", "eeeededededeeeeececebebebebece"],
28740
+ 17: [17, "df..", "ddedededededdeddbdbebdbdbdbdcd"],
28741
+ 18: [17, "de..", "deeededeededeeEdcDcecdcdbebece"],
28742
+ 19: [17, "cf..", "ededeeeedddddeDebEbecdcdbebecd"],
28743
+ 20: [17, "ce..", "eeeeddddeeeeddDdbdbdcecebdbdce"],
28744
+ 21: [17, "dF..", "ddddededededddDdbdbdcdcdcdcdbd"],
28745
+ 22: [17, "ce..", "eeeededeeeeedeDebebececebebece"],
28746
+ 23: [17, "cf..", "edededededededEdcDcdcdcdcdcdcD"],
28747
+ 24: [17, "dF..", "ddddddddddddddDdbdbdbdbdbdbdbd"],
28748
+ 25: [17, "cE..", "eeeeededededeeEecEcecdcdcdcdce"],
28749
+ 26: [17, "cf..", "ededdedeededdedebEbecdcdbebecd"],
28750
+ 27: [17, "de..", "dedeededdedeededcDcdbebecdcdbe"],
28751
+ 28: [17, "cf..", "ededddddeeeedeDebEbebebecdcdcd"],
28752
+ 29: [17, "ce..", "eeeeeeeededededebebebebececece"],
28753
+ 30: [17, "dF..", "dddddedeeeeeedEdcdcdcecebebebd"],
28754
+ 31: [17, "de..", "dedeededededdeDebebecdcdcdcdbe"],
28755
+ 32: [17, "cf..", "ededdededdddeeeecEcebdbdbebecd"],
28756
+ 33: [17, "de..", "dedeeeeeededddDdbdbdcdcdcecebe"],
28757
+ 34: [17, "de..", "dedeeeeeddddedEdcdcdbdbdcecebe"],
28758
+ 35: [17, "cf..", "ededededdededeDebebebebecdcdcd"],
28759
+ 36: [17, "deee", "eeeeeeeeddddddDdcdcdcdcDbebebe"],
28760
+ 37: [17, "dF..", "dddddededededdDdbdbdcecececebd"],
28761
+ 38: [17, "ce..", "eeeeddddddddeeEececebdbdbdbdce"],
28762
+ 39: [17, "cF..", "ededddddddddededcdcdbdbDbdbdcd"],
28763
+ 40: [17, "de..", "dededededdddddddbdbdbdbdbebebe"],
28764
+ 41: [17, "ce..", "eeeeeeeeeeeeeeEececececececece"],
28765
+ 42: [17, "cf..", "ededeeeedddddedebebebdbdcececd"],
28766
+ 43: [17, "df..", "ddddeeeededeedEdcdcdbebececebd"],
28767
+ 44: [17, "cF..", "ededdedeededdeDebebecdcdbebecd"],
28768
+ 45: [17, "ce..", "eeeededededeeeeecEcebebebebece"],
28769
+ 46: [17, "dF..", "ddddededddddedEdcDcdcdcdbdbdbd"],
28770
+ 47: [17, "ce..", "dedededededededececececececece"],
28771
+ 48: [25, "cf..", "ededeeeeeeeeededeeeeeeEecececececdcdcececececd"],
28772
+ 49: [25, "cF..", "ededddddededeeeeededdeDebebecdcdcececdcdbdbdcd"],
28773
+ 50: [25, "ce..", "eeeeddddededdededededeDebebebebebEbecdcdbdbdce"],
28774
+ 51: [25, "ce..", "eeeeededddddeeeededeeeEececebebececebdbdcdcdce"],
28775
+ 52: [25, "ce..", "eeeededededeededededeeEecececdcdcdcdbebebebece"],
28776
+ 53: [25, "dF..", "ddedeeeedddddddddedeeeEdcdcebebebdbDbdbdcececd"],
28777
+ 54: [25, "dF..", "ddedddddededededdddddEDdbdbebdbdcdcdcdcdbdbdcd"],
28778
+ 55: [25, "dF..", "ddeddedeeeeeeeeedededeDdbdbebebebebebebebebecd"],
28779
+ 56: [25, "dE..", "deeeeeeeededeeeededeeEedcdcebebecececdcdcecece"],
28780
+ 57: [25, "de..", "deeedddddddddedeededeeEdcDcecDcdcececdcdbdbDce"],
28781
+ 58: [25, "dF..", "ddedddddeeeedddddedeeeEdcdcebebebdbdcecebdbdcd"],
28782
+ 59: [33, "cF..", "ededdedeededddddeeeeeeeedddddeDebebebdbdcecececebdbdcdcdbebecd"],
28783
+ 60: [33, "cf..", "ededeeeeededededddddeeeeeeeedeDebebececececebdbdcdcdcdcdcececd"],
28784
+ 61: [33, "ce..", "eeeeeeeeddddeeeeeeeeddddeeeeeeeececececebdbdcecececebdbdcecece"],
28785
+ 62: [33, "ce..", "eeeeddddeeeeededededeeeeddddeeEecEcebdbdcececdcdcdcdcecebdbdce"],
28786
+ 63: [33, "cf..", "ededededeeeededededeeeeeeeeeeeEececececececebebEbebecececdcdcd"],
28787
+ 64: [33, "cF..", "ededeeeedddddedeeeeededeeeeedeDebebececebebececebebebdbdcececd"],
28788
+ 65: [33, "df..", "ddedededededddddddddeeeeeeeedeDdbdbececececebdbdbdbdcdcdcdcdcd"],
28789
+ 66: [33, "de..", "deeeededdedeeeeedddddededddddeDdbdbebdbdbebecdcdbebebebecdcdce"],
28790
+ 67: [33, "de..", "deeeddddddddededdddddededdddeeEdcDcebdbdbebebdbdcdcdbdbdbdbdce"],
28791
+ 68: [33, "dE..", "deeeeeeeeeeeeeeeddddeeeeeeeeeeEdcdcececececebdbdcecececececece"],
28792
+ 69: [33, "df..", "ddedededdedeeeeeddddededededdeDdbdbecdcdcdcdbdbdcecebebecdcdcd"],
28793
+ 70: [33, "dF..", "ddeddddddddddddddededededddddeDdbdbebdbdbebebebebdbdbdbdbdbDcd"],
28794
+ 71: [33, "ce..", "eeeeddddeeeededeeeeededeededdeDebebecdcdbebececebebececebdbdce"],
28795
+ 72: [33, "ce..", "eeeededededeededededddddddddeeEececebdbdbdbdcdcdcdcdbebebebece"],
28796
+ 73: [33, "ce..", "eeeeededededddddededdedeeeeeeeEececececebebecdcdbdbdcdcDcdcdce"],
28797
+ 74: [33, "cf..", "ededddddededededededdededddddeDebebebdbdbebecdcDcdcdcdcdbdbdcd"],
28798
+ 75: [33, "cF..", "ededdededededdddddddeeeedddddeDebebebdbdcececdcdcdcdbebebebecd"],
28799
+ 76: [33, "ce..", "eeeeeeeeeeeeeeeeeeeededeeeeedeDebebececebebecececececececececE"],
28800
+ 77: [33, "ce..", "eeeeeeeedededddddededdddedededEdcDcdcdcdbdbdbebebdbdbebececece"],
28801
+ 78: [33, "de..", "dedeededdedededeeeeeeeeededeedEdcdcdbebececececebebebebecdcdbe"],
28802
+ 79: [33, "dF..", "ddddddddededdededdddeeeeedededEdcDcdcdcdcecebdbdbebecdcdbdbdbd"],
28803
+ 80: [33, "dF..", "dddddededdddeeeeddddddddededddDdbdbdcdcdbdbdbdbDcecebdbdbebEbd"],
28804
+ 81: [33, "de..", "dedeeeeeeeeededeededeeeedededdDdbdbdbebecececdcdbebececececebe"],
28805
+ 82: [33, "de..", "dedeededdedeededdedededeedededEdcdcdcdcdbebebebecdcdbebecdcDbe"],
28806
+ 83: [33, "de..", "dededededddddededdddeeeededeeeEececebebececebdbdbebebdbdbebebe"],
28807
+ 84: [33, "cF..", "ededddddeeeeddddeeeeeeeeededeeEecececdcdcecebebecdcdcecebdbdcd"],
28808
+ 85: [33, "cf..", "ededdddddededddddddddedeeeeedeDebebececebebebdbdbdbdbebebdbdcd"],
28809
+ 86: [33, "ce..", "eeeeededddddeeeeeeeedededededeDebebebebebebebebebebebdbdcdcdce"],
28810
+ 87: [33, "ce..", "eeeeddddeeeeddddddddeeeeddddeeeececebdbdcecebdbDbdbdcecebdbdce"],
28811
+ 88: [33, "ce..", "eeeedededdddeeeeededededededeeeecececdcdcdcdcdcdcecebdbdbebece"],
28812
+ 89: [33, "cF..", "ededeeeeddddddddededdedededeeeEecEcebebEbebecdcdbdbdbdbdcececd"],
28813
+ 90: [33, "dF..", "ddddededeeeeededeeeedededededdDdbdbdbebebEbecececdcdcececdcdbd"],
28814
+ 91: [33, "df..", "ddddeeeededededeededdddddededdDdbdbdbebebdbdcdcdbebebebececebd"],
28815
+ 92: [33, "de..", "dedededeededdddddededededdddedEdcdcdbdbdbebebebebdbdcdcdbebebe"],
28816
+ 93: [33, "de..", "dededddddddddedeededeeeeeeeeededcdcdcececececdcdbebebdbdbdbdbe"],
28817
+ 94: [33, "dF..", "ddddeeeeddddeeeeddddeeeededeedEdcDcdbebececebdbDcecebdbdcecebd"],
28818
+ 95: [33, "df..", "ddddddddededeeeedddddededdddddDdbdbDbdbdbebecdcdbebecdcdbdbdbd"],
28819
+ 96: [33, "cf..", "ededeeeededeeeeedededdddeeeedeDebebececebdbdbebececebebecececd"],
28820
+ 97: [33, "ce..", "eeeedededededededdddeeeedddddeDebebebdbdcEcebdbdbebebEbebebece"],
28821
+ 98: [33, "ce..", "eeeeededededeeeeeeeededededeeeEececebebebebecececececdcdcdcdce"],
28822
+ 99: [33, "cf..", "ededededddddddddddddededdedeeeEececebebecdcdbdbdbdbdbdbdcdcdcd"],
28823
+ 100: [33, "cf..", "ededdedeeeeededededeeeeeededdeDebebecdcdcecebebebebececebebecd"]
28824
+ };
28825
+ function sectorBias(code) {
28826
+ return code >= 97 ? (code - 97) / 2 - 1.5 : (code - 65) / 2 - 1.5 - 1 / 64;
28827
+ }
28828
+ var VERTICAL_STEP_EARLY = "120002002002002002202200200200200220220020000022222220000002222220000002222220000";
28829
+ var VERTICAL_STEP_FIRST = 7;
28830
+ function verticalSideOffset(width) {
28831
+ if (width < HOBBY_LIMIT || width > 1400) {
28832
+ return void 0;
28833
+ }
28834
+ let m = VERTICAL_STEP_FIRST;
28835
+ for (let i = 1; i < VERTICAL_STEP_EARLY.length; i++) {
28836
+ if (width >= 16 * (i + VERTICAL_STEP_FIRST) - 7 - +VERTICAL_STEP_EARLY[i]) {
28837
+ m = i + VERTICAL_STEP_FIRST;
28838
+ }
28839
+ }
28840
+ return 8 * m;
28841
+ }
28730
28842
  var penCache = /* @__PURE__ */ new Map();
28731
28843
  function penPolygon(width) {
28732
28844
  const cached = penCache.get(width);
@@ -28739,7 +28851,7 @@ function penPolygon(width) {
28739
28851
  pen = HOBBY[n - 1];
28740
28852
  } else {
28741
28853
  const rx = Math.ceil(width / 2);
28742
- const ry = 8 * Math.floor((width + 9) / 16);
28854
+ const ry = rx;
28743
28855
  const f = flattenBezierPath(ellipseBeziers(-rx, -ry, rx, ry));
28744
28856
  const half = [];
28745
28857
  for (let i = 0; i + 1 < f.length; i += 2) {
@@ -28805,13 +28917,20 @@ function perpendicularVectors(width, dx0, dy0) {
28805
28917
  const [B, hB, hS] = hP >= hN ? [P, hP, hN] : [N, hN, hP];
28806
28918
  const den = 2 * (bh - hB + (bh - hS));
28807
28919
  const w = den === 0 ? 0 : (hB - hS) / den;
28808
- const off = width % 16 === 0 && width >= HOBBY_LIMIT ? FLAT_VECTOR_OFFSET[width / 16] : void 0;
28809
- const sgn = best < n / 2 ? 1 : -1;
28810
- const ox = off ? sgn * off[0] : 0;
28811
- const oy = off ? sgn * off[1] : 0;
28812
28920
  const r = (v) => 8 * Math.floor((v + 4) / 8);
28813
28921
  const x = D[0] + (B[0] - D[0]) * w, y = D[1] + (B[1] - D[1]) * w;
28814
- const vx = r(x + 0.5 * Math.sign(dy) + ox), vy = r(y + 0.5 * Math.sign(dx) + oy);
28922
+ let cx = 0.5 * Math.sign(dy), cy = 0.5 * Math.sign(dx);
28923
+ const table = width % 16 === 0 ? FLAT_SECTOR_BIAS[width / 16] : void 0;
28924
+ if (table) {
28925
+ const key = best * 2 + (hP >= hN ? 0 : 1);
28926
+ const pair = key === 0 ? table[1].slice(0, 2) : key >= table[0] ? table[2].slice((key - table[0]) * 2, (key - table[0]) * 2 + 2) : "..";
28927
+ if (pair[0] !== ".") {
28928
+ cx = sectorBias(pair.charCodeAt(0));
28929
+ cy = sectorBias(pair.charCodeAt(1));
28930
+ }
28931
+ }
28932
+ const side = dx === 0 ? verticalSideOffset(width) : void 0;
28933
+ const vx = side === void 0 ? r(x + cx) : -side, vy = r(y + cy);
28815
28934
  return { v: flip ? [-vx, -vy] : [vx, vy], ray: flip ? [-x, -y] : [x, y] };
28816
28935
  }
28817
28936
  function squareExtension(width, dx, dy) {
@@ -29465,6 +29584,14 @@ function brushPaint2(rCtx) {
29465
29584
  ...state.bkMode === 1 && state.brushPattern?.kind === "hatch" ? { skip: hatchBackgroundMask(state.brushPattern.hatch) } : {}
29466
29585
  };
29467
29586
  }
29587
+ function withoutCurveTangents(path) {
29588
+ if (!path.figures.some((f) => f.tangents)) {
29589
+ return path;
29590
+ }
29591
+ const plain = new GdiRasterPath();
29592
+ plain.figures = path.figures.map((f) => ({ pts: f.pts, closed: f.closed, roundWiden: f.roundWiden }));
29593
+ return plain;
29594
+ }
29468
29595
  function layoutRasterPath(rCtx, path, boxShape = false) {
29469
29596
  if (!rCtx.wmfLayoutRtl || boxShape) return path;
29470
29597
  const shift = Math.round(16 * (rCtx.wholeDevicePixels?.[0] ?? 1));
@@ -29475,9 +29602,11 @@ function layoutRasterPath(rCtx, path, boxShape = false) {
29475
29602
  function paintRasterPath(rCtx, path, opts) {
29476
29603
  path = layoutRasterPath(rCtx, path, opts.rectangle || opts.roundPen);
29477
29604
  const { ctx, state } = rCtx;
29605
+ let filled = !!opts.filled;
29478
29606
  if (opts.fill) {
29479
29607
  const paint = brushPaint2(rCtx);
29480
29608
  if (paint) {
29609
+ filled = true;
29481
29610
  const fillPath = opts.fillPath ? layoutRasterPath(rCtx, opts.fillPath, opts.rectangle || opts.roundPen) : path;
29482
29611
  const spans = fillPathSpans(fillPath, !!opts.winding);
29483
29612
  paintSpansDeferred(rCtx, spans, paint, state.rop2);
@@ -29490,7 +29619,7 @@ function paintRasterPath(rCtx, path, opts) {
29490
29619
  if (!penIsWidened(rCtx)) {
29491
29620
  return false;
29492
29621
  }
29493
- const polys = widenPath(path, penWidenOptions(rCtx, opts));
29622
+ const polys = widenPath(filled ? withoutCurveTangents(path) : path, penWidenOptions(rCtx, opts));
29494
29623
  paintSpansDeferred(rCtx, fillPolygonSpans(polys, true), { kind: "solid", rgb: rgbOf(state.penColor) }, state.rop2);
29495
29624
  return true;
29496
29625
  }
@@ -29807,7 +29936,7 @@ function paintGdiShape(rCtx, shape) {
29807
29936
  return;
29808
29937
  }
29809
29938
  if ((cosmetic || penIsWidened(rCtx)) && (aliased || bitwise)) {
29810
- paintRasterPath(rCtx, getPath(), { fill: false, stroke: true, style: shape.style, rectangle: shape.rectangle, roundPen: shape.roundPen });
29939
+ paintRasterPath(rCtx, getPath(), { fill: false, stroke: true, style: shape.style, rectangle: shape.rectangle, roundPen: shape.roundPen, filled: !!shape.fill && state.brushStyle !== 1 });
29811
29940
  return;
29812
29941
  }
29813
29942
  const pattern = cosmeticPattern(rCtx);
@@ -38712,7 +38841,7 @@ function compatCorner(p, w, h, box) {
38712
38841
  if ((p.rCtx.state.penStyle & 15) === PS_INSIDEFRAME && !penIsCosmetic(p.rCtx)) {
38713
38842
  const penWidth = p.rCtx.state.penWidth * Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2])) * 16;
38714
38843
  const width = box.x1 - box.x0, height = box.y1 - box.y0;
38715
- return [Math.min(cw, width + penWidth) * width / (width + penWidth), Math.min(ch, height + penWidth) * height / (height + penWidth)];
38844
+ return [Math.floor(Math.min(cw, width + penWidth) * width / (width + penWidth)), Math.floor(Math.min(ch, height + penWidth) * height / (height + penWidth))];
38716
38845
  }
38717
38846
  if (!penIsNull(p) && penIsCosmetic(p.rCtx)) {
38718
38847
  const width = box.x1 - box.x0, height = box.y1 - box.y0;
package/dist/index.js CHANGED
@@ -28729,7 +28729,119 @@ var HOBBY = [
28729
28729
  [[8, -48], [-8, -48], [-24, -40], [-40, -24], [-48, -8], [-48, 8], [-40, 24], [-24, 40], [-8, 48], [8, 48], [24, 40], [40, 24], [48, 8], [48, -8], [40, -24], [24, -40]]
28730
28730
  ];
28731
28731
  var HOBBY_LIMIT = 104;
28732
- var FLAT_VECTOR_OFFSET = { 7: [0, 0.5], 8: [0, 0.5], 9: [0.5, 0.5], 10: [0.5, 0] };
28732
+ var FLAT_SECTOR_BIAS = {
28733
+ 7: [9, "cf..", "edededEdcDcdcd"],
28734
+ 8: [9, "dFee", "ededededbdbdbd"],
28735
+ 9: [9, "df..", "ddddddddbDbdbd"],
28736
+ 10: [9, "de..", "dededeDebEbebE"],
28737
+ 11: [9, "ce..", "eeeeeeEececece"],
28738
+ 12: [13, "ce..", "eeeeeeeeeeeececEcecece"],
28739
+ 13: [17, "ce..", "eeeeededdddddeDebebebdbdcdcdce"],
28740
+ 14: [17, "df..", "ddedeeeededeeeedcDcebebecececd"],
28741
+ 15: [17, "dF..", "ddedeeeeeeeedeDdbdbecececececd"],
28742
+ 16: [17, "ce..", "eeeededededeeeeececebebebebece"],
28743
+ 17: [17, "df..", "ddedededededdeddbdbebdbdbdbdcd"],
28744
+ 18: [17, "de..", "deeededeededeeEdcDcecdcdbebece"],
28745
+ 19: [17, "cf..", "ededeeeedddddeDebEbecdcdbebecd"],
28746
+ 20: [17, "ce..", "eeeeddddeeeeddDdbdbdcecebdbdce"],
28747
+ 21: [17, "dF..", "ddddededededddDdbdbdcdcdcdcdbd"],
28748
+ 22: [17, "ce..", "eeeededeeeeedeDebebececebebece"],
28749
+ 23: [17, "cf..", "edededededededEdcDcdcdcdcdcdcD"],
28750
+ 24: [17, "dF..", "ddddddddddddddDdbdbdbdbdbdbdbd"],
28751
+ 25: [17, "cE..", "eeeeededededeeEecEcecdcdcdcdce"],
28752
+ 26: [17, "cf..", "ededdedeededdedebEbecdcdbebecd"],
28753
+ 27: [17, "de..", "dedeededdedeededcDcdbebecdcdbe"],
28754
+ 28: [17, "cf..", "ededddddeeeedeDebEbebebecdcdcd"],
28755
+ 29: [17, "ce..", "eeeeeeeededededebebebebececece"],
28756
+ 30: [17, "dF..", "dddddedeeeeeedEdcdcdcecebebebd"],
28757
+ 31: [17, "de..", "dedeededededdeDebebecdcdcdcdbe"],
28758
+ 32: [17, "cf..", "ededdededdddeeeecEcebdbdbebecd"],
28759
+ 33: [17, "de..", "dedeeeeeededddDdbdbdcdcdcecebe"],
28760
+ 34: [17, "de..", "dedeeeeeddddedEdcdcdbdbdcecebe"],
28761
+ 35: [17, "cf..", "ededededdededeDebebebebecdcdcd"],
28762
+ 36: [17, "deee", "eeeeeeeeddddddDdcdcdcdcDbebebe"],
28763
+ 37: [17, "dF..", "dddddededededdDdbdbdcecececebd"],
28764
+ 38: [17, "ce..", "eeeeddddddddeeEececebdbdbdbdce"],
28765
+ 39: [17, "cF..", "ededddddddddededcdcdbdbDbdbdcd"],
28766
+ 40: [17, "de..", "dededededdddddddbdbdbdbdbebebe"],
28767
+ 41: [17, "ce..", "eeeeeeeeeeeeeeEececececececece"],
28768
+ 42: [17, "cf..", "ededeeeedddddedebebebdbdcececd"],
28769
+ 43: [17, "df..", "ddddeeeededeedEdcdcdbebececebd"],
28770
+ 44: [17, "cF..", "ededdedeededdeDebebecdcdbebecd"],
28771
+ 45: [17, "ce..", "eeeededededeeeeecEcebebebebece"],
28772
+ 46: [17, "dF..", "ddddededddddedEdcDcdcdcdbdbdbd"],
28773
+ 47: [17, "ce..", "dedededededededececececececece"],
28774
+ 48: [25, "cf..", "ededeeeeeeeeededeeeeeeEecececececdcdcececececd"],
28775
+ 49: [25, "cF..", "ededddddededeeeeededdeDebebecdcdcececdcdbdbdcd"],
28776
+ 50: [25, "ce..", "eeeeddddededdededededeDebebebebebEbecdcdbdbdce"],
28777
+ 51: [25, "ce..", "eeeeededddddeeeededeeeEececebebececebdbdcdcdce"],
28778
+ 52: [25, "ce..", "eeeededededeededededeeEecececdcdcdcdbebebebece"],
28779
+ 53: [25, "dF..", "ddedeeeedddddddddedeeeEdcdcebebebdbDbdbdcececd"],
28780
+ 54: [25, "dF..", "ddedddddededededdddddEDdbdbebdbdcdcdcdcdbdbdcd"],
28781
+ 55: [25, "dF..", "ddeddedeeeeeeeeedededeDdbdbebebebebebebebebecd"],
28782
+ 56: [25, "dE..", "deeeeeeeededeeeededeeEedcdcebebecececdcdcecece"],
28783
+ 57: [25, "de..", "deeedddddddddedeededeeEdcDcecDcdcececdcdbdbDce"],
28784
+ 58: [25, "dF..", "ddedddddeeeedddddedeeeEdcdcebebebdbdcecebdbdcd"],
28785
+ 59: [33, "cF..", "ededdedeededddddeeeeeeeedddddeDebebebdbdcecececebdbdcdcdbebecd"],
28786
+ 60: [33, "cf..", "ededeeeeededededddddeeeeeeeedeDebebececececebdbdcdcdcdcdcececd"],
28787
+ 61: [33, "ce..", "eeeeeeeeddddeeeeeeeeddddeeeeeeeececececebdbdcecececebdbdcecece"],
28788
+ 62: [33, "ce..", "eeeeddddeeeeededededeeeeddddeeEecEcebdbdcececdcdcdcdcecebdbdce"],
28789
+ 63: [33, "cf..", "ededededeeeededededeeeeeeeeeeeEececececececebebEbebecececdcdcd"],
28790
+ 64: [33, "cF..", "ededeeeedddddedeeeeededeeeeedeDebebececebebececebebebdbdcececd"],
28791
+ 65: [33, "df..", "ddedededededddddddddeeeeeeeedeDdbdbececececebdbdbdbdcdcdcdcdcd"],
28792
+ 66: [33, "de..", "deeeededdedeeeeedddddededddddeDdbdbebdbdbebecdcdbebebebecdcdce"],
28793
+ 67: [33, "de..", "deeeddddddddededdddddededdddeeEdcDcebdbdbebebdbdcdcdbdbdbdbdce"],
28794
+ 68: [33, "dE..", "deeeeeeeeeeeeeeeddddeeeeeeeeeeEdcdcececececebdbdcecececececece"],
28795
+ 69: [33, "df..", "ddedededdedeeeeeddddededededdeDdbdbecdcdcdcdbdbdcecebebecdcdcd"],
28796
+ 70: [33, "dF..", "ddeddddddddddddddededededddddeDdbdbebdbdbebebebebdbdbdbdbdbDcd"],
28797
+ 71: [33, "ce..", "eeeeddddeeeededeeeeededeededdeDebebecdcdbebececebebececebdbdce"],
28798
+ 72: [33, "ce..", "eeeededededeededededddddddddeeEececebdbdbdbdcdcdcdcdbebebebece"],
28799
+ 73: [33, "ce..", "eeeeededededddddededdedeeeeeeeEececececebebecdcdbdbdcdcDcdcdce"],
28800
+ 74: [33, "cf..", "ededddddededededededdededddddeDebebebdbdbebecdcDcdcdcdcdbdbdcd"],
28801
+ 75: [33, "cF..", "ededdededededdddddddeeeedddddeDebebebdbdcececdcdcdcdbebebebecd"],
28802
+ 76: [33, "ce..", "eeeeeeeeeeeeeeeeeeeededeeeeedeDebebececebebecececececececececE"],
28803
+ 77: [33, "ce..", "eeeeeeeedededddddededdddedededEdcDcdcdcdbdbdbebebdbdbebececece"],
28804
+ 78: [33, "de..", "dedeededdedededeeeeeeeeededeedEdcdcdbebececececebebebebecdcdbe"],
28805
+ 79: [33, "dF..", "ddddddddededdededdddeeeeedededEdcDcdcdcdcecebdbdbebecdcdbdbdbd"],
28806
+ 80: [33, "dF..", "dddddededdddeeeeddddddddededddDdbdbdcdcdbdbdbdbDcecebdbdbebEbd"],
28807
+ 81: [33, "de..", "dedeeeeeeeeededeededeeeedededdDdbdbdbebecececdcdbebececececebe"],
28808
+ 82: [33, "de..", "dedeededdedeededdedededeedededEdcdcdcdcdbebebebecdcdbebecdcDbe"],
28809
+ 83: [33, "de..", "dededededddddededdddeeeededeeeEececebebececebdbdbebebdbdbebebe"],
28810
+ 84: [33, "cF..", "ededddddeeeeddddeeeeeeeeededeeEecececdcdcecebebecdcdcecebdbdcd"],
28811
+ 85: [33, "cf..", "ededdddddededddddddddedeeeeedeDebebececebebebdbdbdbdbebebdbdcd"],
28812
+ 86: [33, "ce..", "eeeeededddddeeeeeeeedededededeDebebebebebebebebebebebdbdcdcdce"],
28813
+ 87: [33, "ce..", "eeeeddddeeeeddddddddeeeeddddeeeececebdbdcecebdbDbdbdcecebdbdce"],
28814
+ 88: [33, "ce..", "eeeedededdddeeeeededededededeeeecececdcdcdcdcdcdcecebdbdbebece"],
28815
+ 89: [33, "cF..", "ededeeeeddddddddededdedededeeeEecEcebebEbebecdcdbdbdbdbdcececd"],
28816
+ 90: [33, "dF..", "ddddededeeeeededeeeedededededdDdbdbdbebebEbecececdcdcececdcdbd"],
28817
+ 91: [33, "df..", "ddddeeeededededeededdddddededdDdbdbdbebebdbdcdcdbebebebececebd"],
28818
+ 92: [33, "de..", "dedededeededdddddededededdddedEdcdcdbdbdbebebebebdbdcdcdbebebe"],
28819
+ 93: [33, "de..", "dededddddddddedeededeeeeeeeeededcdcdcececececdcdbebebdbdbdbdbe"],
28820
+ 94: [33, "dF..", "ddddeeeeddddeeeeddddeeeededeedEdcDcdbebececebdbDcecebdbdcecebd"],
28821
+ 95: [33, "df..", "ddddddddededeeeedddddededdddddDdbdbDbdbdbebecdcdbebecdcdbdbdbd"],
28822
+ 96: [33, "cf..", "ededeeeededeeeeedededdddeeeedeDebebececebdbdbebececebebecececd"],
28823
+ 97: [33, "ce..", "eeeedededededededdddeeeedddddeDebebebdbdcEcebdbdbebebEbebebece"],
28824
+ 98: [33, "ce..", "eeeeededededeeeeeeeededededeeeEececebebebebecececececdcdcdcdce"],
28825
+ 99: [33, "cf..", "ededededddddddddddddededdedeeeEececebebecdcdbdbdbdbdbdbdcdcdcd"],
28826
+ 100: [33, "cf..", "ededdedeeeeededededeeeeeededdeDebebecdcdcecebebebebececebebecd"]
28827
+ };
28828
+ function sectorBias(code) {
28829
+ return code >= 97 ? (code - 97) / 2 - 1.5 : (code - 65) / 2 - 1.5 - 1 / 64;
28830
+ }
28831
+ var VERTICAL_STEP_EARLY = "120002002002002002202200200200200220220020000022222220000002222220000002222220000";
28832
+ var VERTICAL_STEP_FIRST = 7;
28833
+ function verticalSideOffset(width) {
28834
+ if (width < HOBBY_LIMIT || width > 1400) {
28835
+ return void 0;
28836
+ }
28837
+ let m = VERTICAL_STEP_FIRST;
28838
+ for (let i = 1; i < VERTICAL_STEP_EARLY.length; i++) {
28839
+ if (width >= 16 * (i + VERTICAL_STEP_FIRST) - 7 - +VERTICAL_STEP_EARLY[i]) {
28840
+ m = i + VERTICAL_STEP_FIRST;
28841
+ }
28842
+ }
28843
+ return 8 * m;
28844
+ }
28733
28845
  var penCache = /* @__PURE__ */ new Map();
28734
28846
  function penPolygon(width) {
28735
28847
  const cached = penCache.get(width);
@@ -28742,7 +28854,7 @@ function penPolygon(width) {
28742
28854
  pen = HOBBY[n - 1];
28743
28855
  } else {
28744
28856
  const rx = Math.ceil(width / 2);
28745
- const ry = 8 * Math.floor((width + 9) / 16);
28857
+ const ry = rx;
28746
28858
  const f = flattenBezierPath(ellipseBeziers(-rx, -ry, rx, ry));
28747
28859
  const half = [];
28748
28860
  for (let i = 0; i + 1 < f.length; i += 2) {
@@ -28808,13 +28920,20 @@ function perpendicularVectors(width, dx0, dy0) {
28808
28920
  const [B, hB, hS] = hP >= hN ? [P, hP, hN] : [N, hN, hP];
28809
28921
  const den = 2 * (bh - hB + (bh - hS));
28810
28922
  const w = den === 0 ? 0 : (hB - hS) / den;
28811
- const off = width % 16 === 0 && width >= HOBBY_LIMIT ? FLAT_VECTOR_OFFSET[width / 16] : void 0;
28812
- const sgn = best < n / 2 ? 1 : -1;
28813
- const ox = off ? sgn * off[0] : 0;
28814
- const oy = off ? sgn * off[1] : 0;
28815
28923
  const r = (v) => 8 * Math.floor((v + 4) / 8);
28816
28924
  const x = D[0] + (B[0] - D[0]) * w, y = D[1] + (B[1] - D[1]) * w;
28817
- const vx = r(x + 0.5 * Math.sign(dy) + ox), vy = r(y + 0.5 * Math.sign(dx) + oy);
28925
+ let cx = 0.5 * Math.sign(dy), cy = 0.5 * Math.sign(dx);
28926
+ const table = width % 16 === 0 ? FLAT_SECTOR_BIAS[width / 16] : void 0;
28927
+ if (table) {
28928
+ const key = best * 2 + (hP >= hN ? 0 : 1);
28929
+ const pair = key === 0 ? table[1].slice(0, 2) : key >= table[0] ? table[2].slice((key - table[0]) * 2, (key - table[0]) * 2 + 2) : "..";
28930
+ if (pair[0] !== ".") {
28931
+ cx = sectorBias(pair.charCodeAt(0));
28932
+ cy = sectorBias(pair.charCodeAt(1));
28933
+ }
28934
+ }
28935
+ const side = dx === 0 ? verticalSideOffset(width) : void 0;
28936
+ const vx = side === void 0 ? r(x + cx) : -side, vy = r(y + cy);
28818
28937
  return { v: flip ? [-vx, -vy] : [vx, vy], ray: flip ? [-x, -y] : [x, y] };
28819
28938
  }
28820
28939
  function squareExtension(width, dx, dy) {
@@ -29468,6 +29587,14 @@ function brushPaint2(rCtx) {
29468
29587
  ...state.bkMode === 1 && state.brushPattern?.kind === "hatch" ? { skip: hatchBackgroundMask(state.brushPattern.hatch) } : {}
29469
29588
  };
29470
29589
  }
29590
+ function withoutCurveTangents(path) {
29591
+ if (!path.figures.some((f) => f.tangents)) {
29592
+ return path;
29593
+ }
29594
+ const plain = new GdiRasterPath();
29595
+ plain.figures = path.figures.map((f) => ({ pts: f.pts, closed: f.closed, roundWiden: f.roundWiden }));
29596
+ return plain;
29597
+ }
29471
29598
  function layoutRasterPath(rCtx, path, boxShape = false) {
29472
29599
  if (!rCtx.wmfLayoutRtl || boxShape) return path;
29473
29600
  const shift = Math.round(16 * (rCtx.wholeDevicePixels?.[0] ?? 1));
@@ -29478,9 +29605,11 @@ function layoutRasterPath(rCtx, path, boxShape = false) {
29478
29605
  function paintRasterPath(rCtx, path, opts) {
29479
29606
  path = layoutRasterPath(rCtx, path, opts.rectangle || opts.roundPen);
29480
29607
  const { ctx, state } = rCtx;
29608
+ let filled = !!opts.filled;
29481
29609
  if (opts.fill) {
29482
29610
  const paint = brushPaint2(rCtx);
29483
29611
  if (paint) {
29612
+ filled = true;
29484
29613
  const fillPath = opts.fillPath ? layoutRasterPath(rCtx, opts.fillPath, opts.rectangle || opts.roundPen) : path;
29485
29614
  const spans = fillPathSpans(fillPath, !!opts.winding);
29486
29615
  paintSpansDeferred(rCtx, spans, paint, state.rop2);
@@ -29493,7 +29622,7 @@ function paintRasterPath(rCtx, path, opts) {
29493
29622
  if (!penIsWidened(rCtx)) {
29494
29623
  return false;
29495
29624
  }
29496
- const polys = widenPath(path, penWidenOptions(rCtx, opts));
29625
+ const polys = widenPath(filled ? withoutCurveTangents(path) : path, penWidenOptions(rCtx, opts));
29497
29626
  paintSpansDeferred(rCtx, fillPolygonSpans(polys, true), { kind: "solid", rgb: rgbOf(state.penColor) }, state.rop2);
29498
29627
  return true;
29499
29628
  }
@@ -29810,7 +29939,7 @@ function paintGdiShape(rCtx, shape) {
29810
29939
  return;
29811
29940
  }
29812
29941
  if ((cosmetic || penIsWidened(rCtx)) && (aliased || bitwise)) {
29813
- paintRasterPath(rCtx, getPath(), { fill: false, stroke: true, style: shape.style, rectangle: shape.rectangle, roundPen: shape.roundPen });
29942
+ paintRasterPath(rCtx, getPath(), { fill: false, stroke: true, style: shape.style, rectangle: shape.rectangle, roundPen: shape.roundPen, filled: !!shape.fill && state.brushStyle !== 1 });
29814
29943
  return;
29815
29944
  }
29816
29945
  const pattern = cosmeticPattern(rCtx);
@@ -38715,7 +38844,7 @@ function compatCorner(p, w, h, box) {
38715
38844
  if ((p.rCtx.state.penStyle & 15) === PS_INSIDEFRAME && !penIsCosmetic(p.rCtx)) {
38716
38845
  const penWidth = p.rCtx.state.penWidth * Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2])) * 16;
38717
38846
  const width = box.x1 - box.x0, height = box.y1 - box.y0;
38718
- return [Math.min(cw, width + penWidth) * width / (width + penWidth), Math.min(ch, height + penWidth) * height / (height + penWidth)];
38847
+ return [Math.floor(Math.min(cw, width + penWidth) * width / (width + penWidth)), Math.floor(Math.min(ch, height + penWidth) * height / (height + penWidth))];
38719
38848
  }
38720
38849
  if (!penIsNull(p) && penIsCosmetic(p.rCtx)) {
38721
38850
  const width = box.x1 - box.x0, height = box.y1 - box.y0;
package/dist/index.mjs CHANGED
@@ -28727,7 +28727,119 @@ var HOBBY = [
28727
28727
  [[8, -48], [-8, -48], [-24, -40], [-40, -24], [-48, -8], [-48, 8], [-40, 24], [-24, 40], [-8, 48], [8, 48], [24, 40], [40, 24], [48, 8], [48, -8], [40, -24], [24, -40]]
28728
28728
  ];
28729
28729
  var HOBBY_LIMIT = 104;
28730
- var FLAT_VECTOR_OFFSET = { 7: [0, 0.5], 8: [0, 0.5], 9: [0.5, 0.5], 10: [0.5, 0] };
28730
+ var FLAT_SECTOR_BIAS = {
28731
+ 7: [9, "cf..", "edededEdcDcdcd"],
28732
+ 8: [9, "dFee", "ededededbdbdbd"],
28733
+ 9: [9, "df..", "ddddddddbDbdbd"],
28734
+ 10: [9, "de..", "dededeDebEbebE"],
28735
+ 11: [9, "ce..", "eeeeeeEececece"],
28736
+ 12: [13, "ce..", "eeeeeeeeeeeececEcecece"],
28737
+ 13: [17, "ce..", "eeeeededdddddeDebebebdbdcdcdce"],
28738
+ 14: [17, "df..", "ddedeeeededeeeedcDcebebecececd"],
28739
+ 15: [17, "dF..", "ddedeeeeeeeedeDdbdbecececececd"],
28740
+ 16: [17, "ce..", "eeeededededeeeeececebebebebece"],
28741
+ 17: [17, "df..", "ddedededededdeddbdbebdbdbdbdcd"],
28742
+ 18: [17, "de..", "deeededeededeeEdcDcecdcdbebece"],
28743
+ 19: [17, "cf..", "ededeeeedddddeDebEbecdcdbebecd"],
28744
+ 20: [17, "ce..", "eeeeddddeeeeddDdbdbdcecebdbdce"],
28745
+ 21: [17, "dF..", "ddddededededddDdbdbdcdcdcdcdbd"],
28746
+ 22: [17, "ce..", "eeeededeeeeedeDebebececebebece"],
28747
+ 23: [17, "cf..", "edededededededEdcDcdcdcdcdcdcD"],
28748
+ 24: [17, "dF..", "ddddddddddddddDdbdbdbdbdbdbdbd"],
28749
+ 25: [17, "cE..", "eeeeededededeeEecEcecdcdcdcdce"],
28750
+ 26: [17, "cf..", "ededdedeededdedebEbecdcdbebecd"],
28751
+ 27: [17, "de..", "dedeededdedeededcDcdbebecdcdbe"],
28752
+ 28: [17, "cf..", "ededddddeeeedeDebEbebebecdcdcd"],
28753
+ 29: [17, "ce..", "eeeeeeeededededebebebebececece"],
28754
+ 30: [17, "dF..", "dddddedeeeeeedEdcdcdcecebebebd"],
28755
+ 31: [17, "de..", "dedeededededdeDebebecdcdcdcdbe"],
28756
+ 32: [17, "cf..", "ededdededdddeeeecEcebdbdbebecd"],
28757
+ 33: [17, "de..", "dedeeeeeededddDdbdbdcdcdcecebe"],
28758
+ 34: [17, "de..", "dedeeeeeddddedEdcdcdbdbdcecebe"],
28759
+ 35: [17, "cf..", "ededededdededeDebebebebecdcdcd"],
28760
+ 36: [17, "deee", "eeeeeeeeddddddDdcdcdcdcDbebebe"],
28761
+ 37: [17, "dF..", "dddddededededdDdbdbdcecececebd"],
28762
+ 38: [17, "ce..", "eeeeddddddddeeEececebdbdbdbdce"],
28763
+ 39: [17, "cF..", "ededddddddddededcdcdbdbDbdbdcd"],
28764
+ 40: [17, "de..", "dededededdddddddbdbdbdbdbebebe"],
28765
+ 41: [17, "ce..", "eeeeeeeeeeeeeeEececececececece"],
28766
+ 42: [17, "cf..", "ededeeeedddddedebebebdbdcececd"],
28767
+ 43: [17, "df..", "ddddeeeededeedEdcdcdbebececebd"],
28768
+ 44: [17, "cF..", "ededdedeededdeDebebecdcdbebecd"],
28769
+ 45: [17, "ce..", "eeeededededeeeeecEcebebebebece"],
28770
+ 46: [17, "dF..", "ddddededddddedEdcDcdcdcdbdbdbd"],
28771
+ 47: [17, "ce..", "dedededededededececececececece"],
28772
+ 48: [25, "cf..", "ededeeeeeeeeededeeeeeeEecececececdcdcececececd"],
28773
+ 49: [25, "cF..", "ededddddededeeeeededdeDebebecdcdcececdcdbdbdcd"],
28774
+ 50: [25, "ce..", "eeeeddddededdededededeDebebebebebEbecdcdbdbdce"],
28775
+ 51: [25, "ce..", "eeeeededddddeeeededeeeEececebebececebdbdcdcdce"],
28776
+ 52: [25, "ce..", "eeeededededeededededeeEecececdcdcdcdbebebebece"],
28777
+ 53: [25, "dF..", "ddedeeeedddddddddedeeeEdcdcebebebdbDbdbdcececd"],
28778
+ 54: [25, "dF..", "ddedddddededededdddddEDdbdbebdbdcdcdcdcdbdbdcd"],
28779
+ 55: [25, "dF..", "ddeddedeeeeeeeeedededeDdbdbebebebebebebebebecd"],
28780
+ 56: [25, "dE..", "deeeeeeeededeeeededeeEedcdcebebecececdcdcecece"],
28781
+ 57: [25, "de..", "deeedddddddddedeededeeEdcDcecDcdcececdcdbdbDce"],
28782
+ 58: [25, "dF..", "ddedddddeeeedddddedeeeEdcdcebebebdbdcecebdbdcd"],
28783
+ 59: [33, "cF..", "ededdedeededddddeeeeeeeedddddeDebebebdbdcecececebdbdcdcdbebecd"],
28784
+ 60: [33, "cf..", "ededeeeeededededddddeeeeeeeedeDebebececececebdbdcdcdcdcdcececd"],
28785
+ 61: [33, "ce..", "eeeeeeeeddddeeeeeeeeddddeeeeeeeececececebdbdcecececebdbdcecece"],
28786
+ 62: [33, "ce..", "eeeeddddeeeeededededeeeeddddeeEecEcebdbdcececdcdcdcdcecebdbdce"],
28787
+ 63: [33, "cf..", "ededededeeeededededeeeeeeeeeeeEececececececebebEbebecececdcdcd"],
28788
+ 64: [33, "cF..", "ededeeeedddddedeeeeededeeeeedeDebebececebebececebebebdbdcececd"],
28789
+ 65: [33, "df..", "ddedededededddddddddeeeeeeeedeDdbdbececececebdbdbdbdcdcdcdcdcd"],
28790
+ 66: [33, "de..", "deeeededdedeeeeedddddededddddeDdbdbebdbdbebecdcdbebebebecdcdce"],
28791
+ 67: [33, "de..", "deeeddddddddededdddddededdddeeEdcDcebdbdbebebdbdcdcdbdbdbdbdce"],
28792
+ 68: [33, "dE..", "deeeeeeeeeeeeeeeddddeeeeeeeeeeEdcdcececececebdbdcecececececece"],
28793
+ 69: [33, "df..", "ddedededdedeeeeeddddededededdeDdbdbecdcdcdcdbdbdcecebebecdcdcd"],
28794
+ 70: [33, "dF..", "ddeddddddddddddddededededddddeDdbdbebdbdbebebebebdbdbdbdbdbDcd"],
28795
+ 71: [33, "ce..", "eeeeddddeeeededeeeeededeededdeDebebecdcdbebececebebececebdbdce"],
28796
+ 72: [33, "ce..", "eeeededededeededededddddddddeeEececebdbdbdbdcdcdcdcdbebebebece"],
28797
+ 73: [33, "ce..", "eeeeededededddddededdedeeeeeeeEececececebebecdcdbdbdcdcDcdcdce"],
28798
+ 74: [33, "cf..", "ededddddededededededdededddddeDebebebdbdbebecdcDcdcdcdcdbdbdcd"],
28799
+ 75: [33, "cF..", "ededdededededdddddddeeeedddddeDebebebdbdcececdcdcdcdbebebebecd"],
28800
+ 76: [33, "ce..", "eeeeeeeeeeeeeeeeeeeededeeeeedeDebebececebebecececececececececE"],
28801
+ 77: [33, "ce..", "eeeeeeeedededddddededdddedededEdcDcdcdcdbdbdbebebdbdbebececece"],
28802
+ 78: [33, "de..", "dedeededdedededeeeeeeeeededeedEdcdcdbebececececebebebebecdcdbe"],
28803
+ 79: [33, "dF..", "ddddddddededdededdddeeeeedededEdcDcdcdcdcecebdbdbebecdcdbdbdbd"],
28804
+ 80: [33, "dF..", "dddddededdddeeeeddddddddededddDdbdbdcdcdbdbdbdbDcecebdbdbebEbd"],
28805
+ 81: [33, "de..", "dedeeeeeeeeededeededeeeedededdDdbdbdbebecececdcdbebececececebe"],
28806
+ 82: [33, "de..", "dedeededdedeededdedededeedededEdcdcdcdcdbebebebecdcdbebecdcDbe"],
28807
+ 83: [33, "de..", "dededededddddededdddeeeededeeeEececebebececebdbdbebebdbdbebebe"],
28808
+ 84: [33, "cF..", "ededddddeeeeddddeeeeeeeeededeeEecececdcdcecebebecdcdcecebdbdcd"],
28809
+ 85: [33, "cf..", "ededdddddededddddddddedeeeeedeDebebececebebebdbdbdbdbebebdbdcd"],
28810
+ 86: [33, "ce..", "eeeeededddddeeeeeeeedededededeDebebebebebebebebebebebdbdcdcdce"],
28811
+ 87: [33, "ce..", "eeeeddddeeeeddddddddeeeeddddeeeececebdbdcecebdbDbdbdcecebdbdce"],
28812
+ 88: [33, "ce..", "eeeedededdddeeeeededededededeeeecececdcdcdcdcdcdcecebdbdbebece"],
28813
+ 89: [33, "cF..", "ededeeeeddddddddededdedededeeeEecEcebebEbebecdcdbdbdbdbdcececd"],
28814
+ 90: [33, "dF..", "ddddededeeeeededeeeedededededdDdbdbdbebebEbecececdcdcececdcdbd"],
28815
+ 91: [33, "df..", "ddddeeeededededeededdddddededdDdbdbdbebebdbdcdcdbebebebececebd"],
28816
+ 92: [33, "de..", "dedededeededdddddededededdddedEdcdcdbdbdbebebebebdbdcdcdbebebe"],
28817
+ 93: [33, "de..", "dededddddddddedeededeeeeeeeeededcdcdcececececdcdbebebdbdbdbdbe"],
28818
+ 94: [33, "dF..", "ddddeeeeddddeeeeddddeeeededeedEdcDcdbebececebdbDcecebdbdcecebd"],
28819
+ 95: [33, "df..", "ddddddddededeeeedddddededdddddDdbdbDbdbdbebecdcdbebecdcdbdbdbd"],
28820
+ 96: [33, "cf..", "ededeeeededeeeeedededdddeeeedeDebebececebdbdbebececebebecececd"],
28821
+ 97: [33, "ce..", "eeeedededededededdddeeeedddddeDebebebdbdcEcebdbdbebebEbebebece"],
28822
+ 98: [33, "ce..", "eeeeededededeeeeeeeededededeeeEececebebebebecececececdcdcdcdce"],
28823
+ 99: [33, "cf..", "ededededddddddddddddededdedeeeEececebebecdcdbdbdbdbdbdbdcdcdcd"],
28824
+ 100: [33, "cf..", "ededdedeeeeededededeeeeeededdeDebebecdcdcecebebebebececebebecd"]
28825
+ };
28826
+ function sectorBias(code) {
28827
+ return code >= 97 ? (code - 97) / 2 - 1.5 : (code - 65) / 2 - 1.5 - 1 / 64;
28828
+ }
28829
+ var VERTICAL_STEP_EARLY = "120002002002002002202200200200200220220020000022222220000002222220000002222220000";
28830
+ var VERTICAL_STEP_FIRST = 7;
28831
+ function verticalSideOffset(width) {
28832
+ if (width < HOBBY_LIMIT || width > 1400) {
28833
+ return void 0;
28834
+ }
28835
+ let m = VERTICAL_STEP_FIRST;
28836
+ for (let i = 1; i < VERTICAL_STEP_EARLY.length; i++) {
28837
+ if (width >= 16 * (i + VERTICAL_STEP_FIRST) - 7 - +VERTICAL_STEP_EARLY[i]) {
28838
+ m = i + VERTICAL_STEP_FIRST;
28839
+ }
28840
+ }
28841
+ return 8 * m;
28842
+ }
28731
28843
  var penCache = /* @__PURE__ */ new Map();
28732
28844
  function penPolygon(width) {
28733
28845
  const cached = penCache.get(width);
@@ -28740,7 +28852,7 @@ function penPolygon(width) {
28740
28852
  pen = HOBBY[n - 1];
28741
28853
  } else {
28742
28854
  const rx = Math.ceil(width / 2);
28743
- const ry = 8 * Math.floor((width + 9) / 16);
28855
+ const ry = rx;
28744
28856
  const f = flattenBezierPath(ellipseBeziers(-rx, -ry, rx, ry));
28745
28857
  const half = [];
28746
28858
  for (let i = 0; i + 1 < f.length; i += 2) {
@@ -28806,13 +28918,20 @@ function perpendicularVectors(width, dx0, dy0) {
28806
28918
  const [B, hB, hS] = hP >= hN ? [P, hP, hN] : [N, hN, hP];
28807
28919
  const den = 2 * (bh - hB + (bh - hS));
28808
28920
  const w = den === 0 ? 0 : (hB - hS) / den;
28809
- const off = width % 16 === 0 && width >= HOBBY_LIMIT ? FLAT_VECTOR_OFFSET[width / 16] : void 0;
28810
- const sgn = best < n / 2 ? 1 : -1;
28811
- const ox = off ? sgn * off[0] : 0;
28812
- const oy = off ? sgn * off[1] : 0;
28813
28921
  const r = (v) => 8 * Math.floor((v + 4) / 8);
28814
28922
  const x = D[0] + (B[0] - D[0]) * w, y = D[1] + (B[1] - D[1]) * w;
28815
- const vx = r(x + 0.5 * Math.sign(dy) + ox), vy = r(y + 0.5 * Math.sign(dx) + oy);
28923
+ let cx = 0.5 * Math.sign(dy), cy = 0.5 * Math.sign(dx);
28924
+ const table = width % 16 === 0 ? FLAT_SECTOR_BIAS[width / 16] : void 0;
28925
+ if (table) {
28926
+ const key = best * 2 + (hP >= hN ? 0 : 1);
28927
+ const pair = key === 0 ? table[1].slice(0, 2) : key >= table[0] ? table[2].slice((key - table[0]) * 2, (key - table[0]) * 2 + 2) : "..";
28928
+ if (pair[0] !== ".") {
28929
+ cx = sectorBias(pair.charCodeAt(0));
28930
+ cy = sectorBias(pair.charCodeAt(1));
28931
+ }
28932
+ }
28933
+ const side = dx === 0 ? verticalSideOffset(width) : void 0;
28934
+ const vx = side === void 0 ? r(x + cx) : -side, vy = r(y + cy);
28816
28935
  return { v: flip ? [-vx, -vy] : [vx, vy], ray: flip ? [-x, -y] : [x, y] };
28817
28936
  }
28818
28937
  function squareExtension(width, dx, dy) {
@@ -29466,6 +29585,14 @@ function brushPaint2(rCtx) {
29466
29585
  ...state.bkMode === 1 && state.brushPattern?.kind === "hatch" ? { skip: hatchBackgroundMask(state.brushPattern.hatch) } : {}
29467
29586
  };
29468
29587
  }
29588
+ function withoutCurveTangents(path) {
29589
+ if (!path.figures.some((f) => f.tangents)) {
29590
+ return path;
29591
+ }
29592
+ const plain = new GdiRasterPath();
29593
+ plain.figures = path.figures.map((f) => ({ pts: f.pts, closed: f.closed, roundWiden: f.roundWiden }));
29594
+ return plain;
29595
+ }
29469
29596
  function layoutRasterPath(rCtx, path, boxShape = false) {
29470
29597
  if (!rCtx.wmfLayoutRtl || boxShape) return path;
29471
29598
  const shift = Math.round(16 * (rCtx.wholeDevicePixels?.[0] ?? 1));
@@ -29476,9 +29603,11 @@ function layoutRasterPath(rCtx, path, boxShape = false) {
29476
29603
  function paintRasterPath(rCtx, path, opts) {
29477
29604
  path = layoutRasterPath(rCtx, path, opts.rectangle || opts.roundPen);
29478
29605
  const { ctx, state } = rCtx;
29606
+ let filled = !!opts.filled;
29479
29607
  if (opts.fill) {
29480
29608
  const paint = brushPaint2(rCtx);
29481
29609
  if (paint) {
29610
+ filled = true;
29482
29611
  const fillPath = opts.fillPath ? layoutRasterPath(rCtx, opts.fillPath, opts.rectangle || opts.roundPen) : path;
29483
29612
  const spans = fillPathSpans(fillPath, !!opts.winding);
29484
29613
  paintSpansDeferred(rCtx, spans, paint, state.rop2);
@@ -29491,7 +29620,7 @@ function paintRasterPath(rCtx, path, opts) {
29491
29620
  if (!penIsWidened(rCtx)) {
29492
29621
  return false;
29493
29622
  }
29494
- const polys = widenPath(path, penWidenOptions(rCtx, opts));
29623
+ const polys = widenPath(filled ? withoutCurveTangents(path) : path, penWidenOptions(rCtx, opts));
29495
29624
  paintSpansDeferred(rCtx, fillPolygonSpans(polys, true), { kind: "solid", rgb: rgbOf(state.penColor) }, state.rop2);
29496
29625
  return true;
29497
29626
  }
@@ -29808,7 +29937,7 @@ function paintGdiShape(rCtx, shape) {
29808
29937
  return;
29809
29938
  }
29810
29939
  if ((cosmetic || penIsWidened(rCtx)) && (aliased || bitwise)) {
29811
- paintRasterPath(rCtx, getPath(), { fill: false, stroke: true, style: shape.style, rectangle: shape.rectangle, roundPen: shape.roundPen });
29940
+ paintRasterPath(rCtx, getPath(), { fill: false, stroke: true, style: shape.style, rectangle: shape.rectangle, roundPen: shape.roundPen, filled: !!shape.fill && state.brushStyle !== 1 });
29812
29941
  return;
29813
29942
  }
29814
29943
  const pattern = cosmeticPattern(rCtx);
@@ -38713,7 +38842,7 @@ function compatCorner(p, w, h, box) {
38713
38842
  if ((p.rCtx.state.penStyle & 15) === PS_INSIDEFRAME && !penIsCosmetic(p.rCtx)) {
38714
38843
  const penWidth = p.rCtx.state.penWidth * Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2])) * 16;
38715
38844
  const width = box.x1 - box.x0, height = box.y1 - box.y0;
38716
- return [Math.min(cw, width + penWidth) * width / (width + penWidth), Math.min(ch, height + penWidth) * height / (height + penWidth)];
38845
+ return [Math.floor(Math.min(cw, width + penWidth) * width / (width + penWidth)), Math.floor(Math.min(ch, height + penWidth) * height / (height + penWidth))];
38717
38846
  }
38718
38847
  if (!penIsNull(p) && penIsCosmetic(p.rCtx)) {
38719
38848
  const width = box.x1 - box.x0, height = box.y1 - box.y0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emf-converter",
3
- "version": "4.6.5",
3
+ "version": "4.6.7",
4
4
  "description": "Convert EMF/WMF metafile binaries to PNG data URLs or SVG (markup, data URL, React/JSX)",
5
5
  "keywords": [
6
6
  "canvas",