#include #include set_pix_type(area, h, p) struct dd_area *area; struct cvl_p *h; struct dparse *p; { int dev_olays; /* overlay planes on device */ int pic_olays; /* overlay bits in picture */ int bb, bp, bnds, sbb, sbp; /* header fields */ int color=1; /* true if color bands, false if gray */ int red= -1, green= -1, blue= -1, gray= 0; /* bands for these colors */ int colorbits; int top_down=0; int protect=0; int lost=0; ERRTYPE err; pic_olays = (h->cv_sbp > h->cv_bnds * h->cv_bb); if (err = dd_rddevice(p->device, DEV_OLAYS, &dev_olays)) errprnt(dd_err(err)); if (err = dd_rddevice(p->device, DEV_COLOR, &colorbits)) errprnt(dd_err(err)); bp = h->cv_bp; bnds = h->cv_bnds; bb = h->cv_bb; sbp = h->cv_sbp; sbb = h->cv_sbb; if (bnds == 0) bnds = 1; if (bnds == 1) { switch (p->colorch) { case 'A' : case 'C' : color = 0; break; case 'G' : case 'a' : case 'c' : color = 0; sbp = bb * bnds; break; case 'r' : red = 0; sbp = bb * bnds; break; case 'g' : green = 0; sbp = bb * bnds; break; case 'b' : blue = 0; sbp = bb * bnds; break; case 'o' : if (pic_olays) { /* no changes */ } else { bnds = 0; bb = 0; sbb = 0; } break; case '-' : if (p->colornum < colorbits/3) { bnds = sbp; red = sbb-1; sbb = 1; bb = 1; lost = colorbits/3 - p->colornum - 1; } else if (p->colornum < 2*colorbits/3) { bnds = sbp; green = sbb-1; sbb = 1; bb = 1; lost = 2*colorbits/3 - p->colornum - 1; } else if (p->colornum < colorbits) { bnds = sbp; blue = sbb-1; sbb = 1; bb = 1; lost = colorbits - p->colornum - 1; } else { if (pic_olays) { } else { bb = sbb-1; sbb = bb; sbp = bb+1; top_down = 1; lost = colorbits + dev_olays - p->colornum - 1; } } } } else { switch (p->colorch) { case 'A' : case 'C' : red = 0; green = 1; blue = 2; break; case 'G' : case 'a' : case 'c' : red = 0; green = 1; blue = 2; sbp = bb * bnds; break; case 'r' : sbp = bb * bnds; red = 0; break; case 'g' : sbp = bb * bnds; green = 1; break; case 'b' : sbp = bb * bnds; blue = 2; break; case 'o' : if (pic_olays) { /* no changes */ } else { errprnt("No overlays in this color picture."); } break; case '-' : protect = 1; break; } } if ((bnds == 2) && (blue == 2)) blue = 1; if (err = dd_set(area, DD_PIX_TYPE, bp, bnds, bb)) errprnt(dd_err(err)); if (err = dd_set(area, DD_PSIGBITS, sbp)) errprnt(dd_err(err)); if (err = dd_set(area, DD_BSIGBITS, sbb)) errprnt(dd_err(err)); if (err = dd_set(area, DD_LOSTBITS, lost)) errprnt(dd_err(err)); if (err = dd_set(area, DD_TOP_DOWN, top_down)) errprnt(dd_err(err)); if (color) { if (err = dd_set(area, DD_COLOR_BANDS, red, green, blue)) errprnt(dd_err(err)); } else { if (err = dd_set(area, DD_GRAY_BAND, gray)) errprnt(dd_err(err)); } if (protect) area->dd_pixprot = ~(1 << p->colornum); }