@@ -77,6 +77,13 @@ char *drcNeedStyle = NULL;
77
77
#define DRC_CIF_SPACE 0
78
78
#define DRC_CIF_SOLID 1
79
79
80
+ /* Define Euclidean distance checks */
81
+
82
+ #define RADIAL_NW 0x1000
83
+ #define RADIAL_NE 0x8000
84
+ #define RADIAL_SW 0x2000
85
+ #define RADIAL_SE 0x4000
86
+
80
87
/*
81
88
* ----------------------------------------------------------------------------
82
89
*
@@ -715,7 +722,7 @@ drcCifTile (tile, arg)
715
722
{
716
723
errRect .r_ybot -= cptr -> drcc_cdist ;
717
724
if (DRCEuclidean )
718
- arg -> dCD_radial |= 0x1000 ;
725
+ arg -> dCD_radial |= RADIAL_SW ;
719
726
}
720
727
721
728
if (cptr -> drcc_flags & DRC_BOTHCORNERS )
@@ -731,7 +738,7 @@ drcCifTile (tile, arg)
731
738
{
732
739
errRect .r_ytop += cptr -> drcc_cdist ;
733
740
if (DRCEuclidean )
734
- arg -> dCD_radial |= 0x2000 ;
741
+ arg -> dCD_radial |= RADIAL_NW ;
735
742
}
736
743
}
737
744
@@ -761,7 +768,7 @@ drcCifTile (tile, arg)
761
768
{
762
769
errRect .r_ytop += cptr -> drcc_cdist ;
763
770
if (DRCEuclidean )
764
- arg -> dCD_radial |= 0x8000 ;
771
+ arg -> dCD_radial |= RADIAL_NE ;
765
772
}
766
773
767
774
if (cptr -> drcc_flags & DRC_BOTHCORNERS )
@@ -777,7 +784,7 @@ drcCifTile (tile, arg)
777
784
{
778
785
errRect .r_ybot -= cptr -> drcc_cdist ;
779
786
if (DRCEuclidean )
780
- arg -> dCD_radial |= 0x4000 ;
787
+ arg -> dCD_radial |= RADIAL_SE ;
781
788
}
782
789
}
783
790
@@ -797,7 +804,7 @@ drcCifTile (tile, arg)
797
804
}
798
805
if (arg -> dCD_radial )
799
806
{
800
- arg -> dCD_radial &= 0xf0000 ;
807
+ arg -> dCD_radial &= 0xf000 ;
801
808
arg -> dCD_radial |= (0xfff & cptr -> drcc_cdist );
802
809
}
803
810
@@ -902,7 +909,7 @@ drcCifTile (tile, arg)
902
909
{
903
910
errRect .r_xtop += cptr -> drcc_cdist ;
904
911
if (DRCEuclidean )
905
- arg -> dCD_radial |= 0x4000 ;
912
+ arg -> dCD_radial |= RADIAL_SE ;
906
913
}
907
914
908
915
if (cptr -> drcc_flags & DRC_BOTHCORNERS )
@@ -917,7 +924,7 @@ drcCifTile (tile, arg)
917
924
{
918
925
errRect .r_xbot -= cptr -> drcc_cdist ;
919
926
if (DRCEuclidean )
920
- arg -> dCD_radial |= 0x1000 ;
927
+ arg -> dCD_radial |= RADIAL_SW ;
921
928
}
922
929
}
923
930
@@ -949,7 +956,7 @@ drcCifTile (tile, arg)
949
956
{
950
957
errRect .r_xbot -= cptr -> drcc_cdist ;
951
958
if (DRCEuclidean )
952
- arg -> dCD_radial |= 0x2000 ;
959
+ arg -> dCD_radial |= RADIAL_NW ;
953
960
}
954
961
955
962
if (cptr -> drcc_flags & DRC_BOTHCORNERS )
@@ -964,7 +971,7 @@ drcCifTile (tile, arg)
964
971
{
965
972
errRect .r_xtop += cptr -> drcc_cdist ;
966
973
if (DRCEuclidean )
967
- arg -> dCD_radial |= 0x8000 ;
974
+ arg -> dCD_radial |= RADIAL_NE ;
968
975
}
969
976
}
970
977
@@ -1029,6 +1036,7 @@ areaCifCheck(tile, arg)
1029
1036
struct drcClientData * arg ;
1030
1037
{
1031
1038
Rect rect ; /* Area where error is to be recorded. */
1039
+ Rect cifrect ; /* rect, in CIF coordinates */
1032
1040
int scale = drcCifStyle -> cs_scaleFactor ;
1033
1041
1034
1042
/* If the tile has a legal type, then return. */
@@ -1039,10 +1047,11 @@ areaCifCheck(tile, arg)
1039
1047
* the clip area for errors.
1040
1048
*/
1041
1049
1042
- TiToRect (tile , & rect );
1043
- GeoClip (& rect , arg -> dCD_constraint );
1044
- if ((rect .r_xbot >= rect .r_xtop ) || (rect .r_ybot >= rect .r_ytop ))
1050
+ TiToRect (tile , & cifrect );
1051
+ GeoClip (& cifrect , arg -> dCD_constraint );
1052
+ if ((cifrect .r_xbot >= cifrect .r_xtop ) || (cifrect .r_ybot >= cifrect .r_ytop ))
1045
1053
return 0 ;
1054
+ rect = cifrect ;
1046
1055
rect .r_xbot /= scale ;
1047
1056
rect .r_xtop /= scale ;
1048
1057
if (rect .r_xbot == rect .r_xtop )
@@ -1059,6 +1068,80 @@ areaCifCheck(tile, arg)
1059
1068
if ((rect .r_xbot >= rect .r_xtop ) || (rect .r_ybot >= rect .r_ytop ))
1060
1069
return 0 ;
1061
1070
1071
+ /*
1072
+ * Euclidean distance checks
1073
+ */
1074
+ if (arg -> dCD_radial != 0 )
1075
+ {
1076
+ unsigned int i ;
1077
+ int sqx , sqy ;
1078
+ int sdist = arg -> dCD_radial & 0xfff ;
1079
+ long sstest , ssdist = sdist * sdist ;
1080
+
1081
+ if ((arg -> dCD_radial & RADIAL_NW ) != 0 )
1082
+ {
1083
+ if (((sqx = arg -> dCD_constraint -> r_xbot + sdist
1084
+ - cifrect .r_xtop ) >= 0 ) && ((sqy = cifrect .r_ybot
1085
+ - arg -> dCD_constraint -> r_ytop + sdist ) >= 0 )
1086
+ && ((sqx * sqx + sqy * sqy ) >= ssdist ))
1087
+ return 0 ;
1088
+ else if (IsSplit (tile ) && !SplitDirection (tile ) && !SplitSide (tile ))
1089
+ {
1090
+ sstest = drcCifPointToSegment (arg -> dCD_constraint -> r_xbot + sdist ,
1091
+ arg -> dCD_constraint -> r_ytop - sdist ,
1092
+ LEFT (tile ), BOTTOM (tile ), RIGHT (tile ), TOP (tile ));
1093
+ if (sstest > ssdist ) return 0 ;
1094
+ }
1095
+ }
1096
+ if ((arg -> dCD_radial & RADIAL_NE ) != 0 )
1097
+ {
1098
+ if (((sqx = cifrect .r_xbot - arg -> dCD_constraint -> r_xtop
1099
+ + sdist ) >= 0 ) && ((sqy = cifrect .r_ybot
1100
+ - arg -> dCD_constraint -> r_ytop + sdist ) >= 0 )
1101
+ && ((sqx * sqx + sqy * sqy ) >= ssdist ))
1102
+ return 0 ;
1103
+ else if (IsSplit (tile ) && SplitDirection (tile ) && SplitSide (tile ))
1104
+ {
1105
+ sstest = drcCifPointToSegment (arg -> dCD_constraint -> r_xtop - sdist ,
1106
+ arg -> dCD_constraint -> r_ytop - sdist ,
1107
+ LEFT (tile ), TOP (tile ), RIGHT (tile ), BOTTOM (tile ));
1108
+ if (sstest > ssdist ) return 0 ;
1109
+ }
1110
+ }
1111
+ if ((arg -> dCD_radial & RADIAL_SW ) != 0 )
1112
+ {
1113
+ if (((sqx = arg -> dCD_constraint -> r_xbot + sdist
1114
+ - cifrect .r_xtop ) >= 0 ) &&
1115
+ ((sqy = arg -> dCD_constraint -> r_ybot
1116
+ + sdist - cifrect .r_ytop ) >= 0 )
1117
+ && ((sqx * sqx + sqy * sqy ) >= ssdist ))
1118
+ return 0 ;
1119
+ else if (IsSplit (tile ) && SplitDirection (tile ) && !SplitSide (tile ))
1120
+ {
1121
+ sstest = drcCifPointToSegment (arg -> dCD_constraint -> r_xbot + sdist ,
1122
+ arg -> dCD_constraint -> r_ybot + sdist ,
1123
+ LEFT (tile ), TOP (tile ), RIGHT (tile ), BOTTOM (tile ));
1124
+ if (sstest > ssdist ) return 0 ;
1125
+ }
1126
+ }
1127
+ if ((arg -> dCD_radial & RADIAL_SE ) != 0 )
1128
+ {
1129
+ if (((sqx = cifrect .r_xbot - arg -> dCD_constraint -> r_xtop
1130
+ + sdist ) >= 0 ) &&
1131
+ ((sqy = arg -> dCD_constraint -> r_ybot
1132
+ + sdist - cifrect .r_ytop ) >= 0 )
1133
+ && ((sqx * sqx + sqy * sqy ) >= ssdist ))
1134
+ return 0 ;
1135
+ else if (IsSplit (tile ) && !SplitDirection (tile ) && SplitSide (tile ))
1136
+ {
1137
+ sstest = drcCifPointToSegment (arg -> dCD_constraint -> r_xtop - sdist ,
1138
+ arg -> dCD_constraint -> r_ybot + sdist ,
1139
+ LEFT (tile ), BOTTOM (tile ), RIGHT (tile ), TOP (tile ));
1140
+ if (sstest > ssdist ) return 0 ;
1141
+ }
1142
+ }
1143
+ }
1144
+
1062
1145
(* (arg -> dCD_function )) (arg -> dCD_celldef , & rect ,
1063
1146
arg -> dCD_cptr , arg -> dCD_clientData );
1064
1147
(* (arg -> dCD_errors ))++ ;
0 commit comments