home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
graphics
/
utilities
/
gifmachine_458
/
sources
/
stripborder.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-02-15
|
3KB
|
143 lines
/* Copyright 1990 by Christopher A. Wichura.
See file GIFMachine.doc for full description of rights.
*/
#include "GIFMachine.h"
extern struct GIFdescriptor gdesc;
EXTERNBITPLANE;
extern char *AbortMsg;
extern int NoBorderLineThresh;
#define BorderCheck(a, b) ((BitPlane[b][a].rgb_Red != BorderCol.rgb_Red) || \
(BitPlane[b][a].rgb_Green != BorderCol.rgb_Green) || \
(BitPlane[b][a].rgb_Blue != BorderCol.rgb_Blue))
void StripBorder(void)
{
register UWORD x;
register UWORD y;
register int thresh;
register BOOL breakout;
LONG LeftEdge, TopEdge;
LONG Width, Height;
UWORD OrigWidth, OrigHeight;
int WidthThresh, HeightThresh;
int Corner;
struct RGB BorderCol;
PutStr("...Removing border.\n");
OrigWidth = gdesc.gd_Width;
OrigHeight = gdesc.gd_Height;
for (Corner = 0; Corner < 4; Corner++) {
x = (Corner & 1) ? (gdesc.gd_Width - 1) : 0;
y = (Corner & 2) ? (gdesc.gd_Height - 1) : 0;
BorderCol = BitPlane[y][x];
WidthThresh = NoBorderLineThresh * gdesc.gd_Width / 100;
HeightThresh = NoBorderLineThresh * gdesc.gd_Height / 100;
for (breakout = y = 0; (y < gdesc.gd_Height) && !breakout; y++) {
for (thresh = x = 0; x < gdesc.gd_Width; x++)
if (BorderCheck(x, y))
if (++thresh > WidthThresh) {
breakout = TRUE;
break;
}
if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
PutStr(AbortMsg);
MyExit(ABORTEXITVAL);
}
}
TopEdge = y - 1;
for (breakout = 0, y = gdesc.gd_Height - 1; (y > 0) && !breakout; y--) {
for (thresh = x = 0; x < gdesc.gd_Width; x++)
if (BorderCheck(x, y))
if (++thresh > WidthThresh) {
breakout = TRUE;
break;
}
if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
PutStr(AbortMsg);
MyExit(ABORTEXITVAL);
}
}
Height = y - TopEdge + 2;
for (breakout = x = 0; (x < gdesc.gd_Width) && !breakout; x++) {
for (thresh = y = 0; y < gdesc.gd_Height; y++)
if (BorderCheck(x, y))
if (++thresh > HeightThresh) {
breakout = TRUE;
break;
}
if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
PutStr(AbortMsg);
MyExit(ABORTEXITVAL);
}
}
LeftEdge = x - 1;
for (breakout = 0, x = gdesc.gd_Width - 1; (x > 0) && !breakout; x--) {
for (thresh = y = 0; y < gdesc.gd_Height; y++)
if (BorderCheck(x, y))
if (++thresh > HeightThresh) {
breakout = TRUE;
break;
}
if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
PutStr(AbortMsg);
MyExit(ABORTEXITVAL);
}
}
Width = x - LeftEdge + 2;
if ((Width != gdesc.gd_Width) || (Height != gdesc.gd_Height)) {
if (Width < 5 || Height < 5) {
PutStr("......Too much of picture would be removed. Not modified.\n");
return;
}
for (y = 0; y < Height; y++) {
for (x = 0; x < Width; x++)
BitPlane[y][x] = BitPlane[TopEdge + y][LeftEdge + x];
BitPlane[y][x].rgb_Red =
BitPlane[y][x].rgb_Green =
BitPlane[y][x].rgb_Blue = 0;
if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
PutStr(AbortMsg);
MyExit(ABORTEXITVAL);
}
}
gdesc.gd_Width = Width;
gdesc.gd_Height = Height;
}
}
if ((gdesc.gd_Width != OrigWidth) || (gdesc.gd_Height != OrigHeight)) {
if (gdesc.gd_Width & 1)
gdesc.gd_Width++;
MyPrintf("......New width = %ld, New height = %ld\n",
gdesc.gd_Width, gdesc.gd_Height);
}
}