Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
76c8a7d9
Commit
76c8a7d9
authored
Dec 11, 2010
by
Vadim Pisarevsky
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rewrote copyMakeBorder (to support other border types and fix some bugs)
parent
8511b696
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
110 additions
and
359 deletions
+110
-359
utils.cpp
modules/imgproc/src/utils.cpp
+110
-359
No files found.
modules/imgproc/src/utils.cpp
View file @
76c8a7d9
...
...
@@ -71,413 +71,164 @@ CV_IMPL CvSeq* cvPointSeqFromMat( int seq_kind, const CvArr* arr,
return
(
CvSeq
*
)
contour_header
;
}
namespace
cv
{
typedef
CvStatus
(
CV_STDCALL
*
CvCopyNonConstBorderFunc
)(
const
void
*
,
int
,
CvSize
,
void
*
,
int
,
CvSize
,
int
,
int
);
typedef
CvStatus
(
CV_STDCALL
*
CvCopyNonConstBorderFuncI
)(
const
void
*
,
int
,
CvSize
,
CvSize
,
int
,
int
);
CvStatus
CV_STDCALL
icvCopyReplicateBorder_8u
(
const
uchar
*
src
,
int
srcstep
,
CvSize
srcroi
,
uchar
*
dst
,
int
dststep
,
CvSize
dstroi
,
int
top
,
int
left
,
int
cn
,
const
uchar
*
)
static
void
copyMakeBorder_8u
(
const
uchar
*
src
,
int
srcstep
,
Size
srcroi
,
uchar
*
dst
,
int
dststep
,
Size
dstroi
,
int
top
,
int
left
,
int
cn
,
int
borderType
)
{
const
int
isz
=
(
int
)
sizeof
(
int
);
int
i
,
j
;
int
i
,
j
,
k
,
elemSize
=
1
;
bool
intMode
=
false
;
if
(
(
cn
|
srcstep
|
dststep
|
(
size_t
)
src
|
(
size_t
)
dst
)
%
isz
==
0
)
{
const
int
*
isrc
=
(
const
int
*
)
src
;
int
*
idst
=
(
int
*
)
dst
;
cn
/=
isz
;
srcstep
/=
isz
;
dststep
/=
isz
;
srcroi
.
width
*=
cn
;
dstroi
.
width
*=
cn
;
left
*=
cn
;
for
(
i
=
0
;
i
<
dstroi
.
height
;
i
++
,
idst
+=
dststep
)
{
if
(
idst
+
left
!=
isrc
)
memcpy
(
idst
+
left
,
isrc
,
srcroi
.
width
*
sizeof
(
idst
[
0
])
);
for
(
j
=
left
-
1
;
j
>=
0
;
j
--
)
idst
[
j
]
=
idst
[
j
+
cn
];
for
(
j
=
left
+
srcroi
.
width
;
j
<
dstroi
.
width
;
j
++
)
idst
[
j
]
=
idst
[
j
-
cn
];
if
(
i
>=
top
&&
i
<
top
+
srcroi
.
height
-
1
)
isrc
+=
srcstep
;
}
elemSize
=
isz
;
intMode
=
true
;
}
else
{
srcroi
.
width
*=
cn
;
dstroi
.
width
*=
cn
;
left
*=
cn
;
for
(
i
=
0
;
i
<
dstroi
.
height
;
i
++
,
dst
+=
dststep
)
{
if
(
dst
+
left
!=
src
)
memcpy
(
dst
+
left
,
src
,
srcroi
.
width
);
for
(
j
=
left
-
1
;
j
>=
0
;
j
--
)
dst
[
j
]
=
dst
[
j
+
cn
];
for
(
j
=
left
+
srcroi
.
width
;
j
<
dstroi
.
width
;
j
++
)
dst
[
j
]
=
dst
[
j
-
cn
];
if
(
i
>=
top
&&
i
<
top
+
srcroi
.
height
-
1
)
src
+=
srcstep
;
}
AutoBuffer
<
int
>
_tab
((
dstroi
.
width
-
srcroi
.
width
)
*
cn
);
int
*
tab
=
_tab
;
int
right
=
dstroi
.
width
-
srcroi
.
width
-
left
;
int
bottom
=
dstroi
.
height
-
srcroi
.
height
-
top
;
for
(
i
=
0
;
i
<
left
;
i
++
)
{
j
=
borderInterpolate
(
i
-
left
,
srcroi
.
width
,
borderType
)
*
cn
;
for
(
k
=
0
;
k
<
cn
;
k
++
)
tab
[
i
*
cn
+
k
]
=
j
+
k
;
}
return
CV_OK
;
}
static
CvStatus
CV_STDCALL
icvCopyReflect101Border_8u
(
const
uchar
*
src
,
int
srcstep
,
CvSize
srcroi
,
uchar
*
dst
,
int
dststep
,
CvSize
dstroi
,
int
top
,
int
left
,
int
cn
)
{
const
int
isz
=
(
int
)
sizeof
(
int
);
int
i
,
j
,
k
,
t
,
dj
,
tab_size
,
int_mode
=
0
;
const
int
*
isrc
=
(
const
int
*
)
src
;
int
*
idst
=
(
int
*
)
dst
,
*
tab
;
if
(
(
cn
|
srcstep
|
dststep
|
(
size_t
)
src
|
(
size_t
)
dst
)
%
isz
==
0
)
for
(
i
=
0
;
i
<
right
;
i
++
)
{
cn
/=
isz
;
srcstep
/=
isz
;
dststep
/=
isz
;
int_mode
=
1
;
j
=
borderInterpolate
(
srcroi
.
width
+
i
,
srcroi
.
width
,
borderType
)
*
cn
;
for
(
k
=
0
;
k
<
cn
;
k
++
)
tab
[(
i
+
left
)
*
cn
+
k
]
=
j
+
k
;
}
srcroi
.
width
*=
cn
;
dstroi
.
width
*=
cn
;
left
*=
cn
;
right
*=
cn
;
uchar
*
dstInner
=
dst
+
(
dststep
*
top
+
left
)
*
elemSize
;
tab_size
=
dstroi
.
width
-
srcroi
.
width
;
tab
=
(
int
*
)
cvStackAlloc
(
tab_size
*
sizeof
(
tab
[
0
])
);
if
(
srcroi
.
width
==
1
)
{
for
(
k
=
0
;
k
<
cn
;
k
++
)
for
(
i
=
0
;
i
<
tab_size
;
i
+=
cn
)
tab
[
i
+
k
]
=
k
+
left
;
}
else
for
(
i
=
0
;
i
<
srcroi
.
height
;
i
++
,
dstInner
+=
dststep
,
src
+=
srcstep
)
{
j
=
dj
=
cn
;
for
(
i
=
left
-
cn
;
i
>=
0
;
i
-=
cn
)
{
for
(
k
=
0
;
k
<
cn
;
k
++
)
tab
[
i
+
k
]
=
j
+
k
+
left
;
if
(
(
unsigned
)(
j
+=
dj
)
>=
(
unsigned
)
srcroi
.
width
)
j
-=
2
*
dj
,
dj
=
-
dj
;
}
if
(
dstInner
!=
src
)
memcpy
(
dstInner
,
src
,
srcroi
.
width
*
elemSize
);
j
=
srcroi
.
width
-
cn
*
2
;
dj
=
-
cn
;
for
(
i
=
left
;
i
<
tab_size
;
i
+=
cn
)
if
(
intMode
)
{
for
(
k
=
0
;
k
<
cn
;
k
++
)
tab
[
i
+
k
]
=
j
+
k
+
left
;
if
(
(
unsigned
)(
j
+=
dj
)
>=
(
unsigned
)
srcroi
.
width
)
j
-=
2
*
dj
,
dj
=
-
dj
;
const
int
*
isrc
=
(
int
*
)
src
;
int
*
idstInner
=
(
int
*
)
dstInner
;
for
(
j
=
0
;
j
<
left
;
j
++
)
idstInner
[
j
-
left
]
=
isrc
[
tab
[
j
]];
for
(
j
=
0
;
j
<
right
;
j
++
)
idstInner
[
j
+
srcroi
.
width
]
=
isrc
[
tab
[
j
+
left
]];
}
}
if
(
int_mode
)
{
idst
+=
top
*
dststep
;
for
(
i
=
0
;
i
<
srcroi
.
height
;
i
++
,
isrc
+=
srcstep
,
idst
+=
dststep
)
else
{
if
(
idst
+
left
!=
isrc
)
memcpy
(
idst
+
left
,
isrc
,
srcroi
.
width
*
sizeof
(
idst
[
0
])
);
for
(
j
=
0
;
j
<
left
;
j
++
)
{
k
=
tab
[
j
];
idst
[
j
]
=
idst
[
k
];
}
for
(
;
j
<
tab_size
;
j
++
)
{
k
=
tab
[
j
];
idst
[
j
+
srcroi
.
width
]
=
idst
[
k
];
}
dstInner
[
j
-
left
]
=
src
[
tab
[
j
]];
for
(
j
=
0
;
j
<
right
;
j
++
)
dstInner
[
j
+
srcroi
.
width
]
=
src
[
tab
[
j
+
left
]];
}
isrc
-=
srcroi
.
height
*
srcstep
;
idst
-=
(
top
+
srcroi
.
height
)
*
dststep
;
}
else
dstroi
.
width
*=
elemSize
;
dst
+=
dststep
*
top
;
for
(
i
=
0
;
i
<
top
;
i
++
)
{
dst
+=
top
*
dststep
;
for
(
i
=
0
;
i
<
srcroi
.
height
;
i
++
,
src
+=
srcstep
,
dst
+=
dststep
)
{
if
(
dst
+
left
!=
src
)
memcpy
(
dst
+
left
,
src
,
srcroi
.
width
);
for
(
j
=
0
;
j
<
left
;
j
++
)
{
k
=
tab
[
j
];
dst
[
j
]
=
dst
[
k
];
}
for
(
;
j
<
tab_size
;
j
++
)
{
k
=
tab
[
j
];
dst
[
j
+
srcroi
.
width
]
=
dst
[
k
];
}
}
src
-=
srcroi
.
height
*
srcstep
;
dst
-=
(
top
+
srcroi
.
height
)
*
dststep
;
j
=
borderInterpolate
(
i
-
top
,
srcroi
.
height
,
borderType
);
memcpy
(
dst
+
(
i
-
top
)
*
dststep
,
dst
+
j
*
dststep
,
dstroi
.
width
);
}
for
(
t
=
0
;
t
<
2
;
t
++
)
for
(
i
=
0
;
i
<
bottom
;
i
++
)
{
int
i1
,
i2
,
di
;
if
(
t
==
0
)
i1
=
top
-
1
,
i2
=
0
,
di
=
-
1
,
j
=
1
,
dj
=
1
;
else
i1
=
top
+
srcroi
.
height
,
i2
=
dstroi
.
height
,
di
=
1
,
j
=
srcroi
.
height
-
2
,
dj
=
-
1
;
for
(
i
=
i1
;
(
di
>
0
&&
i
<
i2
)
||
(
di
<
0
&&
i
>
i2
);
i
+=
di
)
{
if
(
int_mode
)
{
const
int
*
s
=
idst
+
i
*
dststep
;
int
*
d
=
idst
+
(
j
+
top
)
*
dststep
;
for
(
k
=
0
;
k
<
dstroi
.
width
;
k
++
)
d
[
k
]
=
s
[
k
];
}
else
{
const
uchar
*
s
=
dst
+
i
*
dststep
;
uchar
*
d
=
dst
+
(
j
+
top
)
*
dststep
;
for
(
k
=
0
;
k
<
dstroi
.
width
;
k
++
)
d
[
k
]
=
s
[
k
];
}
if
(
(
unsigned
)(
j
+=
dj
)
>=
(
unsigned
)
srcroi
.
height
)
j
-=
2
*
dj
,
dj
=
-
dj
;
}
j
=
borderInterpolate
(
i
+
srcroi
.
height
,
srcroi
.
height
,
borderType
);
memcpy
(
dst
+
(
i
+
srcroi
.
height
)
*
dststep
,
dst
+
j
*
dststep
,
dstroi
.
width
);
}
return
CV_OK
;
}
static
CvStatus
CV_STDCALL
icvCopyConstBorder_8u
(
const
uchar
*
src
,
int
srcstep
,
CvSize
srcroi
,
uchar
*
dst
,
int
dststep
,
CvSize
dstroi
,
int
top
,
int
left
,
int
cn
,
const
uchar
*
value
)
static
void
copyMakeConstBorder_8u
(
const
uchar
*
src
,
int
srcstep
,
Size
srcroi
,
uchar
*
dst
,
int
dststep
,
Size
dstroi
,
int
top
,
int
left
,
int
cn
,
const
uchar
*
value
)
{
const
int
isz
=
(
int
)
sizeof
(
int
);
int
i
,
j
,
k
;
if
(
(
cn
|
srcstep
|
dststep
|
(
size_t
)
src
|
(
size_t
)
dst
|
(
size_t
)
value
)
%
isz
==
0
)
int
i
,
j
;
AutoBuffer
<
uchar
>
_constBuf
(
dstroi
.
width
*
cn
);
uchar
*
constBuf
=
_constBuf
;
int
right
=
dstroi
.
width
-
srcroi
.
width
-
left
;
int
bottom
=
dstroi
.
height
-
srcroi
.
height
-
top
;
for
(
i
=
0
;
i
<
dstroi
.
width
;
i
++
)
{
const
int
*
isrc
=
(
const
int
*
)
src
;
int
*
idst
=
(
int
*
)
dst
;
const
int
*
ivalue
=
(
const
int
*
)
value
;
int
v0
=
ivalue
[
0
];
cn
/=
isz
;
srcstep
/=
isz
;
dststep
/=
isz
;
srcroi
.
width
*=
cn
;
dstroi
.
width
*=
cn
;
left
*=
cn
;
for
(
j
=
1
;
j
<
cn
;
j
++
)
if
(
ivalue
[
j
]
!=
ivalue
[
0
]
)
break
;
if
(
j
==
cn
)
cn
=
1
;
if
(
dstroi
.
width
<=
0
)
return
CV_OK
;
for
(
i
=
0
;
i
<
dstroi
.
height
;
i
++
,
idst
+=
dststep
)
{
if
(
i
<
top
||
i
>=
top
+
srcroi
.
height
)
{
if
(
cn
==
1
)
{
for
(
j
=
0
;
j
<
dstroi
.
width
;
j
++
)
idst
[
j
]
=
v0
;
}
else
{
for
(
j
=
0
;
j
<
cn
;
j
++
)
idst
[
j
]
=
ivalue
[
j
];
for
(
;
j
<
dstroi
.
width
;
j
++
)
idst
[
j
]
=
idst
[
j
-
cn
];
}
continue
;
}
if
(
cn
==
1
)
{
for
(
j
=
0
;
j
<
left
;
j
++
)
idst
[
j
]
=
v0
;
for
(
j
=
srcroi
.
width
+
left
;
j
<
dstroi
.
width
;
j
++
)
idst
[
j
]
=
v0
;
}
else
{
for
(
k
=
0
;
k
<
cn
;
k
++
)
{
for
(
j
=
0
;
j
<
left
;
j
+=
cn
)
idst
[
j
+
k
]
=
ivalue
[
k
];
for
(
j
=
srcroi
.
width
+
left
;
j
<
dstroi
.
width
;
j
+=
cn
)
idst
[
j
+
k
]
=
ivalue
[
k
];
}
}
if
(
idst
+
left
!=
isrc
)
for
(
j
=
0
;
j
<
srcroi
.
width
;
j
++
)
idst
[
j
+
left
]
=
isrc
[
j
];
isrc
+=
srcstep
;
}
for
(
j
=
0
;
j
<
cn
;
j
++
)
constBuf
[
i
*
cn
+
j
]
=
value
[
j
];
}
else
srcroi
.
width
*=
cn
;
dstroi
.
width
*=
cn
;
left
*=
cn
;
right
*=
cn
;
uchar
*
dstInner
=
dst
+
dststep
*
top
+
left
;
for
(
i
=
0
;
i
<
srcroi
.
height
;
i
++
,
dstInner
+=
dststep
,
src
+=
srcstep
)
{
uchar
v0
=
value
[
0
];
srcroi
.
width
*=
cn
;
dstroi
.
width
*=
cn
;
left
*=
cn
;
for
(
j
=
1
;
j
<
cn
;
j
++
)
if
(
value
[
j
]
!=
value
[
0
]
)
break
;
if
(
j
==
cn
)
cn
=
1
;
if
(
dstroi
.
width
<=
0
)
return
CV_OK
;
for
(
i
=
0
;
i
<
dstroi
.
height
;
i
++
,
dst
+=
dststep
)
{
if
(
i
<
top
||
i
>=
top
+
srcroi
.
height
)
{
if
(
cn
==
1
)
{
for
(
j
=
0
;
j
<
dstroi
.
width
;
j
++
)
dst
[
j
]
=
v0
;
}
else
{
for
(
j
=
0
;
j
<
cn
;
j
++
)
dst
[
j
]
=
value
[
j
];
for
(
;
j
<
dstroi
.
width
;
j
++
)
dst
[
j
]
=
dst
[
j
-
cn
];
}
continue
;
}
if
(
cn
==
1
)
{
for
(
j
=
0
;
j
<
left
;
j
++
)
dst
[
j
]
=
v0
;
for
(
j
=
srcroi
.
width
+
left
;
j
<
dstroi
.
width
;
j
++
)
dst
[
j
]
=
v0
;
}
else
{
for
(
k
=
0
;
k
<
cn
;
k
++
)
{
for
(
j
=
0
;
j
<
left
;
j
+=
cn
)
dst
[
j
+
k
]
=
value
[
k
];
for
(
j
=
srcroi
.
width
+
left
;
j
<
dstroi
.
width
;
j
+=
cn
)
dst
[
j
+
k
]
=
value
[
k
];
}
}
if
(
dst
+
left
!=
src
)
for
(
j
=
0
;
j
<
srcroi
.
width
;
j
++
)
dst
[
j
+
left
]
=
src
[
j
];
src
+=
srcstep
;
}
if
(
dstInner
!=
src
)
memcpy
(
dstInner
,
src
,
srcroi
.
width
);
memcpy
(
dstInner
-
left
,
constBuf
,
left
);
memcpy
(
dstInner
+
srcroi
.
width
,
constBuf
+
left
,
right
);
}
return
CV_OK
;
dst
+=
dststep
*
top
;
for
(
i
=
0
;
i
<
top
;
i
++
)
memcpy
(
dst
+
(
i
-
top
)
*
dststep
,
constBuf
,
dstroi
.
width
);
for
(
i
=
0
;
i
<
bottom
;
i
++
)
memcpy
(
dst
+
(
i
+
srcroi
.
height
)
*
dststep
,
constBuf
,
dstroi
.
width
);
}
CV_IMPL
void
cvCopyMakeBorder
(
const
CvArr
*
srcarr
,
CvArr
*
dstarr
,
CvPoint
offset
,
int
bordertype
,
CvScalar
value
)
void
copyMakeBorder
(
const
Mat
&
src
,
Mat
&
dst
,
int
top
,
int
bottom
,
int
left
,
int
right
,
int
borderType
,
const
Scalar
&
value
)
{
CvMat
srcstub
,
*
src
=
(
CvMat
*
)
srcarr
;
CvMat
dststub
,
*
dst
=
(
CvMat
*
)
dstarr
;
CvSize
srcsize
,
dstsize
;
int
srcstep
,
dststep
;
int
pix_size
,
type
;
if
(
!
CV_IS_MAT
(
src
)
)
src
=
cvGetMat
(
src
,
&
srcstub
);
CV_Assert
(
top
>=
0
&&
bottom
>=
0
&&
left
>=
0
&&
right
>=
0
);
if
(
!
CV_IS_MAT
(
dst
)
)
dst
=
cvGetMat
(
dst
,
&
dststub
);
if
(
offset
.
x
<
0
||
offset
.
y
<
0
)
CV_Error
(
CV_StsOutOfRange
,
"Offset (left/top border width) is negative"
);
if
(
src
->
rows
+
offset
.
y
>
dst
->
rows
||
src
->
cols
+
offset
.
x
>
dst
->
cols
)
CV_Error
(
CV_StsBadSize
,
"Source array is too big or destination array is too small"
);
if
(
!
CV_ARE_TYPES_EQ
(
src
,
dst
))
CV_Error
(
CV_StsUnmatchedFormats
,
""
);
type
=
CV_MAT_TYPE
(
src
->
type
);
pix_size
=
CV_ELEM_SIZE
(
type
);
srcsize
=
cvGetMatSize
(
src
);
dstsize
=
cvGetMatSize
(
dst
);
srcstep
=
src
->
step
;
dststep
=
dst
->
step
;
if
(
srcstep
==
0
)
srcstep
=
CV_STUB_STEP
;
if
(
dststep
==
0
)
dststep
=
CV_STUB_STEP
;
bordertype
&=
15
;
if
(
bordertype
==
IPL_BORDER_REPLICATE
)
{
icvCopyReplicateBorder_8u
(
src
->
data
.
ptr
,
srcstep
,
srcsize
,
dst
->
data
.
ptr
,
dststep
,
dstsize
,
offset
.
y
,
offset
.
x
,
pix_size
);
}
else
if
(
bordertype
==
IPL_BORDER_REFLECT_101
)
{
icvCopyReflect101Border_8u
(
src
->
data
.
ptr
,
srcstep
,
srcsize
,
dst
->
data
.
ptr
,
dststep
,
dstsize
,
offset
.
y
,
offset
.
x
,
pix_size
);
}
else
if
(
bordertype
==
IPL_BORDER_CONSTANT
)
dst
.
create
(
src
.
rows
+
top
+
bottom
,
src
.
cols
+
left
+
right
,
src
.
type
()
);
if
(
borderType
!=
BORDER_CONSTANT
)
copyMakeBorder_8u
(
src
.
data
,
src
.
step
,
src
.
size
(),
dst
.
data
,
dst
.
step
,
dst
.
size
(),
top
,
left
,
src
.
elemSize
(),
borderType
);
else
{
double
buf
[
4
];
cvScalarToRawData
(
&
value
,
buf
,
src
->
type
,
0
);
icvCopyConstBorder_8u
(
src
->
data
.
ptr
,
srcstep
,
srcsize
,
dst
->
data
.
ptr
,
dststep
,
dstsize
,
offset
.
y
,
offset
.
x
,
pix_size
,
(
uchar
*
)
buf
);
scalarToRawData
(
value
,
buf
,
src
.
type
()
);
copyMakeConstBorder_8u
(
src
.
data
,
src
.
step
,
src
.
size
()
,
dst
.
data
,
dst
.
step
,
dst
.
size
()
,
top
,
left
,
src
.
elemSize
()
,
(
uchar
*
)
buf
);
}
else
CV_Error
(
CV_StsBadFlag
,
"Unknown/unsupported border type"
);
}
}
namespace
cv
{
void
copyMakeBorder
(
const
Mat
&
src
,
Mat
&
dst
,
int
top
,
int
bottom
,
int
left
,
int
right
,
int
borderType
,
const
Scalar
&
value
)
CV_IMPL
void
cvCopyMakeBorder
(
const
CvArr
*
srcarr
,
CvArr
*
dstarr
,
CvPoint
offset
,
int
borderType
,
CvScalar
value
)
{
dst
.
create
(
src
.
rows
+
top
+
bottom
,
src
.
cols
+
left
+
right
,
src
.
type
()
);
CvMat
_src
=
src
,
_dst
=
dst
;
cvCopyMakeBorder
(
&
_src
,
&
_dst
,
Point
(
left
,
top
),
borderType
,
value
);
}
cv
::
Mat
src
=
cv
::
cvarrToMat
(
srcarr
),
dst
=
cv
::
cvarrToMat
(
dstarr
);
int
left
=
offset
.
x
,
right
=
dst
.
cols
-
src
.
cols
-
left
;
int
top
=
offset
.
y
,
bottom
=
dst
.
rows
-
src
.
rows
-
top
;
CV_Assert
(
dst
.
type
()
==
src
.
type
()
);
cv
::
copyMakeBorder
(
src
,
dst
,
top
,
bottom
,
left
,
right
,
borderType
,
value
);
}
/* End of file. */
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