You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
6.6 KiB
240 lines
6.6 KiB
//
|
|
// fuimg2.c
|
|
//
|
|
// September.3,1997 H.Ishida (FPL)
|
|
// fuxlers.dll (NT5.0 MiniDriver)
|
|
//
|
|
// Aug.2,1996 H.Ishida(FPL)
|
|
// FJXL.DLL (NT4.0 MiniDriver)
|
|
//
|
|
// COPYRIGHT(C) FUJITSU LIMITED 1996-1997
|
|
|
|
#include "fuxl.h"
|
|
#include "fuimg2.h"
|
|
|
|
//
|
|
// Win-F RTGIMG2 output routine
|
|
// RTGIMG2:
|
|
// GS<\x1D> + P1<\x30> + Space<\x20> + a<\x61>
|
|
// + Pc + Pxh + Pxl + Pyh + Pyl + Pyh + D1 + ... + D64
|
|
// { + D1 + ... + D64 } + Pc
|
|
//
|
|
// P1 must be 30(hex)
|
|
//
|
|
// Pc: number of the following block.
|
|
// if Pc is 0, terminate RTGIMG2.
|
|
//
|
|
// Pxl, Pxh, Pyl, Pyh: coordinate of the following block.
|
|
// it must be a multiple of 32.
|
|
//
|
|
// X->
|
|
// <-- 16dot -->
|
|
// 1 8 9 16
|
|
// +--------+--------+
|
|
// | D1 | D2 |
|
|
// +--------+--------+ ^
|
|
// | | D3 | D4 | |
|
|
// v +--------+--------+ |
|
|
// Y . . . 16dot
|
|
// . . . |
|
|
// . . . |
|
|
// +--------+--------+ v
|
|
// | D63 | D64 |
|
|
// +--------+--------+
|
|
// White dot:0 Black dot:1
|
|
//
|
|
|
|
|
|
|
|
|
|
const UINT MAX_BLOCK = 255;
|
|
const UINT CB_RTGIMG2HEADER = 5;
|
|
const UINT CB_RTGIMG2BLOCK = 64;
|
|
const UINT IDX_BLOCK_COUNTER = 0;
|
|
|
|
|
|
//
|
|
// LPBYTE fuxlRtgimg2OutputData(
|
|
// PDEVOJB pdevobj // MINI5 data
|
|
// LPBYTE lpbDst, // address of data to be output(spool).
|
|
// UINT x, // x-coordinate
|
|
// UINT y, // y-coordinate
|
|
// UINT uTmp // 00h: entire block is white. otherwise block is not white.
|
|
// );
|
|
//
|
|
// Output RTGIMG2 block to spool.
|
|
//
|
|
// Return value:
|
|
// address of next block to be stored.
|
|
//
|
|
static LPBYTE fuxlRtgimg2OutputData(PDEVOBJ pdevobj, LPBYTE lpbDst, UINT x, UINT y, UINT uTmp)
|
|
{
|
|
if(uTmp == 0){
|
|
// entire block is white.
|
|
// igonre this block. flush blocks in buffer.
|
|
if(lpbDst[IDX_BLOCK_COUNTER] > 0){
|
|
WRITESPOOLBUF(pdevobj,
|
|
lpbDst,
|
|
lpbDst[IDX_BLOCK_COUNTER] * CB_RTGIMG2BLOCK + CB_RTGIMG2HEADER);
|
|
lpbDst[IDX_BLOCK_COUNTER] = 0;
|
|
}
|
|
}
|
|
else {
|
|
if(lpbDst[IDX_BLOCK_COUNTER] == 0){
|
|
// first block, in buffer, needs its coordinate.
|
|
lpbDst[1] = HIBYTE((WORD)x); // Pxh
|
|
lpbDst[2] = LOBYTE((WORD)x); // Pxl
|
|
lpbDst[3] = HIBYTE((WORD)y); // Pyh
|
|
lpbDst[4] = LOBYTE((WORD)y); // Pyl
|
|
}
|
|
lpbDst[IDX_BLOCK_COUNTER]++;
|
|
if(lpbDst[IDX_BLOCK_COUNTER] >= MAX_BLOCK){
|
|
WRITESPOOLBUF(pdevobj,
|
|
lpbDst,
|
|
lpbDst[IDX_BLOCK_COUNTER] * CB_RTGIMG2BLOCK + CB_RTGIMG2HEADER);
|
|
lpbDst[IDX_BLOCK_COUNTER] = 0;
|
|
}
|
|
}
|
|
// return pointer for the address, next block will be stored.
|
|
return lpbDst + lpbDst[IDX_BLOCK_COUNTER] * CB_RTGIMG2BLOCK + CB_RTGIMG2HEADER;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// void FuxlOutputRTGIMG2(
|
|
// PDEVOBJ pdevobj, // MINI5 data
|
|
// LPCBYTE lpBuf, // address of image
|
|
// UINT bxSrc, // width of image (in byte)
|
|
// UINT y, // y-coordinate
|
|
// UINT cy // height of image (scanline)
|
|
// );
|
|
//
|
|
// Convert image to RTGIMG2 command sequence, and spool.
|
|
//
|
|
//
|
|
// Souce image data:
|
|
//
|
|
// | <-------------------- bxSrc ----------------------> |
|
|
// lpBuf ->*--------+--------+--------+--------+--------+--------+---
|
|
// | | | | | | | ^
|
|
// +--------+--------+--------+--------+--------+--------+ |
|
|
// | | | | | | | cy
|
|
// +--------+--------+--------+--------+--------+--------+ |
|
|
// | | | | | | | |
|
|
// +--------+--------+--------+--------+--------+--------+ |
|
|
// | | | | | | | v
|
|
// +--------+--------+--------+--------+--------+--------+---
|
|
//
|
|
// coordinate of '*' (left-top of image) is (0, y)
|
|
// white dot:0
|
|
// black dot:1
|
|
//
|
|
//
|
|
void fuxlOutputRTGIMG2(PDEVOBJ pdevobj, LPCBYTE lpBuf, UINT bxSrc, UINT y, UINT cy)
|
|
{
|
|
LPCBYTE lpbSrc;
|
|
LPBYTE lpbDst;
|
|
LPCBYTE lpbTmpSrc;
|
|
LPBYTE lpbTmpDst;
|
|
UINT uTmp;
|
|
UINT x;
|
|
UINT i, j, ii;
|
|
|
|
lpbDst = (LPBYTE)MemAllocZ(CB_RTGIMG2HEADER + MAX_BLOCK * CB_RTGIMG2BLOCK);
|
|
if(lpbDst == NULL)
|
|
return;
|
|
|
|
WRITESPOOLBUF(pdevobj, "\x1D\x30\x20\x61", 4); // RTGIMG2 start
|
|
|
|
lpbSrc = lpBuf;
|
|
lpbDst[0] = 0; // Pc
|
|
lpbDst[1] = 0; // Pxl
|
|
lpbDst[2] = 0; // Pxh
|
|
lpbDst[3] = 0; // Pyl
|
|
lpbDst[4] = 0; // Pyh
|
|
lpbTmpDst = &lpbDst[CB_RTGIMG2HEADER];
|
|
|
|
for(i = cy; i >= 32; i -= 32){
|
|
x = 0;
|
|
for(j = bxSrc; j >= 2; j -= 2){
|
|
lpbTmpSrc = lpbSrc;
|
|
uTmp = 0;
|
|
for(ii = 32; ii > 0; --ii){
|
|
uTmp |= lpbTmpSrc[0];
|
|
*lpbTmpDst++ = lpbTmpSrc[0];
|
|
uTmp |= lpbTmpSrc[1];
|
|
*lpbTmpDst++ = lpbTmpSrc[1];
|
|
lpbTmpSrc += bxSrc;
|
|
}
|
|
lpbTmpDst = fuxlRtgimg2OutputData(pdevobj, lpbDst, x, y, uTmp);
|
|
x += 16;
|
|
lpbSrc += 2;
|
|
}
|
|
if(j > 0){
|
|
// right edge of image
|
|
// j must be 1.
|
|
lpbTmpSrc = lpbSrc;
|
|
uTmp = 0;
|
|
for(ii = 32; ii > 0; --ii){
|
|
uTmp |= lpbTmpSrc[0];
|
|
*lpbTmpDst++ =lpbTmpSrc[0];
|
|
*lpbTmpDst++ = 0; // padding for right side
|
|
lpbTmpSrc += bxSrc;
|
|
}
|
|
lpbTmpDst = fuxlRtgimg2OutputData(pdevobj, lpbDst, x, y, uTmp);
|
|
lpbSrc++;
|
|
}
|
|
// flush buffer
|
|
lpbTmpDst = fuxlRtgimg2OutputData(pdevobj, lpbDst, x, y, 0);
|
|
lpbSrc += bxSrc * 31;
|
|
y += 32;
|
|
}
|
|
if(i > 0){
|
|
// bottom edge of image
|
|
x = 0;
|
|
for(j = bxSrc; j >= 2; j -= 2){
|
|
lpbTmpSrc = lpbSrc;
|
|
uTmp = 0;
|
|
for(ii = i; ii > 0; --ii){
|
|
uTmp |= lpbTmpSrc[0];
|
|
*lpbTmpDst++ = lpbTmpSrc[0];
|
|
uTmp |= lpbTmpSrc[1];
|
|
*lpbTmpDst++ = lpbTmpSrc[1];
|
|
lpbTmpSrc += bxSrc;
|
|
}
|
|
for(ii = 32 - i; ii > 0; --ii){
|
|
*lpbTmpDst++ = 0; // padding for bottom lines
|
|
*lpbTmpDst++ = 0; // padding for bottom lines
|
|
}
|
|
lpbTmpDst = fuxlRtgimg2OutputData(pdevobj, lpbDst, x, y, uTmp);
|
|
x += 16;
|
|
lpbSrc += 2;
|
|
}
|
|
if(j > 0){
|
|
// right-bottom corner of image
|
|
// j must be 1.
|
|
lpbTmpSrc = lpbSrc;
|
|
uTmp = 0;
|
|
for(ii = i; ii > 0; --ii){
|
|
uTmp |= lpbTmpSrc[0];
|
|
*lpbTmpDst++ = lpbTmpSrc[0];
|
|
*lpbTmpDst++ = 0; // padding for right side
|
|
lpbTmpSrc += bxSrc;
|
|
}
|
|
for(ii = 32 - i ; ii > 0; --ii){
|
|
*lpbTmpDst++ = 0; // padding for bottom lines
|
|
*lpbTmpDst++ = 0; // padding for bottom lines
|
|
}
|
|
lpbTmpDst = fuxlRtgimg2OutputData(pdevobj, lpbDst, x, y, uTmp);
|
|
}
|
|
// flush buffer
|
|
lpbTmpDst = fuxlRtgimg2OutputData(pdevobj, lpbDst, x, y, 0);
|
|
}
|
|
WRITESPOOLBUF(pdevobj, "\x00", 1); // RTGIMG2 terminate
|
|
MemFree(lpbDst);
|
|
}
|
|
|
|
|
|
// end of fuimg2.c
|
|
|