Tk Source Code

Hex Artifact Content
Login

Artifact 404baea4578f3a7e0dca97211c84770a9c4358e2:

Attachment "2874226 - -joinstyle - performance checks.tcl" to ticket [2874226fff] added by fvogel 2017-08-19 16:03:39.
0000: 23 20 54 68 69 73 20 69 73 20 61 6e 20 61 6e 61  # This is an ana
0010: 6c 79 73 69 73 20 6f 66 20 74 68 65 20 70 65 72  lysis of the per
0020: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 61 63 74 20  formance impact 
0030: 6f 66 20 74 68 65 20 66 69 78 20 66 6f 72 20 74  of the fix for t
0040: 69 63 6b 65 74 0d 0a 23 20 20 20 20 32 38 37 34  icket..#    2874
0050: 32 32 36 20 2d 20 70 6f 6c 79 67 6f 6e 20 64 6f  226 - polygon do
0060: 6e 27 74 20 68 6f 6e 6f 72 20 2d 6a 6f 69 6e 73  n't honor -joins
0070: 74 79 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  tyle on Windows 
0080: 61 6e 64 20 4f 53 20 58 0d 0a 23 20 4c 69 6e 75  and OS X..# Linu
0090: 78 3a 20 6e 6f 20 62 75 67 2c 20 6e 6f 20 66 69  x: no bug, no fi
00a0: 78 0d 0a 23 20 57 69 6e 64 6f 77 73 3a 20 66 69  x..# Windows: fi
00b0: 78 20 65 78 69 73 74 73 3a 20 5b 63 34 34 31 65  x exists: [c441e
00c0: 37 33 66 5d 0d 0a 23 20 4f 53 20 58 3a 20 66 69  73f]..# OS X: fi
00d0: 78 20 65 78 69 73 74 73 3a 20 5b 61 62 64 32 36  x exists: [abd26
00e0: 61 36 65 5d 0d 0a 23 0d 0a 23 20 54 68 69 73 20  a6e]..#..# This 
00f0: 70 65 72 66 6f 72 6d 61 63 6e 65 20 69 6d 70 61  performacne impa
0100: 63 74 20 61 6e 61 6c 79 73 69 73 20 64 65 61 6c  ct analysis deal
0110: 73 20 77 69 74 68 20 57 69 6e 64 6f 77 73 20 6f  s with Windows o
0120: 6e 6c 79 2e 0d 0a 23 20 63 6f 72 65 2d 38 2d 36  nly...# core-8-6
0130: 2d 62 72 61 6e 63 68 20 61 6e 64 20 74 68 65 20  -branch and the 
0140: 62 75 67 66 69 78 20 62 72 61 6e 63 68 20 61 72  bugfix branch ar
0150: 65 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 72 65  e compiled in re
0160: 6c 65 61 73 65 20 6d 6f 64 65 20 77 69 74 68 20  lease mode with 
0170: 6e 6f 20 73 70 65 63 69 61 6c 20 6f 70 74 69 6f  no special optio
0180: 6e 0d 0a 0d 0a 0d 0a 23 23 23 23 23 23 23 23 23  n......#########
0190: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01b0: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 23 23 23  ###########..###
01c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01f0: 23 0d 0a 0d 0a 57 69 74 68 20 72 65 66 65 72 65  #....With refere
0200: 6e 63 65 20 5b 63 34 34 31 65 37 33 66 5d 20 28  nce [c441e73f] (
0210: 61 6b 61 20 74 68 65 20 22 62 75 67 66 69 78 22  aka the "bugfix"
0220: 29 2c 20 61 20 63 61 6e 64 69 64 61 74 65 20 22  ), a candidate "
0230: 6f 70 74 69 6d 69 7a 65 64 20 62 75 67 66 69 78  optimized bugfix
0240: 22 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e  " for Windows on
0250: 6c 79 20 28 6e 6f 20 73 75 63 68 20 6e 65 65 64  ly (no such need
0260: 20 66 6f 72 20 4f 53 20 58 29 20 63 6f 75 6c 64   for OS X) could
0270: 20 62 65 3a 0d 0a 0d 0a 0d 0a 43 3a 5c 55 73 65   be:......C:\Use
0280: 72 73 5c 66 72 61 6e 63 6f 69 73 5c 44 6f 63 75  rs\francois\Docu
0290: 6d 65 6e 74 73 5c 44 65 76 65 6c 6f 70 6d 65 6e  ments\Developmen
02a0: 74 5c 74 63 6c 74 6b 2d 66 6f 73 73 69 6c 5c 74  t\tcltk-fossil\t
02b0: 6b 3e 66 20 64 69 66 66 0d 0a 49 6e 64 65 78 3a  k>f diff..Index:
02c0: 20 77 69 6e 2f 74 6b 57 69 6e 44 72 61 77 2e 63   win/tkWinDraw.c
02d0: 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..==============
02e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
02f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0300: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0310: 3d 3d 3d 3d 0d 0a 2d 2d 2d 20 77 69 6e 2f 74 6b  ====..--- win/tk
0320: 57 69 6e 44 72 61 77 2e 63 0d 0a 2b 2b 2b 20 77  WinDraw.c..+++ w
0330: 69 6e 2f 74 6b 57 69 6e 44 72 61 77 2e 63 0d 0a  in/tkWinDraw.c..
0340: 40 40 20 2d 37 33 39 2c 31 35 20 2b 37 33 39 2c  @@ -739,15 +739,
0350: 31 37 20 40 40 0d 0a 20 7d 0d 0a 20 3f 0d 0a 20  17 @@.. }.. ?.. 
0360: 2f 2a 0d 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*..  *---------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20  -------------.. 
03b0: 20 2a 0d 0a 2d 20 2a 20 4d 61 6b 65 41 6e 64 53   *..- * MakeAndS
03c0: 74 72 6f 6b 65 50 61 74 68 20 2d 2d 0d 0a 2b 20  trokePath --..+ 
03d0: 2a 20 44 72 61 77 50 6f 6c 79 20 2d 2d 0d 0a 20  * DrawPoly --.. 
03e0: 20 2a 0d 0a 20 20 2a 20 20 20 20 20 54 68 69 73   *..  *     This
03f0: 20 66 75 6e 63 74 69 6f 6e 20 64 72 61 77 73 20   function draws 
0400: 61 20 73 68 61 70 65 20 75 73 69 6e 67 20 61 20  a shape using a 
0410: 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 73 2c 20  list of points, 
0420: 61 20 73 74 69 70 70 6c 65 20 70 61 74 74 65 72  a stipple patter
0430: 6e 2c 0d 0a 2d 20 2a 20 20 20 20 20 61 6e 64 20  n,..- *     and 
0440: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64 72  the specified dr
0450: 61 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  awing function. 
0460: 49 74 20 64 6f 65 73 20 69 74 20 74 68 72 6f 75  It does it throu
0470: 67 68 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 61  gh creation of a
0480: 0d 0a 2d 20 2a 20 20 20 20 20 73 6f 2d 63 61 6c  ..- *     so-cal
0490: 6c 65 64 20 27 70 61 74 68 27 20 28 73 65 65 20  led 'path' (see 
04a0: 47 44 49 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  GDI documentatio
04b0: 6e 20 6f 6e 20 4d 53 44 4e 29 2e 0d 0a 2b 20 2a  n on MSDN)...+ *
04c0: 20 20 20 20 20 61 6e 64 20 74 68 65 20 73 70 65       and the spe
04d0: 63 69 66 69 65 64 20 64 72 61 77 69 6e 67 20 66  cified drawing f
04e0: 75 6e 63 74 69 6f 6e 2e 20 43 6c 6f 73 65 64 20  unction. Closed 
04f0: 70 6f 6c 79 6c 69 6e 65 73 20 61 72 65 20 64 72  polylines are dr
0500: 61 77 6e 20 74 68 72 6f 75 67 68 0d 0a 2b 20 2a  awn through..+ *
0510: 20 20 20 20 20 63 72 65 61 74 69 6f 6e 20 6f 66       creation of
0520: 20 61 20 73 6f 2d 63 61 6c 6c 65 64 20 27 70 61   a so-called 'pa
0530: 74 68 27 20 28 73 65 65 20 47 44 49 20 64 6f 63  th' (see GDI doc
0540: 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 4d 53  umentation on MS
0550: 44 4e 29 2e 0d 0a 2b 20 2a 20 20 20 20 20 4f 70  DN)...+ *     Op
0560: 65 6e 20 70 6f 6c 79 6c 69 6e 65 73 20 61 6e 64  en polylines and
0570: 20 70 6f 6c 79 67 6f 6e 73 20 61 72 65 20 64 72   polygons are dr
0580: 61 77 6e 20 61 20 74 69 6e 79 20 62 69 74 20 71  awn a tiny bit q
0590: 75 69 63 6b 65 72 2c 20 77 69 74 68 6f 75 74 0d  uicker, without.
05a0: 0a 2b 20 2a 20 20 20 20 20 72 65 73 6f 72 74 69  .+ *     resorti
05b0: 6e 67 20 74 6f 20 61 20 70 61 74 68 2e 0d 0a 20  ng to a path... 
05c0: 20 2a 0d 0a 20 20 2a 20 52 65 73 75 6c 74 73 3a   *..  * Results:
05d0: 0d 0a 20 20 2a 20 20 20 20 20 4e 6f 6e 65 2e 0d  ..  *     None..
05e0: 0a 20 20 2a 0d 0a 20 20 2a 20 53 69 64 65 20 65  .  *..  * Side e
05f0: 66 66 65 63 74 73 3a 0d 0a 40 40 20 2d 37 35 34  ffects:..@@ -754
0600: 2c 33 36 20 2b 37 35 36 2c 34 30 20 40 40 0d 0a  ,36 +756,40 @@..
0610: 20 20 2a 20 20 20 20 20 4e 6f 6e 65 2e 0d 0a 20    *     None... 
0620: 20 2a 0d 0a 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d   *..  *---------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20  -------------.. 
0670: 20 2a 2f 0d 0a 20 73 74 61 74 69 63 20 76 6f 69   */.. static voi
0680: 64 0d 0a 2d 4d 61 6b 65 41 6e 64 53 74 72 6f 6b  d..-MakeAndStrok
0690: 65 50 61 74 68 28 0d 0a 2b 44 72 61 77 50 6f 6c  ePath(..+DrawPol
06a0: 79 28 0d 0a 20 20 20 20 20 48 44 43 20 64 63 2c  y(..     HDC dc,
06b0: 0d 0a 20 20 20 20 20 50 4f 49 4e 54 20 2a 77 69  ..     POINT *wi
06c0: 6e 50 6f 69 6e 74 73 2c 0d 0a 20 20 20 20 20 69  nPoints,..     i
06d0: 6e 74 20 6e 70 6f 69 6e 74 73 2c 0d 0a 20 20 20  nt npoints,..   
06e0: 20 20 57 69 6e 44 72 61 77 46 75 6e 63 20 66 75    WinDrawFunc fu
06f0: 6e 63 29 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  nc)        /* Na
0700: 6d 65 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77  me of the Window
0710: 73 20 47 44 49 20 64 72 61 77 69 6e 67 20 66 75  s GDI drawing fu
0720: 6e 63 74 69 6f 6e 3a 0d 0a 20 20 20 20 20 20 20  nction:..       
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20 69            this i
0750: 73 20 65 69 74 68 65 72 20 50 6f 6c 79 6c 69 6e  s either Polylin
0760: 65 20 6f 72 20 50 6f 6c 79 67 6f 6e 2e 20 2a 2f  e or Polygon. */
0770: 0d 0a 20 7b 0d 0a 2d 20 20 20 20 42 65 67 69 6e  .. {..-    Begin
0780: 50 61 74 68 28 64 63 29 3b 0d 0a 2d 20 20 20 20  Path(dc);..-    
0790: 66 75 6e 63 28 64 63 2c 20 77 69 6e 50 6f 69 6e  func(dc, winPoin
07a0: 74 73 2c 20 6e 70 6f 69 6e 74 73 29 3b 0d 0a 20  ts, npoints);.. 
07b0: 20 20 20 20 2f 2a 0d 0a 2d 20 20 20 20 20 2a 20      /*..-     * 
07c0: 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 63  In the case of c
07d0: 6c 6f 73 65 64 20 70 6f 6c 79 6c 69 6e 65 73 2c  losed polylines,
07e0: 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c   the first and l
07f0: 61 73 74 20 70 6f 69 6e 74 73 0d 0a 2d 20 20 20  ast points..-   
0800: 20 20 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65    * are the same
0810: 2e 20 57 65 20 77 61 6e 74 20 6d 69 74 65 72 20  . We want miter 
0820: 6f 72 20 62 65 76 65 6c 20 6a 6f 69 6e 20 62 65  or bevel join be
0830: 20 72 65 6e 64 65 72 65 64 20 61 6c 73 6f 0d 0a   rendered also..
0840: 2d 20 20 20 20 20 2a 20 61 74 20 74 68 69 73 20  -     * at this 
0850: 70 6f 69 6e 74 2c 20 74 68 69 73 20 6e 65 65 64  point, this need
0860: 73 20 74 65 6c 6c 69 6e 67 20 74 68 65 20 57 69  s telling the Wi
0870: 6e 64 6f 77 73 20 47 44 49 20 74 68 61 74 20 74  ndows GDI that t
0880: 68 65 0d 0a 2d 20 20 20 20 20 2a 20 70 61 74 68  he..-     * path
0890: 20 69 73 20 63 6c 6f 73 65 64 2e 0d 0a 2d 20 20   is closed...-  
08a0: 20 20 20 2a 2f 0d 0a 2b 20 20 20 20 2a 20 49 6e     */..+    * In
08b0: 20 63 61 73 65 20 6f 66 20 61 20 63 6c 6f 73 65   case of a close
08c0: 64 20 70 6f 6c 79 6c 69 6e 65 2c 20 77 68 65 72  d polyline, wher
08d0: 65 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20  e the first and 
08e0: 6c 61 73 74 20 70 6f 69 6e 74 73 20 61 72 65 0d  last points are.
08f0: 0a 2b 20 20 20 20 2a 20 74 68 65 20 73 61 6d 65  .+    * the same
0900: 2c 20 77 65 20 77 61 6e 74 20 6d 69 74 65 72 20  , we want miter 
0910: 6f 72 20 62 65 76 65 6c 20 6a 6f 69 6e 20 62 65  or bevel join be
0920: 20 72 65 6e 64 65 72 65 64 20 61 6c 73 6f 20 61   rendered also a
0930: 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0d 0a 2b  t this point...+
0940: 20 20 20 20 2a 20 54 6f 20 67 65 74 20 74 68 69      * To get thi
0950: 73 20 72 65 73 75 6c 74 2c 20 74 68 65 20 57 69  s result, the Wi
0960: 6e 64 6f 77 73 20 47 44 49 20 6e 65 65 64 73 20  ndows GDI needs 
0970: 74 6f 20 62 65 20 74 6f 6c 64 20 65 78 70 6c 69  to be told expli
0980: 63 69 74 65 6c 79 0d 0a 2b 20 20 20 20 2a 20 74  citely..+    * t
0990: 68 61 74 20 74 68 65 20 70 6f 6c 79 6c 69 6e 65  hat the polyline
09a0: 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 69 73   is closed. This
09b0: 20 6e 65 65 64 73 20 63 72 65 61 74 69 6f 6e 20   needs creation 
09c0: 6f 66 20 61 20 27 70 61 74 68 27 2e 0d 0a 2b 20  of a 'path'...+ 
09d0: 20 20 20 2a 2f 0d 0a 20 20 20 20 20 69 66 20 28     */..     if (
09e0: 66 75 6e 63 20 3d 3d 20 50 6f 6c 79 6c 69 6e 65  func == Polyline
09f0: 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 69 66  ) {..         if
0a00: 20 28 28 77 69 6e 50 6f 69 6e 74 73 5b 30 5d 2e   ((winPoints[0].
0a10: 78 20 3d 3d 20 77 69 6e 50 6f 69 6e 74 73 5b 6e  x == winPoints[n
0a20: 70 6f 69 6e 74 73 2d 31 5d 2e 78 29 20 26 26 0d  points-1].x) &&.
0a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0a40: 20 20 28 77 69 6e 50 6f 69 6e 74 73 5b 30 5d 2e    (winPoints[0].
0a50: 79 20 3d 3d 20 77 69 6e 50 6f 69 6e 74 73 5b 6e  y == winPoints[n
0a60: 70 6f 69 6e 74 73 2d 31 5d 2e 79 29 29 20 7b 0d  points-1].y)) {.
0a70: 0a 2b 20 20 20 20 20 20 20 20 20 20 20 20 42 65  .+            Be
0a80: 67 69 6e 50 61 74 68 28 64 63 29 3b 0d 0a 2b 20  ginPath(dc);..+ 
0a90: 20 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 28             func(
0aa0: 64 63 2c 20 77 69 6e 50 6f 69 6e 74 73 2c 20 6e  dc, winPoints, n
0ab0: 70 6f 69 6e 74 73 29 3b 0d 0a 20 20 20 20 20 20  points);..      
0ac0: 20 20 20 20 20 20 20 43 6c 6f 73 65 46 69 67 75         CloseFigu
0ad0: 72 65 28 64 63 29 3b 0d 0a 2b 20 20 20 20 20 20  re(dc);..+      
0ae0: 20 20 20 20 20 20 45 6e 64 50 61 74 68 28 64 63        EndPath(dc
0af0: 29 3b 0d 0a 2b 20 20 20 20 20 20 20 20 20 20 20  );..+           
0b00: 20 53 74 72 6f 6b 65 50 61 74 68 28 64 63 29 3b   StrokePath(dc);
0b10: 0d 0a 2b 20 20 20 20 20 20 20 20 20 20 20 20 72  ..+            r
0b20: 65 74 75 72 6e 3b 0d 0a 20 20 20 20 20 20 20 20  eturn;..        
0b30: 20 7d 0d 0a 2d 20 20 20 20 20 20 20 20 45 6e 64   }..-        End
0b40: 50 61 74 68 28 64 63 29 3b 0d 0a 2d 20 20 20 20  Path(dc);..-    
0b50: 20 20 20 20 53 74 72 6f 6b 65 50 61 74 68 28 64      StrokePath(d
0b60: 63 29 3b 0d 0a 2d 20 20 20 20 7d 20 65 6c 73 65  c);..-    } else
0b70: 20 7b 0d 0a 2d 20 20 20 20 20 20 20 20 45 6e 64   {..-        End
0b80: 50 61 74 68 28 64 63 29 3b 0d 0a 2d 20 20 20 20  Path(dc);..-    
0b90: 20 20 20 20 53 74 72 6f 6b 65 41 6e 64 46 69 6c      StrokeAndFil
0ba0: 6c 50 61 74 68 28 64 63 29 3b 0d 0a 20 20 20 20  lPath(dc);..    
0bb0: 20 7d 0d 0a 2b 0d 0a 2b 20 20 20 20 2f 2a 0d 0a   }..+..+    /*..
0bc0: 2b 20 20 20 20 20 2a 20 49 6e 20 61 6c 6c 20 6f  +     * In all o
0bd0: 74 68 65 72 20 63 61 73 65 73 2c 20 61 20 70 61  ther cases, a pa
0be0: 74 68 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  th is not needed
0bf0: 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 75 73 65   (and is not use
0c00: 64 20 74 6f 20 61 76 6f 69 64 0d 0a 2b 20 20 20  d to avoid..+   
0c10: 20 20 2a 20 61 6e 79 20 70 65 72 66 6f 72 6d 61    * any performa
0c20: 6e 63 65 20 6c 6f 73 73 2c 20 62 65 20 69 74 20  nce loss, be it 
0c30: 76 65 72 79 20 73 6d 61 6c 6c 29 2e 0d 0a 2b 20  very small)...+ 
0c40: 20 20 20 20 2a 2f 0d 0a 2b 20 20 20 20 66 75 6e      */..+    fun
0c50: 63 28 64 63 2c 20 77 69 6e 50 6f 69 6e 74 73 2c  c(dc, winPoints,
0c60: 20 6e 70 6f 69 6e 74 73 29 3b 0d 0a 20 7d 0d 0a   npoints);.. }..
0c70: 20 3f 0d 0a 20 2f 2a 0d 0a 20 20 2a 2d 2d 2d 2d   ?.. /*..  *----
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cc0: 2d 2d 0d 0a 20 20 2a 0d 0a 40 40 20 2d 38 37 37  --..  *..@@ -877
0cd0: 2c 31 31 20 2b 38 38 33 2c 31 31 20 40 40 0d 0a  ,11 +883,11 @@..
0ce0: 20 20 20 20 20 20 20 20 20 2a 2f 0d 0a 0d 0a 20           */.... 
0cf0: 20 20 20 20 20 20 20 53 65 74 50 6f 6c 79 46 69         SetPolyFi
0d00: 6c 6c 4d 6f 64 65 28 64 63 4d 65 6d 2c 20 28 67  llMode(dcMem, (g
0d10: 63 2d 3e 66 69 6c 6c 5f 72 75 6c 65 20 3d 3d 20  c->fill_rule == 
0d20: 45 76 65 6e 4f 64 64 52 75 6c 65 29 20 3f 20 41  EvenOddRule) ? A
0d30: 4c 54 45 52 4e 41 54 45 0d 0a 20 20 20 20 20 20  LTERNATE..      
0d40: 20 20 20 20 20 20 20 20 20 20 3a 20 57 49 4e 44            : WIND
0d50: 49 4e 47 29 3b 0d 0a 20 20 20 20 20 20 20 20 6f  ING);..        o
0d60: 6c 64 4d 65 6d 42 72 75 73 68 20 3d 20 53 65 6c  ldMemBrush = Sel
0d70: 65 63 74 4f 62 6a 65 63 74 28 64 63 4d 65 6d 2c  ectObject(dcMem,
0d80: 20 43 72 65 61 74 65 53 6f 6c 69 64 42 72 75 73   CreateSolidBrus
0d90: 68 28 67 63 2d 3e 66 6f 72 65 67 72 6f 75 6e 64  h(gc->foreground
0da0: 29 29 3b 0d 0a 2d 20 20 20 20 20 20 20 20 4d 61  ));..-        Ma
0db0: 6b 65 41 6e 64 53 74 72 6f 6b 65 50 61 74 68 28  keAndStrokePath(
0dc0: 64 63 4d 65 6d 2c 20 77 69 6e 50 6f 69 6e 74 73  dcMem, winPoints
0dd0: 2c 20 6e 70 6f 69 6e 74 73 2c 20 66 75 6e 63 29  , npoints, func)
0de0: 3b 0d 0a 2b 20 20 20 20 20 20 20 20 44 72 61 77  ;..+        Draw
0df0: 50 6f 6c 79 28 64 63 4d 65 6d 2c 20 77 69 6e 50  Poly(dcMem, winP
0e00: 6f 69 6e 74 73 2c 20 6e 70 6f 69 6e 74 73 2c 20  oints, npoints, 
0e10: 66 75 6e 63 29 3b 0d 0a 20 20 20 20 20 20 20 20  func);..        
0e20: 42 69 74 42 6c 74 28 64 63 2c 20 72 65 63 74 2e  BitBlt(dc, rect.
0e30: 6c 65 66 74 2c 20 72 65 63 74 2e 74 6f 70 2c 20  left, rect.top, 
0e40: 77 69 64 74 68 2c 20 68 65 69 67 68 74 2c 20 64  width, height, d
0e50: 63 4d 65 6d 2c 20 30 2c 20 30 2c 20 43 4f 50 59  cMem, 0, 0, COPY
0e60: 46 47 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  FG);....        
0e70: 2f 2a 0d 0a 20 20 20 20 20 20 20 20 20 2a 20 49  /*..         * I
0e80: 66 20 77 65 20 61 72 65 20 72 65 6e 64 65 72 69  f we are renderi
0e90: 6e 67 20 61 6e 20 6f 70 61 71 75 65 20 73 74 69  ng an opaque sti
0ea0: 70 70 6c 65 2c 20 74 68 65 6e 20 64 72 61 77 20  pple, then draw 
0eb0: 74 68 65 20 70 6f 6c 79 67 6f 6e 20 69 6e 20 74  the polygon in t
0ec0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 2a 20 62  he..         * b
0ed0: 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 20  ackground color 
0ee0: 61 6e 64 20 63 6f 70 79 20 69 74 20 74 6f 20 74  and copy it to t
0ef0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 77  he destination w
0f00: 68 65 72 65 76 65 72 20 74 68 65 0d 0a 40 40 20  herever the..@@ 
0f10: 2d 38 38 39 2c 31 31 20 2b 38 39 35 2c 31 31 20  -889,11 +895,11 
0f20: 40 40 0d 0a 20 20 20 20 20 20 20 20 20 2a 2f 0d  @@..         */.
0f30: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 67  ...        if (g
0f40: 63 2d 3e 66 69 6c 6c 5f 73 74 79 6c 65 20 3d 3d  c->fill_style ==
0f50: 20 46 69 6c 6c 4f 70 61 71 75 65 53 74 69 70 70   FillOpaqueStipp
0f60: 6c 65 64 29 20 7b 0d 0a 20 20 20 20 20 20 20 20  led) {..        
0f70: 20 20 20 20 44 65 6c 65 74 65 4f 62 6a 65 63 74      DeleteObject
0f80: 28 53 65 6c 65 63 74 4f 62 6a 65 63 74 28 64 63  (SelectObject(dc
0f90: 4d 65 6d 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Mem,..          
0fa0: 20 20 20 20 20 20 20 20 20 20 43 72 65 61 74 65            Create
0fb0: 53 6f 6c 69 64 42 72 75 73 68 28 67 63 2d 3e 62  SolidBrush(gc->b
0fc0: 61 63 6b 67 72 6f 75 6e 64 29 29 29 3b 0d 0a 2d  ackground)));..-
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 6b 65              Make
0fe0: 41 6e 64 53 74 72 6f 6b 65 50 61 74 68 28 64 63  AndStrokePath(dc
0ff0: 4d 65 6d 2c 20 77 69 6e 50 6f 69 6e 74 73 2c 20  Mem, winPoints, 
1000: 6e 70 6f 69 6e 74 73 2c 20 66 75 6e 63 29 3b 0d  npoints, func);.
1010: 0a 2b 20 20 20 20 20 20 20 20 20 20 20 20 44 72  .+            Dr
1020: 61 77 50 6f 6c 79 28 64 63 4d 65 6d 2c 20 77 69  awPoly(dcMem, wi
1030: 6e 50 6f 69 6e 74 73 2c 20 6e 70 6f 69 6e 74 73  nPoints, npoints
1040: 2c 20 66 75 6e 63 29 3b 0d 0a 20 20 20 20 20 20  , func);..      
1050: 20 20 20 20 20 20 42 69 74 42 6c 74 28 64 63 2c        BitBlt(dc,
1060: 20 72 65 63 74 2e 6c 65 66 74 2c 20 72 65 63 74   rect.left, rect
1070: 2e 74 6f 70 2c 20 77 69 64 74 68 2c 20 68 65 69  .top, width, hei
1080: 67 68 74 2c 20 64 63 4d 65 6d 2c 20 30 2c 20 30  ght, dcMem, 0, 0
1090: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
10a0: 20 20 20 20 20 20 20 43 4f 50 59 42 47 29 3b 0d         COPYBG);.
10b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
10c0: 20 20 20 20 20 20 53 65 6c 65 63 74 4f 62 6a 65        SelectObje
10d0: 63 74 28 64 63 4d 65 6d 2c 20 6f 6c 64 50 65 6e  ct(dcMem, oldPen
10e0: 29 3b 0d 0a 40 40 20 2d 39 30 35 2c 31 31 20 2b  );..@@ -905,11 +
10f0: 39 31 31 2c 31 31 20 40 40 0d 0a 20 20 20 20 20  911,11 @@..     
1100: 20 20 20 6f 6c 64 42 72 75 73 68 20 3d 20 53 65     oldBrush = Se
1110: 6c 65 63 74 4f 62 6a 65 63 74 28 64 63 2c 20 43  lectObject(dc, C
1120: 72 65 61 74 65 53 6f 6c 69 64 42 72 75 73 68 28  reateSolidBrush(
1130: 67 63 2d 3e 66 6f 72 65 67 72 6f 75 6e 64 29 29  gc->foreground))
1140: 3b 0d 0a 20 20 20 20 20 20 20 20 53 65 74 52 4f  ;..        SetRO
1150: 50 32 28 64 63 2c 20 74 6b 70 57 69 6e 52 6f 70  P2(dc, tkpWinRop
1160: 4d 6f 64 65 73 5b 67 63 2d 3e 66 75 6e 63 74 69  Modes[gc->functi
1170: 6f 6e 5d 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  on]);....       
1180: 20 53 65 74 50 6f 6c 79 46 69 6c 6c 4d 6f 64 65   SetPolyFillMode
1190: 28 64 63 2c 20 28 67 63 2d 3e 66 69 6c 6c 5f 72  (dc, (gc->fill_r
11a0: 75 6c 65 20 3d 3d 20 45 76 65 6e 4f 64 64 52 75  ule == EvenOddRu
11b0: 6c 65 29 20 3f 20 41 4c 54 45 52 4e 41 54 45 0d  le) ? ALTERNATE.
11c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11d0: 20 3a 20 57 49 4e 44 49 4e 47 29 3b 0d 0a 2d 20   : WINDING);..- 
11e0: 20 20 20 20 20 20 20 4d 61 6b 65 41 6e 64 53 74         MakeAndSt
11f0: 72 6f 6b 65 50 61 74 68 28 64 63 2c 20 77 69 6e  rokePath(dc, win
1200: 50 6f 69 6e 74 73 2c 20 6e 70 6f 69 6e 74 73 2c  Points, npoints,
1210: 20 66 75 6e 63 29 3b 0d 0a 2b 20 20 20 20 20 20   func);..+      
1220: 20 20 44 72 61 77 50 6f 6c 79 28 64 63 2c 20 77    DrawPoly(dc, w
1230: 69 6e 50 6f 69 6e 74 73 2c 20 6e 70 6f 69 6e 74  inPoints, npoint
1240: 73 2c 20 66 75 6e 63 29 3b 0d 0a 20 20 20 20 20  s, func);..     
1250: 20 20 20 53 65 6c 65 63 74 4f 62 6a 65 63 74 28     SelectObject(
1260: 64 63 2c 20 6f 6c 64 50 65 6e 29 3b 0d 0a 20 20  dc, oldPen);..  
1270: 20 20 20 7d 0d 0a 20 20 20 20 20 44 65 6c 65 74     }..     Delet
1280: 65 4f 62 6a 65 63 74 28 53 65 6c 65 63 74 4f 62  eObject(SelectOb
1290: 6a 65 63 74 28 64 63 2c 20 6f 6c 64 42 72 75 73  ject(dc, oldBrus
12a0: 68 29 29 3b 0d 0a 20 7d 0d 0a 20 3f 0d 0a 0d 0a  h));.. }.. ?....
12b0: 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
12c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
12e0: 23 23 23 23 23 23 0d 0a 23 23 23 23 23 23 23 23  ######..########
12f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1310: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
1320: 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
1330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1350: 23 23 23 23 23 23 0d 0a 23 20 70 65 72 66 6f 72  ######..# perfor
1360: 6d 61 6e 63 65 20 6e 6f 6e 2d 72 65 67 72 65 73  mance non-regres
1370: 73 69 6f 6e 20 74 65 73 74 69 6e 67 3a 20 70 6f  sion testing: po
1380: 6c 79 67 6f 6e 0d 0a 0d 0a 70 61 63 6b 61 67 65  lygon....package
1390: 20 72 65 71 75 69 72 65 20 54 6b 0d 0a 70 61 63   require Tk..pac
13a0: 6b 20 5b 63 61 6e 76 61 73 20 2e 63 5d 0d 0a 0d  k [canvas .c]...
13b0: 0a 70 72 6f 63 20 67 65 6e 63 6f 6f 72 64 73 20  .proc gencoords 
13c0: 7b 6e 20 7b 6d 61 78 78 20 34 30 30 7d 20 7b 6d  {n {maxx 400} {m
13d0: 61 78 79 20 32 35 30 7d 7d 20 7b 0d 0a 20 20 20  axy 250}} {..   
13e0: 20 73 65 74 20 72 65 73 20 7b 7d 0d 0a 20 20 20   set res {}..   
13f0: 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b   for {set i 1} {
1400: 24 69 20 3c 3d 20 24 6e 7d 20 7b 69 6e 63 72 20  $i <= $n} {incr 
1410: 69 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  i} {..        se
1420: 74 20 78 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64  t x [expr {round
1430: 28 72 61 6e 64 28 29 20 2a 20 24 6d 61 78 78 29  (rand() * $maxx)
1440: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  }]..        set 
1450: 79 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64 28 72  y [expr {round(r
1460: 61 6e 64 28 29 20 2a 20 24 6d 61 78 79 29 7d 5d  and() * $maxy)}]
1470: 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
1480: 64 20 72 65 73 20 24 78 20 24 79 0d 0a 20 20 20  d res $x $y..   
1490: 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 24   }..    return $
14a0: 72 65 73 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 64  res..}....proc d
14b0: 72 61 77 69 74 20 7b 72 65 70 65 61 74 74 65 73  rawit {repeattes
14c0: 74 20 6e 62 76 65 72 74 69 63 65 73 7d 20 7b 0d  t nbvertices} {.
14d0: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
14e0: 31 7d 20 7b 24 69 20 3c 3d 20 24 72 65 70 65 61  1} {$i <= $repea
14f0: 74 74 65 73 74 7d 20 7b 69 6e 63 72 20 69 7d 20  ttest} {incr i} 
1500: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69  {..        set i
1510: 64 20 5b 2e 63 20 63 72 65 61 74 65 20 70 6f 6c  d [.c create pol
1520: 79 67 6f 6e 20 5b 67 65 6e 63 6f 6f 72 64 73 20  ygon [gencoords 
1530: 24 6e 62 76 65 72 74 69 63 65 73 5d 5d 0d 0a 20  $nbvertices]].. 
1540: 20 20 20 20 20 20 20 2e 63 20 69 74 65 6d 63 6f         .c itemco
1550: 6e 66 69 67 75 72 65 20 24 69 64 20 2d 66 69 6c  nfigure $id -fil
1560: 6c 20 72 65 64 20 2d 6f 75 74 6c 69 6e 65 20 62  l red -outline b
1570: 6c 61 63 6b 20 2d 77 69 64 74 68 20 31 30 20 2d  lack -width 10 -
1580: 6a 6f 69 6e 73 74 79 6c 65 20 6d 69 74 65 72 0d  joinstyle miter.
1590: 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 0d  .        update.
15a0: 0a 20 20 20 20 20 20 20 20 2e 63 20 64 65 6c 65  .        .c dele
15b0: 74 65 20 24 69 64 0d 0a 20 20 20 20 7d 0d 0a 7d  te $id..    }..}
15c0: 0d 0a 0d 0a 70 72 6f 63 20 74 69 6d 65 69 74 20  ....proc timeit 
15d0: 7b 72 65 70 65 61 74 64 72 61 77 20 6e 62 76 65  {repeatdraw nbve
15e0: 72 74 69 63 65 73 20 7b 6e 62 20 33 7d 7d 20 7b  rtices {nb 3}} {
15f0: 0d 0a 20 20 20 20 73 65 74 20 74 6f 74 20 30 0d  ..    set tot 0.
1600: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
1610: 31 7d 20 7b 24 69 20 3c 3d 20 24 6e 62 7d 20 7b  1} {$i <= $nb} {
1620: 69 6e 63 72 20 69 7d 20 7b 0d 0a 20 20 20 20 20  incr i} {..     
1630: 20 20 20 69 6e 63 72 20 74 6f 74 20 5b 73 63 61     incr tot [sca
1640: 6e 20 5b 74 69 6d 65 20 7b 64 72 61 77 69 74 20  n [time {drawit 
1650: 24 72 65 70 65 61 74 64 72 61 77 20 24 6e 62 76  $repeatdraw $nbv
1660: 65 72 74 69 63 65 73 7d 5d 20 25 64 5d 0d 0a 20  ertices}] %d].. 
1670: 20 20 20 7d 0d 0a 20 20 20 20 70 75 74 73 20 22     }..    puts "
1680: 4d 65 61 6e 20 74 69 6d 65 20 6f 6e 20 24 6e 62  Mean time on $nb
1690: 20 72 75 6e 73 3a 20 5b 65 78 70 72 20 7b 24 74   runs: [expr {$t
16a0: 6f 74 20 2f 20 24 6e 62 7d 5d 20 b5 73 22 0d 0a  ot / $nb}] .s"..
16b0: 7d 0d 0a 0d 0a 74 69 6d 65 69 74 20 35 30 30 20  }....timeit 500 
16c0: 33 30 30 20 33 0d 0a 74 69 6d 65 69 74 20 32 30  300 3..timeit 20
16d0: 30 30 20 33 30 20 33 0d 0a 74 69 6d 65 69 74 20  00 30 3..timeit 
16e0: 35 30 30 30 20 35 30 20 31 30 0d 0a 0d 0a 23 20  5000 50 10....# 
16f0: 72 65 73 75 6c 74 73 20 28 69 6e 20 b5 73 29 3a  results (in .s):
1700: 20 20 20 20 20 20 20 63 6f 72 65 2d 38 2d 36 2d         core-8-6-
1710: 62 72 61 6e 63 68 20 20 20 20 62 75 67 66 69 78  branch    bugfix
1720: 20 62 72 61 6e 63 68 20 20 20 20 6f 70 74 69 6d   branch    optim
1730: 69 7a 65 64 20 62 75 67 66 69 78 20 20 20 20 70  ized bugfix    p
1740: 65 72 66 20 6c 6f 73 73 20 20 20 20 20 20 70 65  erf loss      pe
1750: 72 66 20 6c 6f 73 73 20 20 20 20 20 20 20 70 65  rf loss       pe
1760: 72 66 20 6c 6f 73 73 0d 0a 23 20 20 20 20 20 20  rf loss..#      
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 20 20 5b 36 64 63 31 62 33 34 39 5d 20 20      [6dc1b349]  
1790: 20 20 20 20 20 20 20 5b 63 34 34 31 65 37 33 66         [c441e73f
17a0: 5d 20 20 20 20 20 20 20 5b 2e 2e 2e 20 3f 20 2e  ]       [... ? .
17b0: 2e 2e 5d 20 20 20 20 20 20 20 20 38 36 2d 3e 62  ..]        86->b
17c0: 75 67 66 69 78 20 20 20 20 20 62 75 67 66 69 78  ugfix     bugfix
17d0: 2d 3e 6f 70 74 69 20 20 20 20 38 36 2d 3e 6f 70  ->opti    86->op
17e0: 74 69 6d 0d 0a 23 20 74 69 6d 65 69 74 20 35 30  tim..# timeit 50
17f0: 30 20 33 30 30 20 33 20 20 09 09 35 32 30 33 38  0 300 3  ..52038
1800: 34 33 09 09 09 35 30 33 34 37 33 38 09 09 35 30  43...5034738..50
1810: 36 39 35 37 31 09 09 09 2d 33 2c 32 25 09 09 30  69571...-3,2%..0
1820: 2c 37 25 09 09 2d 32 2c 36 25 0d 0a 23 20 74 69  ,7%..-2,6%..# ti
1830: 6d 65 69 74 20 32 30 30 30 20 33 30 20 33 09 09  meit 2000 30 3..
1840: 33 37 32 36 36 39 39 09 09 09 33 34 33 33 31 37  3726699...343317
1850: 36 09 09 33 34 33 32 34 38 30 09 09 09 2d 37 2c  6..3432480...-7,
1860: 39 25 09 09 30 2c 30 25 09 09 2d 37 2c 39 25 0d  9%..0,0%..-7,9%.
1870: 0a 23 20 74 69 6d 65 69 74 20 35 30 30 30 20 35  .# timeit 5000 5
1880: 30 20 31 30 09 09 31 30 32 37 38 31 38 37 09 09  0 10..10278187..
1890: 39 39 32 39 38 30 33 09 09 31 30 30 30 38 37 32  9929803..1000872
18a0: 36 09 09 2d 33 2c 34 25 09 09 30 2c 38 25 09 09  6..-3,4%..0,8%..
18b0: 2d 32 2c 36 25 0d 0a 0d 0a 54 68 65 72 65 66 6f  -2,6%....Therefo
18c0: 72 65 3a 0d 0a 20 20 20 20 55 73 69 6e 67 20 70  re:..    Using p
18d0: 61 74 68 73 20 69 73 20 6d 6f 72 65 20 70 65 72  aths is more per
18e0: 66 6f 72 6d 61 6e 74 20 74 68 61 6e 20 6e 6f 74  formant than not
18f0: 20 75 73 69 6e 67 20 74 68 65 6d 2e 0d 0a 20 20   using them...  
1900: 20 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 64 20    The optimized 
1910: 66 69 78 20 69 6e 20 66 61 63 74 20 64 6f 65 73  fix in fact does
1920: 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 62 65   not optimize be
1930: 63 61 75 73 65 20 69 74 20 64 6f 65 73 20 6e 6f  cause it does no
1940: 74 20 75 73 65 20 61 20 70 61 74 68 20 66 6f 72  t use a path for
1950: 20 6e 6f 6e 2d 63 6c 6f 73 65 64 20 70 6f 6c 79   non-closed poly
1960: 6c 69 6e 65 73 2e 0d 0a 0d 0a 42 55 54 3a 0d 0a  lines.....BUT:..
1970: 20 20 20 20 41 6c 6c 20 74 68 65 73 65 20 66 69      All these fi
1980: 67 75 72 65 73 20 61 72 65 20 69 6e 20 74 68 65  gures are in the
1990: 20 75 6e 63 65 72 74 61 69 6e 74 79 20 6d 61 72   uncertainty mar
19a0: 67 69 6e 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  gin. When runnin
19b0: 67 20 74 68 65 20 74 65 73 74 73 20 6c 61 74 65  g the tests late
19c0: 72 20 61 67 61 69 6e 20 66 69 67 75 72 65 73 20  r again figures 
19d0: 77 65 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20  were different. 
19e0: 44 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 63  Depends on the c
19f0: 6f 6d 70 75 74 65 72 20 75 73 65 20 49 20 67 75  omputer use I gu
1a00: 65 73 73 2e 0d 0a 20 20 20 20 57 68 61 74 27 73  ess...    What's
1a10: 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68   important is th
1a20: 61 74 20 74 68 65 20 66 69 67 75 72 65 73 20 73  at the figures s
1a30: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 61 72 61  hould be compara
1a40: 62 6c 65 20 73 69 6e 63 65 20 74 65 73 74 73 20  ble since tests 
1a50: 77 65 72 65 20 72 75 6e 20 6e 65 78 74 20 74 6f  were run next to
1a60: 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 61   each other in a
1a70: 20 73 68 6f 72 74 20 74 69 6d 65 66 72 61 6d 65   short timeframe
1a80: 2c 20 74 68 75 73 20 6e 6f 20 70 65 72 66 6f 72  , thus no perfor
1a90: 6d 61 6e 63 65 20 6c 6f 73 73 2e 0d 0a 0d 0a 0d  mance loss......
1aa0: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
1ab0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ac0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1ad0: 23 23 23 23 23 0d 0a 23 20 70 65 72 66 6f 72 6d  #####..# perform
1ae0: 61 6e 63 65 20 6e 6f 6e 2d 72 65 67 72 65 73 73  ance non-regress
1af0: 69 6f 6e 20 74 65 73 74 69 6e 67 3a 20 28 70 6f  ion testing: (po
1b00: 6c 79 29 6c 69 6e 65 0d 0a 0d 0a 70 61 63 6b 61  ly)line....packa
1b10: 67 65 20 72 65 71 75 69 72 65 20 54 6b 0d 0a 70  ge require Tk..p
1b20: 61 63 6b 20 5b 63 61 6e 76 61 73 20 2e 63 5d 0d  ack [canvas .c].
1b30: 0a 0d 0a 70 72 6f 63 20 67 65 6e 63 6f 6f 72 64  ...proc gencoord
1b40: 73 20 7b 6e 20 63 6c 6f 73 65 6c 69 6e 65 20 7b  s {n closeline {
1b50: 6d 61 78 78 20 34 30 30 7d 20 7b 6d 61 78 79 20  maxx 400} {maxy 
1b60: 32 35 30 7d 7d 20 7b 0d 0a 20 20 20 20 73 65 74  250}} {..    set
1b70: 20 72 65 73 20 7b 7d 0d 0a 20 20 20 20 66 6f 72   res {}..    for
1b80: 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c   {set i 1} {$i <
1b90: 3d 20 24 6e 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  = $n} {incr i} {
1ba0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 78 20  ..        set x 
1bb0: 5b 65 78 70 72 20 7b 72 6f 75 6e 64 28 72 61 6e  [expr {round(ran
1bc0: 64 28 29 20 2a 20 24 6d 61 78 78 29 7d 5d 0d 0a  d() * $maxx)}]..
1bd0: 20 20 20 20 20 20 20 20 73 65 74 20 79 20 5b 65          set y [e
1be0: 78 70 72 20 7b 72 6f 75 6e 64 28 72 61 6e 64 28  xpr {round(rand(
1bf0: 29 20 2a 20 24 6d 61 78 79 29 7d 5d 0d 0a 20 20  ) * $maxy)}]..  
1c00: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
1c10: 73 20 24 78 20 24 79 0d 0a 20 20 20 20 7d 0d 0a  s $x $y..    }..
1c20: 20 20 20 20 69 66 20 7b 24 63 6c 6f 73 65 6c 69      if {$closeli
1c30: 6e 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  ne} {..        #
1c40: 20 63 6c 6f 73 65 20 74 68 65 20 70 6f 6c 79 6c   close the polyl
1c50: 69 6e 65 0d 0a 20 20 20 20 20 20 20 20 6c 61 70  ine..        lap
1c60: 70 65 6e 64 20 72 65 73 20 5b 6c 69 6e 64 65 78  pend res [lindex
1c70: 20 24 72 65 73 20 30 5d 0d 0a 20 20 20 20 20 20   $res 0]..      
1c80: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20 5b 6c    lappend res [l
1c90: 69 6e 64 65 78 20 24 72 65 73 20 31 5d 0d 0a 20  index $res 1].. 
1ca0: 20 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
1cb0: 20 24 72 65 73 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63   $res..}....proc
1cc0: 20 64 72 61 77 69 74 20 7b 72 65 70 65 61 74 64   drawit {repeatd
1cd0: 72 61 77 20 6e 62 76 65 72 74 69 63 65 73 20 63  raw nbvertices c
1ce0: 6c 6f 73 65 6c 69 6e 65 7d 20 7b 0d 0a 20 20 20  loseline} {..   
1cf0: 20 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b   for {set i 1} {
1d00: 24 69 20 3c 3d 20 24 72 65 70 65 61 74 64 72 61  $i <= $repeatdra
1d10: 77 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0d 0a 20  w} {incr i} {.. 
1d20: 20 20 20 20 20 20 20 73 65 74 20 69 64 20 5b 2e         set id [.
1d30: 63 20 63 72 65 61 74 65 20 6c 69 6e 65 20 5b 67  c create line [g
1d40: 65 6e 63 6f 6f 72 64 73 20 24 6e 62 76 65 72 74  encoords $nbvert
1d50: 69 63 65 73 20 24 63 6c 6f 73 65 6c 69 6e 65 5d  ices $closeline]
1d60: 5d 0d 0a 20 20 20 20 20 20 20 20 2e 63 20 69 74  ]..        .c it
1d70: 65 6d 63 6f 6e 66 69 67 75 72 65 20 24 69 64 20  emconfigure $id 
1d80: 2d 66 69 6c 6c 20 72 65 64 20 2d 77 69 64 74 68  -fill red -width
1d90: 20 31 30 20 2d 6a 6f 69 6e 73 74 79 6c 65 20 6d   10 -joinstyle m
1da0: 69 74 65 72 0d 0a 20 20 20 20 20 20 20 20 75 70  iter..        up
1db0: 64 61 74 65 0d 0a 20 20 20 20 20 20 20 20 2e 63  date..        .c
1dc0: 20 64 65 6c 65 74 65 20 24 69 64 0d 0a 20 20 20   delete $id..   
1dd0: 20 7d 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 74 69   }..}....proc ti
1de0: 6d 65 69 74 20 7b 72 65 70 65 61 74 64 72 61 77  meit {repeatdraw
1df0: 20 6e 62 76 65 72 74 69 63 65 73 20 7b 6e 62 20   nbvertices {nb 
1e00: 33 7d 20 7b 63 6c 6f 73 65 6c 69 6e 65 20 74 72  3} {closeline tr
1e10: 75 65 7d 7d 20 7b 0d 0a 20 20 20 20 73 65 74 20  ue}} {..    set 
1e20: 74 6f 74 20 30 0d 0a 20 20 20 20 66 6f 72 20 7b  tot 0..    for {
1e30: 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c 3d 20  set i 1} {$i <= 
1e40: 24 6e 62 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0d  $nb} {incr i} {.
1e50: 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 74 6f  .        incr to
1e60: 74 20 5b 73 63 61 6e 20 5b 74 69 6d 65 20 7b 64  t [scan [time {d
1e70: 72 61 77 69 74 20 24 72 65 70 65 61 74 64 72 61  rawit $repeatdra
1e80: 77 20 24 6e 62 76 65 72 74 69 63 65 73 20 24 63  w $nbvertices $c
1e90: 6c 6f 73 65 6c 69 6e 65 7d 5d 20 25 64 5d 0d 0a  loseline}] %d]..
1ea0: 20 20 20 20 7d 0d 0a 20 20 20 20 70 75 74 73 20      }..    puts 
1eb0: 22 4d 65 61 6e 20 74 69 6d 65 20 6f 6e 20 24 6e  "Mean time on $n
1ec0: 62 20 72 75 6e 73 3a 20 5b 65 78 70 72 20 7b 24  b runs: [expr {$
1ed0: 74 6f 74 20 2f 20 24 6e 62 7d 5d 20 b5 73 22 0d  tot / $nb}] .s".
1ee0: 0a 7d 0d 0a 0d 0a 74 69 6d 65 69 74 20 35 30 30  .}....timeit 500
1ef0: 20 33 30 30 20 33 0d 0a 74 69 6d 65 69 74 20 35   300 3..timeit 5
1f00: 30 30 20 33 30 30 20 33 20 30 0d 0a 74 69 6d 65  00 300 3 0..time
1f10: 69 74 20 32 30 30 30 20 33 30 20 33 0d 0a 74 69  it 2000 30 3..ti
1f20: 6d 65 69 74 20 32 30 30 30 20 33 30 20 33 20 30  meit 2000 30 3 0
1f30: 0d 0a 74 69 6d 65 69 74 20 35 30 30 30 20 35 30  ..timeit 5000 50
1f40: 20 31 30 0d 0a 74 69 6d 65 69 74 20 35 30 30 30   10..timeit 5000
1f50: 20 35 30 20 31 30 20 30 0d 0a 0d 0a 23 20 72 65   50 10 0....# re
1f60: 73 75 6c 74 73 20 28 69 6e 20 b5 73 29 3a 20 20  sults (in .s):  
1f70: 20 20 20 20 20 63 6f 72 65 2d 38 2d 36 2d 62 72       core-8-6-br
1f80: 61 6e 63 68 20 20 20 20 62 75 67 66 69 78 20 62  anch    bugfix b
1f90: 72 61 6e 63 68 20 20 20 20 6f 70 74 69 6d 69 7a  ranch    optimiz
1fa0: 65 64 20 62 75 67 66 69 78 20 20 20 20 70 65 72  ed bugfix    per
1fb0: 66 20 6c 6f 73 73 20 20 20 20 20 20 70 65 72 66  f loss      perf
1fc0: 20 6c 6f 73 73 20 20 20 20 20 20 20 70 65 72 66   loss       perf
1fd0: 20 6c 6f 73 73 0d 0a 23 20 20 20 20 20 20 20 20   loss..#        
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 5b 36 64 63 31 62 33 34 39 5d 20 20 20 20    [6dc1b349]    
2000: 20 20 20 20 20 5b 63 34 34 31 65 37 33 66 5d 20       [c441e73f] 
2010: 20 20 20 20 20 20 5b 2e 2e 2e 20 3f 20 2e 2e 2e        [... ? ...
2020: 5d 20 20 20 20 20 20 20 20 38 36 2d 3e 62 75 67  ]        86->bug
2030: 66 69 78 20 20 20 20 20 62 75 67 66 69 78 2d 3e  fix     bugfix->
2040: 6f 70 74 69 20 20 20 20 38 36 2d 3e 6f 70 74 69  opti    86->opti
2050: 6d 0d 0a 23 20 74 69 6d 65 69 74 20 35 30 30 20  m..# timeit 500 
2060: 33 30 30 20 33 09 09 34 35 31 36 34 33 33 09 09  300 3..4516433..
2070: 09 34 34 38 36 35 37 30 09 09 34 34 39 35 32 32  .4486570..449522
2080: 32 09 09 09 2d 30 2c 37 25 09 09 30 2c 32 25 09  2...-0,7%..0,2%.
2090: 09 2d 30 2c 35 25 0d 0a 23 20 74 69 6d 65 69 74  .-0,5%..# timeit
20a0: 20 35 30 30 20 33 30 30 20 33 20 30 09 09 34 34   500 300 3 0..44
20b0: 39 35 32 38 36 09 09 09 34 34 33 36 39 33 30 09  95286...4436930.
20c0: 09 34 34 32 34 38 36 35 09 09 09 2d 31 2c 33 25  .4424865...-1,3%
20d0: 09 09 2d 30 2c 33 25 09 09 2d 31 2c 36 25 0d 0a  ..-0,3%..-1,6%..
20e0: 23 20 74 69 6d 65 69 74 20 32 30 30 30 20 33 30  # timeit 2000 30
20f0: 20 33 09 09 33 32 33 37 33 30 39 09 09 09 33 31   3..3237309...31
2100: 39 34 31 39 39 09 09 33 31 38 30 30 30 30 09 09  94199..3180000..
2110: 09 2d 31 2c 33 25 09 09 2d 30 2c 34 25 09 09 2d  .-1,3%..-0,4%..-
2120: 31 2c 38 25 0d 0a 23 20 74 69 6d 65 69 74 20 32  1,8%..# timeit 2
2130: 30 30 30 20 33 30 20 33 20 30 09 09 33 31 36 33  000 30 3 0..3163
2140: 35 38 34 09 09 09 33 31 36 31 30 36 36 09 09 33  584...3161066..3
2150: 31 33 33 33 37 30 09 09 09 2d 30 2c 31 25 09 09  133370...-0,1%..
2160: 2d 30 2c 39 25 09 09 2d 31 2c 30 25 0d 0a 23 20  -0,9%..-1,0%..# 
2170: 74 69 6d 65 69 74 20 35 30 30 30 20 35 30 20 31  timeit 5000 50 1
2180: 30 09 09 39 31 31 33 39 32 33 09 09 09 39 30 32  0..9113923...902
2190: 39 36 31 32 09 09 39 30 34 37 33 34 34 09 09 09  9612..9047344...
21a0: 2d 30 2c 39 25 09 09 30 2c 32 25 09 09 2d 30 2c  -0,9%..0,2%..-0,
21b0: 37 25 0d 0a 23 20 74 69 6d 65 69 74 20 35 30 30  7%..# timeit 500
21c0: 30 20 35 30 20 31 30 20 30 09 09 39 30 32 30 36  0 50 10 0..90206
21d0: 39 30 09 09 09 39 30 30 35 39 34 37 09 09 38 39  90...9005947..89
21e0: 33 34 31 32 39 09 09 09 2d 30 2c 32 25 09 09 2d  34129...-0,2%..-
21f0: 30 2c 38 25 09 09 2d 31 2c 30 25 0d 0a 0d 0a 54  0,8%..-1,0%....T
2200: 68 65 72 65 66 6f 72 65 3a 0d 0a 20 20 20 20 55  herefore:..    U
2210: 73 69 6e 67 20 70 61 74 68 73 20 69 73 20 67 65  sing paths is ge
2220: 6e 65 72 61 6c 6c 79 20 6d 6f 72 65 20 70 65 72  nerally more per
2230: 66 6f 72 6d 61 6e 74 20 74 68 61 6e 20 6e 6f 74  formant than not
2240: 20 75 73 69 6e 67 20 74 68 65 6d 2e 0d 0a 20 20   using them...  
2250: 20 20 53 6c 69 67 68 74 20 61 64 64 69 74 69 6f    Slight additio
2260: 6e 61 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  nal performance 
2270: 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 6f 70  gain with the op
2280: 74 69 6d 69 7a 65 64 20 66 69 78 20 77 68 65 6e  timized fix when
2290: 20 74 68 65 20 70 6f 6c 79 6c 69 6e 65 20 69 73   the polyline is
22a0: 20 6e 6f 74 20 63 6c 6f 73 65 64 2e 0d 0a 20 20   not closed...  
22b0: 20 20 46 6f 72 20 63 6c 6f 73 65 64 20 70 6f 6c    For closed pol
22c0: 79 6c 69 6e 65 73 20 74 68 65 20 6f 70 74 69 6d  ylines the optim
22d0: 69 7a 65 64 20 66 69 78 20 69 73 20 69 6e 20 66  ized fix is in f
22e0: 61 63 74 20 61 20 76 65 72 79 20 73 6d 61 6c 6c  act a very small
22f0: 20 6c 6f 73 73 20 6f 66 20 70 65 72 66 6f 72 6d   loss of perform
2300: 61 6e 63 65 2e 0d 0a 0d 0a 42 55 54 3a 0d 0a 20  ance.....BUT:.. 
2310: 20 20 20 41 6c 6c 20 74 68 65 73 65 20 66 69 67     All these fig
2320: 75 72 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ures are in the 
2330: 75 6e 63 65 72 74 61 69 6e 74 79 20 6d 61 72 67  uncertainty marg
2340: 69 6e 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  in. When running
2350: 20 74 68 65 20 74 65 73 74 73 20 6c 61 74 65 72   the tests later
2360: 20 61 67 61 69 6e 20 66 69 67 75 72 65 73 20 77   again figures w
2370: 65 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 44  ere different. D
2380: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 63 6f  epends on the co
2390: 6d 70 75 74 65 72 20 75 73 65 20 49 20 67 75 65  mputer use I gue
23a0: 73 73 2e 0d 0a 20 20 20 20 57 68 61 74 27 73 20  ss...    What's 
23b0: 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61  important is tha
23c0: 74 20 74 68 65 20 66 69 67 75 72 65 73 20 73 68  t the figures sh
23d0: 6f 75 6c 64 20 62 65 20 63 6f 6d 70 61 72 61 62  ould be comparab
23e0: 6c 65 20 73 69 6e 63 65 20 74 65 73 74 73 20 77  le since tests w
23f0: 65 72 65 20 72 75 6e 20 6e 65 78 74 20 74 6f 20  ere run next to 
2400: 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 61 20  each other in a 
2410: 73 68 6f 72 74 20 74 69 6d 65 66 72 61 6d 65 2c  short timeframe,
2420: 20 74 68 75 73 20 6e 6f 20 70 65 72 66 6f 72 6d   thus no perform
2430: 61 6e 63 65 20 6c 6f 73 73 2e 0d 0a 0d 0a 0d 0a  ance loss.......
2440: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2450: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2460: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2470: 23 23 23 23 0d 0a 47 45 4e 45 52 41 4c 20 43 4f  ####..GENERAL CO
2480: 4e 43 4c 55 53 49 4f 4e 3a 0d 0a 0d 0a 20 20 20  NCLUSION:....   
2490: 20 41 6c 6c 20 69 6e 20 61 6c 6c 20 74 68 65 20   All in all the 
24a0: 6f 70 74 69 6d 69 7a 65 64 20 66 69 78 20 69 73  optimized fix is
24b0: 20 77 6f 72 73 65 20 74 68 61 6e 20 6e 6f 6e 2d   worse than non-
24c0: 6f 70 74 69 6d 69 7a 65 64 20 66 69 78 20 66 6f  optimized fix fo
24d0: 72 20 70 6f 6c 79 67 6f 6e 73 20 61 6e 64 20 6e  r polygons and n
24e0: 6f 6e 2d 63 6c 6f 73 65 64 20 70 6f 6c 79 6c 69  on-closed polyli
24f0: 6e 65 73 2e 0d 0a 20 20 20 20 50 61 74 68 73 20  nes...    Paths 
2500: 61 72 65 20 6d 6f 72 65 20 70 65 72 66 6f 72 6d  are more perform
2510: 61 6e 74 20 74 68 61 6e 20 6e 6f 74 20 75 73 69  ant than not usi
2520: 6e 67 20 74 68 65 6d 2e 0d 0a 20 20 20 20 54 68  ng them...    Th
2530: 65 20 6f 70 74 69 6d 69 7a 65 64 20 66 69 78 20  e optimized fix 
2540: 64 6f 65 73 20 70 72 6f 76 69 64 65 20 61 20 73  does provide a s
2550: 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
2560: 20 69 6e 63 72 65 61 73 65 20 66 6f 72 20 6e 6f   increase for no
2570: 6e 2d 63 6c 6f 73 65 64 20 70 6f 6c 79 6c 69 6e  n-closed polylin
2580: 65 73 2c 20 62 75 74 20 74 68 69 73 20 69 73 20  es, but this is 
2590: 6d 6f 72 65 20 74 68 61 6e 20 62 61 6c 61 6e 63  more than balanc
25a0: 65 64 20 62 79 20 74 68 65 20 70 65 72 66 6f 72  ed by the perfor
25b0: 6d 61 6e 63 65 20 6c 6f 73 73 20 77 69 74 68 20  mance loss with 
25c0: 70 6f 6c 79 67 6f 6e 73 20 61 6e 64 20 63 6c 6f  polygons and clo
25d0: 73 65 64 20 70 6f 6c 79 6c 69 6e 65 73 2c 20 65  sed polylines, e
25e0: 73 70 65 63 69 61 6c 6c 79 20 73 69 6e 63 65 20  specially since 
25f0: 74 68 65 20 6d 65 61 73 75 72 65 64 20 70 65 72  the measured per
2600: 66 6f 72 6d 61 6e 63 65 20 69 6e 63 72 65 61 73  formance increas
2610: 65 20 69 73 20 6d 61 72 67 69 6e 61 6c 20 63 6f  e is marginal co
2620: 6d 70 61 72 65 64 20 74 6f 20 74 68 65 20 75 6e  mpared to the un
2630: 63 65 72 74 61 69 6e 74 79 20 6f 66 20 74 68 65  certainty of the
2640: 20 6d 65 61 73 75 72 65 6d 65 6e 74 2e 0d 0a 0d   measurement....
2650: 0a 20 20 20 2d 2d 3e 20 31 2e 20 54 68 65 20 66  .   --> 1. The f
2660: 69 78 20 64 6f 65 73 20 6e 6f 74 20 63 72 65 61  ix does not crea
2670: 74 65 20 61 6e 79 20 6c 6f 73 73 20 6f 66 20 70  te any loss of p
2680: 65 72 66 6f 72 6d 61 6e 63 65 2e 20 49 74 20 72  erformance. It r
2690: 61 74 68 65 72 20 69 6d 70 72 6f 76 65 73 20 70  ather improves p
26a0: 65 72 66 6f 72 6d 61 6e 63 65 20 73 6c 69 67 68  erformance sligh
26b0: 74 6c 79 2e 0d 0a 20 20 20 20 20 20 20 32 2e 20  tly...       2. 
26c0: 54 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 66 69  The optimized fi
26d0: 78 20 69 73 20 72 65 6a 65 63 74 65 64 2c 20 61  x is rejected, a
26e0: 6e 64 20 74 68 65 20 62 75 67 66 69 78 20 5b 63  nd the bugfix [c
26f0: 34 34 31 65 37 33 66 5d 20 69 73 20 6b 65 70 74  441e73f] is kept
2700: 20 61 73 20 69 73 2e 0d 0a 0d 0a                  as is.....