Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
f353c77c
Commit
f353c77c
authored
Oct 31, 2007
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
more zone preps
parent
64e9e168
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
1131 additions
and
893 deletions
+1131
-893
change_log.txt
change_log.txt
+2
-0
base_struct.cpp
common/base_struct.cpp
+0
-17
gr_basic.cpp
common/gr_basic.cpp
+1009
-826
base_struct.h
include/base_struct.h
+13
-2
pcbstruct.h
include/pcbstruct.h
+11
-0
wxstruct.h
include/wxstruct.h
+7
-1
class_board.cpp
pcbnew/class_board.cpp
+13
-5
class_edge_mod.cpp
pcbnew/class_edge_mod.cpp
+3
-1
class_track.h
pcbnew/class_track.h
+6
-4
classpcb.cpp
pcbnew/classpcb.cpp
+19
-1
files.cpp
pcbnew/files.cpp
+7
-3
tracepcb.cpp
pcbnew/tracepcb.cpp
+2
-1
trpiste.cpp
pcbnew/trpiste.cpp
+1
-1
zones.cpp
pcbnew/zones.cpp
+38
-31
No files found.
change_log.txt
View file @
f353c77c
...
...
@@ -19,6 +19,8 @@ email address.
design and was crashing. Also, export_to_pcbnew.cpp now uses the simple
BOARD::Save() function. It was another place to maintain the PCB file format,
rather than simply putting that knowledge into one place like BOARD::Save().
+ all
beautified gr_basic.cpp and made CLIP_LINE macro a static inline function.
2007-Oct-30 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
...
...
common/base_struct.cpp
View file @
f353c77c
...
...
@@ -57,23 +57,6 @@ void EDA_BaseStruct::InitVars()
}
/* Gestion de l'etat (status) de la structure (active, deleted..) */
int
EDA_BaseStruct
::
GetState
(
int
type
)
const
{
return
m_Status
&
type
;
}
void
EDA_BaseStruct
::
SetState
(
int
type
,
int
state
)
{
if
(
state
)
m_Status
|=
type
;
/* state = ON ou OFF */
else
m_Status
&=
~
type
;
}
/***********************************************************/
void
EDA_BaseStruct
::
DeleteStructList
()
/***********************************************************/
...
...
common/gr_basic.cpp
View file @
f353c77c
/********************************/
/* Low level graphics routines */
/********************************/
/********************************/
/* Low level graphics routines */
/********************************/
#include "fctsys.h"
...
...
@@ -15,41 +15,42 @@
/* global variables */
extern
BASE_SCREEN
*
ActiveScreen
;
extern
BASE_SCREEN
*
ActiveScreen
;
/* Variables locales */
static
int
GRLastMoveToX
,
GRLastMoveToY
;
static
int
Text_Color
=
LIGHTGRAY
;
static
int
PenMinWidth
=
1
;
/* largeur minimum de la plume (DOIT etre > 0)
(utile pour trace sur imprimante) */
static
int
ForceBlackPen
;
/* si != 0 : traces en noir (utilise pour trace
sur imprimante */
static
int
xcliplo
=
0
,
ycliplo
=
0
,
xcliphi
=
2000
,
ycliphi
=
2000
;
/* coord de la surface de trace */
static
int
lastcolor
=
-
1
;
static
int
lastwidth
=
-
1
;
static
int
s_Last_Pen_Style
=
-
1
;
static
wxDC
*
lastDC
=
NULL
;
static
int
GRLastMoveToX
,
GRLastMoveToY
;
static
int
Text_Color
=
LIGHTGRAY
;
static
int
PenMinWidth
=
1
;
/* largeur minimum de la plume (DOIT etre > 0)
* (utile pour trace sur imprimante) */
static
int
ForceBlackPen
;
/* si != 0 : traces en noir (utilise pour trace
* sur imprimante */
static
int
xcliplo
=
0
,
ycliplo
=
0
,
xcliphi
=
2000
,
ycliphi
=
2000
;
/* coord de la surface de trace */
static
int
lastcolor
=
-
1
;
static
int
lastwidth
=
-
1
;
static
int
s_Last_Pen_Style
=
-
1
;
static
wxDC
*
lastDC
=
NULL
;
/*
Macro de clipping du trace d'une ligne:
la ligne (x1,y1 x2,y2) est clippee pour rester dans le cadre
(xcliplo,ycliplo xcliphi,ycliphi) (variables globales,locales a ce fichier)
Ceci est necessaire sous WIN95 car les coord de trace
(bien que en int 32bits) sont tronquees en 16 bits (stupide BG)
*/
*
Macro de clipping du trace d'une ligne:
*
la ligne (x1,y1 x2,y2) est clippee pour rester dans le cadre
*
(xcliplo,ycliplo xcliphi,ycliphi) (variables globales,locales a ce fichier)
*
Ceci est necessaire sous WIN95 car les coord de trace
*
(bien que en int 32bits) sont tronquees en 16 bits (stupide BG)
*/
#ifndef us
#define us unsigned int
#endif
static
inline
int
USCALE
(
us
arg
,
us
num
,
us
den
)
static
inline
int
USCALE
(
us
arg
,
us
num
,
us
den
)
{
int
ii
;
int
ii
;
ii
=
(
int
)(
((
float
)
arg
*
num
)
/
den
);
return
(
ii
)
;
ii
=
(
int
)
(
(
(
float
)
arg
*
num
)
/
den
);
return
ii
;
}
...
...
@@ -59,213 +60,254 @@ static inline int USCALE(us arg, us num, us den)
#define GET_ZOOM ActiveScreen->GetZoom()
#endif
static
int
inline
ZoomValue
(
int
value_to_zoom
)
{
int
zoom
=
GET_ZOOM
;
if
(
value_to_zoom
>=
0
)
return
(
(
value_to_zoom
+
(
zoom
>>
1
)
)
/
zoom
)
;
else
return
(
(
value_to_zoom
-
(
zoom
>>
1
)
)
/
zoom
)
;
}
static
int
inline
ZoomValue
(
int
value_to_zoom
)
{
int
zoom
=
GET_ZOOM
;
if
(
value_to_zoom
>=
0
)
return
(
value_to_zoom
+
(
zoom
>>
1
)
)
/
zoom
;
else
return
(
value_to_zoom
-
(
zoom
>>
1
)
)
/
zoom
;
}
/****************************************/
/* External reference for the mappings. */
/****************************************/
int
GRMapX
(
int
x
)
int
GRMapX
(
int
x
)
{
int
coord
=
x
-
ActiveScreen
->
m_DrawOrg
.
x
;
int
coord
=
x
-
ActiveScreen
->
m_DrawOrg
.
x
;
#ifndef WX_ZOOM
coord
=
ZoomValue
(
coord
);
coord
-=
ActiveScreen
->
m_StartVisu
.
x
;
coord
=
ZoomValue
(
coord
);
coord
-=
ActiveScreen
->
m_StartVisu
.
x
;
#endif
return
coord
;
return
coord
;
}
int
GRMapY
(
int
y
)
int
GRMapY
(
int
y
)
{
int
coord
=
y
-
ActiveScreen
->
m_DrawOrg
.
y
;
int
coord
=
y
-
ActiveScreen
->
m_DrawOrg
.
y
;
#ifndef WX_ZOOM
coord
=
ZoomValue
(
coord
);
coord
-=
ActiveScreen
->
m_StartVisu
.
y
;
coord
=
ZoomValue
(
coord
);
coord
-=
ActiveScreen
->
m_StartVisu
.
y
;
#endif
return
coord
;
return
coord
;
}
#define WHEN_OUTSIDE return
#define WHEN_INSIDE
#define CLIP_LINE(x1,y1,x2,y2) \
{\
int temp;\
do {\
if(x1 > x2) { EXCHG(x1,x2); EXCHG(y1,y2); }\
if((x2 < xcliplo) || (x1 > xcliphi)) { WHEN_OUTSIDE; }\
if(y1 < y2)\
{\
if((y2 < ycliplo) || (y1 > ycliphi)) { WHEN_OUTSIDE;}\
if(y1 < ycliplo)\
{\
temp = USCALE((x2 - x1),(ycliplo - y1),(y2 - y1));\
if((x1 += temp) > xcliphi) { WHEN_OUTSIDE; }\
y1 = ycliplo;\
WHEN_INSIDE;\
}\
if(y2 > ycliphi)\
{\
temp = USCALE((x2 - x1),(y2 - ycliphi),(y2 - y1));\
if((x2 -= temp) < xcliplo) { WHEN_OUTSIDE; }\
y2 = ycliphi;\
WHEN_INSIDE;\
}\
if(x1 < xcliplo)\
{\
temp = USCALE((y2 - y1),(xcliplo - x1),(x2 - x1));\
y1 += temp; x1 = xcliplo;\
WHEN_INSIDE;\
}\
if(x2 > xcliphi)\
{\
temp = USCALE((y2 - y1),(x2 - xcliphi),(x2 - x1));\
y2 -= temp; x2 = xcliphi;\
WHEN_INSIDE;\
}\
}\
else\
{\
if((y1 < ycliplo) || (y2 > ycliphi)) { WHEN_OUTSIDE; }\
if(y1 > ycliphi)\
{\
temp = USCALE((x2 - x1),(y1 - ycliphi),(y1 - y2));\
if((x1 += temp) > xcliphi) { WHEN_OUTSIDE; }\
y1 = ycliphi;\
WHEN_INSIDE;\
}\
if(y2 < ycliplo)\
{\
temp = USCALE((x2 - x1),(ycliplo - y2),(y1 - y2));\
if((x2 -= temp) < xcliplo) { WHEN_OUTSIDE; }\
y2 = ycliplo;\
WHEN_INSIDE;\
}\
if(x1 < xcliplo)\
{\
temp = USCALE((y1 - y2),(xcliplo - x1),(x2 - x1));\
y1 -= temp; x1 = xcliplo;\
WHEN_INSIDE;\
}\
if(x2 > xcliphi)\
{\
temp = USCALE((y1 - y2),(x2 - xcliphi),(x2 - x1));\
y2 += temp; x2 = xcliphi;\
WHEN_INSIDE;\
}\
}\
} while(0);\
}
static
void
WinClipAndDrawLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
,
int
width
=
1
)
{
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
if
(
ClipBox
)
{
xcliplo
=
ClipBox
->
GetX
();
ycliplo
=
ClipBox
->
GetY
();
xcliphi
=
ClipBox
->
GetRight
();
ycliphi
=
ClipBox
->
GetBottom
();
xcliplo
-=
width
;
ycliplo
-=
width
;
xcliphi
+=
width
;
ycliphi
+=
width
;
CLIP_LINE
(
x1
,
y1
,
x2
,
y2
);
}
GRSetColorPen
(
DC
,
Color
,
width
);
DC
->
DrawLine
(
x1
,
y1
,
x2
,
y2
);
#define WHEN_INSIDE
static
inline
void
clip_line
(
int
&
x1
,
int
&
y1
,
int
&
x2
,
int
&
y2
)
{
int
temp
;
if
(
x1
>
x2
)
{
EXCHG
(
x1
,
x2
);
EXCHG
(
y1
,
y2
);
}
if
(
(
x2
<
xcliplo
)
||
(
x1
>
xcliphi
)
)
{
WHEN_OUTSIDE
;
}
if
(
y1
<
y2
)
{
if
(
(
y2
<
ycliplo
)
||
(
y1
>
ycliphi
)
)
{
WHEN_OUTSIDE
;
}
if
(
y1
<
ycliplo
)
{
temp
=
USCALE
(
(
x2
-
x1
),
(
ycliplo
-
y1
),
(
y2
-
y1
)
);
if
(
(
x1
+=
temp
)
>
xcliphi
)
{
WHEN_OUTSIDE
;
}
y1
=
ycliplo
;
WHEN_INSIDE
;
}
if
(
y2
>
ycliphi
)
{
temp
=
USCALE
(
(
x2
-
x1
),
(
y2
-
ycliphi
),
(
y2
-
y1
)
);
if
(
(
x2
-=
temp
)
<
xcliplo
)
{
WHEN_OUTSIDE
;
}
y2
=
ycliphi
;
WHEN_INSIDE
;
}
if
(
x1
<
xcliplo
)
{
temp
=
USCALE
(
(
y2
-
y1
),
(
xcliplo
-
x1
),
(
x2
-
x1
)
);
y1
+=
temp
;
x1
=
xcliplo
;
WHEN_INSIDE
;
}
if
(
x2
>
xcliphi
)
{
temp
=
USCALE
(
(
y2
-
y1
),
(
x2
-
xcliphi
),
(
x2
-
x1
)
);
y2
-=
temp
;
x2
=
xcliphi
;
WHEN_INSIDE
;
}
}
else
{
if
(
(
y1
<
ycliplo
)
||
(
y2
>
ycliphi
)
)
{
WHEN_OUTSIDE
;
}
if
(
y1
>
ycliphi
)
{
temp
=
USCALE
(
(
x2
-
x1
),
(
y1
-
ycliphi
),
(
y1
-
y2
)
);
if
(
(
x1
+=
temp
)
>
xcliphi
)
{
WHEN_OUTSIDE
;
}
y1
=
ycliphi
;
WHEN_INSIDE
;
}
if
(
y2
<
ycliplo
)
{
temp
=
USCALE
(
(
x2
-
x1
),
(
ycliplo
-
y2
),
(
y1
-
y2
)
);
if
(
(
x2
-=
temp
)
<
xcliplo
)
{
WHEN_OUTSIDE
;
}
y2
=
ycliplo
;
WHEN_INSIDE
;
}
if
(
x1
<
xcliplo
)
{
temp
=
USCALE
(
(
y1
-
y2
),
(
xcliplo
-
x1
),
(
x2
-
x1
)
);
y1
-=
temp
;
x1
=
xcliplo
;
WHEN_INSIDE
;
}
if
(
x2
>
xcliphi
)
{
temp
=
USCALE
(
(
y1
-
y2
),
(
x2
-
xcliphi
),
(
x2
-
x1
)
);
y2
+=
temp
;
x2
=
xcliphi
;
WHEN_INSIDE
;
}
}
}
static
void
WinClipAndDrawLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
,
int
width
=
1
)
{
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
if
(
ClipBox
)
{
xcliplo
=
ClipBox
->
GetX
();
ycliplo
=
ClipBox
->
GetY
();
xcliphi
=
ClipBox
->
GetRight
();
ycliphi
=
ClipBox
->
GetBottom
();
xcliplo
-=
width
;
ycliplo
-=
width
;
xcliphi
+=
width
;
ycliphi
+=
width
;
clip_line
(
x1
,
y1
,
x2
,
y2
);
}
GRSetColorPen
(
DC
,
Color
,
width
);
DC
->
DrawLine
(
x1
,
y1
,
x2
,
y2
);
}
/* Routine de forcage de la reinit de la plume courante.
Doit etre appelee par securite apres changement de contexte graphique
avant tout trace
*
Doit etre appelee par securite apres changement de contexte graphique
*
avant tout trace
*/
void
GRResetPenAndBrush
(
wxDC
*
DC
)
void
GRResetPenAndBrush
(
wxDC
*
DC
)
{
lastcolor
=
-
1
;
GRSetBrush
(
DC
,
BLACK
);
// Force no fill
lastDC
=
NULL
;
lastcolor
=
-
1
;
GRSetBrush
(
DC
,
BLACK
);
// Force no fill
lastDC
=
NULL
;
}
/* routine d'ajustage de la largeur mini de plume */
void
SetPenMinWidth
(
int
minwidth
)
void
SetPenMinWidth
(
int
minwidth
)
{
PenMinWidth
=
minwidth
;
if
(
PenMinWidth
<
1
)
PenMinWidth
=
1
;
PenMinWidth
=
minwidth
;
if
(
PenMinWidth
<
1
)
PenMinWidth
=
1
;
}
/* Routine de changement de couleurs et epaisseur de la plume courante */
void
GRSetColorPen
(
wxDC
*
DC
,
int
Color
,
int
width
,
int
style
)
void
GRSetColorPen
(
wxDC
*
DC
,
int
Color
,
int
width
,
int
style
)
{
Color
&=
MASKCOLOR
;
// Pour 32 couleurs Max
Color
&=
MASKCOLOR
;
// Pour 32 couleurs Max
if
(
width
<
PenMinWidth
)
width
=
PenMinWidth
;
if
(
width
<
PenMinWidth
)
width
=
PenMinWidth
;
if
(
ForceBlackPen
&&
Color
!=
WHITE
)
Color
=
BLACK
;
if
(
ForceBlackPen
&&
Color
!=
WHITE
)
Color
=
BLACK
;
if
(
(
lastcolor
!=
Color
)
||
(
lastwidth
!=
width
)
||
(
s_Last_Pen_Style
!=
style
)
||
(
lastDC
!=
DC
)
)
{
wxPen
DrawPen
;
DrawPen
.
SetColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
);
if
(
(
lastcolor
!=
Color
)
||
(
lastwidth
!=
width
)
||
(
s_Last_Pen_Style
!=
style
)
||
(
lastDC
!=
DC
)
)
{
wxPen
DrawPen
;
DrawPen
.
SetColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
);
DrawPen
.
SetWidth
(
width
);
DrawPen
.
SetStyle
(
style
);
DrawPen
.
SetWidth
(
width
);
DrawPen
.
SetStyle
(
style
);
// if ( &DC->GetPen() != DrawPen )
DC
->
SetPen
(
DrawPen
);
lastcolor
=
Color
;
lastwidth
=
width
;
lastDC
=
DC
;
s_Last_Pen_Style
=
style
;
}
DC
->
SetPen
(
DrawPen
);
lastcolor
=
Color
;
lastwidth
=
width
;
lastDC
=
DC
;
s_Last_Pen_Style
=
style
;
}
}
/***********************************************/
void
GRSetBrush
(
wxDC
*
DC
,
int
Color
,
int
fill
)
void
GRSetBrush
(
wxDC
*
DC
,
int
Color
,
int
fill
)
/***********************************************/
{
Color
&=
MASKCOLOR
;
// Pour 32 couleurs Max
if
(
ForceBlackPen
&&
Color
!=
WHITE
)
Color
=
BLACK
;
wxBrush
DrawBrush
;
DrawBrush
.
SetColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
);
Color
&=
MASKCOLOR
;
// Pour 32 couleurs Max
if
(
ForceBlackPen
&&
Color
!=
WHITE
)
Color
=
BLACK
;
wxBrush
DrawBrush
;
DrawBrush
.
SetColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
);
if
(
fill
)
DrawBrush
.
SetStyle
(
wxSOLID
);
else
DrawBrush
.
SetStyle
(
wxTRANSPARENT
);
DC
->
SetBrush
(
DrawBrush
);
if
(
fill
)
DrawBrush
.
SetStyle
(
wxSOLID
);
else
DrawBrush
.
SetStyle
(
wxTRANSPARENT
);
DC
->
SetBrush
(
DrawBrush
);
}
/*************************************/
void
GRForceBlackPen
(
bool
flagforce
)
void
GRForceBlackPen
(
bool
flagforce
)
/*************************************/
{
ForceBlackPen
=
flagforce
;
ForceBlackPen
=
flagforce
;
}
...
...
@@ -273,267 +315,332 @@ void GRForceBlackPen(bool flagforce )
/* routines de controle et positionnement du curseur souris */
/************************************************************/
/* positionne la souris au point de coord pos */
void
GRMouseWarp
(
WinEDA_DrawPanel
*
panel
,
const
wxPoint
&
pos
)
void
GRMouseWarp
(
WinEDA_DrawPanel
*
panel
,
const
wxPoint
&
pos
)
{
if
(
panel
==
NULL
)
return
;
panel
->
WarpPointer
(
pos
.
x
,
pos
.
y
);
if
(
panel
==
NULL
)
return
;
panel
->
WarpPointer
(
pos
.
x
,
pos
.
y
);
}
/**********************************************/
/* Routine pour selectionner le mode de trace */
/**********************************************/
void
GRSetDrawMode
(
wxDC
*
DC
,
int
draw_mode
)
void
GRSetDrawMode
(
wxDC
*
DC
,
int
draw_mode
)
{
if
(
draw_mode
&
GR_OR
)
DC
->
SetLogicalFunction
(
wxOR
);
else
if
(
draw_mode
&
GR_XOR
)
DC
->
SetLogicalFunction
(
wxXOR
);
else
if
(
draw_mode
&
GR_NXOR
)
DC
->
SetLogicalFunction
(
wxEQUIV
);
else
DC
->
SetLogicalFunction
(
wxCOPY
);
if
(
draw_mode
&
GR_OR
)
DC
->
SetLogicalFunction
(
wxOR
);
else
if
(
draw_mode
&
GR_XOR
)
DC
->
SetLogicalFunction
(
wxXOR
);
else
if
(
draw_mode
&
GR_NXOR
)
DC
->
SetLogicalFunction
(
wxEQUIV
);
else
DC
->
SetLogicalFunction
(
wxCOPY
);
}
/*********************************************************************/
void
GRPutPixel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
Color
)
void
GRPutPixel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
Color
)
/*********************************************************************/
{
GRSPutPixel
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
Color
);
GRSPutPixel
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
Color
);
}
/********************************************************************/
void
GRSPutPixel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
Color
)
void
GRSPutPixel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
Color
)
/********************************************************************/
{
if
(
ClipBox
)
/* suppression des pixels hors ecran */
{
if
(
x
<
ClipBox
->
GetX
()
)
return
;
if
(
y
<
ClipBox
->
GetY
()
)
return
;
if
(
x
>
(
ClipBox
->
GetRight
())
)
return
;
if
(
y
>
(
ClipBox
->
GetBottom
())
)
return
;
}
GRSetColorPen
(
DC
,
Color
);
DC
->
DrawPoint
(
x
,
y
);
if
(
ClipBox
)
/* suppression des pixels hors ecran */
{
if
(
x
<
ClipBox
->
GetX
()
)
return
;
if
(
y
<
ClipBox
->
GetY
()
)
return
;
if
(
x
>
(
ClipBox
->
GetRight
()
)
)
return
;
if
(
y
>
(
ClipBox
->
GetBottom
()
)
)
return
;
}
GRSetColorPen
(
DC
,
Color
);
DC
->
DrawPoint
(
x
,
y
);
}
/*******************************************/
/* int GRGetPixel(wxDC * DC, int x, int y) */
/*******************************************/
int
GRGetPixel
(
wxDC
*
DC
,
int
x
,
int
y
)
/*******************************************/
/* int GRGetPixel(wxDC * DC, int x, int y) */
/*******************************************/
int
GRGetPixel
(
wxDC
*
DC
,
int
x
,
int
y
)
{
wxColour
colour
;
unsigned
char
r
,
g
,
b
;
int
ii
;
wxColour
colour
;
unsigned
char
r
,
g
,
b
;
int
ii
;
DC
->
GetPixel
(
(
long
)
x
,
(
long
)
y
,
&
colour
);
r
=
colour
.
Red
();
b
=
colour
.
Blue
();
g
=
colour
.
Green
();
for
(
ii
=
0
;
ii
<
NBCOLOR
;
ii
++
)
{
if
(
(
r
==
ColorRefs
[
ii
].
m_Red
)
&&
(
g
==
ColorRefs
[
ii
].
m_Green
)
&&
(
b
==
ColorRefs
[
ii
].
m_Blue
)
)
break
;
}
DC
->
GetPixel
(
(
long
)
x
,
(
long
)
y
,
&
colour
);
r
=
colour
.
Red
();
b
=
colour
.
Blue
();
g
=
colour
.
Green
();
for
(
ii
=
0
;
ii
<
NBCOLOR
;
ii
++
)
{
if
(
(
r
==
ColorRefs
[
ii
].
m_Red
)
&&
(
g
==
ColorRefs
[
ii
].
m_Green
)
&&
(
b
==
ColorRefs
[
ii
].
m_Blue
)
)
break
;
}
return
ii
;
return
ii
;
}
/****************************************************************************
* Routine to draw a line, in Object spaces. *
****************************************************************************/
void
GRLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
GRSLine
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
GRSLine
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
}
/***************************************************/
/* Routine to draw a Dashed line, in Screen space. */
/***************************************************/
void
GRSDashedLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRSDashedLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
lastcolor
=
-
1
;
GRSetColorPen
(
DC
,
Color
,
width
,
wxSHORT_DASH
);
GRSLine
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
width
,
Color
);
lastcolor
=
-
1
;
GRSetColorPen
(
DC
,
Color
,
width
);
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
lastcolor
=
-
1
;
GRSetColorPen
(
DC
,
Color
,
width
,
wxSHORT_DASH
);
GRSLine
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
width
,
Color
);
lastcolor
=
-
1
;
GRSetColorPen
(
DC
,
Color
,
width
);
}
void
GRSDashedLineTo
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRSDashedLineTo
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
lastcolor
=
-
1
;
GRSetColorPen
(
DC
,
Color
,
width
,
wxSHORT_DASH
);
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
x2
,
y2
,
width
,
Color
);
lastcolor
=
-
1
;
GRSetColorPen
(
DC
,
Color
,
width
);
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
lastcolor
=
-
1
;
GRSetColorPen
(
DC
,
Color
,
width
,
wxSHORT_DASH
);
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
x2
,
y2
,
width
,
Color
);
lastcolor
=
-
1
;
GRSetColorPen
(
DC
,
Color
,
width
);
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
}
/****************************************************************************
* Routine to draw a Dashed line, in Object spaces. *
****************************************************************************/
void
GRDashedLineTo
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRDashedLineTo
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
GRSDashedLineTo
(
ClipBox
,
DC
,
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
GRSDashedLineTo
(
ClipBox
,
DC
,
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
}
void
GRDashedLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRDashedLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
GRSDashedLine
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
GRSDashedLine
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
}
/****************************************************************************
* Routine to move to a new position, in Object space. *
****************************************************************************/
void
GRMoveTo
(
int
x
,
int
y
)
void
GRMoveTo
(
int
x
,
int
y
)
{
GRLastMoveToX
=
GRMapX
(
x
);
GRLastMoveToY
=
GRMapY
(
y
);
GRLastMoveToX
=
GRMapX
(
x
);
GRLastMoveToY
=
GRMapY
(
y
);
}
/*******************************************************/
/* Routine to draw to a new position, in Object space. */
/*******************************************************/
void
GRLineTo
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
)
void
GRLineTo
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
)
{
int
GRLineToX
,
GRLineToY
;
int
GRLineToX
,
GRLineToY
;
GRLineToX
=
GRMapX
(
x
);
GRLineToY
=
GRMapY
(
y
);
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
GRLineToX
,
GRLineToY
,
ZoomValue
(
width
),
Color
);
GRLineToX
=
GRMapX
(
x
);
GRLineToY
=
GRMapY
(
y
);
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
GRLineToX
,
GRLineToY
,
ZoomValue
(
width
),
Color
);
}
/*************************************************/
/* Routine to draw a Mixed line, in Object space */
/*************************************************/
void
GRMixedLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRMixedLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
GRSMixedLine
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
GRSMixedLine
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
}
/***********************************************************/
/* Routine to draw a Mixed line, in Screen (Pixels) space */
/***********************************************************/
void
GRSMixedLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRSMixedLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
GRSetColorPen
(
DC
,
Color
,
width
,
wxDOT_DASH
);
GRSLine
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
width
,
Color
);
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetColorPen
(
DC
,
Color
,
width
,
wxDOT_DASH
);
GRSLine
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
width
,
Color
);
GRSetColorPen
(
DC
,
Color
,
width
);
}
/****************************************************************************
* Routine to move to a new position, in Screen (pixels) space. *
****************************************************************************/
void
GRSMoveTo
(
int
x
,
int
y
)
void
GRSMoveTo
(
int
x
,
int
y
)
{
GRLastMoveToX
=
x
;
GRLastMoveToY
=
y
;
GRLastMoveToX
=
x
;
GRLastMoveToY
=
y
;
}
/****************************************************************************
* Routine to draw to a new position, in Screen (pixels) space. *
****************************************************************************/
void
GRSLineTo
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
)
void
GRSLineTo
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
)
{
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
x
,
y
,
width
,
Color
);
GRLastMoveToX
=
x
;
GRLastMoveToY
=
y
;
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
x
,
y
,
width
,
Color
);
GRLastMoveToX
=
x
;
GRLastMoveToY
=
y
;
}
/****************************************************************************
* Routine to draw to a new position, in Screen (pixels) space. *
****************************************************************************/
void
GRSLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRSLine
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
WinClipAndDrawLine
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
Color
,
width
);
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
WinClipAndDrawLine
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
Color
,
width
);
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
}
/****************************************************************************/
/* Routine to move to a new position relative to current one, as in Object */
/* space. */
/****************************************************************************/
void
GRMoveRel
(
int
x
,
int
y
)
void
GRMoveRel
(
int
x
,
int
y
)
{
GRLastMoveToX
+=
ZoomValue
(
x
);
GRLastMoveToY
+=
ZoomValue
(
y
);
GRLastMoveToX
+=
ZoomValue
(
x
);
GRLastMoveToY
+=
ZoomValue
(
y
);
}
/****************************************************************************
* Routine to line to a new position relative to current one, as in Object *
* space. *
****************************************************************************/
void
GRLineRel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
)
void
GRLineRel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
)
{
int
GRLineToX
=
GRLastMoveToX
,
GRLineToY
=
GRLastMoveToY
;
int
GRLineToX
=
GRLastMoveToX
,
GRLineToY
=
GRLastMoveToY
;
GRLineToX
+=
ZoomValue
(
x
);
GRLineToY
+=
ZoomValue
(
y
);
GRLineToX
+=
ZoomValue
(
x
);
GRLineToY
+=
ZoomValue
(
y
);
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
GRLineToX
,
GRLineToY
,
ZoomValue
(
width
),
Color
);
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
GRLineToX
,
GRLineToY
,
ZoomValue
(
width
),
Color
);
}
/****************************************************************************
* Routine to move to a new position relative to current one, as in Screen *
* space (pixel coords.). *
****************************************************************************/
void
GRSMoveRel
(
int
x
,
int
y
)
void
GRSMoveRel
(
int
x
,
int
y
)
{
GRLastMoveToX
+=
x
;
GRLastMoveToY
+=
y
;
GRLastMoveToX
+=
x
;
GRLastMoveToY
+=
y
;
}
/****************************************************************************
* Routine to line to a new position relative to current one, as in Screen *
* space (pixel coords.). *
****************************************************************************/
void
GRSLineRel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
)
void
GRSLineRel
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
width
,
int
Color
)
{
long
GRLineToX
=
GRLastMoveToX
+
x
,
GRLineToY
=
GRLastMoveToY
+
y
;
long
GRLineToX
=
GRLastMoveToX
+
x
,
GRLineToY
=
GRLastMoveToY
+
y
;
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
GRLineToX
,
GRLineToY
,
width
,
Color
);
GRLastMoveToX
=
GRLineToX
;
GRLastMoveToY
=
GRLineToY
;
GRSLine
(
ClipBox
,
DC
,
GRLastMoveToX
,
GRLastMoveToY
,
GRLineToX
,
GRLineToY
,
width
,
Color
);
GRLastMoveToX
=
GRLineToX
;
GRLastMoveToY
=
GRLineToY
;
}
/**************************************************/
/* Routine de trace d'un segment a bouts arrondis */
/* Object space = real coords.). */
/**************************************************/
void
GRCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
GRSCSegm
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
GRSCSegm
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
}
/*******************************************************************
* Routine de trace d'un segment (plein) a bouts arrondis in Object *
* space (real coords.). *
********************************************************************/
void
GRFillCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
* Routine de trace d'un segment (plein) a bouts arrondis in Object *
* space (real coords.). *
********************************************************************/
void
GRFillCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
GRSFillCSegm
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
GRSFillCSegm
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
ZoomValue
(
width
),
Color
);
}
/**********************************************************/
/* Routine de trace d'un segment (plein) a bouts arrondis */
/* ( Screen space = pixel coords.). */
/**********************************************************/
/**********************************************************/
/* Routine de trace d'un segment (plein) a bouts arrondis */
/* ( Screen space = pixel coords.). */
/**********************************************************/
void
GRSFillCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRSFillCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
WinClipAndDrawLine
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
Color
,
width
);
WinClipAndDrawLine
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
Color
,
width
);
}
...
...
@@ -541,371 +648,392 @@ void GRSFillCSegm(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
/* Routine de trace d'un segment a bouts arrondis (Mode SKETCH) */
/* Screen space (pixel coords.). */
/****************************************************************/
void
GRSCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
long
rayon
,
dwx
,
dwy
;
long
dx
,
dy
,
dwx2
,
dwy2
;
long
sx1
,
sy1
,
ex1
,
ey1
;
/* coord du 1er bord */
long
sx2
,
sy2
,
ex2
,
ey2
;
/* coord du 1eme bord */
bool
swap_ends
=
FALSE
;
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
if
(
ClipBox
)
{
xcliplo
=
ClipBox
->
GetX
();
ycliplo
=
ClipBox
->
GetY
();
xcliphi
=
ClipBox
->
GetRight
();
ycliphi
=
ClipBox
->
GetHeight
();
xcliplo
-=
width
;
ycliplo
-=
width
;
xcliphi
+=
width
;
ycliphi
+=
width
;
CLIP_LINE
(
x1
,
y1
,
x2
,
y2
);
}
if
(
width
<=
2
)
/* ligne simple ou epaisse de 2 pixels*/
{
GRSetColorPen
(
DC
,
Color
,
width
);
DC
->
DrawLine
(
x1
,
y1
,
x2
,
y2
);
return
;
}
GRSetColorPen
(
DC
,
Color
);
GRSetBrush
(
DC
,
Color
,
FALSE
);
rayon
=
(
width
+
1
)
>>
1
;
dx
=
x2
-
x1
;
dy
=
y2
-
y1
;
if
(
dx
==
0
)
/* segment vertical */
{
dwx
=
rayon
;
if
(
dy
>=
0
)
dwx
=
-
dwx
;
sx1
=
x1
-
dwx
;
sy1
=
y1
;
ex1
=
x2
-
dwx
;
ey1
=
y2
;
DC
->
DrawLine
(
sx1
,
sy1
,
ex1
,
ey1
);
sx2
=
x1
+
dwx
;
sy2
=
y1
;
ex2
=
x2
+
dwx
;
ey2
=
y2
;
DC
->
DrawLine
(
sx2
,
sy2
,
ex2
,
ey2
);
}
else
if
(
dy
==
0
)
/* segment horizontal */
{
dwy
=
rayon
;
if
(
dx
<
0
)
dwy
=
-
dwy
;
sx1
=
x1
,
sy1
=
y1
-
dwy
;
ex1
=
x2
;
ey1
=
y2
-
dwy
;
DC
->
DrawLine
(
sx1
,
sy1
,
ex1
,
ey1
);
sx2
=
x1
;
sy2
=
y1
+
dwy
;
ex2
=
x2
;
ey2
=
y2
+
dwy
;
DC
->
DrawLine
(
sx2
,
sy2
,
ex2
,
ey2
);
}
else
{
if
(
ABS
(
dx
)
==
ABS
(
dy
)
)
/* segment a 45 degre */
{
dwx
=
dwy
=
((
width
*
5
)
+
4
)
/
7
;
// = width/2 * 0.707
if
(
dy
<
0
)
{
if
(
dx
<=
0
)
{
dwx
=
-
dwx
;
swap_ends
=
TRUE
;
}
}
else
{
if
(
dx
>
0
)
{
dwy
=
-
dwy
;
swap_ends
=
TRUE
;
}
}
}
else
{
int
delta_angle
=
ArcTangente
(
dy
,
dx
);
dwx
=
0
;
dwy
=
width
;
RotatePoint
(
(
int
*
)
&
dwx
,
(
int
*
)
&
dwy
,
-
delta_angle
);
}
dwx2
=
dwx
>>
1
;
dwy2
=
dwy
>>
1
;
sx1
=
x1
-
dwx2
;
sy1
=
y1
-
dwy2
;
ex1
=
x2
-
dwx2
;
ey1
=
y2
-
dwy2
;
DC
->
DrawLine
(
sx1
,
sy1
,
ex1
,
ey1
);
sx2
=
x1
+
dwx2
;
sy2
=
y1
+
dwy2
;
ex2
=
x2
+
dwx2
;
ey2
=
y2
+
dwy2
;
DC
->
DrawLine
(
sx2
,
sy2
,
ex2
,
ey2
);
}
if
(
swap_ends
)
{
DC
->
DrawArc
(
sx2
,
sy2
,
sx1
,
sy1
,
x1
,
y1
);
DC
->
DrawArc
(
ex1
,
ey1
,
ex2
,
ey2
,
x2
,
y2
);
}
else
{
DC
->
DrawArc
(
sx1
,
sy1
,
sx2
,
sy2
,
x1
,
y1
);
DC
->
DrawArc
(
ex2
,
ey2
,
ex1
,
ey1
,
x2
,
y2
);
}
}
static
bool
IsGRSPolyDrawable
(
EDA_Rect
*
ClipBox
,
int
n
,
int
*
Points
)
{
int
ii
;
int
Xmin
,
Xmax
,
Ymin
,
Ymax
;
Xmin
=
Xmax
=
Points
[
0
];
Ymin
=
Ymax
=
Points
[
1
];
for
(
ii
=
1
;
ii
<
n
;
ii
++
)
// calcul du rectangle d'encadrement
{
int
jj
=
ii
*
2
;
Xmin
=
MIN
(
Xmin
,
Points
[
jj
]);
Xmax
=
MAX
(
Xmax
,
Points
[
jj
]);
Ymin
=
MIN
(
Ymin
,
Points
[
jj
+
1
]);
Ymax
=
MAX
(
Ymax
,
Points
[
jj
+
1
]);
}
xcliplo
=
ClipBox
->
GetX
();
ycliplo
=
ClipBox
->
GetY
();
xcliphi
=
ClipBox
->
GetRight
();
ycliphi
=
ClipBox
->
GetHeight
();
if
(
Xmax
<
xcliplo
)
return
FALSE
;
if
(
Xmin
>
xcliphi
)
return
FALSE
;
if
(
Ymax
<
ycliplo
)
return
FALSE
;
if
(
Ymin
>
ycliphi
)
return
FALSE
;
return
TRUE
;
void
GRSCSegm
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
long
rayon
,
dwx
,
dwy
;
long
dx
,
dy
,
dwx2
,
dwy2
;
long
sx1
,
sy1
,
ex1
,
ey1
;
/* coord du 1er bord */
long
sx2
,
sy2
,
ex2
,
ey2
;
/* coord du 1eme bord */
bool
swap_ends
=
FALSE
;
GRLastMoveToX
=
x2
;
GRLastMoveToY
=
y2
;
if
(
ClipBox
)
{
xcliplo
=
ClipBox
->
GetX
();
ycliplo
=
ClipBox
->
GetY
();
xcliphi
=
ClipBox
->
GetRight
();
ycliphi
=
ClipBox
->
GetHeight
();
xcliplo
-=
width
;
ycliplo
-=
width
;
xcliphi
+=
width
;
ycliphi
+=
width
;
clip_line
(
x1
,
y1
,
x2
,
y2
);
}
if
(
width
<=
2
)
/* ligne simple ou epaisse de 2 pixels*/
{
GRSetColorPen
(
DC
,
Color
,
width
);
DC
->
DrawLine
(
x1
,
y1
,
x2
,
y2
);
return
;
}
GRSetColorPen
(
DC
,
Color
);
GRSetBrush
(
DC
,
Color
,
FALSE
);
rayon
=
(
width
+
1
)
>>
1
;
dx
=
x2
-
x1
;
dy
=
y2
-
y1
;
if
(
dx
==
0
)
/* segment vertical */
{
dwx
=
rayon
;
if
(
dy
>=
0
)
dwx
=
-
dwx
;
sx1
=
x1
-
dwx
;
sy1
=
y1
;
ex1
=
x2
-
dwx
;
ey1
=
y2
;
DC
->
DrawLine
(
sx1
,
sy1
,
ex1
,
ey1
);
sx2
=
x1
+
dwx
;
sy2
=
y1
;
ex2
=
x2
+
dwx
;
ey2
=
y2
;
DC
->
DrawLine
(
sx2
,
sy2
,
ex2
,
ey2
);
}
else
if
(
dy
==
0
)
/* segment horizontal */
{
dwy
=
rayon
;
if
(
dx
<
0
)
dwy
=
-
dwy
;
sx1
=
x1
,
sy1
=
y1
-
dwy
;
ex1
=
x2
;
ey1
=
y2
-
dwy
;
DC
->
DrawLine
(
sx1
,
sy1
,
ex1
,
ey1
);
sx2
=
x1
;
sy2
=
y1
+
dwy
;
ex2
=
x2
;
ey2
=
y2
+
dwy
;
DC
->
DrawLine
(
sx2
,
sy2
,
ex2
,
ey2
);
}
else
{
if
(
ABS
(
dx
)
==
ABS
(
dy
)
)
/* segment a 45 degre */
{
dwx
=
dwy
=
(
(
width
*
5
)
+
4
)
/
7
;
// = width/2 * 0.707
if
(
dy
<
0
)
{
if
(
dx
<=
0
)
{
dwx
=
-
dwx
;
swap_ends
=
TRUE
;
}
}
else
{
if
(
dx
>
0
)
{
dwy
=
-
dwy
;
swap_ends
=
TRUE
;
}
}
}
else
{
int
delta_angle
=
ArcTangente
(
dy
,
dx
);
dwx
=
0
;
dwy
=
width
;
RotatePoint
(
(
int
*
)
&
dwx
,
(
int
*
)
&
dwy
,
-
delta_angle
);
}
dwx2
=
dwx
>>
1
;
dwy2
=
dwy
>>
1
;
sx1
=
x1
-
dwx2
;
sy1
=
y1
-
dwy2
;
ex1
=
x2
-
dwx2
;
ey1
=
y2
-
dwy2
;
DC
->
DrawLine
(
sx1
,
sy1
,
ex1
,
ey1
);
sx2
=
x1
+
dwx2
;
sy2
=
y1
+
dwy2
;
ex2
=
x2
+
dwx2
;
ey2
=
y2
+
dwy2
;
DC
->
DrawLine
(
sx2
,
sy2
,
ex2
,
ey2
);
}
if
(
swap_ends
)
{
DC
->
DrawArc
(
sx2
,
sy2
,
sx1
,
sy1
,
x1
,
y1
);
DC
->
DrawArc
(
ex1
,
ey1
,
ex2
,
ey2
,
x2
,
y2
);
}
else
{
DC
->
DrawArc
(
sx1
,
sy1
,
sx2
,
sy2
,
x1
,
y1
);
DC
->
DrawArc
(
ex2
,
ey2
,
ex1
,
ey1
,
x2
,
y2
);
}
}
static
bool
IsGRSPolyDrawable
(
EDA_Rect
*
ClipBox
,
int
n
,
int
*
Points
)
{
int
ii
;
int
Xmin
,
Xmax
,
Ymin
,
Ymax
;
Xmin
=
Xmax
=
Points
[
0
];
Ymin
=
Ymax
=
Points
[
1
];
for
(
ii
=
1
;
ii
<
n
;
ii
++
)
// calcul du rectangle d'encadrement
{
int
jj
=
ii
*
2
;
Xmin
=
MIN
(
Xmin
,
Points
[
jj
]
);
Xmax
=
MAX
(
Xmax
,
Points
[
jj
]
);
Ymin
=
MIN
(
Ymin
,
Points
[
jj
+
1
]
);
Ymax
=
MAX
(
Ymax
,
Points
[
jj
+
1
]
);
}
xcliplo
=
ClipBox
->
GetX
();
ycliplo
=
ClipBox
->
GetY
();
xcliphi
=
ClipBox
->
GetRight
();
ycliphi
=
ClipBox
->
GetHeight
();
if
(
Xmax
<
xcliplo
)
return
FALSE
;
if
(
Xmin
>
xcliphi
)
return
FALSE
;
if
(
Ymax
<
ycliplo
)
return
FALSE
;
if
(
Ymin
>
ycliphi
)
return
FALSE
;
return
TRUE
;
}
/************************************************************************/
/* Routine to draw a new polyline and fill it if Fill, in screen space. */
/************************************************************************/
void
GRSPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
)
void
GRSPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
)
{
int
startx
,
starty
;
int
startx
,
starty
;
if
(
!
IsGRSPolyDrawable
(
ClipBox
,
n
,
Points
)
)
return
;
if
(
!
IsGRSPolyDrawable
(
ClipBox
,
n
,
Points
)
)
return
;
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetColorPen
(
DC
,
Color
,
width
);
if
(
Fill
&&
(
n
>
2
)
)
{
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
DC
->
DrawPolygon
(
n
,
(
wxPoint
*
)
Points
);
}
else
{
startx
=
Points
[
n
*
2
-
2
];
starty
=
Points
[
n
*
2
-
1
];
GRSetBrush
(
DC
,
Color
);
DC
->
DrawLines
(
n
,
(
wxPoint
*
)
Points
);
}
if
(
Fill
&&
(
n
>
2
)
)
{
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
DC
->
DrawPolygon
(
n
,
(
wxPoint
*
)
Points
);
}
else
{
startx
=
Points
[
n
*
2
-
2
];
starty
=
Points
[
n
*
2
-
1
];
GRSetBrush
(
DC
,
Color
);
DC
->
DrawLines
(
n
,
(
wxPoint
*
)
Points
);
}
}
/******************************************************************************/
/* Routine to draw a new closed polyline and fill it if Fill, in screen space */
/******************************************************************************/
void
GRSClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
Color
,
int
BgColor
)
void
GRSClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
Color
,
int
BgColor
)
{
GRSClosedPoly
(
ClipBox
,
DC
,
n
,
Points
,
Fill
,
0
,
Color
,
BgColor
);
GRSClosedPoly
(
ClipBox
,
DC
,
n
,
Points
,
Fill
,
0
,
Color
,
BgColor
);
}
void
GRSClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
)
void
GRSClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
)
{
int
startx
,
starty
;
int
startx
,
starty
;
if
(
!
IsGRSPolyDrawable
(
ClipBox
,
n
,
Points
)
)
return
;
if
(
!
IsGRSPolyDrawable
(
ClipBox
,
n
,
Points
)
)
return
;
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetColorPen
(
DC
,
Color
,
width
);
if
(
Fill
&&
(
n
>
2
)
)
{
GRSMoveTo
(
Points
[
n
*
2
-
2
],
Points
[
n
*
2
-
1
]
);
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
DC
->
DrawPolygon
(
n
,
(
wxPoint
*
)
Points
,
0
,
0
,
wxODDEVEN_RULE
);
}
else
{
startx
=
Points
[
n
*
2
-
2
];
starty
=
Points
[
n
*
2
-
1
];
GRSetBrush
(
DC
,
BgColor
);
DC
->
DrawLines
(
n
,
(
wxPoint
*
)
Points
);
if
(
Fill
&&
(
n
>
2
)
)
{
GRSMoveTo
(
Points
[
n
*
2
-
2
],
Points
[
n
*
2
-
1
]
);
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
DC
->
DrawPolygon
(
n
,
(
wxPoint
*
)
Points
,
0
,
0
,
wxODDEVEN_RULE
);
}
else
{
startx
=
Points
[
n
*
2
-
2
];
starty
=
Points
[
n
*
2
-
1
];
GRSetBrush
(
DC
,
BgColor
);
DC
->
DrawLines
(
n
,
(
wxPoint
*
)
Points
);
/* Fermeture du polygone */
if
(
(
startx
!=
Points
[
0
])
||
(
starty
!=
Points
[
1
])
)
{
GRSLine
(
ClipBox
,
DC
,
Points
[
0
],
Points
[
1
],
startx
,
starty
,
width
,
Color
);
}
}
/* Fermeture du polygone */
if
(
(
startx
!=
Points
[
0
])
||
(
starty
!=
Points
[
1
])
)
{
GRSLine
(
ClipBox
,
DC
,
Points
[
0
],
Points
[
1
],
startx
,
starty
,
width
,
Color
);
}
}
}
/************************************************************************/
/* Routine to draw a new polyline and fill it if Fill, in drawing space. */
/************************************************************************/
void
GRPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
)
void
GRPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
)
{
int
ii
,
jj
;
int
ii
,
jj
;
width
=
ZoomValue
(
width
);
for
(
ii
=
0
;
ii
<
n
;
ii
++
)
{
jj
=
ii
<<
1
;
Points
[
jj
]
=
GRMapX
(
Points
[
jj
]
);
jj
++
;
Points
[
jj
]
=
GRMapY
(
Points
[
jj
]
);
}
width
=
ZoomValue
(
width
);
for
(
ii
=
0
;
ii
<
n
;
ii
++
)
{
jj
=
ii
<<
1
;
Points
[
jj
]
=
GRMapX
(
Points
[
jj
]);
jj
++
;
Points
[
jj
]
=
GRMapY
(
Points
[
jj
]);
}
GRSPoly
(
ClipBox
,
DC
,
n
,
Points
,
Fill
,
width
,
Color
,
BgColor
);
GRSPoly
(
ClipBox
,
DC
,
n
,
Points
,
Fill
,
width
,
Color
,
BgColor
);
}
/**************************************************************************/
/* Routine to draw a closed polyline and fill it if Fill, in object space */
/**************************************************************************/
void
GRClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
Color
,
int
BgColor
)
void
GRClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
Color
,
int
BgColor
)
{
GRClosedPoly
(
ClipBox
,
DC
,
n
,
Points
,
Fill
,
0
,
Color
,
BgColor
);
GRClosedPoly
(
ClipBox
,
DC
,
n
,
Points
,
Fill
,
0
,
Color
,
BgColor
);
}
void
GRClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
)
void
GRClosedPoly
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
n
,
int
*
Points
,
int
Fill
,
int
width
,
int
Color
,
int
BgColor
)
{
int
ii
,
jj
;
int
ii
,
jj
;
width
=
ZoomValue
(
width
);
for
(
ii
=
0
;
ii
<
n
;
ii
++
)
{
jj
=
ii
<<
1
;
Points
[
jj
]
=
GRMapX
(
Points
[
jj
]
);
jj
++
;
Points
[
jj
]
=
GRMapY
(
Points
[
jj
]
);
}
width
=
ZoomValue
(
width
);
for
(
ii
=
0
;
ii
<
n
;
ii
++
)
{
jj
=
ii
<<
1
;
Points
[
jj
]
=
GRMapX
(
Points
[
jj
]);
jj
++
;
Points
[
jj
]
=
GRMapY
(
Points
[
jj
]);
}
GRSClosedPoly
(
ClipBox
,
DC
,
n
,
Points
,
Fill
,
width
,
Color
,
BgColor
);
GRSClosedPoly
(
ClipBox
,
DC
,
n
,
Points
,
Fill
,
width
,
Color
,
BgColor
);
}
/***********************************************/
/* Routine to draw a circle, in object space. */
/***********************************************/
void
GRCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
Color
)
void
GRCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
Color
)
{
int
cx
=
GRMapX
(
x
);
int
cy
=
GRMapY
(
y
);
int
rayon
=
ZoomValue
(
r
);
int
cx
=
GRMapX
(
x
);
int
cy
=
GRMapY
(
y
);
int
rayon
=
ZoomValue
(
r
);
GRSCircle
(
ClipBox
,
DC
,
cx
,
cy
,
rayon
,
0
,
Color
);
GRSCircle
(
ClipBox
,
DC
,
cx
,
cy
,
rayon
,
0
,
Color
);
}
/*****************************************************/
/* Routine to draw a Filled circle, in object space. */
/*****************************************************/
void
GRFilledCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
,
int
BgColor
)
void
GRFilledCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
,
int
BgColor
)
{
r
=
ZoomValue
(
r
);
width
=
ZoomValue
(
width
);
GRSFilledCircle
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
r
,
width
,
Color
,
BgColor
);
r
=
ZoomValue
(
r
);
width
=
ZoomValue
(
width
);
GRSFilledCircle
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
r
,
width
,
Color
,
BgColor
);
}
/******************************************************/
/* Routine to draw a FILLED circle, in drawing space. */
/******************************************************/
void
GRSFilledCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
,
int
BgColor
)
{
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
if
(
x
<
(
x0
-
r
)
)
return
;
if
(
y
<
(
y0
-
r
)
)
return
;
if
(
x
>
(
r
+
xm
)
)
return
;
if
(
y
>
(
r
+
ym
)
)
return
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
DC
->
DrawEllipse
(
x
-
r
,
y
-
r
,
r
+
r
,
r
+
r
);
void
GRSFilledCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
,
int
BgColor
)
{
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
if
(
x
<
(
x0
-
r
)
)
return
;
if
(
y
<
(
y0
-
r
)
)
return
;
if
(
x
>
(
r
+
xm
)
)
return
;
if
(
y
>
(
r
+
ym
)
)
return
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
DC
->
DrawEllipse
(
x
-
r
,
y
-
r
,
r
+
r
,
r
+
r
);
}
/***********************************************************/
/* Routine to draw a circle, in object space. */
/***********************************************************/
void
GRCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
)
void
GRCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
r
,
int
width
,
int
Color
)
{
r
=
ZoomValue
(
r
);
width
=
ZoomValue
(
width
);
GRSCircle
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
r
,
width
,
Color
);
r
=
ZoomValue
(
r
);
width
=
ZoomValue
(
width
);
GRSCircle
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
r
,
width
,
Color
);
}
/***********************************************/
/* Routine to draw a circle, in drawing space. */
/***********************************************/
void
GRSCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
xc
,
int
yc
,
int
r
,
int
width
,
int
Color
)
{
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
if
(
xc
<
(
x0
-
r
-
width
)
)
return
;
if
(
yc
<
(
y0
-
r
-
width
)
)
return
;
if
(
xc
>
(
r
+
xm
+
width
)
)
return
;
if
(
yc
>
(
r
+
ym
+
width
)
)
return
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetBrush
(
DC
,
Color
,
FALSE
);
DC
->
DrawEllipse
(
xc
-
r
,
yc
-
r
,
r
+
r
,
r
+
r
);
void
GRSCircle
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
xc
,
int
yc
,
int
r
,
int
width
,
int
Color
)
{
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
if
(
xc
<
(
x0
-
r
-
width
)
)
return
;
if
(
yc
<
(
y0
-
r
-
width
)
)
return
;
if
(
xc
>
(
r
+
xm
+
width
)
)
return
;
if
(
yc
>
(
r
+
ym
+
width
)
)
return
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetBrush
(
DC
,
Color
,
FALSE
);
DC
->
DrawEllipse
(
xc
-
r
,
yc
-
r
,
r
+
r
,
r
+
r
);
}
/************************************************/
/* Routine to draw an arc, in USER space. */
/* Debut et fin de l'arc donnes par leur coord. */
/************************************************/
void
GRArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
Color
)
void
GRArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
Color
)
{
GRSArc1
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
GRMapX
(
xc
),
GRMapY
(
yc
),
0
,
Color
);
GRSArc1
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
GRMapX
(
xc
),
GRMapY
(
yc
),
0
,
Color
);
}
/************************************************/
/* Routine to draw an arc, width = width in USER space. */
/* Debut et fin de l'arc donnes par leur coord. */
/************************************************/
void
GRArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
width
,
int
Color
)
void
GRArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
width
,
int
Color
)
{
GRSArc1
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
GRMapX
(
xc
),
GRMapY
(
yc
),
ZoomValue
(
width
),
Color
);
GRSArc1
(
ClipBox
,
DC
,
GRMapX
(
x1
),
GRMapY
(
y1
),
GRMapX
(
x2
),
GRMapY
(
y2
),
GRMapX
(
xc
),
GRMapY
(
yc
),
ZoomValue
(
width
),
Color
);
}
...
...
@@ -913,378 +1041,433 @@ void GRArc1(EDA_Rect * ClipBox,wxDC * DC, int x1, int y1, int x2, int y2,
/* Routine to draw an arc, width = width, in screen space. */
/* Debut et fin de l'arc donnes par leur coord. */
/************************************************/
void
GRSArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
width
,
int
Color
)
{
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
,
r
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
r
=
(
int
)
hypot
(
x1
-
xc
,
y1
-
yc
);
if
(
xc
<
(
x0
-
r
)
)
return
;
if
(
yc
<
(
y0
-
r
)
)
return
;
if
(
xc
>
(
r
+
xm
)
)
return
;
if
(
yc
>
(
r
+
ym
)
)
return
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetBrush
(
DC
,
Color
);
DC
->
DrawArc
(
x1
,
y1
,
x2
,
y2
,
xc
,
yc
);
void
GRSArc1
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
xc
,
int
yc
,
int
width
,
int
Color
)
{
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
,
r
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
r
=
(
int
)
hypot
(
x1
-
xc
,
y1
-
yc
);
if
(
xc
<
(
x0
-
r
)
)
return
;
if
(
yc
<
(
y0
-
r
)
)
return
;
if
(
xc
>
(
r
+
xm
)
)
return
;
if
(
yc
>
(
r
+
ym
)
)
return
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetBrush
(
DC
,
Color
);
DC
->
DrawArc
(
x1
,
y1
,
x2
,
y2
,
xc
,
yc
);
}
/********************************************************************/
/* Routine to draw an arc, in screen space. */
/* As the Y axe is inverted the Angles should be inverted as well. */
/********************************************************************/
void
GRSArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
xc
,
int
yc
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
)
void
GRSArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
xc
,
int
yc
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
)
{
int
x1
,
y1
,
x2
,
y2
;
int
x1
,
y1
,
x2
,
y2
;
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
if
(
xc
<
(
x0
-
r
-
width
)
)
return
;
if
(
yc
<
(
y0
-
r
-
width
)
)
return
;
if
(
xc
>
(
r
+
xm
+
width
)
)
return
;
if
(
yc
>
(
r
+
ym
+
width
)
)
return
;
}
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
if
(
xc
<
(
x0
-
r
-
width
)
)
return
;
if
(
yc
<
(
y0
-
r
-
width
)
)
return
;
if
(
xc
>
(
r
+
xm
+
width
)
)
return
;
if
(
yc
>
(
r
+
ym
+
width
)
)
return
;
}
x1
=
r
;
y1
=
0
;
RotatePoint
(
&
x1
,
&
y1
,
EndAngle
);
x1
=
r
;
y1
=
0
;
RotatePoint
(
&
x1
,
&
y1
,
EndAngle
);
x2
=
r
;
y2
=
0
;
RotatePoint
(
&
x2
,
&
y2
,
StAngle
);
x2
=
r
;
y2
=
0
;
RotatePoint
(
&
x2
,
&
y2
,
StAngle
);
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetBrush
(
DC
,
Color
);
DC
->
DrawArc
(
xc
+
x1
,
yc
-
y1
,
xc
+
x2
,
yc
-
y2
,
xc
,
yc
);
GRSetColorPen
(
DC
,
Color
,
width
);
GRSetBrush
(
DC
,
Color
);
DC
->
DrawArc
(
xc
+
x1
,
yc
-
y1
,
xc
+
x2
,
yc
-
y2
,
xc
,
yc
);
}
/********************************************************************/
/* Routine to draw an Filled arc, in screen space. */
/* As the Y axes is inverted the Angles should be inverted as well. */
/********************************************************************/
void
GRSFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
xc
,
int
yc
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
,
int
BgColor
)
void
GRSFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
xc
,
int
yc
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
,
int
BgColor
)
{
int
x1
,
y1
,
x2
,
y2
;
int
x1
,
y1
,
x2
,
y2
;
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
if
(
xc
<
(
x0
-
r
-
1
)
)
return
;
if
(
yc
<
(
y0
-
r
-
1
)
)
return
;
if
(
xc
>
(
r
+
xm
+
1
)
)
return
;
if
(
yc
>
(
r
+
ym
+
1
)
)
return
;
}
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
x0
,
y0
,
xm
,
ym
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
if
(
xc
<
(
x0
-
r
-
1
)
)
return
;
if
(
yc
<
(
y0
-
r
-
1
)
)
return
;
if
(
xc
>
(
r
+
xm
+
1
)
)
return
;
if
(
yc
>
(
r
+
ym
+
1
)
)
return
;
}
x1
=
r
;
y1
=
0
;
RotatePoint
(
&
x1
,
&
y1
,
EndAngle
);
x1
=
r
;
y1
=
0
;
RotatePoint
(
&
x1
,
&
y1
,
EndAngle
);
x2
=
r
;
y2
=
0
;
RotatePoint
(
&
x2
,
&
y2
,
StAngle
);
x2
=
r
;
y2
=
0
;
RotatePoint
(
&
x2
,
&
y2
,
StAngle
);
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
GRSetColorPen
(
DC
,
Color
,
width
);
DC
->
DrawArc
(
xc
+
x1
,
yc
-
y1
,
xc
+
x2
,
yc
-
y2
,
xc
,
yc
);
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
GRSetColorPen
(
DC
,
Color
,
width
);
DC
->
DrawArc
(
xc
+
x1
,
yc
-
y1
,
xc
+
x2
,
yc
-
y2
,
xc
,
yc
);
}
/********************************************************************/
/* Routine to draw a Filled arc, in drawing space. */
/* As the Y axes is inverted the Angles should be inverted as well. */
/********************************************************************/
void
GRFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
,
int
BgColor
)
void
GRFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
,
int
BgColor
)
{
width
=
ZoomValue
(
width
);
GRSFilledArc
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
StAngle
,
EndAngle
,
ZoomValue
(
r
),
width
,
Color
,
BgColor
);
width
=
ZoomValue
(
width
);
GRSFilledArc
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
StAngle
,
EndAngle
,
ZoomValue
(
r
),
width
,
Color
,
BgColor
);
}
void
GRFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
Color
,
int
BgColor
)
void
GRFilledArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
Color
,
int
BgColor
)
{
GRSFilledArc
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
StAngle
,
EndAngle
,
ZoomValue
(
r
),
0
,
Color
,
BgColor
);
GRSFilledArc
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
StAngle
,
EndAngle
,
ZoomValue
(
r
),
0
,
Color
,
BgColor
);
}
/********************************************************************/
/* Routine to draw an arc, in drawing space. */
/* As the Y axes is inverted the Angles should be inverted as well. */
/********************************************************************/
void
GRArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
xc
,
int
yc
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
Color
)
{
int
x1
,
y1
,
x2
,
y2
;
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
rayon
=
ZoomValue
(
r
)
+
1
;
int
x0
,
y0
,
xm
,
ym
,
x
,
y
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
x
=
GRMapX
(
xc
);
y
=
GRMapY
(
yc
);
if
(
x
<
(
x0
-
rayon
)
)
return
;
if
(
y
<
(
y0
-
rayon
)
)
return
;
if
(
x
>
(
xm
+
rayon
)
)
return
;
if
(
y
>
(
ym
+
rayon
)
)
return
;
}
x1
=
r
;
y1
=
0
;
RotatePoint
(
&
x1
,
&
y1
,
EndAngle
);
x2
=
r
;
y2
=
0
;
RotatePoint
(
&
x2
,
&
y2
,
StAngle
);
GRSetColorPen
(
DC
,
Color
);
GRSetBrush
(
DC
,
Color
,
FALSE
);
DC
->
DrawArc
(
GRMapX
(
xc
+
x1
),
GRMapY
(
yc
-
y1
),
GRMapX
(
xc
+
x2
),
GRMapY
(
yc
-
y2
),
GRMapX
(
xc
),
GRMapY
(
yc
)
);
void
GRArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
xc
,
int
yc
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
Color
)
{
int
x1
,
y1
,
x2
,
y2
;
/* suppression des cercles hors ecran */
if
(
ClipBox
)
{
int
rayon
=
ZoomValue
(
r
)
+
1
;
int
x0
,
y0
,
xm
,
ym
,
x
,
y
;
x0
=
ClipBox
->
GetX
();
y0
=
ClipBox
->
GetY
();
xm
=
ClipBox
->
GetRight
();
ym
=
ClipBox
->
GetBottom
();
x
=
GRMapX
(
xc
);
y
=
GRMapY
(
yc
);
if
(
x
<
(
x0
-
rayon
)
)
return
;
if
(
y
<
(
y0
-
rayon
)
)
return
;
if
(
x
>
(
xm
+
rayon
)
)
return
;
if
(
y
>
(
ym
+
rayon
)
)
return
;
}
x1
=
r
;
y1
=
0
;
RotatePoint
(
&
x1
,
&
y1
,
EndAngle
);
x2
=
r
;
y2
=
0
;
RotatePoint
(
&
x2
,
&
y2
,
StAngle
);
GRSetColorPen
(
DC
,
Color
);
GRSetBrush
(
DC
,
Color
,
FALSE
);
DC
->
DrawArc
(
GRMapX
(
xc
+
x1
),
GRMapY
(
yc
-
y1
),
GRMapX
(
xc
+
x2
),
GRMapY
(
yc
-
y2
),
GRMapX
(
xc
),
GRMapY
(
yc
)
);
}
/********************************************************************/
/* Routine to draw an arc, width = width, in drawing space. */
/* As the Y axes is inverted the Angles should be inverted as well. */
/********************************************************************/
void
GRArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
)
void
GRArc
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x
,
int
y
,
int
StAngle
,
int
EndAngle
,
int
r
,
int
width
,
int
Color
)
{
GRSArc
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
StAngle
,
EndAngle
,
ZoomValue
(
r
),
ZoomValue
(
width
),
Color
);
GRSArc
(
ClipBox
,
DC
,
GRMapX
(
x
),
GRMapY
(
y
),
StAngle
,
EndAngle
,
ZoomValue
(
r
),
ZoomValue
(
width
),
Color
);
}
/**************************************************/
/* Routine to draw a Rectangle, in drawing space. */
/**************************************************/
void
GRRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
)
void
GRRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
)
{
x1
=
GRMapX
(
x1
);
y1
=
GRMapY
(
y1
);
x2
=
GRMapX
(
x2
);
y2
=
GRMapY
(
y2
);
x1
=
GRMapX
(
x1
);
y1
=
GRMapY
(
y1
);
x2
=
GRMapX
(
x2
);
y2
=
GRMapY
(
y2
);
GRSRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
Color
);
GRSRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
Color
);
}
/**************************************************/
/* Routine to draw a Rectangle, in drawing space. */
/**************************************************/
void
GRRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
x1
=
GRMapX
(
x1
);
y1
=
GRMapY
(
y1
);
x2
=
GRMapX
(
x2
);
y2
=
GRMapY
(
y2
);
width
=
ZoomValue
(
width
);
x1
=
GRMapX
(
x1
);
y1
=
GRMapY
(
y1
);
x2
=
GRMapX
(
x2
);
y2
=
GRMapY
(
y2
);
width
=
ZoomValue
(
width
);
GRSRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
width
,
Color
);
GRSRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
width
,
Color
);
}
/************************************************************************************/
void
GRFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
,
int
BgColor
)
void
GRFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
,
int
BgColor
)
/************************************************************************************/
/* Routine to draw a Rectangle (filled with AreaColor), in drawing space. */
{
x1
=
GRMapX
(
x1
);
y1
=
GRMapY
(
y1
);
x2
=
GRMapX
(
x2
);
y2
=
GRMapY
(
y2
);
x1
=
GRMapX
(
x1
);
y1
=
GRMapY
(
y1
);
x2
=
GRMapX
(
x2
);
y2
=
GRMapY
(
y2
);
GRSFilledRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
0
,
Color
,
BgColor
);
GRSFilledRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
0
,
Color
,
BgColor
);
}
/************************************************************************************/
void
GRFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
,
int
BgColor
)
void
GRFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
,
int
BgColor
)
/************************************************************************************/
/* Routine to draw a Rectangle (filled with AreaColor), in drawing space. */
{
x1
=
GRMapX
(
x1
);
y1
=
GRMapY
(
y1
);
x2
=
GRMapX
(
x2
);
y2
=
GRMapY
(
y2
);
width
=
ZoomValue
(
width
);
x1
=
GRMapX
(
x1
);
y1
=
GRMapY
(
y1
);
x2
=
GRMapX
(
x2
);
y2
=
GRMapY
(
y2
);
width
=
ZoomValue
(
width
);
GRSFilledRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
width
,
Color
,
BgColor
);
GRSFilledRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
width
,
Color
,
BgColor
);
}
/*************************************************/
/* Routine to draw a Rectangle, in screen space. */
/*************************************************/
void
GRSRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
)
void
GRSRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
)
{
GRSRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
0
,
Color
);
GRSRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
0
,
Color
);
}
void
GRSRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
void
GRSRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
)
{
if
(
x1
>
x2
)
EXCHG
(
x1
,
x2
);
if
(
y1
>
y2
)
EXCHG
(
y1
,
y2
);
if
(
x1
>
x2
)
EXCHG
(
x1
,
x2
);
if
(
y1
>
y2
)
EXCHG
(
y1
,
y2
);
/* Clipping des coordonnees */
if
(
ClipBox
)
{
int
xmin
=
ClipBox
->
GetX
();
int
ymin
=
ClipBox
->
GetY
();
int
xmax
=
ClipBox
->
GetRight
();
int
ymax
=
ClipBox
->
GetBottom
();
/* Clipping des coordonnees */
if
(
ClipBox
)
{
int
xmin
=
ClipBox
->
GetX
();
int
ymin
=
ClipBox
->
GetY
();
int
xmax
=
ClipBox
->
GetRight
();
int
ymax
=
ClipBox
->
GetBottom
();
if
(
x1
>
xmax
)
return
;
if
(
x2
<
xmin
)
return
;
if
(
y1
>
ymax
)
return
;
if
(
y2
<
ymin
)
return
;
}
if
(
x1
>
xmax
)
return
;
if
(
x2
<
xmin
)
return
;
if
(
y1
>
ymax
)
return
;
if
(
y2
<
ymin
)
return
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
if
(
(
x1
==
x2
)
||
(
y1
==
y2
)
)
DC
->
DrawLine
(
x1
,
y1
,
x2
,
y2
);
else
{
GRSetBrush
(
DC
,
BLACK
);
DC
->
DrawRectangle
(
x1
,
y1
,
x2
-
x1
,
y2
-
y1
);
}
GRSetColorPen
(
DC
,
Color
,
width
);
if
(
(
x1
==
x2
)
||
(
y1
==
y2
)
)
DC
->
DrawLine
(
x1
,
y1
,
x2
,
y2
);
else
{
GRSetBrush
(
DC
,
BLACK
);
DC
->
DrawRectangle
(
x1
,
y1
,
x2
-
x1
,
y2
-
y1
);
}
}
/* Routine to draw a Filled Rectangle, in screen space. */
/***************************************************************************************/
void
GRSFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
,
int
BgColor
)
void
GRSFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
Color
,
int
BgColor
)
/***************************************************************************************/
{
GRSFilledRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
0
,
Color
,
BgColor
);
GRSFilledRect
(
ClipBox
,
DC
,
x1
,
y1
,
x2
,
y2
,
0
,
Color
,
BgColor
);
}
/***************************************************************************************/
void
GRSFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
,
int
BgColor
)
void
GRSFilledRect
(
EDA_Rect
*
ClipBox
,
wxDC
*
DC
,
int
x1
,
int
y1
,
int
x2
,
int
y2
,
int
width
,
int
Color
,
int
BgColor
)
/***************************************************************************************/
{
if
(
x1
>
x2
)
EXCHG
(
x1
,
x2
);
if
(
y1
>
y2
)
EXCHG
(
y1
,
y2
);
if
(
ClipBox
)
{
int
xmin
=
ClipBox
->
GetX
();
int
ymin
=
ClipBox
->
GetY
();
int
xmax
=
ClipBox
->
GetRight
();
int
ymax
=
ClipBox
->
GetBottom
();
if
(
x1
>
xmax
)
return
;
if
(
x2
<
xmin
)
return
;
if
(
y1
>
ymax
)
return
;
if
(
y2
<
ymin
)
return
;
// Clipping coordinates
if
(
x1
<
xmin
)
x1
=
xmin
-
1
;
if
(
y1
<
ymin
)
y1
=
ymin
-
1
;
if
(
x2
>
xmax
)
x2
=
xmax
+
1
;
if
(
y2
>
ymax
)
y2
=
ymax
+
1
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
if
(
(
x1
==
x2
)
||
(
y1
==
y2
)
)
DC
->
DrawLine
(
x1
,
y1
,
x2
,
y2
);
else
{
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
DC
->
DrawRectangle
(
x1
,
y1
,
x2
-
x1
,
y2
-
y1
);
}
}
/*******************************/
/* Routines used to draw texts */
/*******************************/
if
(
x1
>
x2
)
EXCHG
(
x1
,
x2
);
if
(
y1
>
y2
)
EXCHG
(
y1
,
y2
);
if
(
ClipBox
)
{
int
xmin
=
ClipBox
->
GetX
();
int
ymin
=
ClipBox
->
GetY
();
int
xmax
=
ClipBox
->
GetRight
();
int
ymax
=
ClipBox
->
GetBottom
();
if
(
x1
>
xmax
)
return
;
if
(
x2
<
xmin
)
return
;
if
(
y1
>
ymax
)
return
;
if
(
y2
<
ymin
)
return
;
// Clipping coordinates
if
(
x1
<
xmin
)
x1
=
xmin
-
1
;
if
(
y1
<
ymin
)
y1
=
ymin
-
1
;
if
(
x2
>
xmax
)
x2
=
xmax
+
1
;
if
(
y2
>
ymax
)
y2
=
ymax
+
1
;
}
GRSetColorPen
(
DC
,
Color
,
width
);
if
(
(
x1
==
x2
)
||
(
y1
==
y2
)
)
DC
->
DrawLine
(
x1
,
y1
,
x2
,
y2
);
else
{
GRSetBrush
(
DC
,
BgColor
,
FILLED
);
DC
->
DrawRectangle
(
x1
,
y1
,
x2
-
x1
,
y2
-
y1
);
}
}
/*******************************/
/* Routines used to draw texts */
/*******************************/
/*********************************************/
void
GRSetFont
(
wxDC
*
DC
,
wxFont
*
Font
)
void
GRSetFont
(
wxDC
*
DC
,
wxFont
*
Font
)
/*********************************************/
/* Routine to set the current font */
{
DC
->
SetFont
(
*
Font
);
DC
->
SetFont
(
*
Font
);
}
/*********************************************************/
void
GRSetTextFgColor
(
wxDC
*
DC
,
int
Color
)
void
GRSetTextFgColor
(
wxDC
*
DC
,
int
Color
)
/*********************************************************/
/* Set the foreground color used to draw texts */
{
DC
->
SetTextForeground
(
wxColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
)
);
DC
->
SetTextForeground
(
wxColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
)
);
}
void
GRSetTextFgColor
(
wxDC
*
DC
,
wxFont
*
,
int
Color
)
void
GRSetTextFgColor
(
wxDC
*
DC
,
wxFont
*
,
int
Color
)
{
DC
->
SetTextForeground
(
wxColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
)
);
DC
->
SetTextForeground
(
wxColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
)
);
}
/*****************************************************************************/
void
GRGetTextExtent
(
wxDC
*
DC
,
const
wxChar
*
Text
,
long
*
width
,
long
*
height
)
void
GRGetTextExtent
(
wxDC
*
DC
,
const
wxChar
*
Text
,
long
*
width
,
long
*
height
)
/*****************************************************************************/
/* Return the size of the text
*/
*/
{
long
w
=
0
,
h
=
0
;
long
w
=
0
,
h
=
0
;
if
(
Text
)
{
DC
->
GetTextExtent
(
Text
,
&
w
,
&
h
);
}
if
(
width
)
*
width
=
w
;
if
(
height
)
*
height
=
h
;
if
(
Text
)
{
DC
->
GetTextExtent
(
Text
,
&
w
,
&
h
);
}
if
(
width
)
*
width
=
w
;
if
(
height
)
*
height
=
h
;
}
/********************************/
void
GRResetTextFgColor
(
wxDC
*
DC
)
void
GRResetTextFgColor
(
wxDC
*
DC
)
/********************************/
/* Set the foreground color used to draw texts to the default value */
{
GRSetTextFgColor
(
DC
,
Text_Color
);
GRSetTextFgColor
(
DC
,
Text_Color
);
}
/*********************************************************/
void
GRSetTextBgColor
(
wxDC
*
DC
,
int
Color
)
void
GRSetTextBgColor
(
wxDC
*
DC
,
int
Color
)
/*********************************************************/
/* Set the background color used to draw texts */
{
Color
&=
MASKCOLOR
;
// keep only the bits used to select the color
DC
->
SetTextBackground
(
wxColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
)
);
Color
&=
MASKCOLOR
;
// keep only the bits used to select the color
DC
->
SetTextBackground
(
wxColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
)
);
}
void
GRSetTextBgColor
(
wxDC
*
DC
,
wxFont
*
,
int
Color
)
void
GRSetTextBgColor
(
wxDC
*
DC
,
wxFont
*
,
int
Color
)
{
Color
&=
MASKCOLOR
;
// keep only the bits used to select the color
DC
->
SetTextBackground
(
wxColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
)
);
Color
&=
MASKCOLOR
;
// keep only the bits used to select the color
DC
->
SetTextBackground
(
wxColour
(
ColorRefs
[
Color
].
m_Red
,
ColorRefs
[
Color
].
m_Green
,
ColorRefs
[
Color
].
m_Blue
)
);
}
include/base_struct.h
View file @
f353c77c
...
...
@@ -191,8 +191,19 @@ public:
/* Gestion de l'etat (status) de la structure (active, deleted..) */
int
GetState
(
int
type
)
const
;
void
SetState
(
int
type
,
int
state
);
int
GetState
(
int
type
)
const
{
return
m_Status
&
type
;
}
void
SetState
(
int
type
,
int
state
)
{
if
(
state
)
m_Status
|=
type
;
// state = ON or OFF
else
m_Status
&=
~
type
;
}
int
ReturnStatus
()
const
{
return
m_Status
;
}
...
...
include/pcbstruct.h
View file @
f353c77c
...
...
@@ -442,6 +442,17 @@ public:
EDGE_ZONE
(
BOARD_ITEM
*
StructFather
);
EDGE_ZONE
(
const
EDGE_ZONE
&
edgezone
);
~
EDGE_ZONE
();
EDGE_ZONE
*
Next
()
{
return
(
EDGE_ZONE
*
)
Pnext
;
}
/**
* Function Save
* writes the data structures for this object out to a FILE in "*.pcb" format.
* @param aFile The FILE to write to.
* @return bool - true if success writing else false.
*/
bool
Save
(
FILE
*
aFile
)
const
;
};
...
...
include/wxstruct.h
View file @
f353c77c
...
...
@@ -535,7 +535,13 @@ public:
void
Block_Move
(
wxDC
*
DC
);
void
Block_Duplicate
(
wxDC
*
DC
);
// zone handling:
/**
* Function DelLimitesZone
* deletes the limits of a zone.
* @param DC A wxDC to draw onto.
* @param Redraw If true, means redraw the pcb without the zone limits
*/
void
DelLimitesZone
(
wxDC
*
DC
,
bool
Redraw
);
// layerhandling:
...
...
pcbnew/class_board.cpp
View file @
f353c77c
...
...
@@ -610,7 +610,7 @@ bool BOARD::Save( FILE* aFile ) const
default
:
// future: throw exception here
#if defined(DEBUG)
printf
(
"BOARD::Save() ignoring
draw
type %d
\n
"
,
item
->
Type
()
);
printf
(
"BOARD::Save() ignoring
m_Drawings
type %d
\n
"
,
item
->
Type
()
);
#endif
break
;
}
...
...
@@ -623,14 +623,22 @@ bool BOARD::Save( FILE* aFile ) const
goto
out
;
fprintf
(
aFile
,
"$EndTRACK
\n
"
);
// save the zones
fprintf
(
aFile
,
"$ZONE
\n
"
);
for
(
item
=
m_Zone
;
item
;
item
=
item
->
Next
()
)
if
(
!
item
->
Save
(
aFile
)
)
goto
out
;
fprintf
(
aFile
,
"$EndZONE
\n
"
);
// save the zone edges
if
(
m_CurrentLimitZone
)
{
fprintf
(
aFile
,
"$ZONE_EDGE
\n
"
);
for
(
item
=
m_CurrentLimitZone
;
item
;
item
=
item
->
Next
()
)
if
(
!
item
->
Save
(
aFile
)
)
goto
out
;
fprintf
(
aFile
,
"$EndZONE_EDGE
\n
"
);
}
if
(
fprintf
(
aFile
,
"$EndBOARD
\n
"
)
!=
sizeof
(
"$EndBOARD
\n
"
)
-
1
)
goto
out
;
...
...
@@ -690,11 +698,11 @@ void BOARD::Show( int nestLevel, std::ostream& os )
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</zones>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<
edgezon
es>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"<
zoneedg
es>
\n
"
;
p
=
m_CurrentLimitZone
;
for
(
;
p
;
p
=
p
->
Pnext
)
p
->
Show
(
nestLevel
+
2
,
os
);
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</
edgezon
es>
\n
"
;
NestedSpace
(
nestLevel
+
1
,
os
)
<<
"</
zoneedg
es>
\n
"
;
p
=
m_Son
;
for
(
;
p
;
p
=
p
->
Pnext
)
...
...
pcbnew/class_edge_mod.cpp
View file @
f353c77c
...
...
@@ -404,7 +404,9 @@ bool EDGE_MODULE::Save( FILE* aFile ) const
default
:
// future: throw an exception here
printf
(
"%s unexpected EDGE_MODULE::m_Shape: %d
\n
"
,
__func__
,
m_Shape
);
#if defined(DEBUG)
printf
(
"EDGE_MODULE::Save(): unexpected m_Shape: %d
\n
"
,
m_Shape
);
#endif
break
;
}
...
...
pcbnew/class_track.h
View file @
f353c77c
...
...
@@ -80,10 +80,12 @@ public:
*/
void
Insert
(
BOARD
*
Pcb
,
BOARD_ITEM
*
InsertPoint
);
/*Search the "best" insertion point within the track linked list
* the best point is the of the corresponding net code section
* @return the item found in the linked list (or NULL if no track)
*/
/**
* Function GetBestInsertPoint
* searches the "best" insertion point within the track linked list.
* The best point is the of the corresponding net code section.
* @return TRACK* - the item found in the linked list (or NULL if no track)
*/
TRACK
*
GetBestInsertPoint
(
BOARD
*
Pcb
);
/* Search (within the track linked list) the first segment matching the netcode
...
...
pcbnew/classpcb.cpp
View file @
f353c77c
...
...
@@ -38,6 +38,7 @@ void EDA_BaseStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC )
EDGE_ZONE
::
EDGE_ZONE
(
BOARD_ITEM
*
parent
)
:
DRAWSEGMENT
(
parent
,
TYPEEDGEZONE
)
{
m_Width
=
2
;
// a minimum for visibility, while dragging
}
...
...
@@ -47,6 +48,23 @@ EDGE_ZONE:: ~EDGE_ZONE()
}
bool
EDGE_ZONE
::
Save
(
FILE
*
aFile
)
const
{
if
(
GetState
(
DELETED
)
)
return
true
;
int
ret
=
fprintf
(
aFile
,
"ZE %d %d %d %d %d %lX %X
\n
"
,
m_Start
.
x
,
m_Start
.
y
,
m_End
.
x
,
m_End
.
y
,
m_Angle
,
m_TimeStamp
,
ReturnStatus
()
);
return
(
ret
>
14
);
}
/**********************/
/* Classe DRAWSEGMENT */
/**********************/
...
...
@@ -131,7 +149,7 @@ bool DRAWSEGMENT::Save( FILE* aFile ) const
bool
rc
=
false
;
if
(
fprintf
(
aFile
,
"$DRAWSEGMENT
\n
"
)
!=
sizeof
(
"
%
DRAWSEGMENT
\n
"
)
-
1
)
if
(
fprintf
(
aFile
,
"$DRAWSEGMENT
\n
"
)
!=
sizeof
(
"
$
DRAWSEGMENT
\n
"
)
-
1
)
goto
out
;
fprintf
(
aFile
,
"Po %d %d %d %d %d %d
\n
"
,
...
...
pcbnew/files.cpp
View file @
f353c77c
...
...
@@ -235,9 +235,13 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, wxDC * DC, bo
#if 1 && defined(DEBUG)
// note this seems to freeze up pcbnew when run under the kicad project
// manager. runs fine from command prompt.
// output the board object tree to stdout:
// note this freezes up pcbnew when run under the kicad project
// manager. runs fine from command prompt. This is because the kicad
// project manager redirects stdout of the child pcbnew process to itself,
// but never reads from that pipe, and that in turn eventually blocks
// the pcbnew program when the pipe it is writing to gets full.
// Output the board object tree to stdout, but please run from command prompt:
m_Pcb
->
Show
(
0
,
std
::
cout
);
#endif
...
...
pcbnew/tracepcb.cpp
View file @
f353c77c
...
...
@@ -177,10 +177,11 @@ void WinEDA_PcbFrame::Trace_Pcb( wxDC* DC, int mode )
DrawHightLight
(
DC
,
g_HightLigth_NetCode
);
EDGE_ZONE
*
segment
=
m_Pcb
->
m_CurrentLimitZone
;
for
(
;
segment
!=
NULL
;
segment
=
(
EDGE_ZONE
*
)
segment
->
Pback
)
for
(
;
segment
!=
NULL
;
segment
=
(
EDGE_ZONE
*
)
segment
->
Pback
)
{
if
(
segment
->
m_Flags
&
IS_MOVED
)
continue
;
Trace_DrawSegmentPcb
(
DrawPanel
,
DC
,
segment
,
mode
);
}
...
...
pcbnew/trpiste.cpp
View file @
f353c77c
...
...
@@ -92,11 +92,11 @@ void Trace_DrawSegmentPcb( WinEDA_DrawPanel* panel, wxDC* DC,
/* coord de depart */
ux0
=
PtDrawSegment
->
m_Start
.
x
;
uy0
=
PtDrawSegment
->
m_Start
.
y
;
/* coord d'arrivee */
dx
=
PtDrawSegment
->
m_End
.
x
;
dy
=
PtDrawSegment
->
m_End
.
y
;
mode
=
DisplayOpt
.
DisplayDrawItems
;
if
(
PtDrawSegment
->
m_Flags
&
FORCE_SKETCH
)
mode
=
SKETCH
;
...
...
pcbnew/zones.cpp
View file @
f353c77c
...
...
@@ -412,8 +412,7 @@ void WinEDA_PcbFrame::Edit_Zone_Width( wxDC* DC, SEGZONE* aZone )
Line
.
ToDouble
(
&
f_new_width
);
g_DesignSettings
.
m_CurrentTrackWidth
=
From_User_Unit
(
g_UnitMetric
,
f_new_width
,
GetScreen
(
)
->
GetInternalUnits
()
);
f_new_width
,
GetScreen
()
->
GetInternalUnits
()
);
for
(
SEGZONE
*
zone
=
m_Pcb
->
m_Zone
;
zone
;
zone
=
zone
->
Next
()
)
{
...
...
@@ -604,16 +603,16 @@ static void Display_Zone_Netname( WinEDA_PcbFrame* frame )
static
void
Exit_Zones
(
WinEDA_DrawPanel
*
Panel
,
wxDC
*
DC
)
/********************************************************/
/*
routine d'annulation de la Commande Begin_Zone si une piste est en cours
*
de tracage, ou de sortie de l'application SEGZONES.
*
Appel par la touche ESC
/*
*
*
Function Exit_Zones
*
cancels the Begin_Zone state if at least one EDGE_ZONE has been created.
*/
{
WinEDA_PcbFrame
*
pcbframe
=
(
WinEDA_PcbFrame
*
)
Panel
->
m_Parent
;
if
(
pcbframe
->
m_Pcb
->
m_CurrentLimitZone
)
{
if
(
Panel
->
ManageCurseur
)
/* trace en cours */
if
(
Panel
->
ManageCurseur
)
// trace in progress
{
Panel
->
ManageCurseur
(
Panel
,
DC
,
0
);
}
...
...
@@ -629,12 +628,9 @@ static void Exit_Zones( WinEDA_DrawPanel* Panel, wxDC* DC )
/**************************************************************/
void
WinEDA_BasePcbFrame
::
DelLimitesZone
(
wxDC
*
DC
,
bool
Redraw
)
/**************************************************************/
/* Supprime la liste des segments constituant la frontiere courante
* Libere la memoire correspondante
*/
{
EDGE_ZONE
*
segment
,
*
Next
;
EDGE_ZONE
*
segment
;
EDGE_ZONE
*
next
;
if
(
m_Pcb
->
m_CurrentLimitZone
==
NULL
)
return
;
...
...
@@ -642,14 +638,17 @@ void WinEDA_BasePcbFrame::DelLimitesZone( wxDC* DC, bool Redraw )
if
(
!
IsOK
(
this
,
_
(
"Delete Current Zone Edges"
)
)
)
return
;
/
* efface ancienne limite de zone */
/
/ erase the old zone border, one segment at a time
segment
=
m_Pcb
->
m_CurrentLimitZone
;
for
(
;
segment
!=
NULL
;
segment
=
N
ext
)
for
(
;
segment
!=
NULL
;
segment
=
n
ext
)
{
Next
=
(
EDGE_ZONE
*
)
segment
->
Pback
;
next
=
(
EDGE_ZONE
*
)
segment
->
Pback
;
if
(
Redraw
)
Trace_DrawSegmentPcb
(
DrawPanel
,
DC
,
segment
,
GR_XOR
);
segment
->
Pnext
=
NULL
;
delete
segment
;
segment
->
Pnext
=
NULL
;
delete
segment
;
}
SetCurItem
(
NULL
);
...
...
@@ -657,47 +656,53 @@ void WinEDA_BasePcbFrame::DelLimitesZone( wxDC* DC, bool Redraw )
}
/********************************************/
EDGE_ZONE
*
WinEDA_PcbFrame
::
Begin_Zone
()
/********************************************/
/*
* Routine d'initialisation d'un trace de Limite de Zone ou
* de placement d'un point intermediaire
/**
* Function Begin_Zone
* either initializes the first segment of a new zone, or adds an
* intermediate segment.
*/
EDGE_ZONE
*
WinEDA_PcbFrame
::
Begin_Zone
()
{
EDGE_ZONE
*
oldedge
,
*
newedge
=
NULL
;
EDGE_ZONE
*
oldedge
;
EDGE_ZONE
*
newedge
=
NULL
;
oldedge
=
m_Pcb
->
m_CurrentLimitZone
;
// if first segment
if
(
(
m_Pcb
->
m_CurrentLimitZone
==
NULL
)
/* debut reel du trace */
||
(
DrawPanel
->
ManageCurseur
==
NULL
)
)
/* reprise d'un trace complementaire */
{
m_Pcb
->
m_CurrentLimitZone
=
newedge
=
new
EDGE_ZONE
(
m_Pcb
);
newedge
=
new
EDGE_ZONE
(
m_Pcb
);
newedge
->
m_Flags
=
IS_NEW
|
STARTPOINT
|
IS_MOVED
;
newedge
->
m_Start
=
newedge
->
m_End
=
GetScreen
()
->
m_Curseur
;
newedge
->
SetLayer
(
GetScreen
()
->
m_Active_Layer
);
// link into list:
newedge
->
Pback
=
oldedge
;
if
(
oldedge
)
oldedge
->
Pnext
=
newedge
;
newedge
->
SetLayer
(
GetScreen
()
->
m_Active_Layer
);
newedge
->
m_Width
=
2
;
/* Largeur minimum tracable */
newedge
->
m_Start
=
newedge
->
m_End
=
GetScreen
()
->
m_Curseur
;
m_Pcb
->
m_CurrentLimitZone
=
newedge
;
DrawPanel
->
ManageCurseur
=
Show_Zone_Edge_While_MoveMouse
;
DrawPanel
->
ForceCloseManageCurseur
=
Exit_Zones
;
}
// edge in progress:
else
/* piste en cours : les coord du point d'arrivee ont ete mises
* a jour par la routine Show_Zone_Edge_While_MoveMouse*/
{
if
(
oldedge
->
m_Start
!=
oldedge
->
m_End
)
{
newedge
=
new
EDGE_ZONE
(
oldedge
);
newedge
->
Pback
=
oldedge
;
oldedge
->
Pnext
=
newedge
;
newedge
->
m_Flags
=
IS_NEW
|
IS_MOVED
;
newedge
->
m_Start
=
newedge
->
m_End
=
oldedge
->
m_End
;
newedge
->
SetLayer
(
GetScreen
()
->
m_Active_Layer
);
// link into list:
newedge
->
Pback
=
oldedge
;
oldedge
->
Pnext
=
newedge
;
m_Pcb
->
m_CurrentLimitZone
=
newedge
;
}
}
...
...
@@ -724,11 +729,13 @@ void WinEDA_PcbFrame::End_Zone( wxDC* DC )
/* il sera raccorde au point de depart */
PtLim
=
m_Pcb
->
m_CurrentLimitZone
;
PtLim
->
m_Flags
&=
~
(
IS_NEW
|
IS_MOVED
);
while
(
PtLim
&&
PtLim
->
Pback
)
{
PtLim
=
(
EDGE_ZONE
*
)
PtLim
->
Pback
;
if
(
PtLim
->
m_Flags
&
STARTPOINT
)
break
;
PtLim
->
m_Flags
&=
~
(
IS_NEW
|
IS_MOVED
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment