@rian8337/osu-strain-graph-generator 1.4.17 → 2.0.0-alpha.14

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/index.js CHANGED
@@ -1,8 +1,318 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const osu_base_1 = require("@rian8337/osu-base");
4
- const canvas_1 = require("canvas");
5
- const Chart_1 = require("./Chart");
1
+ 'use strict';
2
+
3
+ var osuBase = require('@rian8337/osu-base');
4
+ var canvas = require('canvas');
5
+
6
+ /**
7
+ * Utility to draw a graph with only node-canvas.
8
+ *
9
+ * Used for creating strain graph of beatmaps.
10
+ */
11
+ class Chart {
12
+ /**
13
+ * The canvas instance of this chart.
14
+ */
15
+ canvas;
16
+ /**
17
+ * The 2D rendering surface for the drawing surface of this chart.
18
+ */
19
+ context;
20
+ graphWidth;
21
+ graphHeight;
22
+ minX;
23
+ minY;
24
+ maxX;
25
+ maxY;
26
+ unitsPerTickX;
27
+ unitsPerTickY;
28
+ background;
29
+ xLabel;
30
+ yLabel;
31
+ xValueType;
32
+ yValueType;
33
+ pointRadius;
34
+ padding = 10;
35
+ tickSize = 10;
36
+ axisColor = "#555";
37
+ font = "12pt Calibri";
38
+ axisLabelFont = "bold 11pt Calibri";
39
+ fontHeight = 12;
40
+ baseLabelOffset = 15;
41
+ rangeX;
42
+ rangeY;
43
+ numXTicks;
44
+ numYTicks;
45
+ x;
46
+ y;
47
+ width;
48
+ height;
49
+ scaleX;
50
+ scaleY;
51
+ /**
52
+ * @param values Initializer options for the graph.
53
+ */
54
+ constructor(values) {
55
+ this.graphWidth = values.graphWidth;
56
+ this.graphHeight = values.graphHeight;
57
+ this.canvas = canvas.createCanvas(this.graphWidth, this.graphHeight);
58
+ this.context = this.canvas.getContext("2d");
59
+ this.minX = values.minX;
60
+ this.minY = values.minY;
61
+ this.maxX = values.maxX;
62
+ this.maxY = values.maxY;
63
+ this.unitsPerTickX = values.unitsPerTickX;
64
+ this.unitsPerTickY = values.unitsPerTickY;
65
+ this.background = values.background;
66
+ this.xLabel = values.xLabel;
67
+ this.yLabel = values.yLabel;
68
+ this.xValueType = values.xValueType;
69
+ this.yValueType = values.yValueType;
70
+ this.pointRadius = Math.max(0, values.pointRadius ?? 1);
71
+ // Relationships
72
+ this.rangeX = this.maxX - this.minX;
73
+ this.rangeY = this.maxY - this.minY;
74
+ this.numXTicks = Math.round(this.rangeX / this.unitsPerTickX);
75
+ this.numYTicks = Math.round(this.rangeY / this.unitsPerTickY);
76
+ this.x = this.getLongestValueWidth() + this.padding * 2;
77
+ this.y = this.padding * 2;
78
+ this.width = this.canvas.width - this.x - this.padding * 2;
79
+ this.height =
80
+ this.canvas.height - this.y - this.padding - this.fontHeight;
81
+ this.scaleX =
82
+ (this.width - (this.xLabel ? this.baseLabelOffset : 0)) /
83
+ this.rangeX;
84
+ this.scaleY =
85
+ (this.height - (this.yLabel ? this.baseLabelOffset : 0)) /
86
+ this.rangeY;
87
+ // Draw background and X and Y axis tick marks
88
+ this.setBackground();
89
+ this.drawXAxis(true);
90
+ this.drawYAxis(true);
91
+ }
92
+ /**
93
+ * Draws a line graph with specified data, color, and line width.
94
+ *
95
+ * @param data The data to make the graph.
96
+ * @param color The color of the line.
97
+ * @param width The width of the line.
98
+ */
99
+ drawLine(data, color, width) {
100
+ const c = this.context;
101
+ c.save();
102
+ this.transformContext();
103
+ c.lineWidth = width;
104
+ c.strokeStyle = c.fillStyle = color;
105
+ c.beginPath();
106
+ c.moveTo(data[0].x * this.scaleX, data[0].y * this.scaleY);
107
+ for (let n = 0; n < data.length; ++n) {
108
+ const point = data[n];
109
+ // Data segment
110
+ c.lineTo(point.x * this.scaleX, point.y * this.scaleY);
111
+ c.stroke();
112
+ c.closePath();
113
+ if (this.pointRadius) {
114
+ c.beginPath();
115
+ c.arc(point.x * this.scaleX, point.y * this.scaleY, this.pointRadius, 0, 2 * Math.PI, false);
116
+ c.fill();
117
+ c.closePath();
118
+ }
119
+ // Position for next segment
120
+ c.beginPath();
121
+ c.moveTo(point.x * this.scaleX, point.y * this.scaleY);
122
+ }
123
+ c.restore();
124
+ }
125
+ /**
126
+ * Draws an area graph with specified data and color.
127
+ *
128
+ * @param data The data to make the graph.
129
+ * @param color The color of the area.
130
+ */
131
+ drawArea(data, color) {
132
+ const c = this.context;
133
+ c.save();
134
+ this.transformContext();
135
+ c.strokeStyle = c.fillStyle = color;
136
+ c.beginPath();
137
+ data.forEach((d) => c.lineTo(d.x * this.scaleX, d.y * this.scaleY));
138
+ c.stroke();
139
+ c.lineTo(data.at(-1).x * this.scaleX, 0);
140
+ c.lineTo(0, 0);
141
+ c.fill();
142
+ c.restore();
143
+ // Redraw axes since it gets
144
+ // overlapped by chart area
145
+ if (color !== this.axisColor) {
146
+ this.drawXAxis();
147
+ this.drawYAxis();
148
+ }
149
+ }
150
+ /**
151
+ * Returns a Buffer that represents the graph.
152
+ */
153
+ getBuffer() {
154
+ return this.canvas.toBuffer();
155
+ }
156
+ /**
157
+ * Draws the X axis of the graph.
158
+ *
159
+ * @param drawLabel Whether or not to draw the axis label.
160
+ */
161
+ drawXAxis(drawLabel) {
162
+ const c = this.context;
163
+ const labelOffset = this.xLabel ? this.baseLabelOffset : 0;
164
+ const yLabelOffset = this.yLabel ? this.baseLabelOffset : 0;
165
+ c.save();
166
+ if (this.xLabel && drawLabel) {
167
+ c.textAlign = "center";
168
+ c.font = this.axisLabelFont;
169
+ c.fillText(this.xLabel, this.x + this.width / 2, this.y + this.height + labelOffset);
170
+ c.restore();
171
+ }
172
+ c.beginPath();
173
+ c.moveTo(this.x + yLabelOffset, this.y + this.height - labelOffset);
174
+ c.lineTo(this.x + this.width, this.y + this.height - labelOffset);
175
+ c.strokeStyle = this.axisColor;
176
+ c.lineWidth = 2;
177
+ c.stroke();
178
+ // Draw tick marks
179
+ for (let n = 0; n < this.numXTicks; ++n) {
180
+ c.beginPath();
181
+ c.moveTo(((n + 1) * (this.width - yLabelOffset)) / this.numXTicks +
182
+ this.x +
183
+ yLabelOffset, this.y + this.height - labelOffset);
184
+ c.lineTo(((n + 1) * (this.width - yLabelOffset)) / this.numXTicks +
185
+ this.x +
186
+ yLabelOffset, this.y + this.height - labelOffset - this.tickSize);
187
+ c.stroke();
188
+ }
189
+ // Draw labels
190
+ c.font = this.font;
191
+ c.fillStyle = "black";
192
+ c.textAlign = "center";
193
+ c.textBaseline = "middle";
194
+ for (let n = 0; n < this.numXTicks; ++n) {
195
+ const label = Math.round(((n + 1) * this.maxX) / this.numXTicks);
196
+ let stringLabel = label.toString();
197
+ switch (this.xValueType) {
198
+ case "time":
199
+ stringLabel = this.timeString(label);
200
+ break;
201
+ }
202
+ c.save();
203
+ c.translate(((n + 1) * (this.width - yLabelOffset)) / this.numXTicks +
204
+ this.x +
205
+ yLabelOffset, this.y + this.height + this.padding - labelOffset);
206
+ c.fillText(stringLabel, 0, 0);
207
+ c.restore();
208
+ }
209
+ c.restore();
210
+ }
211
+ /**
212
+ * Draws the Y axis of the graph.
213
+ *
214
+ * @param drawLabel Whether or not to draw the axis label.
215
+ */
216
+ drawYAxis(drawLabel) {
217
+ const c = this.context;
218
+ const labelOffset = this.yLabel ? this.baseLabelOffset : 0;
219
+ const xLabelOffset = this.xLabel ? this.baseLabelOffset : 0;
220
+ c.save();
221
+ if (this.yLabel && drawLabel) {
222
+ c.textAlign = "center";
223
+ c.font = this.axisLabelFont;
224
+ c.translate(0, this.graphHeight);
225
+ c.rotate(-Math.PI / 2);
226
+ c.fillText(this.yLabel, this.y + xLabelOffset + this.height / 2, this.x - labelOffset * 2.5);
227
+ c.restore();
228
+ }
229
+ c.beginPath();
230
+ c.moveTo(this.x + labelOffset, this.y);
231
+ c.lineTo(this.x + labelOffset, this.y + this.height - xLabelOffset);
232
+ c.strokeStyle = this.axisColor;
233
+ c.lineWidth = 2;
234
+ c.stroke();
235
+ c.restore();
236
+ // Draw tick marks
237
+ for (let n = 0; n < this.numYTicks; ++n) {
238
+ c.beginPath();
239
+ c.moveTo(this.x + labelOffset, (n * (this.height - xLabelOffset)) / this.numYTicks + this.y);
240
+ c.lineTo(this.x + labelOffset + this.tickSize, (n * (this.height - xLabelOffset)) / this.numYTicks + this.y);
241
+ c.stroke();
242
+ }
243
+ // Draw values
244
+ c.font = this.font;
245
+ c.fillStyle = "black";
246
+ c.textAlign = "right";
247
+ c.textBaseline = "middle";
248
+ for (let n = 0; n < this.numYTicks; ++n) {
249
+ const value = Math.round(this.maxY - (n * this.maxY) / this.numYTicks);
250
+ c.save();
251
+ c.translate(this.x + labelOffset - this.padding, (n * (this.height - xLabelOffset)) / this.numYTicks + this.y);
252
+ c.fillText(value.toString(), 0, 0);
253
+ c.restore();
254
+ }
255
+ c.restore();
256
+ }
257
+ /**
258
+ * Transforms the context and move it to the center of the graph.
259
+ */
260
+ transformContext() {
261
+ const c = this.context;
262
+ // Move context to point (0, 0) in graph
263
+ c.translate(this.x + (this.yLabel ? this.baseLabelOffset : 0), this.y + this.height - (this.xLabel ? this.baseLabelOffset : 0));
264
+ // Invert the Y scale so that it
265
+ // increments as we go upwards
266
+ c.scale(1, -1);
267
+ }
268
+ /**
269
+ * Gets the longest width from each label text in Y axis.
270
+ */
271
+ getLongestValueWidth() {
272
+ this.context.font = this.font;
273
+ let longestValueWidth = 0;
274
+ for (let n = 0; n < this.numYTicks; ++n) {
275
+ const value = this.maxY - n * this.unitsPerTickY;
276
+ let stringValue = value.toString();
277
+ switch (this.yValueType) {
278
+ case "time":
279
+ stringValue = this.timeString(value);
280
+ break;
281
+ }
282
+ longestValueWidth = Math.max(longestValueWidth, this.context.measureText(stringValue).width);
283
+ }
284
+ return longestValueWidth;
285
+ }
286
+ /**
287
+ * Sets the background of the graph.
288
+ */
289
+ setBackground() {
290
+ if (!this.background) {
291
+ this.context.globalAlpha = 0.7;
292
+ this.context.fillStyle = "#ffffff";
293
+ this.context.fillRect(0, 0, this.canvas.width, this.canvas.height);
294
+ this.context.fillStyle = "#000000";
295
+ return;
296
+ }
297
+ this.context.globalAlpha = 1;
298
+ this.context.drawImage(this.background, 0, 0, this.canvas.width, this.canvas.height);
299
+ this.context.globalAlpha = 0.8;
300
+ this.context.fillStyle = "#bbbbbb";
301
+ this.context.fillRect(0, 0, 900, 250);
302
+ this.context.globalAlpha = 1;
303
+ this.context.fillStyle = "#000000";
304
+ }
305
+ /**
306
+ * Time string parsing function for axis labels.
307
+ */
308
+ timeString(second) {
309
+ return new Date(1000 * Math.ceil(second))
310
+ .toISOString()
311
+ .substr(11, 8)
312
+ .replace(/^[0:]+/, "");
313
+ }
314
+ }
315
+
6
316
  /**
7
317
  * Generates the strain chart of beatmap beatmap and returns the chart as a buffer.
8
318
  *
@@ -20,7 +330,7 @@ async function getStrainChart(beatmap, beatmapsetID, color = "#000000") {
20
330
  return null;
21
331
  }
22
332
  const sectionLength = 400;
23
- const currentSectionEnd = Math.ceil(beatmap.map.objects[0].startTime / sectionLength) *
333
+ const currentSectionEnd = Math.ceil(beatmap.map.hitObjects.objects[0].startTime / sectionLength) *
24
334
  sectionLength;
25
335
  const strainInformations = new Array(Math.max(beatmap.strainPeaks.aimWithSliders.length, beatmap.strainPeaks.speed.length, beatmap.strainPeaks.flashlight.length));
26
336
  for (let i = 0; i < strainInformations.length; ++i) {
@@ -29,7 +339,7 @@ async function getStrainChart(beatmap, beatmapsetID, color = "#000000") {
29
339
  const flashlightStrain = beatmap.strainPeaks.flashlight[i] ?? 0;
30
340
  strainInformations[i] = {
31
341
  time: (currentSectionEnd + sectionLength * i) / 1000,
32
- strain: beatmap.mods.some((m) => m instanceof osu_base_1.ModFlashlight)
342
+ strain: beatmap.mods.some((m) => m instanceof osuBase.ModFlashlight)
33
343
  ? (aimStrain + speedStrain + flashlightStrain) / 3
34
344
  : (aimStrain + speedStrain) / 2,
35
345
  };
@@ -43,7 +353,7 @@ async function getStrainChart(beatmap, beatmapsetID, color = "#000000") {
43
353
  const maxYUnits = 10;
44
354
  const unitsPerTickX = Math.ceil(maxTime / maxXUnits / 10) * 10;
45
355
  const unitsPerTickY = Math.ceil(maxStrain / maxYUnits / 20) * 20;
46
- const chart = new Chart_1.Chart({
356
+ const chart = new Chart({
47
357
  graphWidth: 900,
48
358
  graphHeight: 250,
49
359
  minX: 0,
@@ -52,7 +362,7 @@ async function getStrainChart(beatmap, beatmapsetID, color = "#000000") {
52
362
  maxY: Math.ceil(maxStrain / unitsPerTickY) * unitsPerTickY,
53
363
  unitsPerTickX,
54
364
  unitsPerTickY,
55
- background: await (0, canvas_1.loadImage)(`https://assets.ppy.sh/beatmaps/${beatmapsetID}/covers/cover.jpg`).catch(() => {
365
+ background: await canvas.loadImage(`https://assets.ppy.sh/beatmaps/${beatmapsetID}/covers/cover.jpg`).catch(() => {
56
366
  return undefined;
57
367
  }),
58
368
  xLabel: "Time",
@@ -60,8 +370,9 @@ async function getStrainChart(beatmap, beatmapsetID, color = "#000000") {
60
370
  pointRadius: 0,
61
371
  xValueType: "time",
62
372
  });
63
- chart.drawArea(strainInformations.map((v) => new osu_base_1.Vector2(v.time, v.strain)), color);
373
+ chart.drawArea(strainInformations.map((v) => new osuBase.Vector2(v.time, v.strain)), color);
64
374
  return chart.getBuffer();
65
- }
66
- exports.default = getStrainChart;
67
- //# sourceMappingURL=index.js.map
375
+ }
376
+
377
+ module.exports = getStrainChart;
378
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/Chart.ts","../src/index.ts"],"sourcesContent":[null,null],"names":["createCanvas","ModFlashlight","loadImage","Vector2"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rian8337/osu-strain-graph-generator",
3
- "version": "1.4.17",
3
+ "version": "2.0.0-alpha.14",
4
4
  "description": "A module for generating strain graph of an osu!standard beatmap.",
5
5
  "keywords": [
6
6
  "osu",
@@ -21,7 +21,7 @@
21
21
  "url": "git+https://github.com/Rian8337/osu-droid-module.git"
22
22
  },
23
23
  "scripts": {
24
- "build": "tsc",
24
+ "build": "rollup -c ../../rollup.config.js",
25
25
  "lint": "eslint --ext ts",
26
26
  "prepare": "npm run build",
27
27
  "test": "echo \"No tests for this module\""
@@ -30,13 +30,13 @@
30
30
  "url": "https://github.com/Rian8337/osu-droid-module/issues"
31
31
  },
32
32
  "dependencies": {
33
- "@rian8337/osu-base": "^1.4.16",
34
- "@rian8337/osu-difficulty-calculator": "^1.4.17",
35
- "@rian8337/osu-rebalance-difficulty-calculator": "^1.4.17",
33
+ "@rian8337/osu-base": "^2.0.0-alpha.8",
34
+ "@rian8337/osu-difficulty-calculator": "^2.0.0-alpha.9",
35
+ "@rian8337/osu-rebalance-difficulty-calculator": "^2.0.0-alpha.14",
36
36
  "canvas": "^2.9.0"
37
37
  },
38
38
  "publishConfig": {
39
39
  "access": "public"
40
40
  },
41
- "gitHead": "e24c07916def1d0d7ac5e0b69db7dd11d592d504"
41
+ "gitHead": "d29d21817d24e4d6f3cfe962026f741e8b7b0e4e"
42
42
  }
@@ -1,21 +1,13 @@
1
- declare module "@rian8337/osu-strain-graph-generator" {
2
- import { StarRating } from "@rian8337/osu-difficulty-calculator";
3
- import { StarRating as RebalanceStarRating } from "@rian8337/osu-rebalance-difficulty-calculator";
1
+ import { StarRating } from '@rian8337/osu-difficulty-calculator';
2
+ import { StarRating as StarRating$1 } from '@rian8337/osu-rebalance-difficulty-calculator';
4
3
 
5
- //#region Functions
4
+ /**
5
+ * Generates the strain chart of beatmap beatmap and returns the chart as a buffer.
6
+ *
7
+ * @param beatmap The beatmap to generate the strain graph for.
8
+ * @param beatmapsetID The beatmapset ID to get background image from. If omitted, the background will be plain white.
9
+ * @param color The color of the graph.
10
+ */
11
+ declare function getStrainChart(beatmap: StarRating | StarRating$1, beatmapsetID?: number, color?: string): Promise<Buffer | null>;
6
12
 
7
- /**
8
- * Generates the strain chart of beatmap beatmap and returns the chart as a buffer.
9
- *
10
- * @param beatmap The beatmap to generate the strain graph for.
11
- * @param beatmapsetID The beatmapset ID to get background image from. If omitted, the background will be plain white.
12
- * @param color The color of the graph.
13
- */
14
- export default function getStrainChart(
15
- beatmap: StarRating | RebalanceStarRating,
16
- beatmapsetID?: number,
17
- color?: string
18
- ): Promise<Buffer | null>;
19
-
20
- //#endregion
21
- }
13
+ export { getStrainChart as default };
package/dist/Chart.js DELETED
@@ -1,283 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Chart = void 0;
4
- const canvas_1 = require("canvas");
5
- /**
6
- * Utility to draw a graph with only node-canvas.
7
- *
8
- * Used for creating strain graph of beatmaps.
9
- */
10
- class Chart {
11
- /**
12
- * @param values Initializer options for the graph.
13
- */
14
- constructor(values) {
15
- this.padding = 10;
16
- this.tickSize = 10;
17
- this.axisColor = "#555";
18
- this.font = "12pt Calibri";
19
- this.axisLabelFont = "bold 11pt Calibri";
20
- this.fontHeight = 12;
21
- this.baseLabelOffset = 15;
22
- this.graphWidth = values.graphWidth;
23
- this.graphHeight = values.graphHeight;
24
- this.canvas = (0, canvas_1.createCanvas)(this.graphWidth, this.graphHeight);
25
- this.context = this.canvas.getContext("2d");
26
- this.minX = values.minX;
27
- this.minY = values.minY;
28
- this.maxX = values.maxX;
29
- this.maxY = values.maxY;
30
- this.unitsPerTickX = values.unitsPerTickX;
31
- this.unitsPerTickY = values.unitsPerTickY;
32
- this.background = values.background;
33
- this.xLabel = values.xLabel;
34
- this.yLabel = values.yLabel;
35
- this.xValueType = values.xValueType;
36
- this.yValueType = values.yValueType;
37
- this.pointRadius = Math.max(0, values.pointRadius ?? 1);
38
- // Relationships
39
- this.rangeX = this.maxX - this.minX;
40
- this.rangeY = this.maxY - this.minY;
41
- this.numXTicks = Math.round(this.rangeX / this.unitsPerTickX);
42
- this.numYTicks = Math.round(this.rangeY / this.unitsPerTickY);
43
- this.x = this.getLongestValueWidth() + this.padding * 2;
44
- this.y = this.padding * 2;
45
- this.width = this.canvas.width - this.x - this.padding * 2;
46
- this.height =
47
- this.canvas.height - this.y - this.padding - this.fontHeight;
48
- this.scaleX =
49
- (this.width - (this.xLabel ? this.baseLabelOffset : 0)) /
50
- this.rangeX;
51
- this.scaleY =
52
- (this.height - (this.yLabel ? this.baseLabelOffset : 0)) /
53
- this.rangeY;
54
- // Draw background and X and Y axis tick marks
55
- this.setBackground();
56
- this.drawXAxis(true);
57
- this.drawYAxis(true);
58
- }
59
- /**
60
- * Draws a line graph with specified data, color, and line width.
61
- *
62
- * @param data The data to make the graph.
63
- * @param color The color of the line.
64
- * @param width The width of the line.
65
- */
66
- drawLine(data, color, width) {
67
- const c = this.context;
68
- c.save();
69
- this.transformContext();
70
- c.lineWidth = width;
71
- c.strokeStyle = c.fillStyle = color;
72
- c.beginPath();
73
- c.moveTo(data[0].x * this.scaleX, data[0].y * this.scaleY);
74
- for (let n = 0; n < data.length; ++n) {
75
- const point = data[n];
76
- // Data segment
77
- c.lineTo(point.x * this.scaleX, point.y * this.scaleY);
78
- c.stroke();
79
- c.closePath();
80
- if (this.pointRadius) {
81
- c.beginPath();
82
- c.arc(point.x * this.scaleX, point.y * this.scaleY, this.pointRadius, 0, 2 * Math.PI, false);
83
- c.fill();
84
- c.closePath();
85
- }
86
- // Position for next segment
87
- c.beginPath();
88
- c.moveTo(point.x * this.scaleX, point.y * this.scaleY);
89
- }
90
- c.restore();
91
- }
92
- /**
93
- * Draws an area graph with specified data and color.
94
- *
95
- * @param data The data to make the graph.
96
- * @param color The color of the area.
97
- */
98
- drawArea(data, color) {
99
- const c = this.context;
100
- c.save();
101
- this.transformContext();
102
- c.strokeStyle = c.fillStyle = color;
103
- c.beginPath();
104
- data.forEach((d) => c.lineTo(d.x * this.scaleX, d.y * this.scaleY));
105
- c.stroke();
106
- c.lineTo(data.at(-1).x * this.scaleX, 0);
107
- c.lineTo(0, 0);
108
- c.fill();
109
- c.restore();
110
- // Redraw axes since it gets
111
- // overlapped by chart area
112
- if (color !== this.axisColor) {
113
- this.drawXAxis();
114
- this.drawYAxis();
115
- }
116
- }
117
- /**
118
- * Returns a Buffer that represents the graph.
119
- */
120
- getBuffer() {
121
- return this.canvas.toBuffer();
122
- }
123
- /**
124
- * Draws the X axis of the graph.
125
- *
126
- * @param drawLabel Whether or not to draw the axis label.
127
- */
128
- drawXAxis(drawLabel) {
129
- const c = this.context;
130
- const labelOffset = this.xLabel ? this.baseLabelOffset : 0;
131
- const yLabelOffset = this.yLabel ? this.baseLabelOffset : 0;
132
- c.save();
133
- if (this.xLabel && drawLabel) {
134
- c.textAlign = "center";
135
- c.font = this.axisLabelFont;
136
- c.fillText(this.xLabel, this.x + this.width / 2, this.y + this.height + labelOffset);
137
- c.restore();
138
- }
139
- c.beginPath();
140
- c.moveTo(this.x + yLabelOffset, this.y + this.height - labelOffset);
141
- c.lineTo(this.x + this.width, this.y + this.height - labelOffset);
142
- c.strokeStyle = this.axisColor;
143
- c.lineWidth = 2;
144
- c.stroke();
145
- // Draw tick marks
146
- for (let n = 0; n < this.numXTicks; ++n) {
147
- c.beginPath();
148
- c.moveTo(((n + 1) * (this.width - yLabelOffset)) / this.numXTicks +
149
- this.x +
150
- yLabelOffset, this.y + this.height - labelOffset);
151
- c.lineTo(((n + 1) * (this.width - yLabelOffset)) / this.numXTicks +
152
- this.x +
153
- yLabelOffset, this.y + this.height - labelOffset - this.tickSize);
154
- c.stroke();
155
- }
156
- // Draw labels
157
- c.font = this.font;
158
- c.fillStyle = "black";
159
- c.textAlign = "center";
160
- c.textBaseline = "middle";
161
- for (let n = 0; n < this.numXTicks; ++n) {
162
- const label = Math.round(((n + 1) * this.maxX) / this.numXTicks);
163
- let stringLabel = label.toString();
164
- switch (this.xValueType) {
165
- case "time":
166
- stringLabel = this.timeString(label);
167
- break;
168
- }
169
- c.save();
170
- c.translate(((n + 1) * (this.width - yLabelOffset)) / this.numXTicks +
171
- this.x +
172
- yLabelOffset, this.y + this.height + this.padding - labelOffset);
173
- c.fillText(stringLabel, 0, 0);
174
- c.restore();
175
- }
176
- c.restore();
177
- }
178
- /**
179
- * Draws the Y axis of the graph.
180
- *
181
- * @param drawLabel Whether or not to draw the axis label.
182
- */
183
- drawYAxis(drawLabel) {
184
- const c = this.context;
185
- const labelOffset = this.yLabel ? this.baseLabelOffset : 0;
186
- const xLabelOffset = this.xLabel ? this.baseLabelOffset : 0;
187
- c.save();
188
- if (this.yLabel && drawLabel) {
189
- c.textAlign = "center";
190
- c.font = this.axisLabelFont;
191
- c.translate(0, this.graphHeight);
192
- c.rotate(-Math.PI / 2);
193
- c.fillText(this.yLabel, this.y + xLabelOffset + this.height / 2, this.x - labelOffset * 2.5);
194
- c.restore();
195
- }
196
- c.beginPath();
197
- c.moveTo(this.x + labelOffset, this.y);
198
- c.lineTo(this.x + labelOffset, this.y + this.height - xLabelOffset);
199
- c.strokeStyle = this.axisColor;
200
- c.lineWidth = 2;
201
- c.stroke();
202
- c.restore();
203
- // Draw tick marks
204
- for (let n = 0; n < this.numYTicks; ++n) {
205
- c.beginPath();
206
- c.moveTo(this.x + labelOffset, (n * (this.height - xLabelOffset)) / this.numYTicks + this.y);
207
- c.lineTo(this.x + labelOffset + this.tickSize, (n * (this.height - xLabelOffset)) / this.numYTicks + this.y);
208
- c.stroke();
209
- }
210
- // Draw values
211
- c.font = this.font;
212
- c.fillStyle = "black";
213
- c.textAlign = "right";
214
- c.textBaseline = "middle";
215
- for (let n = 0; n < this.numYTicks; ++n) {
216
- const value = Math.round(this.maxY - (n * this.maxY) / this.numYTicks);
217
- c.save();
218
- c.translate(this.x + labelOffset - this.padding, (n * (this.height - xLabelOffset)) / this.numYTicks + this.y);
219
- c.fillText(value.toString(), 0, 0);
220
- c.restore();
221
- }
222
- c.restore();
223
- }
224
- /**
225
- * Transforms the context and move it to the center of the graph.
226
- */
227
- transformContext() {
228
- const c = this.context;
229
- // Move context to point (0, 0) in graph
230
- c.translate(this.x + (this.yLabel ? this.baseLabelOffset : 0), this.y + this.height - (this.xLabel ? this.baseLabelOffset : 0));
231
- // Invert the Y scale so that it
232
- // increments as we go upwards
233
- c.scale(1, -1);
234
- }
235
- /**
236
- * Gets the longest width from each label text in Y axis.
237
- */
238
- getLongestValueWidth() {
239
- this.context.font = this.font;
240
- let longestValueWidth = 0;
241
- for (let n = 0; n < this.numYTicks; ++n) {
242
- const value = this.maxY - n * this.unitsPerTickY;
243
- let stringValue = value.toString();
244
- switch (this.yValueType) {
245
- case "time":
246
- stringValue = this.timeString(value);
247
- break;
248
- }
249
- longestValueWidth = Math.max(longestValueWidth, this.context.measureText(stringValue).width);
250
- }
251
- return longestValueWidth;
252
- }
253
- /**
254
- * Sets the background of the graph.
255
- */
256
- setBackground() {
257
- if (!this.background) {
258
- this.context.globalAlpha = 0.7;
259
- this.context.fillStyle = "#ffffff";
260
- this.context.fillRect(0, 0, this.canvas.width, this.canvas.height);
261
- this.context.fillStyle = "#000000";
262
- return;
263
- }
264
- this.context.globalAlpha = 1;
265
- this.context.drawImage(this.background, 0, 0, this.canvas.width, this.canvas.height);
266
- this.context.globalAlpha = 0.8;
267
- this.context.fillStyle = "#bbbbbb";
268
- this.context.fillRect(0, 0, 900, 250);
269
- this.context.globalAlpha = 1;
270
- this.context.fillStyle = "#000000";
271
- }
272
- /**
273
- * Time string parsing function for axis labels.
274
- */
275
- timeString(second) {
276
- return new Date(1000 * Math.ceil(second))
277
- .toISOString()
278
- .substr(11, 8)
279
- .replace(/^[0:]+/, "");
280
- }
281
- }
282
- exports.Chart = Chart;
283
- //# sourceMappingURL=Chart.js.map
package/dist/Chart.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"Chart.js","sourceRoot":"","sources":["../src/Chart.ts"],"names":[],"mappings":"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"}