diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2022-09-28 02:22:32 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2022-09-28 02:22:32 +0000 |
commit | 0d782c278caeb9e70b1a5635d018168b09ecf2ba (patch) | |
tree | b807f4ee6b4ce6b9cbafb66768d09c106a71040d /lib/libpam.c | |
parent | 4616d7d06bc2ee200a7f40cee107fbbbf5d0cae9 (diff) | |
download | netpbm-mirror-0d782c278caeb9e70b1a5635d018168b09ecf2ba.tar.gz netpbm-mirror-0d782c278caeb9e70b1a5635d018168b09ecf2ba.tar.xz netpbm-mirror-0d782c278caeb9e70b1a5635d018168b09ecf2ba.zip |
Copy current Development release as Advanced
git-svn-id: http://svn.code.sf.net/p/netpbm/code/advanced@4444 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'lib/libpam.c')
-rw-r--r-- | lib/libpam.c | 86 |
1 files changed, 85 insertions, 1 deletions
diff --git a/lib/libpam.c b/lib/libpam.c index b24f230e..a01dd596 100644 --- a/lib/libpam.c +++ b/lib/libpam.c @@ -216,6 +216,24 @@ pnm_createBlackTuple(const struct pam * const pamP, +void +pnm_createWhiteTuple(const struct pam * const pamP, + tuple * const whiteTupleP) { +/*---------------------------------------------------------------------------- + Create a "white" tuple. By that we mean a tuple all of whose elements are + the maxval. If it's an RGB, grayscale, or b&w pixel, that means it's + white. +-----------------------------------------------------------------------------*/ + unsigned int i; + + *whiteTupleP = pnm_allocpamtuple(pamP); + + for (i = 0; i < pamP->depth; ++i) + (*whiteTupleP)[i] = pamP->maxval; +} + + + static tuple * allocPamRow(const struct pam * const pamP) { /*---------------------------------------------------------------------------- @@ -434,6 +452,8 @@ setSeekableAndRasterPos(struct pam * const pamP) { } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" #define MAX_LABEL_LENGTH 8 #define MAX_VALUE_LENGTH 255 @@ -443,7 +463,7 @@ parseHeaderLine(const char * const buffer, char * const label, char * const value) { /*---------------------------------------------------------------------------- - We truncate the labe to MAX_LABEL_LENGTH and the value to + We truncate the label to MAX_LABEL_LENGTH and the value to MAX_VALUE_LENGTH. There must be at least that much space (plus space for a terminating NUL) at 'label' and 'value', respectively. -----------------------------------------------------------------------------*/ @@ -484,6 +504,7 @@ parseHeaderLine(const char * const buffer, value[valueCurs] = '\0'; } } +#pragma GCC diagnostic pop @@ -1417,6 +1438,66 @@ pnm_backgroundtuple(struct pam * const pamP, +tuple +pnm_backgroundtuplerow(const struct pam * const pamP, + tuple * const tuplerow) { +/*----------------------------------------------------------------------------- + Guess a good background color for an image that contains row 'tuplerow' + (probably top or bottom edge), described by *pamP. + + This function was copied from libpnm3.c's pnm_backgroundxelrow() and + modified to use tuples instead of xels. +-----------------------------------------------------------------------------*/ + tuple bgtuple; + + bgtuple = pnm_allocpamtuple(pamP); + + assert(pamP->width > 0); + + if (pamP->width == 1) + pnm_assigntuple(pamP, bgtuple, tuplerow[0]); + else { + tuple const l = tuplerow[0]; + tuple const r = tuplerow[pamP->width-1]; + + if (pnm_tupleequal(pamP, l, r)) { + /* Both corners are same color, so that's the background color, + without any extra computation. + */ + pnm_assigntuple(pamP, bgtuple, l); + } else { + /* Corners are different */ + + if (pamP->depth == 1 && pamP->maxval == 1) { + /* It's black and white, with one corner black, the other + white. We consider whichever color is most prevalent in + the row the background color. + */ + unsigned int col; + unsigned int blackCt; + + for (col = 0, blackCt = 0; col < pamP->width; ++col) { + if (tuplerow[col] == 0) + ++blackCt; + } + if (blackCt > pamP->width / 2) + bgtuple[0] = 0; + else + bgtuple[0] = pamP->maxval; + } else { + /* Use the cartesian mean of the two corner colors */ + unsigned int plane; + + for (plane = 0; plane < pamP->depth; ++plane) + bgtuple[plane] = (l[plane] + r[plane])/2; + } + } + } + return bgtuple; +} + + + /*============================================================================= pm_system() Standard Input feeder and Standard Output accepter functions. =============================================================================*/ @@ -1456,3 +1537,6 @@ pm_accept_to_pamtuples(int const pipeToSuckFd, pm_close(inpamP->file); } + + + |