Transfer() dithers and renders an entire row of pixels passed to it by the Render() function. When Transfer() gets called, it is passed 5 parameters: Parameters: PInfo - a pointer to a PrtInfo structure y - the row number ptr - a pointer to the buffer colors - a pointer to the color buffers BufOffset - the buffer offset for interleaved printing. The dithering process of Transfer() might entail thresholding, grey-scale dithering, or color-dithering each destination pixel. If PInfo->pi_threshold is non-zero, then the dither value is: PInfo->pi_threshold \^15 If PInfo->pi_threshold is zero, then the dither value is computed by: *(PInfo->pi_dmatrix + ((y & 3) * 2) + (x & 3)) where x is initialized to PInfo->pi_xpos and is incremented for each of the destination pixels. Since the printer device uses a 4x4 dither matrix, you must calculate the dither value exactly as given above. Otherwise, your driver will be non-standard and the results will be unpredictable. The Transfer() function renders by putting a pixel in the print buffer based on the dither value. If the intensity value for the pixel is greater than the dither value as computed above, then the pixel should be put in the print buffer. If it is less than, or equal to the dither value, it should be skipped to process the next pixel. Printer Type of Color Class Dithering Rendering logic ----------- --------- --------------- PCC_BW Thresholding Test the black value against the threshold value to see if you should render a black pixel. Grey Scale Test the black value against the dither value to see if you should render a black pixel. Color NA PCC_YMC Thresholding Test the black value against the threshold value to see if you should render a black pixel. Print yellow, magenta and cyan pixel to make black. Grey Scale Test the black value against the dither value to see if you should render a black pixel. Print yellow, magenta and cyan pixel to make black. Color Test the yellow value against the dither value to see if you should render a yellow pixel. Repeat this process for magenta and cyan. PCC_YMCB Thresholding Test the black value against the threshold value to see if you should render a black pixel. Grey Scale Test the black value against the dither value to see if you should render a black pixel. Color Test the black value against the dither value to see if you should render a black pixel. If black is not rendered, then test the yellow value against the dither value to see if you should render a yellow pixel. Repeat this process for magenta and cyan. (See the EpsonX_transfer.c file) PCC_YMC_BW Thresholding Test the black value against the threshold value to see if you should render a black pixel. Grey Scale Test the black value against the dither value to see if you should render a black pixel. Color Test the yellow value against the dither value to see if you should render a yellow pixel. Repeat this process for magenta and cyan. In general, if black is rendered for a specific printer dot, then the YMC values should be ignored, since the combination of YMC is black. It is recommended that the printer buffer be constructed so that the order of colors printed is yellow, magenta, cyan and black, to prevent smudging and minimize color contamination on ribbon color printers. The example transfer.c files are provided in C for demonstration only. Writing this module in assembler can cut the time needed for a graphic dump in half. The EpsonX transfer.asm file is an example of this.