123 #include <config_auto.h>
126 #include "allheaders.h"
135 static void dilateGrayLow(l_uint32 *datad, l_int32 w, l_int32 h,
136 l_int32 wpld, l_uint32 *datas, l_int32 wpls,
137 l_int32 size, l_int32 direction, l_uint8 *buffer,
139 static void erodeGrayLow(l_uint32 *datad, l_int32 w, l_int32 h,
140 l_int32 wpld, l_uint32 *datas, l_int32 wpls,
141 l_int32 size, l_int32 direction, l_uint8 *buffer,
166 l_uint8 *buffer, *minarray;
167 l_int32 w, h, wplb, wplt;
168 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
169 l_uint32 *datab, *datat;
170 PIX *pixb, *pixt, *pixd;
172 PROCNAME(
"pixErodeGray");
175 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
176 if (pixGetDepth(pixs) != 8)
177 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
178 if (hsize < 1 || vsize < 1)
179 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", procName, NULL);
180 if ((hsize & 1) == 0 ) {
181 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", procName);
184 if ((vsize & 1) == 0 ) {
185 L_WARNING(
"vert sel size must be odd; increasing by 1\n", procName);
189 pixb = pixt = pixd = NULL;
190 buffer = minarray = NULL;
192 if (hsize == 1 && vsize == 1)
196 leftpix = (hsize + 1) / 2;
197 rightpix = (3 * hsize + 1) / 2;
200 }
else if (hsize == 1) {
203 toppix = (vsize + 1) / 2;
204 bottompix = (3 * vsize + 1) / 2;
206 leftpix = (hsize + 1) / 2;
207 rightpix = (3 * hsize + 1) / 2;
208 toppix = (vsize + 1) / 2;
209 bottompix = (3 * vsize + 1) / 2;
214 if (!pixb || !pixt) {
215 L_ERROR(
"pixb and pixt not made\n", procName);
222 wplb = pixGetWpl(pixb);
223 wplt = pixGetWpl(pixt);
225 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
226 maxsize = L_MAX(hsize, vsize);
227 minarray = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
228 if (!buffer || !minarray) {
229 L_ERROR(
"buffer and minarray not made\n", procName);
234 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
236 }
else if (hsize == 1) {
237 erodeGrayLow(datat, w, h, wplt, datab, wplb, vsize, L_VERT,
240 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
244 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
252 L_ERROR(
"pixd not made\n", procName);
282 l_uint8 *buffer, *maxarray;
283 l_int32 w, h, wplb, wplt;
284 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
285 l_uint32 *datab, *datat;
286 PIX *pixb, *pixt, *pixd;
288 PROCNAME(
"pixDilateGray");
291 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
292 if (pixGetDepth(pixs) != 8)
293 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
294 if (hsize < 1 || vsize < 1)
295 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", procName, NULL);
296 if ((hsize & 1) == 0 ) {
297 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", procName);
300 if ((vsize & 1) == 0 ) {
301 L_WARNING(
"vert sel size must be odd; increasing by 1\n", procName);
305 pixb = pixt = pixd = NULL;
306 buffer = maxarray = NULL;
308 if (hsize == 1 && vsize == 1)
312 leftpix = (hsize + 1) / 2;
313 rightpix = (3 * hsize + 1) / 2;
316 }
else if (hsize == 1) {
319 toppix = (vsize + 1) / 2;
320 bottompix = (3 * vsize + 1) / 2;
322 leftpix = (hsize + 1) / 2;
323 rightpix = (3 * hsize + 1) / 2;
324 toppix = (vsize + 1) / 2;
325 bottompix = (3 * vsize + 1) / 2;
330 if (!pixb || !pixt) {
331 L_ERROR(
"pixb and pixt not made\n", procName);
338 wplb = pixGetWpl(pixb);
339 wplt = pixGetWpl(pixt);
341 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
342 maxsize = L_MAX(hsize, vsize);
343 maxarray = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
344 if (!buffer || !maxarray) {
345 L_ERROR(
"buffer and maxarray not made\n", procName);
350 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
352 }
else if (hsize == 1) {
356 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
368 L_ERROR(
"pixd not made\n", procName);
400 l_int32 w, h, wplb, wplt;
401 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
402 l_uint32 *datab, *datat;
403 PIX *pixb, *pixt, *pixd;
405 PROCNAME(
"pixOpenGray");
408 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
409 if (pixGetDepth(pixs) != 8)
410 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
411 if (hsize < 1 || vsize < 1)
412 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", procName, NULL);
413 if ((hsize & 1) == 0 ) {
414 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", procName);
417 if ((vsize & 1) == 0 ) {
418 L_WARNING(
"vert sel size must be odd; increasing by 1\n", procName);
422 pixb = pixt = pixd = NULL;
423 buffer = array = NULL;
425 if (hsize == 1 && vsize == 1)
429 leftpix = (hsize + 1) / 2;
430 rightpix = (3 * hsize + 1) / 2;
433 }
else if (hsize == 1) {
436 toppix = (vsize + 1) / 2;
437 bottompix = (3 * vsize + 1) / 2;
439 leftpix = (hsize + 1) / 2;
440 rightpix = (3 * hsize + 1) / 2;
441 toppix = (vsize + 1) / 2;
442 bottompix = (3 * vsize + 1) / 2;
447 if (!pixb || !pixt) {
448 L_ERROR(
"pixb and pixt not made\n", procName);
455 wplb = pixGetWpl(pixb);
456 wplt = pixGetWpl(pixt);
458 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
459 maxsize = L_MAX(hsize, vsize);
460 array = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
461 if (!buffer || !array) {
462 L_ERROR(
"buffer and array not made\n", procName);
467 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
471 dilateGrayLow(datab, w, h, wplb, datat, wplt, hsize, L_HORIZ,
474 else if (hsize == 1) {
475 erodeGrayLow(datat, w, h, wplt, datab, wplb, vsize, L_VERT,
482 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
486 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
490 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
500 L_ERROR(
"pixd not made\n", procName);
532 l_int32 w, h, wplb, wplt;
533 l_int32 leftpix, rightpix, toppix, bottompix, maxsize;
534 l_uint32 *datab, *datat;
535 PIX *pixb, *pixt, *pixd;
537 PROCNAME(
"pixCloseGray");
540 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
541 if (pixGetDepth(pixs) != 8)
542 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
543 if (hsize < 1 || vsize < 1)
544 return (
PIX *)ERROR_PTR(
"hsize or vsize < 1", procName, NULL);
545 if ((hsize & 1) == 0 ) {
546 L_WARNING(
"horiz sel size must be odd; increasing by 1\n", procName);
549 if ((vsize & 1) == 0 ) {
550 L_WARNING(
"vert sel size must be odd; increasing by 1\n", procName);
554 pixb = pixt = pixd = NULL;
555 buffer = array = NULL;
557 if (hsize == 1 && vsize == 1)
561 leftpix = (hsize + 1) / 2;
562 rightpix = (3 * hsize + 1) / 2;
565 }
else if (hsize == 1) {
568 toppix = (vsize + 1) / 2;
569 bottompix = (3 * vsize + 1) / 2;
571 leftpix = (hsize + 1) / 2;
572 rightpix = (3 * hsize + 1) / 2;
573 toppix = (vsize + 1) / 2;
574 bottompix = (3 * vsize + 1) / 2;
579 if (!pixb || !pixt) {
580 L_ERROR(
"pixb and pixt not made\n", procName);
587 wplb = pixGetWpl(pixb);
588 wplt = pixGetWpl(pixt);
590 buffer = (l_uint8 *)LEPT_CALLOC(L_MAX(w, h),
sizeof(l_uint8));
591 maxsize = L_MAX(hsize, vsize);
592 array = (l_uint8 *)LEPT_CALLOC(2 * maxsize,
sizeof(l_uint8));
593 if (!buffer || !array) {
594 L_ERROR(
"buffer and array not made\n", procName);
599 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
603 erodeGrayLow(datab, w, h, wplb, datat, wplt, hsize, L_HORIZ,
605 }
else if (hsize == 1) {
610 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
613 dilateGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
621 erodeGrayLow(datat, w, h, wplt, datab, wplb, hsize, L_HORIZ,
625 erodeGrayLow(datab, w, h, wplb, datat, wplt, vsize, L_VERT,
631 L_ERROR(
"pixd not made\n", procName);
669 PIX *pixt, *pixb, *pixbd, *pixd;
671 PROCNAME(
"pixErodeGray3");
674 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
675 if (pixGetDepth(pixs) != 8)
676 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
677 if (pixGetColormap(pixs))
678 return (
PIX *)ERROR_PTR(
"pix has colormap", procName, NULL);
679 if ((hsize != 1 && hsize != 3) ||
680 (vsize != 1 && vsize != 3))
681 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", procName, NULL);
683 if (hsize == 1 && vsize == 1)
720 l_uint32 *datas, *datad, *lines, *lined;
721 l_int32 w, h, wpl, i, j;
722 l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, minval;
725 PROCNAME(
"pixErodeGray3h");
728 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
729 if (pixGetDepth(pixs) != 8)
730 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
736 wpl = pixGetWpl(pixs);
737 for (i = 0; i < h; i++) {
738 lines = datas + i * wpl;
739 lined = datad + i * wpl;
740 for (j = 1; j < w - 8; j += 8) {
751 minval = L_MIN(val1, val2);
754 minval = L_MIN(val3, val4);
757 minval = L_MIN(val5, val6);
760 minval = L_MIN(val7, val8);
787 l_uint32 *datas, *datad, *linesi, *linedi;
788 l_int32 w, h, wpl, i, j;
789 l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, minval;
792 PROCNAME(
"pixErodeGray3v");
795 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
796 if (pixGetDepth(pixs) != 8)
797 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
803 wpl = pixGetWpl(pixs);
804 for (j = 0; j < w; j++) {
805 for (i = 1; i < h - 8; i += 8) {
806 linesi = datas + i * wpl;
807 linedi = datad + i * wpl;
818 minval = L_MIN(val1, val2);
821 minval = L_MIN(val3, val4);
824 minval = L_MIN(val5, val6);
827 minval = L_MIN(val7, val8);
855 PIX *pixt, *pixb, *pixbd, *pixd;
857 PROCNAME(
"pixDilateGray3");
860 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
861 if (pixGetDepth(pixs) != 8)
862 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
863 if (pixGetColormap(pixs))
864 return (
PIX *)ERROR_PTR(
"pix has colormap", procName, NULL);
865 if ((hsize != 1 && hsize != 3) ||
866 (vsize != 1 && vsize != 3))
867 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", procName, NULL);
869 if (hsize == 1 && vsize == 1)
906 l_uint32 *datas, *datad, *lines, *lined;
907 l_int32 w, h, wpl, i, j;
908 l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, maxval;
911 PROCNAME(
"pixDilateGray3h");
914 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
915 if (pixGetDepth(pixs) != 8)
916 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
922 wpl = pixGetWpl(pixs);
923 for (i = 0; i < h; i++) {
924 lines = datas + i * wpl;
925 lined = datad + i * wpl;
926 for (j = 1; j < w - 8; j += 8) {
937 maxval = L_MAX(val1, val2);
940 maxval = L_MAX(val3, val4);
943 maxval = L_MAX(val5, val6);
946 maxval = L_MAX(val7, val8);
970 l_uint32 *datas, *datad, *linesi, *linedi;
971 l_int32 w, h, wpl, i, j;
972 l_int32 val0, val1, val2, val3, val4, val5, val6, val7, val8, val9, maxval;
975 PROCNAME(
"pixDilateGray3v");
978 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
979 if (pixGetDepth(pixs) != 8)
980 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
986 wpl = pixGetWpl(pixs);
987 for (j = 0; j < w; j++) {
988 for (i = 1; i < h - 8; i += 8) {
989 linesi = datas + i * wpl;
990 linedi = datad + i * wpl;
1001 maxval = L_MAX(val1, val2);
1004 maxval = L_MAX(val3, val4);
1007 maxval = L_MAX(val5, val6);
1010 maxval = L_MAX(val7, val8);
1040 PIX *pixt, *pixb, *pixbd, *pixd;
1042 PROCNAME(
"pixOpenGray3");
1045 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1046 if (pixGetDepth(pixs) != 8)
1047 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1048 if (pixGetColormap(pixs))
1049 return (
PIX *)ERROR_PTR(
"pix has colormap", procName, NULL);
1050 if ((hsize != 1 && hsize != 3) ||
1051 (vsize != 1 && vsize != 3))
1052 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", procName, NULL);
1054 if (hsize == 1 && vsize == 1)
1064 }
else if (hsize == 1) {
1106 PIX *pixt, *pixb, *pixbd, *pixd;
1108 PROCNAME(
"pixCloseGray3");
1111 return (
PIX *)ERROR_PTR(
"pixs not defined", procName, NULL);
1112 if (pixGetDepth(pixs) != 8)
1113 return (
PIX *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
1114 if (pixGetColormap(pixs))
1115 return (
PIX *)ERROR_PTR(
"pix has colormap", procName, NULL);
1116 if ((hsize != 1 && hsize != 3) ||
1117 (vsize != 1 && vsize != 3))
1118 return (
PIX *)ERROR_PTR(
"invalid size: must be 1 or 3", procName, NULL);
1120 if (hsize == 1 && vsize == 1)
1130 }
else if (hsize == 1) {
1197 l_int32 hsize, nsteps, startmax, startx, starty;
1199 l_uint32 *lines, *lined;
1201 if (direction == L_HORIZ) {
1203 nsteps = (w - 2 * hsize) / size;
1204 for (i = 0; i < h; i++) {
1205 lines = datas + i * wpls;
1206 lined = datad + i * wpld;
1209 for (j = 0; j < w; j++)
1212 for (j = 0; j < nsteps; j++) {
1214 startmax = (j + 1) * size - 1;
1215 maxarray[size - 1] = buffer[startmax];
1216 for (k = 1; k < size; k++) {
1217 maxarray[size - 1 - k] =
1218 L_MAX(maxarray[size - k], buffer[startmax - k]);
1219 maxarray[size - 1 + k] =
1220 L_MAX(maxarray[size + k - 2], buffer[startmax + k]);
1224 startx = hsize + j * size;
1226 SET_DATA_BYTE(lined, startx + size - 1, maxarray[2 * size - 2]);
1227 for (k = 1; k < size - 1; k++) {
1228 maxval = L_MAX(maxarray[k], maxarray[k + size - 1]);
1235 nsteps = (h - 2 * hsize) / size;
1236 for (j = 0; j < w; j++) {
1238 for (i = 0; i < h; i++) {
1239 lines = datas + i * wpls;
1243 for (i = 0; i < nsteps; i++) {
1245 startmax = (i + 1) * size - 1;
1246 maxarray[size - 1] = buffer[startmax];
1247 for (k = 1; k < size; k++) {
1248 maxarray[size - 1 - k] =
1249 L_MAX(maxarray[size - k], buffer[startmax - k]);
1250 maxarray[size - 1 + k] =
1251 L_MAX(maxarray[size + k - 2], buffer[startmax + k]);
1255 starty = hsize + i * size;
1256 lined = datad + starty * wpld;
1259 maxarray[2 * size - 2]);
1260 for (k = 1; k < size - 1; k++) {
1261 maxval = L_MAX(maxarray[k], maxarray[k + size - 1]);
1304 l_int32 hsize, nsteps, startmin, startx, starty;
1306 l_uint32 *lines, *lined;
1308 if (direction == L_HORIZ) {
1310 nsteps = (w - 2 * hsize) / size;
1311 for (i = 0; i < h; i++) {
1312 lines = datas + i * wpls;
1313 lined = datad + i * wpld;
1316 for (j = 0; j < w; j++)
1319 for (j = 0; j < nsteps; j++) {
1321 startmin = (j + 1) * size - 1;
1322 minarray[size - 1] = buffer[startmin];
1323 for (k = 1; k < size; k++) {
1324 minarray[size - 1 - k] =
1325 L_MIN(minarray[size - k], buffer[startmin - k]);
1326 minarray[size - 1 + k] =
1327 L_MIN(minarray[size + k - 2], buffer[startmin + k]);
1331 startx = hsize + j * size;
1333 SET_DATA_BYTE(lined, startx + size - 1, minarray[2 * size - 2]);
1334 for (k = 1; k < size - 1; k++) {
1335 minval = L_MIN(minarray[k], minarray[k + size - 1]);
1342 nsteps = (h - 2 * hsize) / size;
1343 for (j = 0; j < w; j++) {
1345 for (i = 0; i < h; i++) {
1346 lines = datas + i * wpls;
1350 for (i = 0; i < nsteps; i++) {
1352 startmin = (i + 1) * size - 1;
1353 minarray[size - 1] = buffer[startmin];
1354 for (k = 1; k < size; k++) {
1355 minarray[size - 1 - k] =
1356 L_MIN(minarray[size - k], buffer[startmin - k]);
1357 minarray[size - 1 + k] =
1358 L_MIN(minarray[size + k - 2], buffer[startmin + k]);
1362 starty = hsize + i * size;
1363 lined = datad + starty * wpld;
1366 minarray[2 * size - 2]);
1367 for (k = 1; k < size - 1; k++) {
1368 minval = L_MIN(minarray[k], minarray[k + size - 1]);
#define GET_DATA_BYTE(pdata, n)
#define SET_DATA_BYTE(pdata, n, val)
static void erodeGrayLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_int32 size, l_int32 direction, l_uint8 *buffer, l_uint8 *minarray)
erodeGrayLow()
static void dilateGrayLow(l_uint32 *datad, l_int32 w, l_int32 h, l_int32 wpld, l_uint32 *datas, l_int32 wpls, l_int32 size, l_int32 direction, l_uint8 *buffer, l_uint8 *maxarray)
dilateGrayLow()
static PIX * pixErodeGray3h(PIX *pixs)
pixErodeGray3h()
static PIX * pixErodeGray3v(PIX *pixs)
pixErodeGray3v()
PIX * pixErodeGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeGray3()
static PIX * pixDilateGray3h(PIX *pixs)
pixDilateGray3h()
PIX * pixOpenGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenGray3()
PIX * pixCloseGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseGray()
static PIX * pixDilateGray3v(PIX *pixs)
pixDilateGray3v()
PIX * pixCloseGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixCloseGray3()
PIX * pixDilateGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateGray()
PIX * pixOpenGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixOpenGray()
PIX * pixErodeGray(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixErodeGray()
PIX * pixDilateGray3(PIX *pixs, l_int32 hsize, l_int32 vsize)
pixDilateGray3()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
void pixDestroy(PIX **ppix)
pixDestroy()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
PIX * pixCopy(PIX *pixd, const PIX *pixs)
pixCopy()
PIX * pixCreateTemplate(const PIX *pixs)
pixCreateTemplate()
PIX * pixClone(PIX *pixs)
pixClone()
PIX * pixRemoveBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot)
pixRemoveBorderGeneral()
PIX * pixAddBorderGeneral(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixAddBorderGeneral()
l_ok pixSetBorderVal(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_uint32 val)
pixSetBorderVal()
l_ok pixSetOrClearBorder(PIX *pixs, l_int32 left, l_int32 right, l_int32 top, l_int32 bot, l_int32 op)
pixSetOrClearBorder()