abstract-image 3.1.3 → 3.2.3

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.
Files changed (188) hide show
  1. package/CHANGELOG.md +27 -21
  2. package/LICENSE +21 -21
  3. package/README.md +73 -71
  4. package/lib/__stories__/react-svg-export/example-1.stories.d.ts.map +1 -1
  5. package/lib/__stories__/react-svg-export/example-1.stories.js +1 -1
  6. package/lib/__stories__/react-svg-export/example-1.stories.js.map +1 -1
  7. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-ellipse.js +379 -379
  8. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-group.d.ts.map +1 -1
  9. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-group.js +124 -124
  10. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-group.js.map +1 -1
  11. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-line.js +55 -55
  12. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-polygon.js +89 -89
  13. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-polyline.js +79 -79
  14. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-rectangle.js +99 -99
  15. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text-growth-directions.d.ts.map +1 -1
  16. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text-growth-directions.js +139 -139
  17. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text-growth-directions.js.map +1 -1
  18. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text.d.ts.map +1 -1
  19. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text.js +64 -64
  20. package/lib/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text.js.map +1 -1
  21. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-ellipse.js +24 -24
  22. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-empty-text.d.ts.map +1 -1
  23. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-empty-text.js +27 -27
  24. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-empty-text.js.map +1 -1
  25. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-group.d.ts.map +1 -1
  26. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-group.js +32 -32
  27. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-group.js.map +1 -1
  28. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-line.js +20 -20
  29. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-polygon.js +34 -34
  30. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-polyline.js +26 -26
  31. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-rectangle.js +20 -20
  32. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text-growth-directions.d.ts.map +1 -1
  33. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text-growth-directions.js +63 -63
  34. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text-growth-directions.js.map +1 -1
  35. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text.d.ts.map +1 -1
  36. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text.js +27 -27
  37. package/lib/exporters/__tests__/eps-export-image/test-defs/eps-text.js.map +1 -1
  38. package/lib/exporters/__tests__/exception/react-svg-direction-exception.test.js +2 -2
  39. package/lib/exporters/__tests__/exception/react-svg-direction-exception.test.js.map +1 -1
  40. package/lib/exporters/__tests__/exception/svg-direction-exception.test.js +2 -2
  41. package/lib/exporters/__tests__/exception/svg-direction-exception.test.js.map +1 -1
  42. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-binary.js +1 -1
  43. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-binary.js.map +1 -1
  44. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-callback.d.ts.map +1 -1
  45. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-callback.js +1 -1
  46. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-callback.js.map +1 -1
  47. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-empty-text.d.ts.map +1 -1
  48. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-empty-text.js +1 -1
  49. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-empty-text.js.map +1 -1
  50. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-group.d.ts.map +1 -1
  51. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-group.js +1 -1
  52. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-group.js.map +1 -1
  53. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-subimage.d.ts.map +1 -1
  54. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-subimage.js +1 -1
  55. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-subimage.js.map +1 -1
  56. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-bold.d.ts +3 -0
  57. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-bold.d.ts.map +1 -0
  58. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-bold.js +35 -0
  59. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-bold.js.map +1 -0
  60. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-growth-directions.d.ts.map +1 -1
  61. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-growth-directions.js +4 -4
  62. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-growth-directions.js.map +1 -1
  63. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-italic.d.ts +3 -0
  64. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-italic.d.ts.map +1 -0
  65. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-italic.js +36 -0
  66. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-italic.js.map +1 -0
  67. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-sub.d.ts.map +1 -1
  68. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-sub.js +1 -1
  69. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-sub.js.map +1 -1
  70. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text.d.ts.map +1 -1
  71. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text.js +2 -2
  72. package/lib/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text.js.map +1 -1
  73. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-binary.js +2 -1
  74. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-binary.js.map +1 -1
  75. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-empty-text.d.ts.map +1 -1
  76. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-empty-text.js +1 -1
  77. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-empty-text.js.map +1 -1
  78. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-group.d.ts.map +1 -1
  79. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-group.js +1 -1
  80. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-group.js.map +1 -1
  81. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-bold.d.ts +3 -0
  82. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-bold.d.ts.map +1 -0
  83. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-bold.js +35 -0
  84. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-bold.js.map +1 -0
  85. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-growth-directions.d.ts.map +1 -1
  86. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-growth-directions.js +4 -4
  87. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-growth-directions.js.map +1 -1
  88. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-italic.d.ts +3 -0
  89. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-italic.d.ts.map +1 -0
  90. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-italic.js +36 -0
  91. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text-italic.js.map +1 -0
  92. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text.d.ts.map +1 -1
  93. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text.js +2 -2
  94. package/lib/exporters/__tests__/svg-export-image/test-defs/svg-text.js.map +1 -1
  95. package/lib/exporters/react-svg-export-image.js +4 -5
  96. package/lib/exporters/react-svg-export-image.js.map +1 -1
  97. package/lib/exporters/svg-export-image.d.ts.map +1 -1
  98. package/lib/exporters/svg-export-image.js +30 -35
  99. package/lib/exporters/svg-export-image.js.map +1 -1
  100. package/lib/model/component.d.ts +3 -2
  101. package/lib/model/component.d.ts.map +1 -1
  102. package/lib/model/component.js +12 -11
  103. package/lib/model/component.js.map +1 -1
  104. package/package.json +2 -2
  105. package/src/__stories__/react-svg-export/example-1.stories.tsx +54 -53
  106. package/src/__stories__/svg-export/example-1.stories.tsx +42 -42
  107. package/src/exporters/__tests__/dxf2d-export-image/export-test-def.ts +11 -11
  108. package/src/exporters/__tests__/dxf2d-export-image/export.test.tsx +13 -13
  109. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-ellipse.ts +405 -405
  110. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-group.ts +166 -165
  111. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-line.ts +80 -80
  112. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-polygon.ts +114 -114
  113. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-polyline.ts +103 -103
  114. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-rectangle.ts +125 -125
  115. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text-growth-directions.ts +214 -210
  116. package/src/exporters/__tests__/dxf2d-export-image/test-defs/dxf2d-text.ts +97 -96
  117. package/src/exporters/__tests__/eps-export-image/export-test-def.ts +11 -11
  118. package/src/exporters/__tests__/eps-export-image/export.test.tsx +13 -13
  119. package/src/exporters/__tests__/eps-export-image/test-defs/eps-ellipse.ts +50 -50
  120. package/src/exporters/__tests__/eps-export-image/test-defs/eps-empty-text.ts +60 -59
  121. package/src/exporters/__tests__/eps-export-image/test-defs/eps-group.ts +74 -73
  122. package/src/exporters/__tests__/eps-export-image/test-defs/eps-line.ts +45 -45
  123. package/src/exporters/__tests__/eps-export-image/test-defs/eps-polygon.ts +65 -65
  124. package/src/exporters/__tests__/eps-export-image/test-defs/eps-polyline.ts +58 -58
  125. package/src/exporters/__tests__/eps-export-image/test-defs/eps-rectangle.ts +46 -46
  126. package/src/exporters/__tests__/eps-export-image/test-defs/eps-text-growth-directions.ts +138 -134
  127. package/src/exporters/__tests__/eps-export-image/test-defs/eps-text.ts +60 -59
  128. package/src/exporters/__tests__/exception/png-unsupported.test.tsx +25 -25
  129. package/src/exporters/__tests__/exception/react-svg-direction-exception.test.tsx +65 -63
  130. package/src/exporters/__tests__/exception/svg-direction-exception.test.tsx +65 -63
  131. package/src/exporters/__tests__/png-export-image/export-test-def.ts +11 -11
  132. package/src/exporters/__tests__/png-export-image/export.test.tsx +13 -13
  133. package/src/exporters/__tests__/png-export-image/test-defs/png-createPNG.tsx +26 -26
  134. package/src/exporters/__tests__/react-svg-export-image/export-test-def.tsx +13 -13
  135. package/src/exporters/__tests__/react-svg-export-image/export.test.tsx +13 -13
  136. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-binary-png.tsx +27 -27
  137. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-binary.tsx +26 -26
  138. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-callback.tsx +60 -59
  139. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-ellipse.tsx +28 -28
  140. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-empty-text.tsx +35 -34
  141. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-group.tsx +44 -43
  142. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-line.tsx +26 -26
  143. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-polygon.tsx +32 -32
  144. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-polyline.tsx +33 -33
  145. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-rectangle.tsx +27 -27
  146. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-subimage.tsx +36 -35
  147. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-bold.tsx +50 -0
  148. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-growth-directions.tsx +80 -76
  149. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-italic.tsx +65 -0
  150. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text-sub.tsx +35 -34
  151. package/src/exporters/__tests__/react-svg-export-image/test-defs/react-svg-text.tsx +35 -34
  152. package/src/exporters/__tests__/svg-export-image/export-test-def.ts +11 -11
  153. package/src/exporters/__tests__/svg-export-image/export.test.tsx +13 -13
  154. package/src/exporters/__tests__/svg-export-image/test-defs/svg-binary.tsx +26 -26
  155. package/src/exporters/__tests__/svg-export-image/test-defs/svg-ellipse.ts +27 -27
  156. package/src/exporters/__tests__/svg-export-image/test-defs/svg-empty-text.ts +34 -33
  157. package/src/exporters/__tests__/svg-export-image/test-defs/svg-group.ts +44 -43
  158. package/src/exporters/__tests__/svg-export-image/test-defs/svg-line.ts +26 -26
  159. package/src/exporters/__tests__/svg-export-image/test-defs/svg-polygon.ts +32 -32
  160. package/src/exporters/__tests__/svg-export-image/test-defs/svg-polyline.ts +33 -33
  161. package/src/exporters/__tests__/svg-export-image/test-defs/svg-rectangle.ts +27 -27
  162. package/src/exporters/__tests__/svg-export-image/test-defs/svg-text-bold.ts +50 -0
  163. package/src/exporters/__tests__/svg-export-image/test-defs/svg-text-growth-directions.ts +80 -76
  164. package/src/exporters/__tests__/svg-export-image/test-defs/svg-text-italic.ts +65 -0
  165. package/src/exporters/__tests__/svg-export-image/test-defs/svg-text.ts +35 -34
  166. package/src/exporters/dxf2d-export-image.ts +218 -218
  167. package/src/exporters/eps-export-image.ts +154 -154
  168. package/src/exporters/index.ts +3 -3
  169. package/src/exporters/png-export-image.ts +12 -12
  170. package/src/exporters/react-svg-export-image.tsx +301 -298
  171. package/src/exporters/svg-export-image.ts +296 -334
  172. package/src/index.ts +11 -11
  173. package/src/model/__tests__/color/export-test-def.ts +13 -13
  174. package/src/model/__tests__/color/export.test.tsx +14 -14
  175. package/src/model/__tests__/color/test-defs/color-from-string.ts +46 -46
  176. package/src/model/__tests__/color/test-defs/color-to-string.ts +35 -35
  177. package/src/model/__tests__/color/test-defs/color-undefined-2.ts +8 -8
  178. package/src/model/__tests__/color/test-defs/color-undefined.ts +8 -8
  179. package/src/model/abstract-image.ts +25 -25
  180. package/src/model/color.ts +52 -52
  181. package/src/model/component.ts +266 -279
  182. package/src/model/index.ts +5 -5
  183. package/src/model/point.ts +11 -11
  184. package/src/model/size.ts +11 -11
  185. package/lib/exporters/__tests__/svg-export-image.test.d.ts +0 -2
  186. package/lib/exporters/__tests__/svg-export-image.test.d.ts.map +0 -1
  187. package/lib/exporters/__tests__/svg-export-image.test.js +0 -35
  188. package/lib/exporters/__tests__/svg-export-image.test.js.map +0 -1
@@ -1,154 +1,154 @@
1
- import * as AI from "../model/index";
2
- import * as R from "ramda";
3
-
4
- export function epsExportImage(root: AI.AbstractImage): string {
5
- return [
6
- "%!PS-Adobe-3.0 EPSF-3.0",
7
- `%%BoundingBox: 0 0 ${root.size.width} ${root.size.height}`,
8
- "/ellipse {7 dict begin",
9
- "/endangle exch def",
10
- "/startangle exch def",
11
- "/yradius exch def",
12
- "/xradius exch def",
13
- "/yC exch def",
14
- "/xC exch def",
15
- "/savematrix matrix currentmatrix def",
16
- "xC yC translate",
17
- "xradius yradius scale",
18
- "0 0 1 startangle endangle arc",
19
- "savematrix setmatrix",
20
- "end",
21
- "} def",
22
- ...R.unnest<string>(
23
- root.components.map(c => epsExportComponent(c, root.size.height))
24
- )
25
- ].join("\n");
26
- }
27
-
28
- function epsExportComponent(c: AI.Component, height: number): Array<string> {
29
- switch (c.type) {
30
- case "ellipse": {
31
- const cx = (c.topLeft.x + c.bottomRight.x) * 0.5;
32
- const cy = height - (c.topLeft.y + c.bottomRight.y) * 0.5;
33
- const rx = 0.5 * (c.bottomRight.x - c.topLeft.x);
34
- const ry = 0.5 * (c.bottomRight.y - c.topLeft.y);
35
- return [
36
- ...getColored(c.fillColor, [
37
- `${cx} ${cy} ${rx} ${ry} 0 360 ellipse`,
38
- "closepath",
39
- "fill"
40
- ]),
41
- ...getColored(c.strokeColor, [
42
- `${cx} ${cy} ${rx} ${ry} 0 360 ellipse`,
43
- "closepath",
44
- `${c.strokeThickness} setlinewidth`,
45
- "stroke"
46
- ])
47
- ];
48
- }
49
- case "group": {
50
- return R.unnest<string>(
51
- c.children.map(cc => epsExportComponent(cc, height))
52
- );
53
- }
54
- case "line": {
55
- return getColored(c.strokeColor, [
56
- `${c.start.x} ${height - c.start.y} moveto`,
57
- `${c.end.x} ${height - c.end.y} lineto`,
58
- `${c.strokeThickness} setlinewidth`,
59
- "stroke"
60
- ]);
61
- }
62
- case "polygon": {
63
- return [
64
- ...getColored(c.fillColor, [
65
- `${c.points[0].x} ${height - c.points[0].y} moveto`,
66
- ...c.points.map(p => `${p.x} ${height - p.y} lineto`),
67
- "closepath",
68
- `${c.strokeThickness} setlinewidth`,
69
- "fill"
70
- ]),
71
- ...getColored(c.strokeColor, [
72
- `${c.points[0].x} ${height - c.points[0].y} moveto`,
73
- ...c.points.map(p => `${p.x} ${height - p.y} lineto`),
74
- "closepath",
75
- "stroke"
76
- ])
77
- ];
78
- }
79
- case "polyline": {
80
- return getColored(c.strokeColor, [
81
- `${c.points[0].x} ${height - c.points[0].y} moveto`,
82
- ...c.points.map(p => `${p.x} ${height - p.y} lineto`),
83
- `${c.strokeThickness} setlinewidth`,
84
- "stroke"
85
- ]);
86
- }
87
- case "rectangle": {
88
- const w = c.bottomRight.x - c.topLeft.x;
89
- const h = c.bottomRight.y - c.topLeft.y;
90
- return [
91
- ...getColored(c.fillColor, [
92
- `${c.topLeft.x} ${height - c.bottomRight.y} ${w} ${h} rectfill`
93
- ]),
94
- ...getColored(c.strokeColor, [
95
- `${c.strokeThickness} setlinewidth`,
96
- `${c.topLeft.x} ${height - c.bottomRight.y} ${w} ${h} rectstroke`
97
- ])
98
- ];
99
- }
100
- case "text": {
101
- return getColored(c.textColor, [
102
- `gsave`,
103
- `/${c.fontFamily} findfont`,
104
- `${c.fontSize} scalefont setfont`,
105
- `${c.position.x} ${height - c.position.y} moveto`,
106
- getTextXOffset(c),
107
- getTextYOffset(c),
108
- `rmoveto`,
109
- `${-c.clockwiseRotationDegrees} rotate`,
110
- `(${c.text}) show`,
111
- `grestore`
112
- ]);
113
- }
114
- default:
115
- return [];
116
- }
117
- }
118
-
119
- function getTextXOffset(c: AI.Text): string {
120
- if (c.horizontalGrowthDirection === "left") {
121
- return `(${c.text}) stringwidth pop neg`;
122
- } else if (c.horizontalGrowthDirection === "uniform") {
123
- return `(${c.text}) stringwidth pop neg 0.5 mul`;
124
- } else {
125
- return `0`;
126
- }
127
- }
128
-
129
- function getTextYOffset(c: AI.Text): string {
130
- if (c.verticalGrowthDirection === "down") {
131
- return `gsave (${
132
- c.text
133
- }) true charpath pathbbox exch pop 3 -1 roll pop sub grestore`;
134
- } else if (c.verticalGrowthDirection === "uniform") {
135
- return `gsave (${
136
- c.text
137
- }) true charpath pathbbox exch pop 3 -1 roll pop sub 0.5 mul grestore`;
138
- } else {
139
- return `0`;
140
- }
141
- }
142
-
143
- function getColored(
144
- color: AI.Color,
145
- instructions: Array<string>
146
- ): Array<string> {
147
- if (color.a === 0) {
148
- return [];
149
- }
150
- return [
151
- `${color.r / 255} ${color.g / 255} ${color.b / 255} setrgbcolor`,
152
- ...instructions
153
- ];
154
- }
1
+ import * as AI from "../model/index";
2
+ import * as R from "ramda";
3
+
4
+ export function epsExportImage(root: AI.AbstractImage): string {
5
+ return [
6
+ "%!PS-Adobe-3.0 EPSF-3.0",
7
+ `%%BoundingBox: 0 0 ${root.size.width} ${root.size.height}`,
8
+ "/ellipse {7 dict begin",
9
+ "/endangle exch def",
10
+ "/startangle exch def",
11
+ "/yradius exch def",
12
+ "/xradius exch def",
13
+ "/yC exch def",
14
+ "/xC exch def",
15
+ "/savematrix matrix currentmatrix def",
16
+ "xC yC translate",
17
+ "xradius yradius scale",
18
+ "0 0 1 startangle endangle arc",
19
+ "savematrix setmatrix",
20
+ "end",
21
+ "} def",
22
+ ...R.unnest<string>(
23
+ root.components.map(c => epsExportComponent(c, root.size.height))
24
+ )
25
+ ].join("\n");
26
+ }
27
+
28
+ function epsExportComponent(c: AI.Component, height: number): Array<string> {
29
+ switch (c.type) {
30
+ case "ellipse": {
31
+ const cx = (c.topLeft.x + c.bottomRight.x) * 0.5;
32
+ const cy = height - (c.topLeft.y + c.bottomRight.y) * 0.5;
33
+ const rx = 0.5 * (c.bottomRight.x - c.topLeft.x);
34
+ const ry = 0.5 * (c.bottomRight.y - c.topLeft.y);
35
+ return [
36
+ ...getColored(c.fillColor, [
37
+ `${cx} ${cy} ${rx} ${ry} 0 360 ellipse`,
38
+ "closepath",
39
+ "fill"
40
+ ]),
41
+ ...getColored(c.strokeColor, [
42
+ `${cx} ${cy} ${rx} ${ry} 0 360 ellipse`,
43
+ "closepath",
44
+ `${c.strokeThickness} setlinewidth`,
45
+ "stroke"
46
+ ])
47
+ ];
48
+ }
49
+ case "group": {
50
+ return R.unnest<string>(
51
+ c.children.map(cc => epsExportComponent(cc, height))
52
+ );
53
+ }
54
+ case "line": {
55
+ return getColored(c.strokeColor, [
56
+ `${c.start.x} ${height - c.start.y} moveto`,
57
+ `${c.end.x} ${height - c.end.y} lineto`,
58
+ `${c.strokeThickness} setlinewidth`,
59
+ "stroke"
60
+ ]);
61
+ }
62
+ case "polygon": {
63
+ return [
64
+ ...getColored(c.fillColor, [
65
+ `${c.points[0].x} ${height - c.points[0].y} moveto`,
66
+ ...c.points.map(p => `${p.x} ${height - p.y} lineto`),
67
+ "closepath",
68
+ `${c.strokeThickness} setlinewidth`,
69
+ "fill"
70
+ ]),
71
+ ...getColored(c.strokeColor, [
72
+ `${c.points[0].x} ${height - c.points[0].y} moveto`,
73
+ ...c.points.map(p => `${p.x} ${height - p.y} lineto`),
74
+ "closepath",
75
+ "stroke"
76
+ ])
77
+ ];
78
+ }
79
+ case "polyline": {
80
+ return getColored(c.strokeColor, [
81
+ `${c.points[0].x} ${height - c.points[0].y} moveto`,
82
+ ...c.points.map(p => `${p.x} ${height - p.y} lineto`),
83
+ `${c.strokeThickness} setlinewidth`,
84
+ "stroke"
85
+ ]);
86
+ }
87
+ case "rectangle": {
88
+ const w = c.bottomRight.x - c.topLeft.x;
89
+ const h = c.bottomRight.y - c.topLeft.y;
90
+ return [
91
+ ...getColored(c.fillColor, [
92
+ `${c.topLeft.x} ${height - c.bottomRight.y} ${w} ${h} rectfill`
93
+ ]),
94
+ ...getColored(c.strokeColor, [
95
+ `${c.strokeThickness} setlinewidth`,
96
+ `${c.topLeft.x} ${height - c.bottomRight.y} ${w} ${h} rectstroke`
97
+ ])
98
+ ];
99
+ }
100
+ case "text": {
101
+ return getColored(c.textColor, [
102
+ `gsave`,
103
+ `/${c.fontFamily} findfont`,
104
+ `${c.fontSize} scalefont setfont`,
105
+ `${c.position.x} ${height - c.position.y} moveto`,
106
+ getTextXOffset(c),
107
+ getTextYOffset(c),
108
+ `rmoveto`,
109
+ `${-c.clockwiseRotationDegrees} rotate`,
110
+ `(${c.text}) show`,
111
+ `grestore`
112
+ ]);
113
+ }
114
+ default:
115
+ return [];
116
+ }
117
+ }
118
+
119
+ function getTextXOffset(c: AI.Text): string {
120
+ if (c.horizontalGrowthDirection === "left") {
121
+ return `(${c.text}) stringwidth pop neg`;
122
+ } else if (c.horizontalGrowthDirection === "uniform") {
123
+ return `(${c.text}) stringwidth pop neg 0.5 mul`;
124
+ } else {
125
+ return `0`;
126
+ }
127
+ }
128
+
129
+ function getTextYOffset(c: AI.Text): string {
130
+ if (c.verticalGrowthDirection === "down") {
131
+ return `gsave (${
132
+ c.text
133
+ }) true charpath pathbbox exch pop 3 -1 roll pop sub grestore`;
134
+ } else if (c.verticalGrowthDirection === "uniform") {
135
+ return `gsave (${
136
+ c.text
137
+ }) true charpath pathbbox exch pop 3 -1 roll pop sub 0.5 mul grestore`;
138
+ } else {
139
+ return `0`;
140
+ }
141
+ }
142
+
143
+ function getColored(
144
+ color: AI.Color,
145
+ instructions: Array<string>
146
+ ): Array<string> {
147
+ if (color.a === 0) {
148
+ return [];
149
+ }
150
+ return [
151
+ `${color.r / 255} ${color.g / 255} ${color.b / 255} setrgbcolor`,
152
+ ...instructions
153
+ ];
154
+ }
@@ -1,3 +1,3 @@
1
- export * from "./svg-export-image";
2
- export * from "./png-export-image";
3
- export * from "./dxf2d-export-image";
1
+ export * from "./svg-export-image";
2
+ export * from "./png-export-image";
3
+ export * from "./dxf2d-export-image";
@@ -1,12 +1,12 @@
1
- import * as AbstractImage from "../model/index";
2
-
3
- export function createPNG(image: AbstractImage.AbstractImage): Uint8Array {
4
- if (image.components.length !== 1) {
5
- throw new Error("Not supported!");
6
- }
7
- const component = image.components[0];
8
- if (component.type === "binaryimage" && component.format === "png") {
9
- return component.data;
10
- }
11
- throw new Error("Not supported!");
12
- }
1
+ import * as AbstractImage from "../model/index";
2
+
3
+ export function createPNG(image: AbstractImage.AbstractImage): Uint8Array {
4
+ if (image.components.length !== 1) {
5
+ throw new Error("Not supported!");
6
+ }
7
+ const component = image.components[0];
8
+ if (component.type === "binaryimage" && component.format === "png") {
9
+ return component.data;
10
+ }
11
+ throw new Error("Not supported!");
12
+ }