@@ -439,52 +439,25 @@ void AddProtoToProtoPruner(PROTO Proto, int ProtoId,
439
439
440
440
441
441
/* ---------------------------------------------------------------------------*/
442
- int BucketFor (FLOAT32 Param, FLOAT32 Offset, int NumBuckets) {
443
- /*
444
- ** Parameters:
445
- ** Param parameter value to map into a bucket number
446
- ** Offset amount to shift param before mapping it
447
- ** NumBuckets number of buckets to map param into
448
- ** Globals: none
449
- ** Operation: This routine maps a parameter value into a bucket between
450
- ** 0 and NumBuckets-1. Offset is added to the parameter
451
- ** before mapping it. Values which map to buckets outside
452
- ** the range are truncated to fit within the range. Mapping
453
- ** is done by truncating rather than rounding.
454
- ** Return: Bucket number corresponding to Param + Offset.
455
- ** Exceptions: none
456
- ** History: Thu Feb 14 13:24:33 1991, DSJ, Created.
457
- */
458
- return ClipToRange (static_cast <int >(MapParam (Param, Offset, NumBuckets)),
459
- 0 , NumBuckets - 1 );
460
- } /* BucketFor */
461
-
442
+ // Returns a quantized bucket for the given param shifted by offset,
443
+ // notionally (param + offset) * num_buckets, but clipped and casted to the
444
+ // appropriate type.
445
+ uinT8 Bucket8For (FLOAT32 param, FLOAT32 offset, int num_buckets) {
446
+ int bucket = IntCastRounded (MapParam (param, offset, num_buckets));
447
+ return static_cast <uinT8>(ClipToRange (bucket, 0 , num_buckets - 1 ));
448
+ }
449
+ uinT16 Bucket16For (FLOAT32 param, FLOAT32 offset, int num_buckets) {
450
+ int bucket = IntCastRounded (MapParam (param, offset, num_buckets));
451
+ return static_cast <uinT16>(ClipToRange (bucket, 0 , num_buckets - 1 ));
452
+ }
462
453
463
454
/* ---------------------------------------------------------------------------*/
464
- int CircBucketFor (FLOAT32 Param, FLOAT32 Offset, int NumBuckets) {
465
- /*
466
- ** Parameters:
467
- ** Param parameter value to map into a circular bucket
468
- ** Offset amount to shift param before mapping it
469
- ** NumBuckets number of buckets to map param into
470
- ** Globals: none
471
- ** Operation: This routine maps a parameter value into a bucket between
472
- ** 0 and NumBuckets-1. Offset is added to the parameter
473
- ** before mapping it. Values which map to buckets outside
474
- ** the range are wrapped to a new value in a circular fashion.
475
- ** Mapping is done by truncating rather than rounding.
476
- ** Return: Bucket number corresponding to Param + Offset.
477
- ** Exceptions: none
478
- ** History: Thu Feb 14 13:24:33 1991, DSJ, Created.
479
- */
480
- int Bucket;
481
-
482
- Bucket = static_cast <int >(MapParam (Param, Offset, NumBuckets));
483
- if (Bucket < 0 )
484
- Bucket += NumBuckets;
485
- else if (Bucket >= NumBuckets)
486
- Bucket -= NumBuckets;
487
- return Bucket;
455
+ // Returns a quantized bucket for the given circular param shifted by offset,
456
+ // notionally (param + offset) * num_buckets, but modded and casted to the
457
+ // appropriate type.
458
+ uinT8 CircBucketFor (FLOAT32 param, FLOAT32 offset, int num_buckets) {
459
+ int bucket = IntCastRounded (MapParam (param, offset, num_buckets));
460
+ return static_cast <uinT8>(Modulo (bucket, num_buckets));
488
461
} /* CircBucketFor */
489
462
490
463
@@ -1694,23 +1667,23 @@ void InitTableFiller (FLOAT32 EndPad, FLOAT32 SidePad,
1694
1667
1695
1668
if (fabs (Angle - 0.0 ) < HV_TOLERANCE || fabs (Angle - 0.5 ) < HV_TOLERANCE) {
1696
1669
/* horizontal proto - handle as special case */
1697
- Filler->X = BucketFor (X - HalfLength - EndPad, XS, NB);
1698
- Filler->YStart = BucketFor (Y - SidePad, YS, NB * 256 );
1699
- Filler->YEnd = BucketFor (Y + SidePad, YS, NB * 256 );
1670
+ Filler->X = Bucket8For (X - HalfLength - EndPad, XS, NB);
1671
+ Filler->YStart = Bucket16For (Y - SidePad, YS, NB * 256 );
1672
+ Filler->YEnd = Bucket16For (Y + SidePad, YS, NB * 256 );
1700
1673
Filler->StartDelta = 0 ;
1701
1674
Filler->EndDelta = 0 ;
1702
1675
Filler->Switch [0 ].Type = LastSwitch;
1703
- Filler->Switch [0 ].X = BucketFor (X + HalfLength + EndPad, XS, NB);
1676
+ Filler->Switch [0 ].X = Bucket8For (X + HalfLength + EndPad, XS, NB);
1704
1677
} else if (fabs (Angle - 0.25 ) < HV_TOLERANCE ||
1705
1678
fabs (Angle - 0.75 ) < HV_TOLERANCE) {
1706
1679
/* vertical proto - handle as special case */
1707
- Filler->X = BucketFor (X - SidePad, XS, NB);
1708
- Filler->YStart = BucketFor (Y - HalfLength - EndPad, YS, NB * 256 );
1709
- Filler->YEnd = BucketFor (Y + HalfLength + EndPad, YS, NB * 256 );
1680
+ Filler->X = Bucket8For (X - SidePad, XS, NB);
1681
+ Filler->YStart = Bucket16For (Y - HalfLength - EndPad, YS, NB * 256 );
1682
+ Filler->YEnd = Bucket16For (Y + HalfLength + EndPad, YS, NB * 256 );
1710
1683
Filler->StartDelta = 0 ;
1711
1684
Filler->EndDelta = 0 ;
1712
1685
Filler->Switch [0 ].Type = LastSwitch;
1713
- Filler->Switch [0 ].X = BucketFor (X + SidePad, XS, NB);
1686
+ Filler->Switch [0 ].X = Bucket8For (X + SidePad, XS, NB);
1714
1687
} else {
1715
1688
/* diagonal proto */
1716
1689
@@ -1736,36 +1709,34 @@ void InitTableFiller (FLOAT32 EndPad, FLOAT32 SidePad,
1736
1709
}
1737
1710
1738
1711
/* translate into bucket positions and deltas */
1739
- Filler->X = (inT8) MapParam (Start.x , XS, NB);
1712
+ Filler->X = Bucket8For (Start.x , XS, NB);
1740
1713
Filler->StartDelta = -(inT16) ((Cos / Sin) * 256 );
1741
1714
Filler->EndDelta = (inT16) ((Sin / Cos) * 256 );
1742
1715
1743
1716
XAdjust = BucketEnd (Filler->X , XS, NB) - Start.x ;
1744
1717
YAdjust = XAdjust * Cos / Sin;
1745
- Filler->YStart = (inT16) MapParam (Start.y - YAdjust, YS, NB * 256 );
1718
+ Filler->YStart = Bucket16For (Start.y - YAdjust, YS, NB * 256 );
1746
1719
YAdjust = XAdjust * Sin / Cos;
1747
- Filler->YEnd = (inT16) MapParam (Start.y + YAdjust, YS, NB * 256 );
1720
+ Filler->YEnd = Bucket16For (Start.y + YAdjust, YS, NB * 256 );
1748
1721
1749
1722
Filler->Switch [S1].Type = StartSwitch;
1750
- Filler->Switch [S1].X = (inT8) MapParam (Switch1.x , XS, NB);
1751
- Filler->Switch [S1].Y = (inT8) MapParam (Switch1.y , YS, NB);
1723
+ Filler->Switch [S1].X = Bucket8For (Switch1.x , XS, NB);
1724
+ Filler->Switch [S1].Y = Bucket8For (Switch1.y , YS, NB);
1752
1725
XAdjust = Switch1.x - BucketStart (Filler->Switch [S1].X , XS, NB);
1753
1726
YAdjust = XAdjust * Sin / Cos;
1754
- Filler->Switch [S1].YInit =
1755
- (inT16) MapParam (Switch1.y - YAdjust, YS, NB * 256 );
1727
+ Filler->Switch [S1].YInit = Bucket16For (Switch1.y - YAdjust, YS, NB * 256 );
1756
1728
Filler->Switch [S1].Delta = Filler->EndDelta ;
1757
1729
1758
1730
Filler->Switch [S2].Type = EndSwitch;
1759
- Filler->Switch [S2].X = (inT8) MapParam (Switch2.x , XS, NB);
1760
- Filler->Switch [S2].Y = (inT8) MapParam (Switch2.y , YS, NB);
1731
+ Filler->Switch [S2].X = Bucket8For (Switch2.x , XS, NB);
1732
+ Filler->Switch [S2].Y = Bucket8For (Switch2.y , YS, NB);
1761
1733
XAdjust = Switch2.x - BucketStart (Filler->Switch [S2].X , XS, NB);
1762
1734
YAdjust = XAdjust * Cos / Sin;
1763
- Filler->Switch [S2].YInit =
1764
- (inT16) MapParam (Switch2.y + YAdjust, YS, NB * 256 );
1735
+ Filler->Switch [S2].YInit = Bucket16For (Switch2.y + YAdjust, YS, NB * 256 );
1765
1736
Filler->Switch [S2].Delta = Filler->StartDelta ;
1766
1737
1767
1738
Filler->Switch [2 ].Type = LastSwitch;
1768
- Filler->Switch [2 ].X = (inT8) MapParam (End.x , XS, NB);
1739
+ Filler->Switch [2 ].X = Bucket8For (End.x , XS, NB);
1769
1740
} else {
1770
1741
/* falling diagonal proto */
1771
1742
Angle *= 2.0 * PI;
@@ -1788,36 +1759,34 @@ void InitTableFiller (FLOAT32 EndPad, FLOAT32 SidePad,
1788
1759
}
1789
1760
1790
1761
/* translate into bucket positions and deltas */
1791
- Filler->X = (inT8) MapParam (Start.x , XS, NB);
1762
+ Filler->X = Bucket8For (Start.x , XS, NB);
1792
1763
Filler->StartDelta = -(inT16) ((Sin / Cos) * 256 );
1793
1764
Filler->EndDelta = (inT16) ((Cos / Sin) * 256 );
1794
1765
1795
1766
XAdjust = BucketEnd (Filler->X , XS, NB) - Start.x ;
1796
1767
YAdjust = XAdjust * Sin / Cos;
1797
- Filler->YStart = (inT16) MapParam (Start.y - YAdjust, YS, NB * 256 );
1768
+ Filler->YStart = Bucket16For (Start.y - YAdjust, YS, NB * 256 );
1798
1769
YAdjust = XAdjust * Cos / Sin;
1799
- Filler->YEnd = (inT16) MapParam (Start.y + YAdjust, YS, NB * 256 );
1770
+ Filler->YEnd = Bucket16For (Start.y + YAdjust, YS, NB * 256 );
1800
1771
1801
1772
Filler->Switch [S1].Type = EndSwitch;
1802
- Filler->Switch [S1].X = (inT8) MapParam (Switch1.x , XS, NB);
1803
- Filler->Switch [S1].Y = (inT8) MapParam (Switch1.y , YS, NB);
1773
+ Filler->Switch [S1].X = Bucket8For (Switch1.x , XS, NB);
1774
+ Filler->Switch [S1].Y = Bucket8For (Switch1.y , YS, NB);
1804
1775
XAdjust = Switch1.x - BucketStart (Filler->Switch [S1].X , XS, NB);
1805
1776
YAdjust = XAdjust * Sin / Cos;
1806
- Filler->Switch [S1].YInit =
1807
- (inT16) MapParam (Switch1.y + YAdjust, YS, NB * 256 );
1777
+ Filler->Switch [S1].YInit = Bucket16For (Switch1.y + YAdjust, YS, NB * 256 );
1808
1778
Filler->Switch [S1].Delta = Filler->StartDelta ;
1809
1779
1810
1780
Filler->Switch [S2].Type = StartSwitch;
1811
- Filler->Switch [S2].X = (inT8) MapParam (Switch2.x , XS, NB);
1812
- Filler->Switch [S2].Y = (inT8) MapParam (Switch2.y , YS, NB);
1781
+ Filler->Switch [S2].X = Bucket8For (Switch2.x , XS, NB);
1782
+ Filler->Switch [S2].Y = Bucket8For (Switch2.y , YS, NB);
1813
1783
XAdjust = Switch2.x - BucketStart (Filler->Switch [S2].X , XS, NB);
1814
1784
YAdjust = XAdjust * Cos / Sin;
1815
- Filler->Switch [S2].YInit =
1816
- (inT16) MapParam (Switch2.y - YAdjust, YS, NB * 256 );
1785
+ Filler->Switch [S2].YInit = Bucket16For (Switch2.y - YAdjust, YS, NB * 256 );
1817
1786
Filler->Switch [S2].Delta = Filler->EndDelta ;
1818
1787
1819
1788
Filler->Switch [2 ].Type = LastSwitch;
1820
- Filler->Switch [2 ].X = (inT8) MapParam (End.x , XS, NB);
1789
+ Filler->Switch [2 ].X = Bucket8For (End.x , XS, NB);
1821
1790
}
1822
1791
}
1823
1792
} /* InitTableFiller */
0 commit comments