2021-04-30 22:24:27 +08:00
import { assert } from 'chai' ;
2021-05-05 22:19:24 +08:00
import { addStage , Konva , cloneAndCompareLayer , isBrowser } from './test-utils' ;
2021-04-30 22:24:27 +08:00
describe ( 'TextPath' , function ( ) {
2017-02-24 22:15:33 +08:00
// ======================================================
2021-04-30 22:24:27 +08:00
it ( '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 ( ) {
2021-04-30 22:24:27 +08:00
this . fill ( 'blue' ) ;
2017-02-24 22:15:33 +08:00
layer . drawScene ( ) ;
} ) ;
2020-05-08 22:59:35 +08:00
textpath . on ( 'mouseout' , function ( ) {
2021-04-30 22:24:27 +08:00
this . fill ( 'orange' ) ;
2017-02-24 22:15:33 +08:00
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 ) ;
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();'
) ;
} ) ;
// ======================================================
2021-05-04 06:09:18 +08:00
it ( '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' ,
2022-03-22 02:49:55 +08:00
text : "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 ( ) ;
assert . equal ( trace . indexOf ( 'NaN' ) === - 1 , true , 'No NaNs' ) ;
2017-02-24 22:15:33 +08:00
} ) ;
2013-08-30 23:23:46 +08:00
2018-06-05 22:28:34 +08:00
// ======================================================
2021-04-30 22:24:27 +08:00
it ( '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 ) ;
2021-04-30 22:24:27 +08:00
assert . equal ( path . data ( ) , undefined ) ;
2018-06-05 22:28:34 +08:00
path . data ( c ) ;
2021-04-30 22:24:27 +08:00
assert . equal ( path . data ( ) , c ) ;
2018-06-05 22:28:34 +08:00
layer . draw ( ) ;
} ) ;
2017-02-24 22:15:33 +08:00
// ======================================================
2021-04-30 22:24:27 +08:00
it ( '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 ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'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();'
) ;
2017-02-24 22:15:33 +08:00
} ) ;
2016-12-08 05:46:59 +08:00
2017-02-24 22:15:33 +08:00
// ======================================================
2021-04-30 22:24:27 +08:00
it ( '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' ,
2022-03-22 02:49:55 +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 ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'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();'
) ;
2017-02-24 22:15:33 +08:00
} ) ;
2012-11-14 13:37:28 +08:00
2017-02-24 22:15:33 +08:00
// ======================================================
2021-04-30 22:24:27 +08:00
it ( '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 ,
2022-03-22 02:49:55 +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 ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'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();'
) ;
2017-02-24 22:15:33 +08:00
} ) ;
// ======================================================
2021-04-30 22:24:27 +08:00
it ( '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 ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'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();'
) ;
2017-02-24 22:15:33 +08:00
} ) ;
// ======================================================
2021-04-30 22:24:27 +08:00
it ( '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' ,
2022-03-22 02:49:55 +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
2023-03-23 04:58:00 +08:00
cloneAndCompareLayer ( layer , 200 , 10 ) ;
2017-02-24 22:15:33 +08:00
} ) ;
2015-02-12 15:10:36 +08:00
2021-04-30 22:24:27 +08:00
it ( '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 ,
2022-03-22 02:49:55 +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 ) ;
2021-05-04 06:09:18 +08:00
cloneAndCompareLayer ( layer , 200 , 30 ) ;
2017-02-24 22:15:33 +08:00
} ) ;
2021-04-30 22:24:27 +08:00
it ( '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 ) ;
} ) ;
2021-04-30 22:24:27 +08:00
it ( 'Text path with emoji' , function ( ) {
2020-09-14 22:46:26 +08:00
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 ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'clearRect();save();transform();font;textBaseline;textAlign;save();save();translate();rotate();fillStyle;fillText();restore();restore();restore();'
) ;
2020-09-14 22:46:26 +08:00
} ) ;
2021-04-30 22:24:27 +08:00
it ( '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 ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'clearRect();save();transform();font;textBaseline;textAlign;save();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();save();transform();beginPath();moveTo();translate();rotate();scale();arc();scale();rotate();translate();lineWidth;strokeStyle;stroke();restore();'
) ;
2017-02-24 22:15:33 +08:00
} ) ;
2016-10-29 05:30:36 +08:00
2021-04-30 22:24:27 +08:00
it ( '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 ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'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-10-11 22:14:53 +08:00
} ) ;
2021-04-30 22:24:27 +08:00
it ( '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
2021-04-30 22:24:27 +08:00
it ( '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
2021-04-30 22:24:27 +08:00
it ( '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 ( ) {
2021-04-30 22:24:27 +08:00
this . fill ( 'blue' ) ;
2017-02-24 22:15:33 +08:00
layer . drawScene ( ) ;
} ) ;
2020-05-08 22:59:35 +08:00
textpath . on ( 'mouseout' , function ( ) {
2021-04-30 22:24:27 +08:00
this . fill ( 'orange' ) ;
2017-02-24 22:15:33 +08:00
layer . drawScene ( ) ;
} ) ;
layer . add ( textpath ) ;
stage . add ( layer ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'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();'
) ;
2017-02-24 22:15:33 +08:00
} ) ;
2018-02-09 18:29:36 +08:00
2021-04-30 22:24:27 +08:00
it ( 'Text with kerning' , function ( ) {
2018-02-09 18:29:36 +08:00
var stage = addStage ( ) ;
// simulate lack of kerning support
2021-04-30 22:24:27 +08:00
stage . content && ( stage . container ( ) . style . fontKerning = 'none' ) ;
2018-02-09 18:29:36 +08:00
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
} ) ;
2021-04-30 22:24:27 +08:00
it ( '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
2021-04-30 22:24:27 +08:00
stage . content && ( stage . container ( ) . style . fontKerning = 'none' ) ;
2018-02-09 18:29:36 +08:00
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
2021-04-30 22:24:27 +08:00
it ( 'can set kerning after initialization' , function ( ) {
2018-11-17 21:50:31 +08:00
var stage = addStage ( ) ;
// simulate lack of kerning support
2021-04-30 22:24:27 +08:00
stage . content && ( stage . container ( ) . style . fontKerning = 'none' ) ;
2018-11-17 21:50:31 +08:00
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
2021-04-30 22:24:27 +08:00
it . 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 ,
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 ( ) ;
} ) ;
2021-04-30 22:24:27 +08:00
it ( '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' ,
2022-03-22 02:49:55 +08:00
data : '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',
2022-03-22 02:49:55 +08:00
data : '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 ( ) ;
2021-04-30 22:24:27 +08:00
assert . equal (
layer . getContext ( ) . getTrace ( true ) ,
'save();translate();rotate();fillStyle;fillText();restore();save();translate();rotate();fillStyle;fillText();restore();restore();restore();save();transform();font;textBaseline;textAlign;translate();save();fillStyle;fillText();restore();restore();save();transform();font;textBaseline;textAlign;save();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-01-02 04:59:27 +08:00
} ) ;
2019-10-16 00:51:13 +08:00
2021-04-30 22:24:27 +08:00
it ( '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' ) ;
} ) ;
2020-11-17 00:12:23 +08:00
2021-04-30 22:24:27 +08:00
it ( 'check bad calculations' , function ( ) {
2020-11-17 00:12:23 +08:00
var stage = addStage ( ) ;
2020-11-18 00:19:23 +08:00
stage . draggable ( true ) ;
2020-11-17 00:12:23 +08:00
var layer = new Konva . Layer ( ) ;
stage . add ( layer ) ;
var textpath = new Konva . TextPath ( {
fill : '#333' ,
fontSize : 16 ,
2020-11-18 00:19:23 +08:00
scaleX : 0.8 ,
scaleY : 0.8 ,
2022-03-22 02:49:55 +08:00
text : '__________________________________________________________________________________________________________________________________________________________________________________________________________________' ,
data : 'M 109.98618090452261 138.6656132223618 C 135.94577638190955 48.80547503140701 149.91187876884422 79.79800957914573 151.40954773869348 117.23973382537689 S 123.00811620603017 419.616741991206 122.84170854271358 460.0538041771357 S 134.33883542713568 469.8304329459799 149.98115577889448 464.33898005653265 S 245.4620163316583 411.5856081972362 257.1105527638191 412.91686950376885 S 239.31850251256282 474.434854428392 249.96859296482413 475.76611573492465 S 338.21036306532665 425.67526648869347 348.5276381909548 424.3440051821608 S 337.3640408291457 461.1772344535176 338.5288944723618 464.33898005653265 S 346.8778454773869 466.79295744346734 358.52638190954775 451.4834524183417' ,
2020-11-17 00:12:23 +08:00
} ) ;
layer . add ( textpath ) ;
2020-11-18 00:19:23 +08:00
var path = new Konva . Path ( {
stroke : 'red' ,
scaleX : 0.8 ,
scaleY : 0.8 ,
2022-03-22 02:49:55 +08:00
data : 'M 109.98618090452261 138.6656132223618 C 135.94577638190955 48.80547503140701 149.91187876884422 79.79800957914573 151.40954773869348 117.23973382537689 S 123.00811620603017 419.616741991206 122.84170854271358 460.0538041771357 S 134.33883542713568 469.8304329459799 149.98115577889448 464.33898005653265 S 245.4620163316583 411.5856081972362 257.1105527638191 412.91686950376885 S 239.31850251256282 474.434854428392 249.96859296482413 475.76611573492465 S 338.21036306532665 425.67526648869347 348.5276381909548 424.3440051821608 S 337.3640408291457 461.1772344535176 338.5288944723618 464.33898005653265 S 346.8778454773869 466.79295744346734 358.52638190954775 451.4834524183417' ,
2020-11-18 00:19:23 +08:00
} ) ;
layer . add ( path ) ;
2020-11-17 00:12:23 +08:00
layer . draw ( ) ;
var rect = textpath . getClientRect ( ) ;
2021-04-30 22:24:27 +08:00
// just different results in different envs
if ( isBrowser ) {
assert . equal ( Math . round ( rect . height ) , 331 , 'check height' ) ;
2023-03-23 04:58:00 +08:00
} else {
assert . equal ( Math . round ( rect . height ) , 333 , 'check height' ) ;
2021-04-30 22:24:27 +08:00
}
2020-11-17 00:12:23 +08:00
textpath . text ( '' ) ;
rect = textpath . getClientRect ( ) ;
assert . equal ( rect . height , 0 , 'check height' ) ;
} ) ;
2020-11-18 00:19:23 +08:00
2021-04-30 22:24:27 +08:00
it ( 'check bad calculations 2' , function ( ) {
2020-11-18 00:19:23 +08:00
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
stage . add ( layer ) ;
var textpath = new Konva . TextPath ( {
x : 0 ,
y : 0 ,
fill : '#333' ,
fontSize : 10 ,
// strokeWidth: 100,
stroke : 'black' ,
scaleX : 0.4 ,
scaleY : 0.4 ,
2022-03-22 02:49:55 +08:00
text : '....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................' ,
data : 'M 117.12814070351759 108.66938206658291 C 79.18719346733668 277.73956799623113 75.85761180904522 379.96743797110554 82.84673366834171 395.7761659861809 S 148.83130025125627 280.47708118718595 177.12060301507537 244.36661824748745 S 326.1725898241206 61.02036887562815 325.67336683417085 85.815110709799 S 174.998726758794 435.7304316896985 172.8354271356784 457.1970202575377 S 273.65633103015074 310.01551271984926 307.1042713567839 270.07767352386935 S 466.09929459798997 92.08432302135678 459.9422110552764 114.3829499057789 S 266.23512060301505 435.5226006595478 254.2537688442211 461.4821961369347 S 328.1430565326633 368.1639210113065 357.09798994974875 337.2120956344221 S 486.31961118090453 207.61623570979899 502.79396984924625 195.8012916143216 S 511.48859170854274 200.85065719221106 498.50879396984925 235.79626648869348 S 379.73086055276383 489.4401119660804 391.37939698492465 495.76360317211055 S 573.2022663316583 313.03941849874377 598.4962311557789 290.0751609610553 S 608.3285672110553 288.6610529208543 608.4949748743719 298.64551271984925 S 604.9168530150754 352.64801334799 599.9246231155779 375.778678548995 S 540.6820665829146 508.5077162374372 565.643216080402 497.19199513190955 S 690.3761155778894 408.77881799623117 814.1834170854271 278.6480252826633' ,
2020-11-18 00:19:23 +08:00
} ) ;
var path = new Konva . Path ( {
x : 0 ,
y : 0 ,
stroke : 'red' ,
scaleX : 0.4 ,
scaleY : 0.4 ,
2022-03-22 02:49:55 +08:00
data : 'M 117.12814070351759 108.66938206658291 C 79.18719346733668 277.73956799623113 75.85761180904522 379.96743797110554 82.84673366834171 395.7761659861809 S 148.83130025125627 280.47708118718595 177.12060301507537 244.36661824748745 S 326.1725898241206 61.02036887562815 325.67336683417085 85.815110709799 S 174.998726758794 435.7304316896985 172.8354271356784 457.1970202575377 S 273.65633103015074 310.01551271984926 307.1042713567839 270.07767352386935 S 466.09929459798997 92.08432302135678 459.9422110552764 114.3829499057789 S 266.23512060301505 435.5226006595478 254.2537688442211 461.4821961369347 S 328.1430565326633 368.1639210113065 357.09798994974875 337.2120956344221 S 486.31961118090453 207.61623570979899 502.79396984924625 195.8012916143216 S 511.48859170854274 200.85065719221106 498.50879396984925 235.79626648869348 S 379.73086055276383 489.4401119660804 391.37939698492465 495.76360317211055 S 573.2022663316583 313.03941849874377 598.4962311557789 290.0751609610553 S 608.3285672110553 288.6610529208543 608.4949748743719 298.64551271984925 S 604.9168530150754 352.64801334799 599.9246231155779 375.778678548995 S 540.6820665829146 508.5077162374372 565.643216080402 497.19199513190955 S 690.3761155778894 408.77881799623117 814.1834170854271 278.6480252826633' ,
2020-11-18 00:19:23 +08:00
} ) ;
layer . add ( path ) ;
// emulate different size function:
// I found the app with custom font
// we calculations were not correct
// so I just coppied text size from that app
textpath . _getTextSize = ( ) = > {
return { height : 10 , width : 5.9399871826171875 } ;
} ;
layer . add ( textpath ) ;
layer . draw ( ) ;
var rect = textpath . getClientRect ( ) ;
2021-04-30 22:24:27 +08:00
assert . equal ( Math . round ( rect . width ) , 299 ) ;
assert . equal ( Math . round ( rect . height ) , 171 ) ;
2020-11-18 00:19:23 +08:00
} ) ;
2022-03-22 02:49:55 +08:00
it . skip ( 'check vertical text path' , function ( ) {
var stage = addStage ( ) ;
var layer = new Konva . Layer ( ) ;
stage . add ( layer ) ;
var textpath = new Konva . TextPath ( {
x : - 280 ,
y : - 190 ,
fill : 'black' ,
fontSize : 10 ,
fontFamily : 'Arial' ,
align : 'right' ,
text : '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&' ,
data : 'M 283 383 L 283 187' ,
} ) ;
layer . add ( textpath ) ;
layer . draw ( ) ;
var rect = textpath . getClientRect ( ) ;
assert . equal ( rect . height , 200 , 'check height' ) ;
} ) ;
2016-09-12 19:28:42 +08:00
} ) ;