/* C-language Transfer routine for EpsonX driver. */ #include <exec/types.h> #include <devices/printer.h> #include <devices/prtbase.h> #include <devices/prtgfx.h> Transfer(PInfo, y, ptr, colors, BufOffset) struct PrtInfo *PInfo; UWORD y; /* row # */ UBYTE *ptr; /* ptr to buffer */ UWORD *colors; /* indexes to color buffers */ ULONG BufOffset; /* used for interleaved printing */ { extern struct PrinterData *PD; extern struct PrinterExtendedData *PED; static UWORD bit_table[8] = {128, 64, 32, 16, 8, 4, 2, 1}; union colorEntry *ColorInt; UBYTE *bptr, *yptr, *mptr, *cptr, Black, Yellow, Magenta, Cyan; UBYTE *dmatrix, dvalue, threshold; UWORD x, width, sx, *sxptr, color, bit, x3; /* printer non-specific, MUST DO FOR EVERY PRINTER */ x = PInfo->pi_xpos; ColorInt = PInfo->pi_ColorInt; sxptr = PInfo->pi_ScaleX; width = PInfo->pi_width; /* printer specific */ if (PED->ped_YDotsInch == 216) { BufOffset *= y % 3; y /= 3; } else if (PED->ped_YDotsInch == 144) { BufOffset *= y & 1; y /= 2; } else { BufOffset = 0; } bit = bit_table[y & 7]; bptr = ptr + colors[0] + BufOffset; yptr = ptr + colors[1] + BufOffset; mptr = ptr + colors[2] + BufOffset; cptr = ptr + colors[3] + BufOffset; /* pre-compute threshold; are we thresholding? */ if (threshold = PInfo->pi_threshold) { /* thresholding */ dvalue = threshold ^ 15; bptr += x; do { /* for all source pixels */ /* pre-compute intensity values for Black component */ Black = ColorInt->colorByte[PCMBLACK]; ColorInt++; sx = *sxptr++; do { /* use this pixel 'sx' times */ if (Black > dvalue) { *bptr |= bit; } bptr++; /* done 1 more printer pixel */ } while (--sx); } while (--width); } else { /* not thresholding, pre-compute ptr to dither matrix */ dmatrix = PInfo->pi_dmatrix + ((y & 3) << 2); if (PD->pd_Preferences.PrintShade == SHADE_GREYSCALE) { do { /* for all source pixels */ /* pre-compute intensity values for Black */ Black = ColorInt->colorByte[PCMBLACK]; ColorInt++; sx = *sxptr++; do { /* use this pixel 'sx' times */ if (Black > dmatrix[x & 3]) { *(bptr + x) |= bit; } x++; /* done 1 more printer pixel */ } while (--sx); } while (--width); } else { /* color */ do { /* for all source pixels */ /* compute intensity values for each color */ Black = ColorInt->colorByte[PCMBLACK]; Yellow = ColorInt->colorByte[PCMYELLOW]; Magenta = ColorInt->colorByte[PCMMAGENTA]; Cyan = ColorInt->colorByte[PCMCYAN]; ColorInt++; sx = *sxptr++; do { /* use this pixel 'sx' times */ x3 = x >> 3; dvalue = dmatrix[x & 3]; if (Black > dvalue) { *(bptr + x) |= bit; } else { /* black not rendered */ if (Yellow > dvalue) { *(yptr + x) |= bit; } if (Magenta > dvalue) { *(mptr + x) |= bit; } if (Cyan > dvalue) { *(cptr + x) |= bit; } } ++x; /* done 1 more printer pixel */ } while (--sx); } while (--width); } } }