rgraph-rails 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +1 -0
- data/README.md +5 -5
- data/lib/rgraph-rails/version.rb +1 -1
- data/rgraph-rails.gemspec +2 -2
- data/vendor/assets/images/bg.png +0 -0
- data/vendor/assets/images/bullet.png +0 -0
- data/vendor/assets/images/facebook-large.png +0 -0
- data/vendor/assets/images/google-plus-large.png +0 -0
- data/vendor/assets/images/logo.png +0 -0
- data/vendor/assets/images/meter-image-sd-needle.png +0 -0
- data/vendor/assets/images/meter-image-sd.png +0 -0
- data/vendor/assets/images/meter-sketch-needle.png +0 -0
- data/vendor/assets/images/meter-sketch.png +0 -0
- data/vendor/assets/images/odometer-background.png +0 -0
- data/vendor/assets/images/rgraph.jpg +0 -0
- data/vendor/assets/images/title.png +0 -0
- data/vendor/assets/images/twitter-large.png +0 -0
- data/vendor/assets/javascripts/RGraph.bar.js +258 -30
- data/vendor/assets/javascripts/RGraph.bipolar.js +4 -3
- data/vendor/assets/javascripts/RGraph.common.annotate.js +4 -3
- data/vendor/assets/javascripts/RGraph.common.context.js +4 -3
- data/vendor/assets/javascripts/RGraph.common.core.js +227 -105
- data/vendor/assets/javascripts/RGraph.common.csv.js +4 -3
- data/vendor/assets/javascripts/RGraph.common.deprecated.js +4 -3
- data/vendor/assets/javascripts/RGraph.common.dynamic.js +5 -4
- data/vendor/assets/javascripts/RGraph.common.effects.js +4 -3
- data/vendor/assets/javascripts/RGraph.common.key.js +4 -3
- data/vendor/assets/javascripts/RGraph.common.resizing.js +4 -3
- data/vendor/assets/javascripts/RGraph.common.sheets.js +357 -0
- data/vendor/assets/javascripts/RGraph.common.tooltips.js +6 -4
- data/vendor/assets/javascripts/RGraph.common.zoom.js +4 -3
- data/vendor/assets/javascripts/RGraph.drawing.background.js +4 -3
- data/vendor/assets/javascripts/RGraph.drawing.circle.js +4 -3
- data/vendor/assets/javascripts/RGraph.drawing.image.js +4 -3
- data/vendor/assets/javascripts/RGraph.drawing.marker1.js +4 -3
- data/vendor/assets/javascripts/RGraph.drawing.marker2.js +4 -3
- data/vendor/assets/javascripts/RGraph.drawing.marker3.js +1 -1
- data/vendor/assets/javascripts/RGraph.drawing.poly.js +1 -1
- data/vendor/assets/javascripts/RGraph.drawing.rect.js +1 -1
- data/vendor/assets/javascripts/RGraph.drawing.text.js +1 -1
- data/vendor/assets/javascripts/RGraph.drawing.xaxis.js +1 -1
- data/vendor/assets/javascripts/RGraph.drawing.yaxis.js +33 -30
- data/vendor/assets/javascripts/RGraph.fuel.js +14 -16
- data/vendor/assets/javascripts/RGraph.funnel.js +1 -1
- data/vendor/assets/javascripts/RGraph.gantt.js +1 -1
- data/vendor/assets/javascripts/RGraph.gauge.js +3 -5
- data/vendor/assets/javascripts/RGraph.hbar.js +738 -212
- data/vendor/assets/javascripts/RGraph.hprogress.js +30 -33
- data/vendor/assets/javascripts/RGraph.line.js +246 -31
- data/vendor/assets/javascripts/RGraph.meter.js +72 -36
- data/vendor/assets/javascripts/RGraph.modaldialog.js +1 -1
- data/vendor/assets/javascripts/RGraph.odo.js +3 -5
- data/vendor/assets/javascripts/RGraph.pie.js +23 -15
- data/vendor/assets/javascripts/RGraph.radar.js +1 -1
- data/vendor/assets/javascripts/RGraph.rose.js +2 -2
- data/vendor/assets/javascripts/RGraph.rscatter.js +116 -27
- data/vendor/assets/javascripts/RGraph.scatter.js +14 -15
- data/vendor/assets/javascripts/RGraph.thermometer.js +8 -10
- data/vendor/assets/javascripts/RGraph.vprogress.js +8 -10
- data/vendor/assets/javascripts/RGraph.waterfall.js +1 -1
- data/vendor/assets/stylesheets/website.css +32 -2
- metadata +6 -5
@@ -1,4 +1,4 @@
|
|
1
|
-
// version:
|
1
|
+
// version: 2016-02-06
|
2
2
|
/**
|
3
3
|
* o--------------------------------------------------------------------------------o
|
4
4
|
* | This file is part of the RGraph package - you can learn more at: |
|
@@ -27,26 +27,24 @@
|
|
27
27
|
/**
|
28
28
|
* Allow for object config style
|
29
29
|
*/
|
30
|
-
if ( typeof conf
|
31
|
-
&& typeof conf.min === 'number'
|
32
|
-
&& typeof conf.max === 'number'
|
30
|
+
if ( typeof conf === 'object'
|
33
31
|
&& typeof conf.value !== 'undefined'
|
34
|
-
&& typeof conf.id
|
35
|
-
|
36
|
-
var id = conf.id
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
&& typeof conf.id === 'string') {
|
33
|
+
|
34
|
+
var id = conf.id,
|
35
|
+
canvas = document.getElementById(id),
|
36
|
+
min = conf.min,
|
37
|
+
max = conf.max,
|
38
|
+
value = conf.value,
|
39
|
+
parseConfObjectForOptions = true; // Set this so the config is parsed (at the end of the constructor)
|
42
40
|
|
43
41
|
} else {
|
44
42
|
|
45
|
-
var id = conf
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
43
|
+
var id = conf,
|
44
|
+
canvas = document.getElementById(id),
|
45
|
+
min = arguments[1],
|
46
|
+
max = arguments[2],
|
47
|
+
value = arguments[3];
|
50
48
|
}
|
51
49
|
|
52
50
|
|
@@ -56,8 +54,8 @@
|
|
56
54
|
this.context = this.canvas.getContext('2d');
|
57
55
|
this.canvas.__object__ = this;
|
58
56
|
|
59
|
-
this.min = min;
|
60
|
-
this.max = max;
|
57
|
+
this.min = RGraph.stringsToNumbers(min);
|
58
|
+
this.max = RGraph.stringsToNumbers(max);
|
61
59
|
this.value = RGraph.stringsToNumbers(value);
|
62
60
|
this.type = 'hprogress';
|
63
61
|
this.coords = [];
|
@@ -319,7 +317,7 @@
|
|
319
317
|
/**
|
320
318
|
* Fire the onbeforedraw event
|
321
319
|
*/
|
322
|
-
RG.
|
320
|
+
RG.fireCustomEvent(this, 'onbeforedraw');
|
323
321
|
|
324
322
|
|
325
323
|
|
@@ -430,7 +428,7 @@
|
|
430
428
|
this.exec = function (func)
|
431
429
|
{
|
432
430
|
func(this);
|
433
|
-
|
431
|
+
|
434
432
|
return this;
|
435
433
|
};
|
436
434
|
|
@@ -446,19 +444,18 @@
|
|
446
444
|
/**
|
447
445
|
* First get the scale
|
448
446
|
*/
|
449
|
-
|
450
447
|
this.scale2 = RG.getScale2(this, {
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
448
|
+
'max':this.max,
|
449
|
+
'min':this.min,
|
450
|
+
'strict':true,
|
451
|
+
'scale.thousand':prop['chart.scale.thousand'],
|
452
|
+
'scale.point':prop['chart.scale.point'],
|
453
|
+
'scale.decimals':prop['chart.scale.decimals'],
|
454
|
+
'ylabels.count':prop['chart.labels.count'],
|
455
|
+
'scale.round':prop['chart.scale.round'],
|
456
|
+
'units.pre': prop['chart.units.pre'],
|
457
|
+
'units.post': prop['chart.units.post']
|
458
|
+
});
|
462
459
|
|
463
460
|
// Set a shadow if requested
|
464
461
|
if (prop['chart.shadow']) {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// version:
|
1
|
+
// version: 2016-02-06
|
2
2
|
/**
|
3
3
|
* o--------------------------------------------------------------------------------o
|
4
4
|
* | This file is part of the RGraph package - you can learn more at: |
|
@@ -266,6 +266,7 @@
|
|
266
266
|
'chart.adjustable': false,
|
267
267
|
'chart.noredraw': false,
|
268
268
|
'chart.outofbounds': false,
|
269
|
+
'chart.outofbounds.clip': false,
|
269
270
|
'chart.chromefix': true,
|
270
271
|
'chart.animation.factor': 1,
|
271
272
|
'chart.animation.unfold.x': false,
|
@@ -275,7 +276,15 @@
|
|
275
276
|
'chart.curvy': false,
|
276
277
|
'chart.line.visible': true,
|
277
278
|
'chart.events.click': null,
|
278
|
-
'chart.events.mousemove': null
|
279
|
+
'chart.events.mousemove': null,
|
280
|
+
'chart.errorbars': false,
|
281
|
+
'chart.errorbars.color': 'black',
|
282
|
+
'chart.errorbars.capped': true,
|
283
|
+
'chart.errorbars.capped.width': 12,
|
284
|
+
'chart.errorbars.linewidth': 1,
|
285
|
+
'chart.combinedchart.effect': null,
|
286
|
+
'chart.combinedchart.effect.options': null,
|
287
|
+
'chart.combinedchart.effect.callback': null
|
279
288
|
}
|
280
289
|
|
281
290
|
/**
|
@@ -831,16 +840,39 @@
|
|
831
840
|
} else {
|
832
841
|
var tickmarks = null;
|
833
842
|
}
|
834
|
-
|
835
843
|
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
844
|
+
//
|
845
|
+
// Draw the line, accounting for the outofboundsClip option
|
846
|
+
//
|
847
|
+
if (prop['chart.outofbounds.clip']) {
|
848
|
+
pa2(
|
849
|
+
co,
|
850
|
+
'sa b r % % % % cl b',
|
851
|
+
0,
|
852
|
+
this.gutterTop,
|
853
|
+
ca.width,
|
854
|
+
ca.height - this.gutterTop - this.gutterBottom
|
855
|
+
);
|
856
|
+
}
|
857
|
+
this.drawLine(
|
858
|
+
this.data[i],
|
859
|
+
prop['chart.colors'][j],
|
860
|
+
fill,
|
861
|
+
this.getLineWidth(j),
|
862
|
+
tickmarks,
|
863
|
+
i
|
864
|
+
);
|
865
|
+
if (prop['chart.outofbounds.clip']) {
|
866
|
+
co.restore();
|
867
|
+
}
|
868
|
+
|
843
869
|
co.stroke();
|
870
|
+
|
871
|
+
/**
|
872
|
+
* Draw errorbars
|
873
|
+
*
|
874
|
+
* ** This is now done in the redrawLine function **
|
875
|
+
*/
|
844
876
|
}
|
845
877
|
|
846
878
|
/**
|
@@ -869,7 +901,7 @@
|
|
869
901
|
co.stroke();
|
870
902
|
// No fill!
|
871
903
|
}
|
872
|
-
|
904
|
+
|
873
905
|
//Redraw the tickmarks
|
874
906
|
if (prop['chart.tickmarks']) {
|
875
907
|
|
@@ -925,6 +957,10 @@
|
|
925
957
|
|
926
958
|
|
927
959
|
|
960
|
+
|
961
|
+
|
962
|
+
|
963
|
+
|
928
964
|
for (var i=0,len=this.coords2.length; i<len; i+=1) {
|
929
965
|
for (var j=0,len2=this.coords2[i].length; j<len2; ++j) {
|
930
966
|
if (typeof(this.coords2[i][j]) == 'object' && typeof(this.coords2[i][j][0]) == 'number' && typeof(this.coords2[i][j][1]) == 'number') {
|
@@ -1098,11 +1134,6 @@
|
|
1098
1134
|
this.drawAxes =
|
1099
1135
|
this.DrawAxes = function ()
|
1100
1136
|
{
|
1101
|
-
//var RG = RGraph;
|
1102
|
-
//var ca = this.canvas;
|
1103
|
-
//var co = this.context;
|
1104
|
-
//var prop = this.properties;
|
1105
|
-
|
1106
1137
|
// Don't draw the axes?
|
1107
1138
|
if (prop['chart.noaxes']) {
|
1108
1139
|
return;
|
@@ -1112,7 +1143,8 @@
|
|
1112
1143
|
RG.noShadow(this);
|
1113
1144
|
|
1114
1145
|
co.lineWidth = prop['chart.axis.linewidth'] + 0.001;
|
1115
|
-
co.lineCap = '
|
1146
|
+
co.lineCap = 'square';
|
1147
|
+
co.lineJoin = 'miter';
|
1116
1148
|
co.strokeStyle = prop['chart.axis.color'];
|
1117
1149
|
co.beginPath();
|
1118
1150
|
|
@@ -2050,15 +2082,32 @@
|
|
2050
2082
|
co.beginPath();
|
2051
2083
|
co.rect(0,0,ca.width * prop['chart.animation.trace.clip'],ca.height);
|
2052
2084
|
co.clip();
|
2053
|
-
|
2085
|
+
|
2086
|
+
|
2087
|
+
|
2088
|
+
|
2089
|
+
|
2090
|
+
//
|
2091
|
+
// Draw errorbars
|
2092
|
+
//
|
2093
|
+
if (typeof prop['chart.errorbars'] !== 'null') {
|
2094
|
+
this.drawErrorbars();
|
2095
|
+
}
|
2096
|
+
|
2097
|
+
|
2098
|
+
|
2099
|
+
|
2054
2100
|
// Now redraw the lines with the correct line width
|
2055
2101
|
this.SetShadow(index);
|
2056
2102
|
this.RedrawLine(lineCoords, color, linewidth, index);
|
2057
2103
|
co.stroke();
|
2058
2104
|
RG.NoShadow(this);
|
2059
|
-
|
2060
|
-
|
2061
|
-
|
2105
|
+
|
2106
|
+
|
2107
|
+
|
2108
|
+
|
2109
|
+
|
2110
|
+
|
2062
2111
|
|
2063
2112
|
// Draw the tickmarks
|
2064
2113
|
for (var i=0; i<lineCoords.length; ++i) {
|
@@ -2694,15 +2743,15 @@
|
|
2694
2743
|
this.getShape =
|
2695
2744
|
this.getPoint = function (e)
|
2696
2745
|
{
|
2697
|
-
var obj = this
|
2698
|
-
|
2699
|
-
|
2700
|
-
|
2701
|
-
|
2702
|
-
|
2703
|
-
var mouseXY = RG.getMouseXY(e)
|
2704
|
-
|
2705
|
-
|
2746
|
+
var obj = this,
|
2747
|
+
RG = RGraph,
|
2748
|
+
ca = canvas = e.target,
|
2749
|
+
co = context = this.context,
|
2750
|
+
prop = this.properties;
|
2751
|
+
|
2752
|
+
var mouseXY = RG.getMouseXY(e),
|
2753
|
+
mouseX = mouseXY[0],
|
2754
|
+
mouseY = mouseXY[1];
|
2706
2755
|
|
2707
2756
|
// This facilitates you being able to pass in the bar object as a parameter instead of
|
2708
2757
|
// the function getting it from the object
|
@@ -3027,7 +3076,7 @@
|
|
3027
3076
|
|
3028
3077
|
y = ca.height - this.gutterBottom - y;
|
3029
3078
|
}
|
3030
|
-
|
3079
|
+
|
3031
3080
|
return y;
|
3032
3081
|
};
|
3033
3082
|
|
@@ -3424,6 +3473,169 @@
|
|
3424
3473
|
|
3425
3474
|
|
3426
3475
|
|
3476
|
+
//
|
3477
|
+
// Draws error-bars for the Bar and Line charts
|
3478
|
+
//
|
3479
|
+
this.drawErrorbars = function ()
|
3480
|
+
{
|
3481
|
+
// Save the state of the canvas so that it can be restored at the end
|
3482
|
+
co.save();
|
3483
|
+
|
3484
|
+
RG.noShadow(this);
|
3485
|
+
|
3486
|
+
var coords = this.coords,
|
3487
|
+
x = 0,
|
3488
|
+
errorbars = prop['chart.errorbars'],
|
3489
|
+
length = 0;
|
3490
|
+
|
3491
|
+
// If not capped set the width of the cap to zero
|
3492
|
+
if (!prop['chart.errorbars.capped']) {
|
3493
|
+
prop['chart.errorbars.capped.width'] = 0.001;
|
3494
|
+
halfwidth = 0.0005;
|
3495
|
+
}
|
3496
|
+
|
3497
|
+
// Set the linewidth
|
3498
|
+
co.lineWidth = prop['chart.errorbars.linewidth'];
|
3499
|
+
|
3500
|
+
|
3501
|
+
|
3502
|
+
|
3503
|
+
for (var i=0; i<coords.length; ++i) {
|
3504
|
+
|
3505
|
+
var halfwidth = prop['chart.errorbars.capped.width'] / 2 || 5,
|
3506
|
+
color = prop['chart.errorbars.color'] || 'black';
|
3507
|
+
|
3508
|
+
// Set the perbar linewidth if the fourth option in the array
|
3509
|
+
// is specified
|
3510
|
+
if (errorbars[i] && typeof errorbars[i][3] === 'number') {
|
3511
|
+
co.lineWidth = errorbars[i][3];
|
3512
|
+
} else if (typeof prop['chart.errorbars.linewidth'] === 'number') {
|
3513
|
+
co.lineWidth = prop['chart.errorbars.linewidth'];
|
3514
|
+
} else {
|
3515
|
+
co.lineWidth = 1;
|
3516
|
+
}
|
3517
|
+
|
3518
|
+
|
3519
|
+
|
3520
|
+
// Calulate the pixel size
|
3521
|
+
if (typeof errorbars === 'number' || typeof errorbars[i] === 'number') {
|
3522
|
+
|
3523
|
+
if (typeof errorbars === 'number') {
|
3524
|
+
var positiveLength = this.getYCoord(this.min) - this.getYCoord(this.min + errorbars),
|
3525
|
+
negativeLength = positiveLength;
|
3526
|
+
} else {
|
3527
|
+
var positiveLength = this.getYCoord(this.min) - this.getYCoord(this.min + errorbars[i]),
|
3528
|
+
negativeLength = positiveLength;
|
3529
|
+
}
|
3530
|
+
|
3531
|
+
if (positiveLength || negativeLength) {
|
3532
|
+
|
3533
|
+
pa2(
|
3534
|
+
co,
|
3535
|
+
'lj miter lc square b m % % l % % m % % l % % l % % m % % l % % s %',
|
3536
|
+
coords[i][0] - halfwidth,
|
3537
|
+
coords[i][1] + negativeLength,
|
3538
|
+
coords[i][0] + halfwidth,
|
3539
|
+
coords[i][1] + negativeLength,
|
3540
|
+
coords[i][0],
|
3541
|
+
coords[i][1] + negativeLength,
|
3542
|
+
coords[i][0],
|
3543
|
+
coords[i][1] - positiveLength,
|
3544
|
+
coords[i][0] - halfwidth,
|
3545
|
+
coords[i][1] - positiveLength,
|
3546
|
+
coords[i][0],
|
3547
|
+
coords[i][1] - positiveLength,
|
3548
|
+
coords[i][0] + halfwidth,
|
3549
|
+
coords[i][1] - positiveLength,
|
3550
|
+
color
|
3551
|
+
);
|
3552
|
+
|
3553
|
+
pa2(
|
3554
|
+
co,
|
3555
|
+
'lj miter lc square b m % % l % % s %',
|
3556
|
+
coords[i][0] - halfwidth,
|
3557
|
+
coords[i][1] + negativeLength,
|
3558
|
+
coords[i][0] + halfwidth,
|
3559
|
+
coords[i][1] + negativeLength,
|
3560
|
+
color
|
3561
|
+
);
|
3562
|
+
}
|
3563
|
+
|
3564
|
+
|
3565
|
+
|
3566
|
+
} else if (typeof errorbars[i] === 'object' && !RG.isNull(errorbars[i])) {
|
3567
|
+
|
3568
|
+
var positiveLength = this.getYCoord(this.min) - this.getYCoord(this.min + errorbars[i][0]),
|
3569
|
+
negativeLength = this.getYCoord(this.min) - this.getYCoord(this.min + errorbars[i][1]);
|
3570
|
+
|
3571
|
+
|
3572
|
+
// Color
|
3573
|
+
if (typeof errorbars[i][2] === 'string') {
|
3574
|
+
color = errorbars[i][2];
|
3575
|
+
}
|
3576
|
+
|
3577
|
+
// Cap width
|
3578
|
+
halfwidth = typeof errorbars[i][4] === 'number' ? errorbars[i][4] / 2 : halfwidth;
|
3579
|
+
|
3580
|
+
|
3581
|
+
// Set the linewidth
|
3582
|
+
if (typeof errorbars[i] === 'object' && typeof errorbars[i][3] === 'number') {
|
3583
|
+
co.lineWidth = errorbars[i][3];
|
3584
|
+
} else if (typeof prop['chart.errorbars.linewidth'] === 'number') {
|
3585
|
+
co.lineWidth = prop['chart.errorbars.linewidth'];
|
3586
|
+
} else {
|
3587
|
+
co.lineWidth = 1;
|
3588
|
+
}
|
3589
|
+
|
3590
|
+
|
3591
|
+
if (!RG.isNull(errorbars[i][0])) {
|
3592
|
+
|
3593
|
+
pa2(
|
3594
|
+
co,
|
3595
|
+
'lc square b m % % l % % l % % m % % l % % s %',
|
3596
|
+
coords[i][0],
|
3597
|
+
coords[i][1],
|
3598
|
+
coords[i][0],
|
3599
|
+
coords[i][1] - positiveLength,
|
3600
|
+
coords[i][0] - halfwidth,
|
3601
|
+
ma.round(coords[i][1] - positiveLength),
|
3602
|
+
coords[i][0],
|
3603
|
+
ma.round(coords[i][1] - positiveLength),
|
3604
|
+
coords[i][0] + halfwidth,
|
3605
|
+
ma.round(coords[i][1] - positiveLength),
|
3606
|
+
color
|
3607
|
+
);
|
3608
|
+
}
|
3609
|
+
|
3610
|
+
if (typeof errorbars[i][1] === 'number') {
|
3611
|
+
|
3612
|
+
var negativeLength = ma.abs(this.getYCoord(errorbars[i][1]) - this.getYCoord(0));
|
3613
|
+
|
3614
|
+
pa2(
|
3615
|
+
co,
|
3616
|
+
'b m % % l % % l % % m % % l % % s %',
|
3617
|
+
coords[i][0],
|
3618
|
+
coords[i][1],
|
3619
|
+
coords[i][0],
|
3620
|
+
coords[i][1] + negativeLength,
|
3621
|
+
coords[i][0] - halfwidth,
|
3622
|
+
ma.round(coords[i][1] + negativeLength),
|
3623
|
+
coords[i][0],
|
3624
|
+
ma.round(coords[i][1] + negativeLength),
|
3625
|
+
coords[i][0] + halfwidth,
|
3626
|
+
ma.round(coords[i][1] + negativeLength),
|
3627
|
+
color
|
3628
|
+
);
|
3629
|
+
}
|
3630
|
+
}
|
3631
|
+
}
|
3632
|
+
|
3633
|
+
co.restore();
|
3634
|
+
};
|
3635
|
+
|
3636
|
+
|
3637
|
+
|
3638
|
+
|
3427
3639
|
/**
|
3428
3640
|
* Trace
|
3429
3641
|
*
|
@@ -3697,6 +3909,7 @@
|
|
3697
3909
|
function iterator ()
|
3698
3910
|
{
|
3699
3911
|
RG.clear(obj.canvas);
|
3912
|
+
|
3700
3913
|
RG.redrawCanvas(obj.canvas);
|
3701
3914
|
|
3702
3915
|
if (frame++ < frames) {
|
@@ -3829,6 +4042,8 @@
|
|
3829
4042
|
|
3830
4043
|
RG.clear(obj.canvas);
|
3831
4044
|
obj.trace2({frames: frames / 2}, unfoldCallback);
|
4045
|
+
|
4046
|
+
return obj;
|
3832
4047
|
};
|
3833
4048
|
|
3834
4049
|
|