51
51
#define SWAP_DELTA(d) (-(d))
52
52
#define SWAP_X(x) (SWAP_SIGN_X(x))
53
53
#define SWAP_Y(y) (PCB->MaxHeight +SWAP_SIGN_Y(y))
54
#define SATURATE(x) ((x) > 32767 ? 32767 : ((x) < -32767 ? -32767 : (x)))
56
#define TO_SCREEN(x) ((PCB->Zoom < 0) ? (x) << -PCB->Zoom : (x) >> PCB->Zoom)
57
#define TO_SCREEN(x) ((Position)((x)*Zoom_Multiplier))
59
#define TO_SCREEN_X(x) (TO_SCREEN(SWAP_IDENT ? SWAP_X(x) : (x)) + Xorig)
60
#define TO_SCREEN_Y(y) (TO_SCREEN(SWAP_IDENT ? SWAP_Y(y) : (y)) + Yorig)
61
#define TO_DRAW_X(x) (TO_SCREEN(SWAP_IDENT ? SWAP_X(x) : (x)) + XORIG)
62
#define TO_DRAWABS_X(x) (TO_SCREEN((x)) + XORIG)
63
#define TO_DRAW_Y(y) (TO_SCREEN(SWAP_IDENT ? SWAP_Y(y) : (y)) + YORIG)
64
#define TO_DRAWABS_Y(y) (TO_SCREEN((y)) + YORIG)
65
#define TO_MASK_X(x) TO_SCREEN_X((x))
66
#define TO_MASK_Y(y) TO_SCREEN_Y((y))
60
#define TO_SCREEN_X(x) TO_SCREEN((SWAP_IDENT ? SWAP_X(x) : (x)) - Xorig)
61
#define TO_SCREEN_Y(y) TO_SCREEN((SWAP_IDENT ? SWAP_Y(y) : (y)) - Yorig)
62
#define TO_DRAW_X(x) TO_SCREEN((SWAP_IDENT ? SWAP_X(x) : (x)) - XORIG)
63
#define TO_DRAWABS_X(x) (TO_SCREEN((x) - XORIG))
64
#define TO_DRAW_Y(y) TO_SCREEN((SWAP_IDENT ? SWAP_Y(y) : (y)) - YORIG)
65
#define TO_DRAWABS_Y(y) (TO_SCREEN((y) - YORIG))
66
#define TO_LIMIT_X(x) ((Position)(SATURATE(Local_Zoom * ((x) - XORIG))))
67
#define TO_LIMIT_Y(y) ((Position)(SATURATE(Local_Zoom * \
68
((SWAP_IDENT ? SWAP_Y(y) : (y)) - YORIG))))
67
69
#define TO_SCREEN_ANGLE(a) (SWAP_IDENT ? SWAP_ANGLE((a)) : (a))
68
70
#define TO_SCREEN_DELTA(d) (SWAP_IDENT ? SWAP_DELTA((d)) : (d))
69
71
#define TO_SCREEN_SIGN_X(x) (SWAP_IDENT ? SWAP_SIGN_X(x) : (x))
70
72
#define TO_SCREEN_SIGN_Y(y) (SWAP_IDENT ? SWAP_SIGN_Y(y) : (y))
73
#define TO_PCB(x) ((PCB->Zoom < 0) ? (x) >> -PCB->Zoom : (x) << PCB->Zoom)
75
#define TO_PCB(x) ((LocationType)((x)/Zoom_Multiplier))
75
#define TO_PCB_X(x) TO_PCB(x - Xorig)
77
#define TO_PCB_X(x) TO_PCB(x) + Xorig
76
78
#define TO_PCB_Y(y) (SWAP_IDENT ? \
77
PCB->MaxHeight -TO_PCB(y - Yorig) : TO_PCB(y - Yorig))
79
PCB->MaxHeight - TO_PCB(y) - Yorig : TO_PCB(y) + Yorig)
79
81
/* ---------------------------------------------------------------------------
80
82
* misc macros, some might already be defined by <limits.h>
110
116
(t)->BoundingBox.X2 >= vxl && \
111
117
(t)->BoundingBox.Y1 <= vyh && \
112
118
(t)->BoundingBox.Y2 >= vyl)
113
#define VLINE(l) ((((l)->Point2.X >= vxl && (l)->Point1.X <= vxh) || \
114
((l)->Point1.X >= vxl && (l)->Point2.X <= vxh)) && \
115
((((l)->Point2.Y >= vyl && (l)->Point1.Y <= vyh) || \
116
((l)->Point1.Y >= vyl && (l)->Point2.Y <= vyh))))
119
#define VLINE(l) ((((l)->Point2.X >= vxl - (l)->Thickness && \
120
(l)->Point1.X <= vxh + (l)->Thickness) || \
121
((l)->Point1.X >= vxl - (l)->Thickness && \
122
(l)->Point2.X <= vxh + (l)->Thickness)) && \
123
((((l)->Point2.Y >= vyl - (l)->Thickness && \
124
(l)->Point1.Y <= vyh + (l)->Thickness) || \
125
((l)->Point1.Y >= vyl - (l)->Thickness && \
126
(l)->Point2.Y <= vyh + (l)->Thickness))))
117
127
#define VARC(a) ((a)->BoundingBox.X1 <= vxh && \
118
128
(a)->BoundingBox.X2 >= vxl && \
119
129
(a)->BoundingBox.Y1 <= vyh && \
120
130
(a)->BoundingBox.Y2 >= vyl)
121
#define VPOLY(p) ((p)->BoundingBox.X1 <= vxh && \
131
#define VPOLY(p) (IsRectangleInPolygon(vxl, vyl, vxh, vyh, (p)))
132
/* (p)->BoundingBox.X1 <= vxh && \
122
133
(p)->BoundingBox.X2 >= vxl && \
123
134
(p)->BoundingBox.Y1 <= vyh && \
124
135
(p)->BoundingBox.Y2 >= vyl)
125
#define VVIA(v) ((v)->X >= vxl && (v)->X <= vxh && \
126
(v)->Y >= vyl && (v)->Y <= vyh)
137
#define VVIA(v) ((v)->X+(v)->Thickness >= vxl && (v)->X - (v)->Thickness <= vxh && \
138
(v)->Y+(v)->Thickness >= vyl && (v)->Y - (v)->Thickness <= vyh)
139
#define VTHERM(v) ((v)->X + (v)->Thickness + (v)->Clearance >= vxl && \
140
(v)->X - (v)->Thickness - (v)->Clearance <= vxh && \
141
(v)->Y + (v)->Thickness + (v)->Thickness >= vyl && \
142
(v)->Y - (v)->Thickness - (v)->Clearance <= vyh)
128
144
/* ---------------------------------------------------------------------------
131
147
#define LAYER_ON_STACK(n) (&PCB->Data->Layer[LayerStack[(n)]])
148
#define LAYER_PTR(n) (&PCB->Data->Layer[(n)])
132
149
#define CURRENT (PCB->SilkActive ? &PCB->Data->Layer[MAX_LAYER + \
133
150
(Settings.ShowSolderSide ? SOLDER_LAYER : COMPONENT_LAYER)] \
134
151
: LAYER_ON_STACK(0))
135
152
#define INDEXOFCURRENT (PCB->SilkActive ? MAX_LAYER + \
136
153
(Settings.ShowSolderSide ? SOLDER_LAYER : COMPONENT_LAYER) \
138
#define SILKLAYER (&PCB->Data->Layer[MAX_LAYER + \
139
(Settings.ShowSolderSide ? SOLDER_LAYER : COMPONENT_LAYER)])
140
#define BACKSILKLAYER (&PCB->Data->Layer[MAX_LAYER + \
141
(Settings.ShowSolderSide ? COMPONENT_LAYER : SOLDER_LAYER)])
155
#define SILKLAYER Layer[MAX_LAYER + \
156
(Settings.ShowSolderSide ? SOLDER_LAYER : COMPONENT_LAYER)]
157
#define BACKSILKLAYER Layer[MAX_LAYER + \
158
(Settings.ShowSolderSide ? COMPONENT_LAYER : SOLDER_LAYER)]
143
160
/* ---------------------------------------------------------------------------
144
161
* returns the object ID
218
236
* all data is relativ to an objects name 'top' which can be either
219
237
* PCB or PasteBuffer
221
#define VIA_LOOP(top, command) { \
239
#define END_LOOP }} while (0)
241
#define STYLE_LOOP(top) do { \
243
RouteStyleTypePtr style; \
244
for (n = 0; n < NUM_STYLES; n++) \
246
style = &(top)->RouteStyle[n]
248
#define VIA_LOOP(top) do { \
222
249
Cardinal n, sn; \
223
250
PinTypePtr via; \
224
251
for (sn = (top)->ViaN, n = 0; (top)->ViaN > 0 && n < (top)->ViaN ; \
225
252
n += 1 + (top)->ViaN - sn, sn = (top)->ViaN) \
227
via = &(top)->Via[n]; \
231
#define DRILL_LOOP(top, command) { \
256
#define DRILL_LOOP(top) do { \
233
258
DrillTypePtr drill; \
234
259
for (n = 0; (top)->DrillN > 0 && n < (top)->DrillN; n++) \
236
drill = &(top)->Drill[n]; \
240
#define NET_LOOP(top, command) { \
261
drill = &(top)->Drill[n]
263
#define NETLIST_LOOP(top) do { \
265
NetListTypePtr netlist; \
266
for (n = (top)->NetListN-1; n != -1; n--) \
268
netlist = &(top)->NetList[n]
270
#define NET_LOOP(top) do { \
242
272
NetTypePtr net; \
243
273
for (n = (top)->NetN-1; n != -1; n--) \
245
net = &(top)->Net[n]; \
249
#define CONNECTION_LOOP(net, command) { \
277
#define CONNECTION_LOOP(net) do { \
251
279
ConnectionTypePtr connection; \
252
280
for (n = (net)->ConnectionN-1; n != -1; n--) \
254
connection = & (net)->Connection[n]; \
282
connection = & (net)->Connection[n]
258
#define ELEMENT_LOOP(top, command) { \
284
#define ELEMENT_LOOP(top) do { \
260
286
ElementTypePtr element; \
261
287
for (n = (top)->ElementN-1; n != -1; n--) \
263
element = &(top)->Element[n]; \
289
element = &(top)->Element[n]
267
#define RAT_LOOP(top, command) { \
291
#define RAT_LOOP(top) do { \
269
293
RatTypePtr line; \
270
294
for (n = (top)->RatN-1; n != -1; n--) \
272
line = &(top)->Rat[n]; \
277
#define ELEMENTTEXT_LOOP(element, command) { \
296
line = &(top)->Rat[n]
299
#define ELEMENTTEXT_LOOP(element) do { \
279
301
TextTypePtr text; \
280
302
for (n = MAX_ELEMENTNAMES-1; n != -1; n--) \
282
text = &(element)->Name[n]; \
304
text = &(element)->Name[n]
286
#define ELEMENTNAME_LOOP(element, command) { \
306
#define ELEMENTNAME_LOOP(element) do { \
288
308
char *textstring; \
289
309
for (n = MAX_ELEMENTNAMES-1; n != -1; n--) \
291
textstring = (element)->Name[n].TextString; \
311
textstring = (element)->Name[n].TextString
295
#define PIN_LOOP(element, command) { \
313
#define PIN_LOOP(element) do { \
296
314
Cardinal n, sn; \
297
315
PinTypePtr pin; \
298
316
for (sn = (element)->PinN, n = 0; (element)->PinN > 0 && n < (element)->PinN ; \
299
317
n += 1 + (element)->PinN - sn, sn = (element)->PinN) \
301
pin = &(element)->Pin[n]; \
319
pin = &(element)->Pin[n]
305
#define PAD_LOOP(element, command) { \
321
#define PAD_LOOP(element) do { \
306
322
Cardinal n, sn; \
307
323
PadTypePtr pad; \
308
324
for (sn = (element)->PadN, n = 0; (element)->PadN > 0 && n < (element)->PadN ; \
309
325
sn == (element)->PadN ? n++ : 0) \
311
pad = &(element)->Pad[n]; \
327
pad = &(element)->Pad[n]
315
#define ARC_LOOP(element, command) { \
329
#define ARC_LOOP(element) do { \
317
331
ArcTypePtr arc; \
318
332
for (n = (element)->ArcN-1; n != -1; n--) \
320
arc = &(element)->Arc[n]; \
334
arc = &(element)->Arc[n]
324
#define ELEMENTLINE_LOOP(element, command) { \
336
#define ELEMENTLINE_LOOP(element) do { \
326
338
LineTypePtr line; \
327
339
for (n = (element)->LineN-1; n != -1; n--) \
329
line = &(element)->Line[n]; \
341
line = &(element)->Line[n]
333
#define LINE_LOOP(layer, command) { \
343
#define LINE_LOOP(layer) do { \
335
345
LineTypePtr line; \
336
346
for (n = (layer)->LineN-1; n != -1; n--) \
338
line = &(layer)->Line[n]; \
348
line = &(layer)->Line[n]
342
#define TEXT_LOOP(layer, command) { \
350
#define TEXT_LOOP(layer) do { \
344
352
TextTypePtr text; \
345
353
for (n = (layer)->TextN-1; n != -1; n--) \
347
text = &(layer)->Text[n]; \
355
text = &(layer)->Text[n]
351
#define POLYGON_LOOP(layer, command) { \
357
#define POLYGON_LOOP(layer) do { \
353
359
PolygonTypePtr polygon; \
354
360
for (n = (layer)->PolygonN-1; n != -1; n--) \
356
polygon = &(layer)->Polygon[n]; \
362
polygon = &(layer)->Polygon[n]
360
#define POLYGONPOINT_LOOP(polygon, command) { \
364
#define POLYGONPOINT_LOOP(polygon) do { \
362
366
PointTypePtr point; \
363
367
for (n = (polygon)->PointN-1; n != -1; n--) \
365
point = &(polygon)->Points[n]; \
369
#define ALLPIN_LOOP(top, command) { \
370
ELEMENT_LOOP((top), PIN_LOOP(element, command )) \
373
#define ALLPAD_LOOP(top, command) { \
374
ELEMENT_LOOP((top), PAD_LOOP(element, command )) \
377
#define ALLLINE_LOOP(top, command) { \
369
point = &(polygon)->Points[n]
371
#define ENDALL_LOOP }} while (0); }} while (0)
373
#define ALLPIN_LOOP(top) \
377
#define ALLPAD_LOOP(top) \
381
#define ALLLINE_LOOP(top) do { \
379
383
LayerTypePtr layer = (top)->Layer; \
380
384
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
381
LINE_LOOP(layer, command ); \
384
#define ALLARC_LOOP(top, command) { \
388
#define ALLARC_LOOP(top) do { \
386
390
LayerTypePtr layer = (top)->Layer; \
387
391
for (l =0; l < MAX_LAYER + 2; l++, layer++) \
388
ARC_LOOP(layer, command ); \
391
#define ALLPOLYGON_LOOP(top, command) { \
395
#define ALLPOLYGON_LOOP(top) do { \
393
397
LayerTypePtr layer = (top)->Layer; \
394
398
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
395
POLYGON_LOOP(layer, command ); \
398
#define COPPERLINE_LOOP(top, command) { \
402
#define COPPERLINE_LOOP(top) do { \
400
404
LayerTypePtr layer = (top)->Layer; \
401
405
for (l = 0; l < MAX_LAYER; l++, layer++) \
402
LINE_LOOP(layer, command ); \
405
#define COPPERARC_LOOP(top, command) { \
409
#define COPPERARC_LOOP(top) do { \
407
411
LayerTypePtr layer = (top)->Layer; \
408
412
for (l =0; l < MAX_LAYER; l++, layer++) \
409
ARC_LOOP(layer, command ); \
412
#define COPPERPOLYGON_LOOP(top, command) { \
416
#define COPPERPOLYGON_LOOP(top) do { \
414
418
LayerTypePtr layer = (top)->Layer; \
415
419
for (l = 0; l < MAX_LAYER; l++, layer++) \
416
POLYGON_LOOP(layer, command ); \
419
#define ALLTEXT_LOOP(top, command) { \
421
LayerTypePtr layer = (top)->Layer; \
422
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
423
TEXT_LOOP(layer, command ); \
426
#define VISIBLELINE_LOOP(top, command) { \
428
LayerTypePtr layer = (top)->Layer; \
429
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
431
LINE_LOOP(layer, command ); \
434
#define VISIBLEARC_LOOP(top, command) { \
436
LayerTypePtr layer = (top)->Layer; \
437
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
439
ARC_LOOP(layer, command ); \
442
#define VISIBLETEXT_LOOP(board, command) { \
423
#define SILKLINE_LOOP(top) do { \
425
LayerTypePtr layer = (top)->Layer; \
426
layer += MAX_LAYER; \
427
for (l = 0; l < 2; l++, layer++) \
431
#define SILKARC_LOOP(top) do { \
433
LayerTypePtr layer = (top)->Layer; \
434
layer += MAX_LAYER; \
435
for (l = 0; l < 2; l++, layer++) \
439
#define SILKPOLYGON_LOOP(top) do { \
441
LayerTypePtr layer = (top)->Layer; \
442
layer += MAX_LAYER; \
443
for (l = 0; l < 2; l++, layer++) \
447
#define ALLTEXT_LOOP(top) do { \
449
LayerTypePtr layer = (top)->Layer; \
450
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
454
#define VISIBLELINE_LOOP(top) do { \
456
LayerTypePtr layer = (top)->Layer; \
457
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
462
#define VISIBLEARC_LOOP(top) do { \
464
LayerTypePtr layer = (top)->Layer; \
465
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
470
#define VISIBLETEXT_LOOP(board) do { \
444
472
LayerTypePtr layer = (board)->Data->Layer; \
445
473
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
447
if (TEXT_IS_VISIBLE((board), layer, text)) \
476
if (TEXT_IS_VISIBLE((board), layer, text))
451
#define VISIBLEPOLYGON_LOOP(top, command) { \
478
#define VISIBLEPOLYGON_LOOP(top) do { \
453
480
LayerTypePtr layer = (top)->Layer; \
454
481
for (l = 0; l < MAX_LAYER + 2; l++, layer++) \
456
POLYGON_LOOP(layer, command ); \
459
#define POINTER_LOOP(top, command) { \
486
#define POINTER_LOOP(top) do { \
462
489
for (n = (top)->PtrN-1; n != -1; n--) \
464
ptr = &(top)->Ptr[n]; \
468
#define MENU_LOOP(top, command) { \
493
#define MENU_LOOP(top) do { \
470
495
LibraryMenuTypePtr menu; \
471
496
for (l = (top)->MenuN-1; l != -1; l--) \
473
menu = &(top)->Menu[l]; \
498
menu = &(top)->Menu[l]
477
#define ENTRY_LOOP(top, command) { \
500
#define ENTRY_LOOP(top) do { \
479
502
LibraryEntryTypePtr entry; \
480
503
for (n = (top)->EntryN-1; n != -1; n--) \
482
entry = &(top)->Entry[n]; \
505
entry = &(top)->Entry[n]
507
#define GROUP_LOOP(group) do { \
509
for (entry = 0; entry < PCB->LayerGroups.Number[(group)]; entry++) \
511
LayerTypePtr layer; \
513
number = PCB->LayerGroups.Entries[(group)][entry]; \
514
if (number >= MAX_LAYER) \
516
layer = LAYER_PTR (number)