#include #include doparms(area, p, area2) struct dd_area *area, *area2; struct dparse *p; { int color, olays; ERRTYPE err; if (err = dd_rddevice(p->device, DEV_OLAYS, &olays)) errprnt(dd_err(err)); if (err = dd_rddevice(p->device, DEV_COLOR, &color)) errprnt(dd_err(err)); if (err = dd_open(area, p->device, p->fx, p->fy, p->nx, p->ny, COLOR32)) errprnt(dd_err(err)); if (err = dd_set(area, DD_BUFFER, 1)) errprnt(dd_err(err)); if (p->interch == 'n') p->interch = 'N'; if (p->interch == 'i') p->interch = 'I'; switch (p->orflag) { case '=' : if (err = dd_set(area, DD_WRITEMODE, DD_ASSIGN)) errprnt(dd_err(err)); break; case '!' : if (err = dd_set(area, DD_WRITEMODE, DD_OR)) errprnt(dd_err(err)); break; case '+' : if (err = dd_set(area, DD_WRITEMODE, DD_AND)) errprnt(dd_err(err)); break; case '^' : if (err = dd_set(area, DD_WRITEMODE, DD_XOR)) errprnt(dd_err(err)); break; default : errprnt("Bad orflag is %c\n",p->orflag); } switch (p->colorch) { case 'r' : if (err = dd_set(area, DD_PIX_TYPE, GRAY8)) errprnt(dd_err(err)); if (err = dd_set(area, DD_COLOR_BANDS, 0, -1, -1)) errprnt(dd_err(err)); break; case 'g' : if (err = dd_set(area, DD_PIX_TYPE, GRAY8)) errprnt(dd_err(err)); if (err = dd_set(area, DD_COLOR_BANDS, -1, 0, -1)) errprnt(dd_err(err)); break; case 'b' : if (err = dd_set(area, DD_PIX_TYPE, GRAY8)) errprnt(dd_err(err)); if (err = dd_set(area, DD_COLOR_BANDS, -1, -1, 0)) errprnt(dd_err(err)); break; case 'G' : if (err = dd_set(area, DD_PIX_TYPE, GRAY8)) errprnt(dd_err(err)); break; case 'A' : if (err = dd_set(area, DD_PIX_TYPE, COLOR16)) errprnt(dd_err(err)); if (err = dd_set(area, DD_PSIGBITS, 12+olays)) errprnt(dd_err(err)); break; case 'a' : if (err = dd_set(area, DD_PIX_TYPE, COLOR16)) errprnt(dd_err(err)); if (err = dd_set(area, DD_PSIGBITS, 12)) errprnt(dd_err(err)); break; case 'c' : if (err = dd_set(area, DD_PIX_TYPE, COLOR32)) errprnt(dd_err(err)); if (err = dd_set(area, DD_PSIGBITS, 24)) errprnt(dd_err(err)); break; case 'C' : if (err = dd_set(area, DD_PIX_TYPE, COLOR32)) errprnt(dd_err(err)); if (err = dd_set(area, DD_PSIGBITS, 24+olays)) errprnt(dd_err(err)); break; case 'o' : if (olays == 0) errprnt("No overlays on this device."); if (p->colornum == -1) { if (err = dd_set(area, DD_PIX_TYPE, 8, 0, 0)) errprnt(dd_err(err)); if (err = dd_set(area, DD_PSIGBITS, olays)) errprnt(dd_err(err)); } else { if (p->colornum >= olays) errprnt("Requested overlay not available"); if (err = dd_set(area, DD_PIX_TYPE, 1,0,0)) errprnt(dd_err(err)); if (err=dd_set(area, DD_TOP_DOWN, 1)) errprnt(dd_err(err)); if (err = dd_set(area, DD_LOSTBITS, olays - p->colornum - 1)) errprnt(dd_err(err)); p->colorch = '-'; p->colornum += color; } break; case '-' : if (p->colornum >= (color + olays)) { errprnt("bitplane out of device range"); } else if (p->colornum >= color) { if (err=dd_set(area, DD_PIX_TYPE, 1,0,0)) errprnt(dd_err(err)); if (err=dd_set(area, DD_TOP_DOWN, 1)) errprnt(dd_err(err)); if (err=dd_set(area, DD_LOSTBITS, (color+olays - p->colornum - 1))) errprnt(dd_err(err)); } else if (p->colornum < color) { if (err=dd_set(area, DD_PIX_TYPE, 1,1,1)) errprnt(dd_err(err)); if (p->colornum < color/3) { if (err=dd_set(area, DD_COLOR_BANDS, 0, -1, -1)) errprnt(dd_err(err)); if (err=dd_set(area, DD_LOSTBITS, (color/3 - p->colornum - 1))) errprnt(dd_err(err)); } else if (p->colornum < 2*color/3) { if (err=dd_set(area, DD_COLOR_BANDS, -1, 0, -1)) errprnt(dd_err(err)); if (err=dd_set(area, DD_LOSTBITS, (2*color/3 - p->colornum - 1))) errprnt(dd_err(err)); } else { if (err=dd_set(area, DD_COLOR_BANDS, -1, -1, 0)) errprnt(dd_err(err)); if (err=dd_set(area, DD_LOSTBITS, (color - p->colornum - 1))) errprnt(dd_err(err)); } } break; } if (area2 == 0) return(0); switch (p->orflag2) { case '=' : if (err = dd_set(area2, DD_WRITEMODE, DD_ASSIGN)) errprnt(dd_err(err)); break; case '!' : if (err = dd_set(area2, DD_WRITEMODE, DD_OR)) errprnt(dd_err(err)); break; case '+' : if (err = dd_set(area2, DD_WRITEMODE, DD_AND)) errprnt(dd_err(err)); break; case '^' : if (err = dd_set(area2, DD_WRITEMODE, DD_XOR)) errprnt(dd_err(err)); break; default : errprnt("Bad orflag is %c\n",p->orflag); } if (err = dd_set(area2, DD_BUFFER, 1)) errprnt(dd_err(err)); switch (p->colorch2) { case 'r' : if (err = dd_set(area2, DD_PIX_TYPE, GRAY8)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_COLOR_BANDS, 0, -1, -1)) errprnt(dd_err(err)); break; case 'g' : if (err = dd_set(area2, DD_PIX_TYPE, GRAY8)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_COLOR_BANDS, -1, 0, -1)) errprnt(dd_err(err)); break; case 'b' : if (err = dd_set(area2, DD_PIX_TYPE, GRAY8)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_COLOR_BANDS, -1, -1, 0)) errprnt(dd_err(err)); break; case 'G' : if (err = dd_set(area2, DD_PIX_TYPE, GRAY8)) errprnt(dd_err(err)); break; case 'A' : if (err = dd_set(area2, DD_PIX_TYPE, COLOR16)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_PSIGBITS, 12+olays)) errprnt(dd_err(err)); break; case 'a' : if (err = dd_set(area2, DD_PIX_TYPE, COLOR16)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_PSIGBITS, 12)) errprnt(dd_err(err)); break; case 'c' : if (err = dd_set(area2, DD_PIX_TYPE, COLOR32)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_PSIGBITS, 24)) errprnt(dd_err(err)); break; case 'C' : if (err = dd_set(area2, DD_PIX_TYPE, COLOR32)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_PSIGBITS, 24+olays)) errprnt(dd_err(err)); break; case 'o' : if (olays == 0) errprnt("No overlays on this device."); if (p->colornum2 == -1) { if (err = dd_set(area2, DD_PIX_TYPE, 8, 0, 0)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_PSIGBITS, olays)) errprnt(dd_err(err)); } else { if (p->colornum2 >= olays) errprnt("Requested overlay not available"); if (err = dd_set(area2, DD_PIX_TYPE, 1,0,0)) errprnt(dd_err(err)); if (err=dd_set(area2, DD_TOP_DOWN, 1)) errprnt(dd_err(err)); if (err = dd_set(area2, DD_LOSTBITS, olays - p->colornum2 - 1)) errprnt(dd_err(err)); p->colorch2 = '-'; p->colornum2 += color; } break; case '-' : if (p->colornum2 >= (color + olays)) { errprnt("bitplane out of device range"); } else if (p->colornum2 >= color) { if (err=dd_set(area2, DD_PIX_TYPE, 1,0,0)) errprnt(dd_err(err)); if (err=dd_set(area2, DD_TOP_DOWN, 1)) errprnt(dd_err(err)); if (err=dd_set(area2, DD_LOSTBITS, (color+olays - p->colornum2 - 1))) errprnt(dd_err(err)); } else if (p->colornum2 < color) { if (err=dd_set(area2, DD_PIX_TYPE, 1,1,1)) errprnt(dd_err(err)); if (p->colornum2 < color/3) { if (err=dd_set(area2, DD_COLOR_BANDS, 0, -1, -1)) errprnt(dd_err(err)); if (err=dd_set(area2, DD_LOSTBITS, (color/3 - p->colornum2 - 1))) errprnt(dd_err(err)); } else if (p->colornum2 < 2*color/3) { if (err=dd_set(area2, DD_COLOR_BANDS, -1, 0, -1)) errprnt(dd_err(err)); if (err=dd_set(area2, DD_LOSTBITS, (2*color/3 - p->colornum2 - 1))) errprnt(dd_err(err)); } else { if (err=dd_set(area2, DD_COLOR_BANDS, -1, -1, 0)) errprnt(dd_err(err)); if (err=dd_set(area2, DD_LOSTBITS, (color - p->colornum2 - 1))) errprnt(dd_err(err)); } } break; } }