Patch title: Release 85 bulk changes
Abstract:
File: /pliant/math/curve.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 

module "/pliant/language/compiler.pli"
module "/pliant/language/context.pli"
module "/pliant/math/functions.pli"
module "/pliant/math/point.pli"
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 

module "/pliant/language/compiler.pli"
module "/pliant/language/context.pli"
module "/pliant/math/functions.pli"
module "/pliant/math/point.pli"
module "/pliant/math/transform.pli"




type CurvePoint
  public

public

  type CurvePoint
    field Float in_x in_y
    field Float x y
    field Float out_x out_y
    field Float in_x in_y
    field Float x y
    field Float out_x out_y
  field uInt16 flags ; field uInt8 in_mode out_mode
    field uInt16 flags ; field uInt8 in_mode out_mode
  
  constant curvepoint_automatic 0
  constant curvepoint_directed 1
  constant curvepoint_manual 2
  
  constant curvepoint_selected 1
  constant curvepoint_withinpoint 100h
  constant curvepoint_withoutpoint 200h
  
  constant automatic curvepoint_automatic
  constant directed curvepoint_directed
  constant manual curvepoint_manual
  


constant automatic 0
constant directed 1
constant manual 2
constant selected 1
constant withinpoint 100h
constant withoutpoint 200h



module "curve/mode.pli"
module "curve/mode.pli"
constant is_ready 80h
constant is_ready (cast 80h Int)

type Curve
  field Array:CurvePoint pts
  field Int status <- standard

type Curve
  field Array:CurvePoint pts
  field Int status <- standard

 
function 'cast Status' c -> s
  arg Curve c ; arg Status s
  explicit
  s := shunt (c:status .and. is_ready)<>0 success failure



function 'cast Status' c -> s
  arg Curve c ; arg Status s
  explicit
  s := shunt (c:status .and. is_ready)<>0 success failure



function min a b -> r
  arg Float a b r
  if a<=b
    r := a
  else
    r := b

function max a b -> r
  arg Float a b r
  if a>=b
    r := a
  else
    r := b

function min a b c -> r
  arg Float a b c r
  r := min (min a b) c
      
function max a b c -> r
  arg Float a b c r
  r := max (max a b) c
      
function bound a m M -> r
  arg Int a m M r
  r := shunt a<=m m a>=M M a


function min a b c -> r
  arg Float a b c r
  r := min (min a b) c
      
function max a b c -> r
  arg Float a b c r
  r := max (max a b) c
      
function bound a m M -> r
  arg Int a m M r
  r := shunt a<=m m a>=M M a


export CurvePoint curve_point '. tg_in' '. tg_out' '. in' '.
export curve_point '. tg_in' '. tg_out' '. in' '. out' '. is_angle'






method c 'size :=' s
  arg_rw Curve c ; arg Int s
  c:pts size := s
  c status := c:status .and. .not. is_ready

method c point i -> p
  arg Curve c ; arg Int i ; arg_R CurvePoint p
  p :> c:pts i
method c point i -> p
  arg Curve c ; arg Int i ; arg_R CurvePoint p
  p :> c:pts i

method c 'point :=' i p
  arg_rw Curve c ; arg Int i ; arg CurvePoint p
  c:pts i := p
  c status := c:status .and. .not. is_ready
  
method c mode -> m
  arg Curve c ; arg Int m
  m := c:status .and. .not. (cast is_ready Int)


  
method c mode -> m
  arg Curve c ; arg Int m
  m := c:status .and. .not. (cast is_ready Int)


method c limits x0 y0 x1 y1
method c bbox x0 y0 x1 y1
  arg Curve c ; arg_w Float x0 y0 x1 y1
  check (c:status .and. is_ready)<>0
  x0 := maximum ; y0 := maximum
  x1 := -maximum ; y1 := -maximum
  for (var Int i) 0 c:pts:size-1
    var Pointer:CurvePoint p :> c:pts i
    x0 := min x0 (min p:x p:x+p:in_x p:x+p:out_x)
    y0 := min y0 (min p:y p:y+p:in_y p:y+p:out_y)
    x1 := max x1 (max p:x p:x+p:in_x p:x+p:out_x)
    y1 := max y1 (max p:y p:y+p:in_y p:y+p:out_y)



  arg Curve c ; arg_w Float x0 y0 x1 y1
  check (c:status .and. is_ready)<>0
  x0 := maximum ; y0 := maximum
  x1 := -maximum ; y1 := -maximum
  for (var Int i) 0 c:pts:size-1
    var Pointer:CurvePoint p :> c:pts i
    x0 := min x0 (min p:x p:x+p:in_x p:x+p:out_x)
    y0 := min y0 (min p:y p:y+p:in_y p:y+p:out_y)
    x1 := max x1 (max p:x p:x+p:in_x p:x+p:out_x)
    y1 := max y1 (max p:y p:y+p:in_y p:y+p:out_y)



method c polyline table t0 p0 t1 p1 delta
  arg Curve c ; arg_rw Array:Point2 table ; arg Float t0 t1 
method c polyline table t0 p0 t1 p1 m epsilon
  arg Curve c ; arg_rw Array:Point2 table ; arg Float t0 t1 epsilon ; arg Transform2 m ; arg Point2 p0 p1
  var Float t05 := (t0+t1)/2.0
  var Float t05 := (t0+t1)/2.0
  var Point2 p05 := c pos t05
  if (distance (point (p0:x+p1:x)*0.5 (p0:y+p1:y)*0.5) p05)<
    table += p05 ; table+=p1
  var Point2 p05 := m (c pos t05)
  if (distance (point (p0:x+p1:x)*0.5 (p0:y+p1:y)*0.5) p05)<=epsilon
    table += p05 ; table += p1
  else
  else
    c polyline table t0 p0 t05 p05 delta
    c polyline table t05 p05 t1 p1 delta
    c polyline table t0 p0 t05 p05 m epsilon
    c polyline table t05 p05 t1 p1 m epsilon


method c polyline delta -> table
  arg Curve c ; arg Float delta ; arg Array:Point2 table
method c polyline m epsilon -> table
  arg Curve c ; arg Transform2 m ; arg Float epsilon ; arg Array:Point2 table
  check (c:status .and. is_ready)<>0
  check (c:status .and. is_ready)<>0
  table size := 1 ; table 0 := c pos 0
  table size := 1 ; table 0 := m (c pos 0)
  var Int n := shunt (c:status .and. outline)<>0 c:pts:size 
  for (var Int i) 0 n-1
    var Pointer:CurvePoint cp0 :> c:pts i
    var Pointer:CurvePoint cp1 :> c:pts (i+1)%c:pts:size
    if cp0:out_x=0 and cp0:out_y=0 and cp1:in_x=0 and cp1:in
  var Int n := shunt (c:status .and. outline)<>0 c:pts:size 
  for (var Int i) 0 n-1
    var Pointer:CurvePoint cp0 :> c:pts i
    var Pointer:CurvePoint cp1 :> c:pts (i+1)%c:pts:size
    if cp0:out_x=0 and cp0:out_y=0 and cp1:in_x=0 and cp1:in
      table += point cp1:x cp1:y
      table += m (point cp1:x cp1:y)
    else
      var Float t0 := i/n ; var Point2 p0 := table table:siz
    else
      var Float t0 := i/n ; var Point2 p0 := table table:siz
      var Float t05 := (i+0.5)/n ; var Point2 p05 := c pos t
      var Float t1 := (i+1)/n ; var Point2 p1 := c pos t1
      c polyline table  t0 p0  t05 p05 delta
      c polyline table  t05 p05 t1 p1 delta
      var Float t05 := (i+0.5)/n ; var Point2 p05 := m (c pos t05)
      var Float t1 := (i+1)/n ; var Point2 p1 := m (c pos t1)
      c polyline table  t0 p0  t05 p05 m epsilon
      c polyline table  t05 p05 t1 p1 m epsilon




method c polyline table p0 p1 delta
  arg Curve c ; arg_rw Array:Point3 table ; arg Float delta 
method c polyline table p0 p1 m epsilon
  arg Curve c ; arg_rw Array:Point3 table ; arg Transform2 m ; arg Float epsilon ; arg Point3 p0 p1
  var Point3 p05
  p05 z := (p0:z+p1:z)/2.0
  var Point3 p05
  p05 z := (p0:z+p1:z)/2.0
  addressof:p05 map Point2 := c pos p05:z
  if (distance (point (p0:x+p1:x)*0.5 (p0:y+p1:y)*0.5) (addr
  addressof:p05 map Point2 := m (c pos p05:z)
  if (distance (point (p0:x+p1:x)*0.5 (p0:y+p1:y)*0.5) (addressof:p05 map Point2))<=epsilon
    table += p05 ; table+=p1
  else
    table += p05 ; table+=p1
  else
    c polyline table p0 p05 delta
    c polyline table p05 p1 delta
    c polyline table p0 p05 m epsilon
    c polyline table p05 p1 m epsilon


method c polyline3 delta -> table
  arg Curve c ; arg Float delta ; arg Array:Point3 table
method c polyline3 m epsilon -> table
  arg Curve c ; arg Transform2 m ; arg Float epsilon ; arg Array:Point3 table
  check (c:status .and. is_ready)<>0
  check (c:status .and. is_ready)<>0
  table size := 1 ; table:0 z := 0 ; (addressof table:0) map
  table size := 1 ; table:0 z := 0 ; (addressof table:0) map Point2 := m (c pos 0)
  var Int n := shunt (c:status .and. outline)<>0 c:pts:size 
  for (var Int i) 0 n-1
    var Pointer:CurvePoint cp0 :> c:pts i
    var Pointer:CurvePoint cp1 :> c:pts (i+1)%c:pts:size
    if cp0:out_x=0 and cp0:out_y=0 and cp1:in_x=0 and cp1:in
  var Int n := shunt (c:status .and. outline)<>0 c:pts:size 
  for (var Int i) 0 n-1
    var Pointer:CurvePoint cp0 :> c:pts i
    var Pointer:CurvePoint cp1 :> c:pts (i+1)%c:pts:size
    if cp0:out_x=0 and cp0:out_y=0 and cp1:in_x=0 and cp1:in
      table += (point cp1:x cp1:y (i+1)/n)
      var Point3 p1 ; p1 z := (i+1)/n ; addressof:p1 map Point2 := m (point cp1:x cp1:y)
      table += p1
    else
      var Point3 p0 := table table:size-1
    else
      var Point3 p0 := table table:size-1
      var Point3 p05 ; p05 z := (i+0.5)/n ; addressof:p05 ma
      var Point3 p1 ; p1 z := (i+1)/n ; addressof:p1 map Poi
      c polyline table p0 p05 delta
      c polyline table p05 p1 delta
      var Point3 p05 ; p05 z := (i+0.5)/n ; addressof:p05 map Point2 := m (c pos p05:z)
      var Point3 p1 ; p1 z := (i+1)/n ; addressof:p1 map Point2 := m (c pos p1:z)
      c polyline table p0 p05 m epsilon
      c polyline table p05 p1 m epsilon


export Curve '. reset' '. through' '. angle' '+=' '. compute


export Curve '. reset' '. through' '. angle' '+=' '. compute
export '. size' '. point' '. mode' '. limits' '. pos'
export '. size' '. size :=' '. point' '. point :=' '. mode' '. bbox' '. pos'
export '. x_param' '. y_param' '. param_x' '. param_y' '. x'
export '. polyline' '. polyline3'
export 'cast Status'
export '. x_param' '. y_param' '. param_x' '. param_y' '. x'
export '. polyline' '. polyline3'
export 'cast Status'