2020-05-08 22:59:35 +08:00
suite ( 'TextPath' , function ( ) {
2017-02-24 22:15:33 +08:00
// ======================================================
2020-05-08 22:59:35 +08:00
test ( 'Render Text Along Line' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2013-09-11 12:17:56 +08:00
2017-02-24 22:15:33 +08:00
var c = 'M 10,10 300,150' ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
var path = new Konva . Path ( {
stroke : 'red' ,
strokeWidth : 1 ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( path ) ;
2013-09-23 13:15:46 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
fill : 'orange' ,
2018-08-21 16:56:04 +08:00
fontSize : 24 ,
2017-02-24 22:15:33 +08:00
fontFamily : 'Arial' ,
text : "The quick brown fox jumped over the lazy dog's back" ,
2020-05-08 22:59:35 +08:00
data : c ,
2013-09-11 12:17:56 +08:00
} ) ;
2020-05-08 22:59:35 +08:00
textpath . on ( 'mouseover' , function ( ) {
2017-02-24 22:15:33 +08:00
this . setFill ( 'blue' ) ;
layer . drawScene ( ) ;
} ) ;
2020-05-08 22:59:35 +08:00
textpath . on ( 'mouseout' , function ( ) {
2017-02-24 22:15:33 +08:00
this . setFill ( 'orange' ) ;
layer . drawScene ( ) ;
2013-09-11 12:17:56 +08:00
} ) ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
showHit ( layer ) ;
assert . equal (
textpath . getClassName ( ) ,
'TextPath' ,
'getClassName should be TextPath'
) ;
var trace = layer . getContext ( ) . getTrace ( true ) ;
//console.log(trace);
assert . equal (
trace ,
'restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();restore();restore();'
) ;
} ) ;
// ======================================================
2020-05-08 22:59:35 +08:00
test . skip ( 'Find Next Segment when Arc is in Path' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2019-10-11 04:52:00 +08:00
var c = 'M10,10 C0,0 10,150 100,100 S300,150 40,130' ;
2017-02-24 22:15:33 +08:00
var path = new Konva . Path ( {
2019-10-11 04:52:00 +08:00
x : 0 ,
y : 50 ,
stroke : 'green' ,
2017-02-24 22:15:33 +08:00
strokeWidth : 1 ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2013-08-30 23:23:46 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( path ) ;
2013-08-30 23:23:46 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
2019-10-11 04:52:00 +08:00
x : 0 ,
y : 50 ,
fill : '#333' ,
fontSize : 50 ,
fontFamily : 'Arial' ,
2018-05-24 09:59:08 +08:00
text :
2019-10-11 04:52:00 +08:00
"All mhe world's a smage, and all mhe men and women merely players." ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2013-08-30 23:23:46 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
2019-10-11 04:52:00 +08:00
var trace = layer . getContext ( ) . getTrace ( ) ;
console . log ( trace ) ;
assert . equal ( trace . indexOf ( 'NaN' ) === - 1 , true , 'No NaNs' ) ;
throw '' ;
2017-02-24 22:15:33 +08:00
} ) ;
2013-08-30 23:23:46 +08:00
2018-06-05 22:28:34 +08:00
// ======================================================
2020-05-08 22:59:35 +08:00
test ( 'Check getter and setter' , function ( ) {
2018-06-05 22:28:34 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
var c = 'M 50 50 l 250 0' ;
var path = new Konva . TextPath ( {
text : 'some text' ,
stroke : 'red' ,
2020-05-08 22:59:35 +08:00
strokeWidth : 1 ,
2018-06-05 22:28:34 +08:00
} ) ;
layer . add ( path ) ;
stage . add ( layer ) ;
assert . equal ( path . getData ( ) , undefined ) ;
path . data ( c ) ;
assert . equal ( path . getData ( ) , c ) ;
layer . draw ( ) ;
} ) ;
2017-02-24 22:15:33 +08:00
// ======================================================
2020-05-08 22:59:35 +08:00
test ( 'Render Text Along Vertical Line' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
// Top Down
var c = 'M 50,10 50,150' ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
var path = new Konva . Path ( {
stroke : 'red' ,
strokeWidth : 1 ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2013-08-30 23:23:46 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( path ) ;
2013-08-30 23:23:46 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
stroke : 'black' ,
strokeWidth : 1 ,
fill : 'orange' ,
2018-08-21 16:56:04 +08:00
fontSize : 18 ,
2017-02-24 22:15:33 +08:00
fontFamily : 'Arial' ,
text : "The quick brown fox jumped over the lazy dog's back" ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2013-08-30 23:23:46 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
// Bottom up
c = 'M 150,150 150,10' ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
path = new Konva . Path ( {
stroke : 'red' ,
strokeWidth : 1 ,
2020-05-08 22:59:35 +08:00
data : c ,
2013-09-11 12:17:56 +08:00
} ) ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( path ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
textpath = new Konva . TextPath ( {
stroke : 'black' ,
strokeWidth : 1 ,
fill : 'orange' ,
2018-08-21 16:56:04 +08:00
fontSize : 18 ,
2017-02-24 22:15:33 +08:00
fontFamily : 'Arial' ,
text : "The quick brown fox jumped over the lazy dog's back" ,
2020-05-08 22:59:35 +08:00
data : c ,
2013-09-11 12:17:56 +08:00
} ) ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
} ) ;
2016-12-08 05:46:59 +08:00
2017-02-24 22:15:33 +08:00
// ======================================================
2020-05-08 22:59:35 +08:00
test ( 'Render Text Along two connected Bezier' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2016-12-08 05:46:59 +08:00
2017-02-24 22:15:33 +08:00
var c = 'M10,10 C0,0 10,150 100,100 S300,150 400,50' ;
var path = new Konva . Path ( {
stroke : 'red' ,
strokeWidth : 1 ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( path ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
stroke : 'black' ,
strokeWidth : 1 ,
fill : 'orange' ,
2018-08-21 16:56:04 +08:00
fontSize : 8 ,
2017-02-24 22:15:33 +08:00
fontFamily : 'Arial' ,
2018-05-24 09:59:08 +08:00
text :
"All the world's a stage, and all the men and women merely players. They have their exits and their entrances; And one man in his time plays many parts." ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
} ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
// ======================================================
2020-05-08 22:59:35 +08:00
test ( 'Render Text Along Elliptical Arc' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
var c = 'M 250,100 A 100 50 30 1 0 150 150' ;
var path = new Konva . Path ( {
stroke : 'red' ,
strokeWidth : 1 ,
2020-05-08 22:59:35 +08:00
data : c ,
2013-09-11 12:17:56 +08:00
} ) ;
2016-09-12 19:28:42 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( path ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
fill : 'black' ,
2018-08-21 16:56:04 +08:00
fontSize : 10 ,
2018-05-24 09:59:08 +08:00
text :
"All the world's a stage, and all the men and women merely players. They have their exits and their entrances; And one man in his time plays many parts." ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
} ) ;
// ======================================================
2020-05-08 22:59:35 +08:00
test ( 'Render Text Along complex path' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2017-07-29 00:40:07 +08:00
var c =
' M 955.92249 , - 42.126952 L 955.92249 , - 42.126952 L 955.92249 , - 42.126952 L 961.93262 , 212.9279 C 961.72797 , 213.3372 961.22315 , 215.2234 960.80572 , 215.5574 C 957.45077 , 218.2413 956.9054 , 218.3026 953.66869 , 216.6843 C 952.62164 , 216.1607 951.67338 , 214.3658 949.91236 , 214.8061 C 947.3405 , 215.4491 948.09281 , 215.8744 946.53166 , 217.4355 C 945.22315 , 218.744 943.52659 , 219.8744 943.52659 , 222.3188 C 943.52659 , 225.6087 944.62943 , 224.7909 946.15603 , 226.8264 C 947.55965 , 228.6979 948.18154 , 229.6696 948.78546 , 232.0852 C 949.37174 , 234.4304 951.2918 , 235.2197 952.16616 , 236.9685 C 953.11809 , 238.8723 956.44837 , 240.9001 955.17122 , 242.6029 C 955.17122 , 242.8772 955.27602 , 243.9657 955.17122 , 244.1055 C 954.37248 , 245.1705 952.25782 , 247.1195 951.79052 , 248.9887 C 951.25154 , 251.1447 951.97226 , 252.3937 951.41489 , 254.6232 C 950.9178 , 256.6116 949.53672 , 257.6472 949.53672 , 259.8821 C 949.53672 , 261.2894 949.87203 , 263.5578 950.66362 , 265.1409 C 951.32462 , 266.4629 953.24159 , 268.3158 953.66869 , 270.0242 C 954.03114 , 271.474 954.12634 , 273.8281 953.66869 , 275.6587 C 953.20033 , 277.5321 952.16616 , 278.7427 952.16616 , 280.9175 C 952.16616 , 281.7694 952.66216 , 286.9313 952.16616 , 287.3033 C 950.55129 , 287.3033 950.38215 , 287.5144 949.16109 , 288.4302 C 947.74898 , 289.4893 945.57047 , 291.4095 944.65349 , 292.9378 C 943.57061 , 294.7426 942.86906 , 296.6011 942.3997 , 298.9479 C 941.97063 , 301.0933 941.32659 , 303.0261 940.1459 , 304.2068 C 938.60102 , 305.7517 939.019 , 307.4128 939.019 , 309.8413 C 939.019 , 311.6467 939.44296 , 314.3005 938.26773 , 315.4758 C 937.15545 , 316.5881 934.88703 , 318.5361 934.88703 , 320.7346 C 934.88703 , 322.7058 934.79432 , 324.8714 935.26267 , 326.7448 C 935.72373 , 328.589 935.6383 , 330.6902 935.6383 , 332.7549 C 935.6383 , 334.5937 936.08895 , 337.1125 935.26267 , 338.765 C 933.38787 , 342.5146 935.26267 , 342.5858 935.26267 , 345.5264 C 935.61053 , 346.9179 935.6383 , 348.2383 935.6383 , 350.034 C 935.6383 , 351.5752 934.96036 , 354.5783 932.63323 , 353.4147 C 932.09123 , 353.1437 928.92886 , 348.8032 927.75 , 351.1609 C 926.64231 , 353.3763 926.87972 , 354.3829 928.12564 , 356.0442 C 929.10471 , 357.3496 930.01787 , 360.3569 928.12564 , 361.303 C 926.67006 , 362.0308 924.24963 , 362.5828 924.74494 , 365.0593 C 925.21304 , 367.3998 926.19847 , 367.8684 926.6231 , 369.567 C 926.7781 , 370.1869 927.80544 , 374.5783 926.24747 , 375.2014 C 924.2456 , 376.0022 920.63857 , 376.64 919.86171 , 378.5821 C 918.7844 , 381.2754 918.89909 , 381.8572 921.36424 , 383.0897 C 922.93947 , 383.8774 923.65296 , 384.6272 925.12057 , 386.0948 C 925.4026 , 386.3768 928.41848 , 391.3951 926.99874 , 392.1049 C 926.6231 , 392.2301 926.22599 , 392.3035 925.87184 , 392.4806 C 924.02717 , 393.4029 922.07311 , 394.7556 920.61297 , 395.4856 C 918.19436 , 396.6949 919.66034 , 398.0609 920.23734 , 400.3689 C 920.66358 , 402.0738 920.9143 , 404.1809 919.48607 , 405.2521 C 918.27148 , 406.163 916.40598 , 407.9567 914.60284 , 407.5059 C 912.7458 , 407.0416 911.06841 , 406.8699 909.71961 , 407.8815 C 908.08698 , 409.106 906.39997 , 410.6424 905.96328 , 412.3891 C 905.46424 , 414.3853 903.5041 , 416.8116 901.83132 , 417.648 C 900.14443 , 418.4914 897.73682 , 419.2163 895.82119 , 420.6531 C 894.39644 , 421.7216 891.99114 , 423.3808 890.93796 , 424.785 C 889.59804 , 426.5716 888.40557 , 428.0687 886.80599 , 429.6682 C 885.18365 , 431.2906 883.35936 , 432.8052 882.29839 , 434.9271 C 881.56876 , 436.3864 879.95545 , 436.9836 879.29333 , 438.3078 C 878.57656 , 439.7413 877.73542 , 441.3406 876.28826 , 442.0641 C 874.75553 , 442.8305 873.35007 , 443.456 871.40503 , 443.9423 C 867.75936 , 444.8537 869.30342 , 446.1864 868.7756 , 448.8255 C 868.7756 , 449.4008 868.88599 , 450.1518 868.7756 , 450.7037 C 868.4147 , 452.5082 867.97176 , 454.46 866.14617 , 454.46 C 863.87643 , 454.46 863.13519 , 452.5202 860.51167 , 452.9575 C 858.30041 , 453.326 855.7288 , 453.4708 853.75028 , 454.46 C 851.66578 , 455.5023 850.88183 , 456.6114 849.24268 , 457.8407 C 848.34172 , 458.5165 844.59521 , 461.2214 842.85692 , 461.2214 C 841.06194 , 461.2214 838.75283 , 461.625 837.59805 , 460.4702 C 836.02546 , 458.8976 834.59299 , 457.0331 834.59299 , 454.8357 C 834.59299 , 452.5753 834.44046 , 450.9268 833.09045 , 449.5768 C 831.22582 , 447.7122 830.88608 , 448.6344 829.33412 , 450.7037 C 827.57516 , 453.049 826.50225 , 455.876 824.07526 , 457.0895 C 820.97109 , 458.6416 819.33963 , 458.3772 818.440
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
y : 50 ,
fill : 'black' ,
2018-08-21 16:56:04 +08:00
fontSize : 24 ,
2017-02-24 22:15:33 +08:00
text : Array ( 4 ) . join (
"All the world's a stage, and all the men and women merely players. They have their exits and their entrances; And one man in his time plays many parts."
) ,
2020-05-08 22:59:35 +08:00
data : c ,
2017-02-24 22:15:33 +08:00
} ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
} ) ;
// ======================================================
2020-05-08 22:59:35 +08:00
test ( 'Render Text Along complex path cached' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
var c = 'M10,10 C0,0 10,150 100,100 S300,150 400,50' ;
var textpath = new Konva . TextPath ( {
stroke : 'black' ,
strokeWidth : 1 ,
fill : 'orange' ,
fontSize : 10 ,
fontFamily : 'Arial' ,
2018-05-24 09:59:08 +08:00
text :
"All the world's a stage, and all the men and women merely players. They have their exits and their entrances; And one man in his time plays many parts." ,
2017-02-24 22:15:33 +08:00
data : c ,
2020-05-08 22:59:35 +08:00
draggable : true ,
2013-09-11 12:17:56 +08:00
} ) ;
2015-02-12 15:10:36 +08:00
2017-02-24 22:15:33 +08:00
textpath . cache ( ) ;
2015-02-12 15:10:36 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
2015-02-12 15:10:36 +08:00
2020-03-27 03:41:06 +08:00
cloneAndCompareLayer ( layer , 200 ) ;
2017-02-24 22:15:33 +08:00
showHit ( layer ) ;
} ) ;
2015-02-12 15:10:36 +08:00
2020-05-08 22:59:35 +08:00
test ( 'Text path with letter spacing' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2015-02-12 15:10:36 +08:00
2017-02-24 22:15:33 +08:00
var c = 'M10,10 C0,0 10,150 100,100 S300,150 400,50' ;
2015-02-12 15:10:36 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
stroke : 'black' ,
strokeWidth : 1 ,
fill : 'orange' ,
fontSize : 10 ,
fontFamily : 'Arial' ,
letterSpacing : 5 ,
2018-05-24 09:59:08 +08:00
text :
"All the world's a stage, and all the men and women merely players." ,
2020-05-08 22:59:35 +08:00
data : c ,
2015-02-12 15:10:36 +08:00
} ) ;
2016-09-16 05:16:29 +08:00
2017-02-24 22:15:33 +08:00
textpath . cache ( ) ;
layer . add ( textpath ) ;
stage . add ( layer ) ;
2020-03-27 03:41:06 +08:00
cloneAndCompareLayer ( layer , 200 ) ;
2017-02-24 22:15:33 +08:00
showHit ( layer ) ;
} ) ;
2020-05-08 22:59:35 +08:00
test ( 'Text path with align' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2019-02-21 00:45:24 +08:00
var c = 'M10,10 300, 10' ;
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
2019-02-21 00:45:24 +08:00
fill : 'black' ,
2017-02-24 22:15:33 +08:00
fontSize : 10 ,
fontFamily : 'Arial' ,
letterSpacing : 5 ,
text : "All the world's a stage." ,
align : 'center' ,
2020-05-08 22:59:35 +08:00
data : c ,
2016-09-16 05:16:29 +08:00
} ) ;
2016-10-29 05:30:36 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
2019-02-21 00:45:24 +08:00
var trace =
'restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();restore();restore();' ;
2020-05-05 23:37:58 +08:00
assert . equal ( layer . getContext ( ) . getTrace ( true ) , trace ) ;
} ) ;
2020-09-14 22:46:26 +08:00
test ( 'Text path with emoji' , function ( ) {
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
var c = 'M10,10 300, 10' ;
var textpath = new Konva . TextPath ( {
fill : 'black' ,
fontSize : 10 ,
fontFamily : 'Arial' ,
letterSpacing : 5 ,
text : '😬' ,
align : 'center' ,
data : c ,
} ) ;
layer . add ( textpath ) ;
stage . add ( layer ) ;
var trace =
'clearRect(0,0,578,200);save();transform(1,0,0,1,0,0);font=normal normal 10px Arial;textBaseline=middle;textAlign=left;save();save();translate(144.438,10);rotate(0);fillStyle=black;fillText(😬,0,0);restore();restore();restore();' ;
assert . equal ( layer . getContext ( ) . getTrace ( ) , trace ) ;
} ) ;
2020-05-08 22:59:35 +08:00
test . skip ( 'Text path with center align - arc' , function ( ) {
2020-05-05 23:37:58 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
var textpath = new Konva . TextPath ( {
fill : '#333' ,
fontSize : 20 ,
text : 'Hello World' ,
align : 'right' ,
2020-05-08 22:59:35 +08:00
data : 'M 50 200 a 100 100 0 0 1 200 0' ,
2020-05-05 23:37:58 +08:00
} ) ;
layer . add ( textpath ) ;
var path = new Konva . Path ( {
stroke : '#000' ,
2020-05-08 22:59:35 +08:00
data : 'M 50 200 a 100 100 0 0 1 200 0' ,
2020-05-05 23:37:58 +08:00
} ) ;
layer . add ( path ) ;
stage . add ( layer ) ;
var trace =
'restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();restore();restore();' ;
2019-02-21 00:45:24 +08:00
assert . equal ( layer . getContext ( ) . getTrace ( true ) , trace ) ;
2017-02-24 22:15:33 +08:00
} ) ;
2016-10-29 05:30:36 +08:00
2020-05-08 22:59:35 +08:00
test ( 'Text path with align right' , function ( ) {
2019-10-11 22:14:53 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
var c = 'M10,10 300, 10' ;
var path = new Konva . Path ( {
stroke : 'red' ,
2020-05-08 22:59:35 +08:00
data : c ,
2019-10-11 22:14:53 +08:00
} ) ;
layer . add ( path ) ;
var textpath = new Konva . TextPath ( {
fill : 'black' ,
fontSize : 10 ,
fontFamily : 'Arial' ,
text : "All the world's a stage." ,
align : 'right' ,
2020-05-08 22:59:35 +08:00
data : c ,
2019-10-11 22:14:53 +08:00
} ) ;
layer . add ( textpath ) ;
stage . add ( layer ) ;
var trace =
"restore();save();translate(228.335,10);rotate(0);fillStyle=black;fillText(w,0,0);restore();save();translate(235.557,10);rotate(0);fillStyle=black;fillText(o,0,0);restore();save();translate(241.118,10);rotate(0);fillStyle=black;fillText(r,0,0);restore();save();translate(244.448,10);rotate(0);fillStyle=black;fillText(l,0,0);restore();save();translate(246.67,10);rotate(0);fillStyle=black;fillText(d,0,0);restore();save();translate(252.231,10);rotate(0);fillStyle=black;fillText(',0,0);restore();save();translate(254.141,10);rotate(0);fillStyle=black;fillText(s,0,0);restore();save();translate(259.141,10);rotate(0);fillStyle=black;fillText( ,0,0);restore();save();translate(261.919,10);rotate(0);fillStyle=black;fillText(a,0,0);restore();save();translate(267.48,10);rotate(0);fillStyle=black;fillText( ,0,0);restore();save();translate(270.259,10);rotate(0);fillStyle=black;fillText(s,0,0);restore();save();translate(275.259,10);rotate(0);fillStyle=black;fillText(t,0,0);restore();save();translate(278.037,10);rotate(0);fillStyle=black;fillText(a,0,0);restore();save();translate(283.599,10);rotate(0);fillStyle=black;fillText(g,0,0);restore();save();translate(289.16,10);rotate(0);fillStyle=black;fillText(e,0,0);restore();save();translate(294.722,10);rotate(0);fillStyle=black;fillText(.,0,0);restore();restore();restore();" ;
assert . equal ( layer . getContext ( ) . getTrace ( ) , trace ) ;
} ) ;
2020-05-08 22:59:35 +08:00
test ( 'Text path with justify align' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2016-10-29 05:30:36 +08:00
2017-02-24 22:15:33 +08:00
var c = 'M10,10 C0,0 10,150 100,100 S300,150 400,50' ;
2016-10-29 05:30:36 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
stroke : 'black' ,
strokeWidth : 1 ,
fill : 'orange' ,
fontSize : 10 ,
fontFamily : 'Arial' ,
letterSpacing : 5 ,
text : 'All the worlds a stage.' ,
align : 'justify' ,
2020-05-08 22:59:35 +08:00
data : c ,
2016-10-29 05:30:36 +08:00
} ) ;
2016-10-29 08:35:34 +08:00
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
2016-12-08 22:08:44 +08:00
2017-07-29 00:40:07 +08:00
var trace =
'rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();save();translate();rotate();fillStyle;fillText();lineWidth;strokeStyle;strokeText();restore();restore();restore();' ;
2016-12-08 22:08:44 +08:00
2017-02-24 22:15:33 +08:00
assert . equal ( layer . getContext ( ) . getTrace ( true ) , trace ) ;
} ) ;
2016-12-08 22:08:44 +08:00
2020-05-08 22:59:35 +08:00
test ( 'Text path with underline' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2016-12-08 22:08:44 +08:00
2017-02-24 22:15:33 +08:00
var c = 'M10,10 C0,0 10,150 100,100 S300,150 400,50' ;
2016-12-08 22:08:44 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
fill : 'orange' ,
fontSize : 10 ,
fontFamily : 'Arial' ,
letterSpacing : 5 ,
text : 'All the worlds a stage.' ,
textDecoration : 'underline' ,
data : c ,
2020-05-08 22:59:35 +08:00
draggable : true ,
2016-12-08 22:08:44 +08:00
} ) ;
2017-02-24 22:15:33 +08:00
layer . add ( textpath ) ;
stage . add ( layer ) ;
2016-12-08 05:46:59 +08:00
2017-07-29 00:40:07 +08:00
var trace =
'rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();save();translate();rotate();fillStyle;fillText();lineTo();restore();stroke();restore();restore();' ;
2016-12-08 05:46:59 +08:00
2017-02-24 22:15:33 +08:00
assert . equal ( layer . getContext ( ) . getTrace ( true ) , trace ) ;
} ) ;
2016-12-08 05:46:59 +08:00
2020-05-08 22:59:35 +08:00
test ( 'Text with baseline' , function ( ) {
2017-02-24 22:15:33 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
2016-12-08 05:46:59 +08:00
2017-02-24 22:15:33 +08:00
var c = 'M 10,10 300,10' ;
2016-12-08 05:46:59 +08:00
2017-02-24 22:15:33 +08:00
var path = new Konva . Path ( {
stroke : 'red' ,
strokeWidth : 1 ,
2020-05-08 22:59:35 +08:00
data : c ,
2016-12-08 05:46:59 +08:00
} ) ;
2017-02-24 22:15:33 +08:00
layer . add ( path ) ;
2016-10-29 08:35:34 +08:00
2017-02-24 22:15:33 +08:00
var textpath = new Konva . TextPath ( {
fill : 'orange' ,
2018-08-21 16:56:04 +08:00
fontSize : 24 ,
2017-02-24 22:15:33 +08:00
fontFamily : 'Arial' ,
text : "The quick brown fox jumped over the lazy dog's back" ,
data : c ,
2020-05-08 22:59:35 +08:00
textBaseline : 'top' ,
2016-10-29 08:35:34 +08:00
} ) ;
2020-05-08 22:59:35 +08:00
textpath . on ( 'mouseover' , function ( ) {
2017-02-24 22:15:33 +08:00
this . setFill ( 'blue' ) ;
layer . drawScene ( ) ;
} ) ;
2020-05-08 22:59:35 +08:00
textpath . on ( 'mouseout' , function ( ) {
2017-02-24 22:15:33 +08:00
this . setFill ( 'orange' ) ;
layer . drawScene ( ) ;
} ) ;
layer . add ( textpath ) ;
stage . add ( layer ) ;
showHit ( layer ) ;
} ) ;
2018-02-09 18:29:36 +08:00
2020-05-08 22:59:35 +08:00
test ( 'Text with kerning' , function ( ) {
2018-02-09 18:29:36 +08:00
var stage = addStage ( ) ;
// simulate lack of kerning support
stage . getContainer ( ) . style . fontKerning = 'none' ;
var layer = new Konva . Layer ( ) ;
var pairs = {
2018-05-24 09:59:08 +08:00
A : {
2020-05-08 22:59:35 +08:00
V : - 0.07421875 ,
2018-02-09 18:29:36 +08:00
} ,
2018-05-24 09:59:08 +08:00
V : {
2020-05-08 22:59:35 +08:00
A : - 0.07421875 ,
} ,
2018-05-24 09:59:08 +08:00
} ;
2018-02-09 18:29:36 +08:00
const kernedText = new Konva . TextPath ( {
2018-05-24 09:59:08 +08:00
x : 0 ,
y : 30 ,
2018-02-09 18:29:36 +08:00
fill : 'black' ,
text : 'AV' ,
fontSize : 60 ,
data : 'M0,0 L200,0' ,
2020-05-08 22:59:35 +08:00
kerningFunc : function ( leftChar , rightChar ) {
2018-05-24 09:59:08 +08:00
return pairs . hasOwnProperty ( leftChar )
? pairs [ leftChar ] [ rightChar ] || 0
: 0 ;
2020-05-08 22:59:35 +08:00
} ,
2018-02-09 18:29:36 +08:00
} ) ;
const unkernedText = new Konva . TextPath ( {
2018-05-24 09:59:08 +08:00
x : 0 ,
y : 90 ,
2018-02-09 18:29:36 +08:00
fill : 'black' ,
text : 'AV' ,
fontSize : 60 ,
2020-05-08 22:59:35 +08:00
data : 'M0,0 L200,0' ,
2018-02-09 18:29:36 +08:00
} ) ;
layer . add ( kernedText ) ;
layer . add ( unkernedText ) ;
stage . add ( layer ) ;
assert (
kernedText . getTextWidth ( ) < unkernedText . getTextWidth ( ) ,
2018-05-24 09:59:08 +08:00
'kerned text lenght must be less then unkerned text length'
) ;
2018-02-09 18:29:36 +08:00
} ) ;
2020-05-08 22:59:35 +08:00
test ( 'Text with invalid kerning getter should not fail (fallback to unkerned)' , function ( ) {
2018-02-09 18:29:36 +08:00
var stage = addStage ( ) ;
// simulate lack of kerning support
stage . getContainer ( ) . style . fontKerning = 'none' ;
var layer = new Konva . Layer ( ) ;
const kernedText = new Konva . TextPath ( {
2018-05-24 09:59:08 +08:00
x : 0 ,
y : 30 ,
2018-02-09 18:29:36 +08:00
fill : 'black' ,
text : 'AV' ,
fontSize : 60 ,
data : 'M0,0 L200,0' ,
2020-05-08 22:59:35 +08:00
kerningFunc : function ( leftChar , rightChar ) {
2018-02-09 18:29:36 +08:00
// getter that fails
2018-05-24 09:59:08 +08:00
throw new Error ( 'something went wrong' ) ;
2020-05-08 22:59:35 +08:00
} ,
2018-02-09 18:29:36 +08:00
} ) ;
const unkernedText = new Konva . TextPath ( {
2018-05-24 09:59:08 +08:00
x : 0 ,
y : 90 ,
2018-02-09 18:29:36 +08:00
fill : 'black' ,
text : 'AV' ,
fontSize : 60 ,
2020-05-08 22:59:35 +08:00
data : 'M0,0 L200,0' ,
2018-02-09 18:29:36 +08:00
} ) ;
layer . add ( kernedText ) ;
layer . add ( unkernedText ) ;
stage . add ( layer ) ;
assert . equal (
2018-05-24 09:59:08 +08:00
kernedText . getTextWidth ( ) ,
unkernedText . getTextWidth ( ) ,
'should gracefully fallback to unkerned text'
) ;
} ) ;
2018-11-17 21:50:31 +08:00
2020-05-08 22:59:35 +08:00
test ( 'can set kerning after initialization' , function ( ) {
2018-11-17 21:50:31 +08:00
var stage = addStage ( ) ;
// simulate lack of kerning support
stage . getContainer ( ) . style . fontKerning = 'none' ;
var layer = new Konva . Layer ( ) ;
stage . add ( layer ) ;
const kernedText = new Konva . TextPath ( {
x : 0 ,
y : 30 ,
fill : 'black' ,
text : 'AV' ,
fontSize : 60 ,
2020-05-08 22:59:35 +08:00
data : 'M0,0 L200,0' ,
2018-11-17 21:50:31 +08:00
} ) ;
layer . add ( kernedText ) ;
layer . draw ( ) ;
var called = false ;
2020-05-08 22:59:35 +08:00
kernedText . kerningFunc ( function ( ) {
2018-11-17 21:50:31 +08:00
called = true ;
return 1 ;
} ) ;
layer . draw ( ) ;
assert . equal ( called , true ) ;
} ) ;
2019-01-02 04:59:27 +08:00
2020-05-08 22:59:35 +08:00
test . skip ( 'linear gradient for path' , function ( ) {
2019-01-11 21:51:46 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
stage . add ( layer ) ;
const text = new Konva . TextPath ( {
x : 0 ,
y : 30 ,
text : 'AV' ,
fontSize : 20 ,
data : 'M0,0 L200,0' ,
fillLinearGradientStartPoint : { x : 0 , y : 0 } ,
fillLinearGradientEndPoint : { x : 200 , y : 0 } ,
fillLinearGradientColorStops : [ 0 , 'yellow' , 1 , 'red' ] ,
2020-05-08 22:59:35 +08:00
text : 'Text with gradient!!' ,
2019-01-11 21:51:46 +08:00
} ) ;
layer . add ( text ) ;
layer . draw ( ) ;
var trace = layer . getContext ( ) . getTrace ( ) ;
console . log ( trace ) ;
} ) ;
2020-05-08 22:59:35 +08:00
test ( 'visual check for text path' , function ( ) {
2019-01-02 04:59:27 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
stage . add ( layer ) ;
layer . add (
new Konva . TextPath ( {
fill : '#333' ,
fontSize : 20 ,
x : 80 ,
y : 300 ,
fontFamily : 'Calibri' ,
text : 'Hello World' ,
align : 'center' ,
textBaseline : 'bottom' ,
data :
2020-05-08 22:59:35 +08:00
'M -80.34441853748636 -247.27469423673992 A 260 260 0 0 1 80.34441853748628 -247.27469423673995' ,
2019-01-02 04:59:27 +08:00
} )
) ;
layer . add (
new Konva . TextPath ( {
fill : '#333' ,
fontSize : 20 ,
x : 80 ,
y : 350 ,
fontFamily : 'Calibri' ,
text : 'Hello World' ,
align : 'center' ,
// textBaseline: 'bottom',
data :
2020-05-08 22:59:35 +08:00
'M -80.34441853748636 -247.27469423673992 A 260 260 0 0 1 80.34441853748628 -247.27469423673995' ,
2019-01-02 04:59:27 +08:00
} )
) ;
layer . add (
new Konva . Text ( {
2020-05-08 22:59:35 +08:00
text : 'Hello world' ,
2019-01-02 04:59:27 +08:00
} )
) ;
layer . add (
new Konva . TextPath ( {
fill : '#333' ,
text : 'Hello world' ,
y : 20 ,
2020-05-08 22:59:35 +08:00
data : 'M 0 0 L100 0' ,
2019-01-02 04:59:27 +08:00
} )
) ;
layer . draw ( ) ;
} ) ;
2019-10-16 00:51:13 +08:00
2020-05-08 22:59:35 +08:00
test ( 'client rect calculations' , function ( ) {
2019-10-16 00:51:13 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
stage . add ( layer ) ;
var textpath = new Konva . TextPath ( {
x : 100 ,
y : 150 ,
fill : '#333' ,
fontSize : 16 ,
fontFamily : 'Arial' ,
align : 'right' ,
text : 'test_path' ,
2020-05-08 22:59:35 +08:00
data : 'M 0,10 L 300 10' ,
2019-10-16 00:51:13 +08:00
} ) ;
layer . add ( textpath ) ;
layer . draw ( ) ;
var rect = textpath . getClientRect ( ) ;
assert . equal ( rect . height , 16 , 'check height' ) ;
textpath . text ( '' ) ;
rect = textpath . getClientRect ( ) ;
assert . equal ( rect . height , 0 , 'check height' ) ;
} ) ;
2016-09-12 19:28:42 +08:00
} ) ;