row.c
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:13k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: row.c,v 1.1.1.1 2005/11/11 21:32:03 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. /*
  27.  * row -
  28.  * support for operations on image rows.
  29.  *
  30.  */
  31. #include "image.h"
  32. #include "lum.h"
  33. int _RILUM = _RED;
  34. int _GILUM = _GREEN;
  35. int _BILUM = _BLUE;
  36. zerorow(sptr,n)
  37. short *sptr;
  38. int n;
  39. {
  40.     memset(sptr,0,n*sizeof(short));
  41. }
  42. copyrow(s,d,n)
  43. short *s, *d;
  44. int n;
  45. {
  46.     memcpy(d,s,n*sizeof(short));
  47. }
  48. setrow(sptr,val,n)
  49. short *sptr;
  50. int val, n;
  51. {
  52.     if(val==0)
  53. zerorow(sptr,n);
  54.     else {
  55. while(n>=8) {
  56.     sptr[0] = val;
  57.     sptr[1] = val;
  58.     sptr[2] = val;
  59.     sptr[3] = val;
  60.     sptr[4] = val;
  61.     sptr[5] = val;
  62.     sptr[6] = val;
  63.     sptr[7] = val;
  64.     sptr += 8;
  65.     n -= 8;
  66. }
  67. while(n--) 
  68.     *sptr++ = val;
  69.     }
  70. }
  71. #define DOCLAMP(iptr,optr) *(optr) = ((*(iptr)<0) ? 0 : (*(iptr)>255) ? 255 : *(iptr))
  72. clamprow(iptr,optr,n)
  73. short *iptr, *optr;
  74. int n;
  75. {
  76.     while(n>=8) {
  77. DOCLAMP(iptr+0,optr+0);
  78. DOCLAMP(iptr+1,optr+1);
  79. DOCLAMP(iptr+2,optr+2);
  80. DOCLAMP(iptr+3,optr+3);
  81. DOCLAMP(iptr+4,optr+4);
  82. DOCLAMP(iptr+5,optr+5);
  83. DOCLAMP(iptr+6,optr+6);
  84. DOCLAMP(iptr+7,optr+7);
  85. iptr += 8;
  86. optr += 8;
  87. n -= 8;
  88.     }
  89.     while(n--) {
  90. DOCLAMP(iptr,optr);
  91. iptr++;
  92. optr++;
  93.     }
  94. }
  95. accrow(iptr,sptr,w,n)
  96. short *iptr;
  97. short *sptr;
  98. int w, n;
  99. {
  100.     if(w == 1) {
  101. addsrow(iptr,sptr,n);
  102.     } else if(w == -1) {
  103. subsrow(iptr,sptr,n);
  104.     } else {
  105. while(n>=8) {
  106.     iptr[0] += w*sptr[0];
  107.     iptr[1] += w*sptr[1];
  108.     iptr[2] += w*sptr[2];
  109.     iptr[3] += w*sptr[3];
  110.     iptr[4] += w*sptr[4];
  111.     iptr[5] += w*sptr[5];
  112.     iptr[6] += w*sptr[6];
  113.     iptr[7] += w*sptr[7];
  114.     iptr += 8;
  115.     sptr += 8;
  116.     n -= 8;
  117. }
  118. while(n--) 
  119.     *iptr++ += (w * *sptr++);
  120.     }
  121. }
  122. divrow(iptr,optr,tot,n)
  123. short *iptr;
  124. short *optr;
  125. int tot, n;
  126. {
  127.     if(iptr == optr) {
  128. while(n>=8) {
  129.     optr[0] = optr[0]/tot;
  130.     optr[1] = optr[1]/tot;
  131.     optr[2] = optr[2]/tot;
  132.     optr[3] = optr[3]/tot;
  133.     optr[4] = optr[4]/tot;
  134.     optr[5] = optr[5]/tot;
  135.     optr[6] = optr[6]/tot;
  136.     optr[7] = optr[7]/tot;
  137.     optr += 8;
  138.     n -= 8;
  139. }
  140. while(n--) {
  141.     *optr = (*optr)/tot;
  142.     optr++;
  143. }
  144.     } else {
  145. while(n>=8) {
  146.     optr[0] = iptr[0]/tot;
  147.     optr[1] = iptr[1]/tot;
  148.     optr[2] = iptr[2]/tot;
  149.     optr[3] = iptr[3]/tot;
  150.     optr[4] = iptr[4]/tot;
  151.     optr[5] = iptr[5]/tot;
  152.     optr[6] = iptr[6]/tot;
  153.     optr[7] = iptr[7]/tot;
  154.     optr += 8;
  155.     iptr += 8;
  156.     n -= 8;
  157. }
  158. while(n--) 
  159.     *optr++ = (*iptr++)/tot;
  160.     }
  161. }
  162. #define DOTOBW(optr,rptr,gptr,bptr) *(optr) = ILUM(*(rptr),*(gptr),*(bptr))
  163. rgbrowtobw(rbuf,gbuf,bbuf,obuf,n)
  164. unsigned short *rbuf, *gbuf, *bbuf, *obuf;
  165. int n;
  166. {
  167.     while(n>=8) {
  168. DOTOBW(obuf+0,rbuf+0,gbuf+0,bbuf+0);
  169. DOTOBW(obuf+1,rbuf+1,gbuf+1,bbuf+1);
  170. DOTOBW(obuf+2,rbuf+2,gbuf+2,bbuf+2);
  171. DOTOBW(obuf+3,rbuf+3,gbuf+3,bbuf+3);
  172. DOTOBW(obuf+4,rbuf+4,gbuf+4,bbuf+4);
  173. DOTOBW(obuf+5,rbuf+5,gbuf+5,bbuf+5);
  174. DOTOBW(obuf+6,rbuf+6,gbuf+6,bbuf+6);
  175. DOTOBW(obuf+7,rbuf+7,gbuf+7,bbuf+7);
  176. rbuf += 8;
  177. gbuf += 8;
  178. bbuf += 8;
  179. obuf += 8;
  180. n -= 8;
  181.     } 
  182.     while(n--) {
  183. DOTOBW(obuf,rbuf,gbuf,bbuf);
  184. rbuf++;
  185. gbuf++;
  186. bbuf++;
  187. obuf++;
  188.     }
  189. }
  190. /*
  191.  * addsrow -
  192.  * Add two rows together
  193.  *
  194.  */
  195. addsrow(dptr,sptr,n)
  196. short *dptr, *sptr;
  197. int n;
  198. {
  199.     while(n>=8) {
  200. dptr[0] += sptr[0];
  201. dptr[1] += sptr[1];
  202. dptr[2] += sptr[2];
  203. dptr[3] += sptr[3];
  204. dptr[4] += sptr[4];
  205. dptr[5] += sptr[5];
  206. dptr[6] += sptr[6];
  207. dptr[7] += sptr[7];
  208. dptr += 8;
  209. sptr += 8;
  210. n -= 8;
  211.     }
  212.     while(n--) 
  213. *dptr++ += *sptr++;
  214. }
  215. /*
  216.  * subsrow -
  217.  * Subtract two rows
  218.  *
  219.  */
  220. subsrow(dptr,sptr,n)
  221. short *dptr, *sptr;
  222. int n;
  223. {
  224.     while(n>=8) {
  225. dptr[0] -= sptr[0];
  226. dptr[1] -= sptr[1];
  227. dptr[2] -= sptr[2];
  228. dptr[3] -= sptr[3];
  229. dptr[4] -= sptr[4];
  230. dptr[5] -= sptr[5];
  231. dptr[6] -= sptr[6];
  232. dptr[7] -= sptr[7];
  233. dptr += 8;
  234. sptr += 8;
  235. n -= 8;
  236.     }
  237.     while(n--) 
  238. *dptr++ -= *sptr++;
  239. }
  240. bitstorow(bits,sbuf,n)
  241. unsigned char *bits;
  242. short *sbuf;
  243. int n;
  244. {
  245.     int i, val, nbytes;
  246.     nbytes = ((n-1)/8)+1;
  247.     for(i = 0; i<nbytes; i++ ) {
  248. val = *bits++;
  249. if(val&0x80)
  250.     sbuf[0] = 0;
  251. else
  252.     sbuf[0] = 255;
  253. if(val&0x40)
  254.     sbuf[1] = 0;
  255. else
  256.     sbuf[1] = 255;
  257. if(val&0x20)
  258.     sbuf[2] = 0;
  259. else
  260.     sbuf[2] = 255;
  261. if(val&0x10)
  262.     sbuf[3] = 0;
  263. else
  264.     sbuf[3] = 255;
  265. if(val&0x08)
  266.     sbuf[4] = 0;
  267. else
  268.     sbuf[4] = 255;
  269. if(val&0x04)
  270.     sbuf[5] = 0;
  271. else
  272.     sbuf[5] = 255;
  273. if(val&0x02)
  274.     sbuf[6] = 0;
  275. else
  276.     sbuf[6] = 255;
  277. if(val&0x01)
  278.     sbuf[7] = 0;
  279. else
  280.     sbuf[7] = 255;
  281. sbuf += 8;
  282.     }
  283. }
  284. rowtobits(sbuf,bits,n)
  285. short *sbuf;
  286. unsigned char *bits;
  287. int n;
  288. {
  289.     int i, val, nbytes, thresh;
  290.     nbytes = ((n-1)/8)+1;
  291.     thresh = 128;
  292.     for(i = 0; i<nbytes; i++) {
  293. val = 0;
  294. if(sbuf[0]<thresh)
  295.     val |= 0x80;
  296. if(sbuf[1]<thresh)
  297.     val |= 0x40;
  298. if(sbuf[2]<thresh)
  299.     val |= 0x20;
  300. if(sbuf[3]<thresh)
  301.     val |= 0x10;
  302. if(sbuf[4]<thresh)
  303.     val |= 0x08;
  304. if(sbuf[5]<thresh)
  305.     val |= 0x04;
  306. if(sbuf[6]<thresh)
  307.     val |= 0x02;
  308. if(sbuf[7]<thresh)
  309.     val |= 0x01;
  310. sbuf += 8;
  311. *bits++ = val;
  312.     }
  313. }
  314. /* 
  315.  * bit reverse a stream of bytes
  316.  *
  317.  */
  318. bitrevbytes(buf,n)
  319. unsigned char *buf;
  320. int n;
  321. {
  322.     int i, x, br;
  323.     static unsigned char *bitrev;
  324.     if(!bitrev) {
  325. bitrev = (unsigned char *)malloc(256);
  326. for(i=0; i<256; i++) {
  327.     br = 0;
  328.     for(x=0; x<8; x++) {
  329. br = br<<1;
  330. if(i&(1<<x))
  331.     br |= 1;
  332.     }
  333.     bitrev[i] = br;
  334. }
  335.     }
  336.     while(n>=8) {
  337. buf[0] = bitrev[buf[0]];
  338. buf[1] = bitrev[buf[1]];
  339. buf[2] = bitrev[buf[2]];
  340. buf[3] = bitrev[buf[3]];
  341. buf[4] = bitrev[buf[4]];
  342. buf[5] = bitrev[buf[5]];
  343. buf[6] = bitrev[buf[6]];
  344. buf[7] = bitrev[buf[7]];
  345. buf += 8;
  346. n -= 8;
  347.     }
  348.     while(n--) {
  349. buf[0] = bitrev[buf[0]];
  350. *buf++;
  351.     }
  352. }
  353. /* 
  354.  * flip a row of shorts
  355.  *
  356.  */
  357. flipsrow(sptr,n) 
  358. register short *sptr;
  359. register int n;
  360. {
  361.     register short temp, *p1, *p2;
  362.     p1 = sptr;
  363.     p2 = sptr+n-1;
  364.     n = n/2;
  365.     while(n--) {
  366. temp = *p1;
  367. *p1++ = *p2;
  368. *p2-- = temp;
  369.     }
  370. }
  371. /*  cpack -
  372.  * Convert from and to cpack format.
  373.  *
  374.  */
  375. bwtocpack(b,l,n)
  376. register unsigned short *b;
  377. register unsigned long *l;
  378. register int n;
  379. {
  380.     while(n>=8) {
  381. l[0] = 0x00010101*b[0];
  382. l[1] = 0x00010101*b[1];
  383. l[2] = 0x00010101*b[2];
  384. l[3] = 0x00010101*b[3];
  385. l[4] = 0x00010101*b[4];
  386. l[5] = 0x00010101*b[5];
  387. l[6] = 0x00010101*b[6];
  388. l[7] = 0x00010101*b[7];
  389. l += 8;
  390. b += 8;
  391. n -= 8;
  392.     }
  393.     while(n--) 
  394. *l++ = 0x00010101*(*b++);
  395. }
  396. rgbtocpack(r,g,b,l,n)
  397. register unsigned short *r, *g, *b;
  398. register unsigned long *l;
  399. register int n;
  400. {
  401.     while(n>=8) {
  402. l[0] = r[0] | (g[0]<<8) | (b[0]<<16);
  403. l[1] = r[1] | (g[1]<<8) | (b[1]<<16);
  404. l[2] = r[2] | (g[2]<<8) | (b[2]<<16);
  405. l[3] = r[3] | (g[3]<<8) | (b[3]<<16);
  406. l[4] = r[4] | (g[4]<<8) | (b[4]<<16);
  407. l[5] = r[5] | (g[5]<<8) | (b[5]<<16);
  408. l[6] = r[6] | (g[6]<<8) | (b[6]<<16);
  409. l[7] = r[7] | (g[7]<<8) | (b[7]<<16);
  410. l += 8;
  411. r += 8;
  412. g += 8;
  413. b += 8;
  414. n -= 8;
  415.     }
  416.     while(n--) 
  417.         *l++ = *r++ | ((*g++)<<8) | ((*b++)<<16);
  418. }
  419. rgbatocpack(r,g,b,a,l,n)
  420. register unsigned short *r, *g, *b, *a;
  421. register unsigned long *l;
  422. register int n;
  423. {
  424.     while(n>=8) {
  425. l[0] = r[0] | (g[0]<<8) | (b[0]<<16) | (a[0]<<24);
  426. l[1] = r[1] | (g[1]<<8) | (b[1]<<16) | (a[1]<<24);
  427. l[2] = r[2] | (g[2]<<8) | (b[2]<<16) | (a[2]<<24);
  428. l[3] = r[3] | (g[3]<<8) | (b[3]<<16) | (a[3]<<24);
  429. l[4] = r[4] | (g[4]<<8) | (b[4]<<16) | (a[4]<<24);
  430. l[5] = r[5] | (g[5]<<8) | (b[5]<<16) | (a[5]<<24);
  431. l[6] = r[6] | (g[6]<<8) | (b[6]<<16) | (a[6]<<24);
  432. l[7] = r[7] | (g[7]<<8) | (b[7]<<16) | (a[7]<<24);
  433. l += 8;
  434. r += 8;
  435. g += 8;
  436. b += 8;
  437. a += 8;
  438. n -= 8;
  439.     }
  440.     while(n--) 
  441.         *l++ = *r++ | ((*g++)<<8) | ((*b++)<<16) | ((*a++)<<24);
  442. }
  443. #define CPACKTORGB(l,r,g,b)
  444. val = (l);
  445. (r) = (val>>0) & 0xff;
  446. (g) = (val>>8) & 0xff;
  447. (b) = (val>>16) & 0xff;
  448. cpacktorgb(l,r,g,b,n)
  449. register unsigned long *l;
  450. register unsigned short *r, *g, *b;
  451. register int n;
  452. {
  453.     unsigned long val;
  454.     while(n>=8) {
  455. CPACKTORGB(l[0],r[0],g[0],b[0]);
  456. CPACKTORGB(l[1],r[1],g[1],b[1]);
  457. CPACKTORGB(l[2],r[2],g[2],b[2]);
  458. CPACKTORGB(l[3],r[3],g[3],b[3]);
  459. CPACKTORGB(l[4],r[4],g[4],b[4]);
  460. CPACKTORGB(l[5],r[5],g[5],b[5]);
  461. CPACKTORGB(l[6],r[6],g[6],b[6]);
  462. CPACKTORGB(l[7],r[7],g[7],b[7]);
  463. l += 8;
  464. r += 8;
  465. g += 8;
  466. b += 8;
  467. n -= 8;
  468.     }
  469.     while(n--) {
  470. CPACKTORGB(l[0],r[0],g[0],b[0]);
  471. l++;
  472. r++;
  473. g++;
  474. b++;
  475.     }
  476. }
  477. #define CPACKTORGBA(l,r,g,b,a)
  478. val = (l);
  479. (r) = (val>>0) & 0xff;
  480. (g) = (val>>8) & 0xff;
  481. (b) = (val>>16) & 0xff;
  482. (a) = (val>>24) & 0xff;
  483. cpacktorgba(l,r,g,b,a,n)
  484. register unsigned long *l;
  485. register unsigned short *r, *g, *b, *a;
  486. register int n;
  487. {
  488.     unsigned long val;
  489.     while(n>=8) {
  490. CPACKTORGBA(l[0],r[0],g[0],b[0],a[0]);
  491. CPACKTORGBA(l[1],r[1],g[1],b[1],a[1]);
  492. CPACKTORGBA(l[2],r[2],g[2],b[2],a[2]);
  493. CPACKTORGBA(l[3],r[3],g[3],b[3],a[3]);
  494. CPACKTORGBA(l[4],r[4],g[4],b[4],a[4]);
  495. CPACKTORGBA(l[5],r[5],g[5],b[5],a[5]);
  496. CPACKTORGBA(l[6],r[6],g[6],b[6],a[6]);
  497. CPACKTORGBA(l[7],r[7],g[7],b[7],a[7]);
  498. l += 8;
  499. r += 8;
  500. g += 8;
  501. b += 8;
  502. a += 8;
  503. n -= 8;
  504.     }
  505.     while(n--) {
  506. CPACKTORGBA(l[0],r[0],g[0],b[0],a[0]);
  507. l++;
  508. r++;
  509. g++;
  510. b++;
  511. a++;
  512.     }
  513. }
  514. /*
  515.  * normrow -
  516.  * Normalize a row of image data
  517.  *
  518.  */
  519. normrow(image,buf)
  520. IMAGE *image;
  521. short *buf;
  522. {
  523.     int n, max;
  524.     n = image->xsize;
  525.     max = image->max;
  526.     if(max == 255 || max == 0)
  527. return;
  528.     while(n>=8) {
  529. buf[0] = (buf[0]*255)/max;
  530. buf[1] = (buf[1]*255)/max;
  531. buf[2] = (buf[2]*255)/max;
  532. buf[3] = (buf[3]*255)/max;
  533. buf[4] = (buf[4]*255)/max;
  534. buf[5] = (buf[5]*255)/max;
  535. buf[6] = (buf[6]*255)/max;
  536. buf[7] = (buf[7]*255)/max;
  537. buf += 8;
  538. n -= 8;
  539.     }
  540.     while(n--) {
  541. *buf = (*buf*255)/max;
  542. buf++;
  543.     }
  544. }
  545. static short *rbuf, *gbuf, *bbuf;
  546. static int malloclen = 0;
  547. getbwrow(image,buf,y)
  548. IMAGE *image;
  549. short *buf;
  550. int y;
  551. {
  552.     if(malloclen!=image->xsize) {
  553. if(malloclen) {
  554.     free(rbuf);
  555.     free(gbuf);
  556.     free(bbuf);
  557. }
  558. rbuf = (short *)malloc(image->xsize*sizeof(short));
  559. gbuf = (short *)malloc(image->xsize*sizeof(short));
  560. bbuf = (short *)malloc(image->xsize*sizeof(short));
  561. malloclen=image->xsize;;
  562.     }
  563.     if(image->zsize<3) {
  564. getrow(image,buf,y,0);
  565.     } else {
  566. getrow(image,rbuf,y,0);
  567. getrow(image,gbuf,y,1);
  568. getrow(image,bbuf,y,2);
  569. rgbrowtobw(rbuf,gbuf,bbuf,buf,image->xsize);
  570.     }
  571. }
  572. putfliprow(image,buf,y,z,flipcode)
  573. IMAGE *image;
  574. short *buf;
  575. int y, z;
  576. int flipcode;
  577. {
  578.     if(flipcode&1)
  579. flipsrow(buf,image->xsize);
  580.     if(flipcode&2)
  581. putrow(image,buf,(image->ysize-1)-y,z);
  582.     else
  583. putrow(image,buf,y,z);
  584. }
  585. getfliprow(image,buf,y,z,flipcode)
  586. IMAGE *image;
  587. short *buf;
  588. int y, z, flipcode;
  589. {
  590.     if(flipcode&2)
  591. getrow(image,buf,(image->ysize-1)-y,z);
  592.     else
  593. getrow(image,buf,y,z);
  594.     if(flipcode&1)
  595. flipsrow(buf,image->xsize);
  596. }
  597. /* 
  598.  * dithering stuff follows
  599.  *
  600.  */
  601. #define MATSIZE88
  602. #define XSIZE 8
  603. #define YSIZE 8
  604. #ifdef NOTDEF
  605. static short dithmat[YSIZE][XSIZE] = { /* 8x8 Limb */
  606. 0, 8, 36, 44, 2, 10, 38, 46,
  607. 16, 24, 52, 60, 18, 26, 54, 62,
  608. 32, 40,  4, 12, 34, 42, 6, 14,
  609. 48, 56, 20, 28, 50, 58, 22, 30,
  610. 3, 11, 39, 47, 1, 9, 37, 45,
  611. 19, 27, 55, 63, 17, 25, 53, 61,
  612. 35, 43, 7, 15, 33, 41, 5, 13,
  613. 51, 59, 23, 31, 49, 57, 21, 29,
  614. };
  615. static short dithmat[YSIZE][XSIZE] = { /* halftone dots */
  616. 3, 17, 55,     63, 61,     47, 9, 1,
  617. 15,  29, 39, 51, 49, 35, 25, 13,
  618. 40, 32, 26, 20, 22, 30, 36, 42,
  619. 56, 44, 10, 4, 6, 18, 52, 58,
  620. 60, 46, 8, 0, 2, 16, 54, 62,
  621. 48, 34, 24, 12, 14, 28, 38, 50,
  622. 23, 31, 37, 43, 41, 33, 27, 21,
  623. 7, 19, 53, 59, 57, 45, 11, 5,
  624. };
  625. #define TOTAL (XSIZE*YSIZE)
  626. ditherrow(buf,y,n)
  627. short *buf;
  628. int y, n;
  629. {
  630.     int r, val;
  631.     int rshades, rmaxbits;
  632.     short *rdith, *gdith, *bdith;
  633.     rdith = &dithmat[y%YSIZE][0];
  634.     rshades = TOTAL+1;
  635.     rmaxbits = ((rshades-1)/TOTAL);
  636.     while(n--) {
  637. r = *buf;
  638. val = (rshades*r)/255;
  639. if(val>=TOTAL) 
  640.     *buf++ = 255;
  641. else if(val>rdith[n%XSIZE])
  642.     *buf++ = 255;
  643. else
  644.     *buf++ = 0;
  645.     }
  646. }
  647. #endif