📄 m8b_drv.c
字号:
case 4: /* zNREPz : (NOT src) */
optPtr = &RepDestM8B;
break;
case 1: /* zORz : src OR dst */
case 2: /* zXORz : src XOR dst */
case 3: /* zNANDz : (NOT src) AND dst */
case 5: /* zNORz : (NOT src) OR dst */
case 6: /* zNXORz : (NOT src) XOR dst */
case 7: /* zANDz : src AND dst */
optPtr = &OXADestM8B;
break;
case 8: /* zCLEARz : 0's */
case 12: /* zSETz : 1's */
optPtr = &SetSrcLCD;
break;
case 9: /* zORNz : src OR (NOT dst) */
case 11: /* zANDNz : src AND (NOT dst) */
case 13: /* zNORNz : (NOT src) OR (NOT dst) */
case 15: /* zNANDNz : (NOT src) AND (NOT dst) */
optPtr = &NotDestSolidM8B;
break;
case 10: /* zNOPz : dst <NOP> */
optPtr = &QuickEnd;
break;
case 14: /* zINVERTz: (NOT dst) */
optPtr = &InvertSrcLCD;
break;
}
/* modify the pen color as necessary */
switch (dstClass)
{
case 3: /* zNANDz */
case 4: /* zNREPz */
case 5: /* zNORz */
case 6: /* zNXORz */
case 13: /* zNORNz */
case 15: /* zNANDNz */
pnColr = (char)-1; /* this has the effect of notting the
pen color for all operations during this call */
case 0: /* zREPz */
case 1: /* zORz */
case 2: /* zXORz */
case 7: /* zANDz */
case 9: /* zORNz */
case 10: /* zNOPz */
case 11: /* zANDNz */
pnColr = 0;
break;
case 8: /* zCLEARz */
pnColr = 0; /* sets all source bits to 0 */
break;
case 12: /* zSETz */
case 14: /* zINVERTz */
pnColr = (char)-1; /* sets all source bits to 1 */
}
/* set up clipping */
if (Set_Up_Clip(blitRec, &cRect, blitMayOverlap, isLine))
goto WI_RTN;
dRect = *rListPtr;
/* See if the destination is too wide */
if((dRect.Xmax - dRect.Xmin) > srcImag->imWidth)
dRect.Xmax = dRect.Xmin + srcImag->imWidth;
/* sXmax not adjusted because not used */
/* See if the destination is too high */
if((dRect.Ymax - dRect.Ymin) > srcImag->imHeight)
dRect.Ymax = dRect.Ymin + srcImag->imHeight;
/* sYmax not adjusted because not used */
/* do we need to worry about clipping */
if(clipToRectFlag != 0)
{
if (dRect.Xmin < cRect.Xmin)
{ /* Reset src & dst Xmin clip limit */
sRect.Xmin -= (dRect.Xmin - cRect.Xmin);
dRect.Xmin = cRect.Xmin;
}
if (dRect.Ymin < cRect.Ymin)
{ /* Reset src & dst Ymin clip limit */
sRect.Ymin -= (dRect.Ymin - cRect.Ymin);
dRect.Ymin = cRect.Ymin;
}
if (dRect.Xmax > cRect.Xmax)
{ /* Reset src & dst Xmax clip limit */
dRect.Xmax = cRect.Xmax;
/* sXmax not altered because not used */
}
if (dRect.Ymax > cRect.Ymax)
{ /* Reset src & dst Ymax clip limit */
dRect.Ymax = cRect.Ymax;
/* sYmax not altered because not used */
}
if ((dRect.Xmin >= dRect.Xmax) || (dRect.Ymin >= dRect.Ymax))
return;
/* do we need to worry about region clipping? */
if (clipToRegionFlag != 0)
{ /* yes, go do it */
FillDrawer = &DrawRectEntryImg;
Blit_Clip_Region(blitRec, &dRect, &sRect);
goto WI_RTN;
}
}
DrawRectEntryImg(blitRec);
WI_RTN:
nuResume(dstBmap);
return;
}
/* Draw the image */
void DrawRectEntryImg(blitRcd *blitRec)
{
lineCntM1 = dRect.Ymax - dRect.Ymin - 1;
dstBgnByte = dRect.Xmin;
byteCntM1 = dRect.Xmax - dRect.Xmin - 1;
dstNextRow = dstBmap->pixBytes - byteCntM1 - 1;
srcNextRow = srcPixBytes - byteCntM1 - 1;
srcBgnByte = sRect.Xmin;
srcPtr = (byte *) (srcImag->imData + (sRect.Ymin * srcPixBytes))
+ srcBgnByte;
dstPtr = (byte *) (*(dstBmap->mapTable[0] + dRect.Ymin))
+ dstBgnByte;
optPtr(); /* blit the rectangle */
return;
}
/* Function mwWRIMMA is a special case optimization for 1->8Bit
WriteImage. */
void mwWRIMMA(blitRcd *blitRec)
{
void DrawRectEntryImg1B(blitRcd *blitRec);
int Set_Up_Clip(blitRcd *clipBlit, rect *clipR, int blitMayOverlap,
int isLine);
int Blit_Clip_Region(blitRcd *fcRec, rect *fillRect, rect *sRect);
void nuResume(grafMap *srcBmap);
void RepDest1M8B(void);
void OXADest1M8B(void);
void SetSrcLCD(void);
void NotDestSolid1M8B(void);
void InvertSrcLCD(void);
void QuickEnd(void);
/* BobB 5/6/98 - added the following functions for transparent raster ops */
void SetTrans1M8B(void);
void InvertTrans1M8B(void);
rect *rListPtr; /* list pointer */
int blitMayOverlap = 0; /* Set false for region clipping*/
int isLine = 0; /* Set false */
srcImag = (image *) blitRec->blitSmap;
if((srcImag->imWidth <= 0) || (srcImag->imHeight <= 0))
return;
sRect.Ymin = 0;
sRect.Xmin = 0;
srcPixBytes = srcImag->imBytes;
rListPtr = (rect *) blitRec->blitList;
dstBmap = blitRec->blitDmap;
/* BobB 5/6/98 - changed the following
dstClass = blitRec->blitRop & 0x0f; */
dstClass = blitRec->blitRop & 0x1f;
M_PAUSE(dstBmap);
bkColr = (char) blitRec->blitBack; /* background color */
pnColr = (char) blitRec->blitFore; /* foreground color */
switch (dstClass)
{ /* look up the optimization routine */
/* Memory non-transparent */
case 0: /* zREPz : src */
case 4: /* zNREPz : (NOT src) */
optPtr = &RepDest1M8B;
break;
case 1: /* zORz : src OR dst */
case 2: /* zXORz : src XOR dst */
case 3: /* zNANDz : (NOT src) AND dst */
case 5: /* zNORz : (NOT src) OR dst */
case 6: /* zNXORz : (NOT src) XOR dst */
case 7: /* zANDz : src AND dst */
optPtr = &OXADest1M8B;
break;
case 8: /* zCLEARz : 0's */
case 12: /* zSETz : 1's */
optPtr = &SetSrcLCD;
break;
case 9: /* zORNz : src OR (NOT dst) */
case 11: /* zANDNz : src AND (NOT dst) */
case 13: /* zNORNz : (NOT src) OR (NOT dst) */
case 15: /* zNANDNz : (NOT src) AND (NOT dst) */
optPtr = &NotDestSolid1M8B;
break;
case 10: /* zNOPz : dst <NOP> */
optPtr = &QuickEnd;
break;
case 14: /* zINVERTz: (NOT dst) */
optPtr = &InvertSrcLCD;
break;
/* BobB 5/6/98 - added the following cases */
/* Memory transparent */
case 16: /* xREPx : !0src */
case 17: /* xORx : !0src OR dst */
case 25: /* xORNx : !0src OR (NOT dst) */
case 28: /* xSETx : 1's */
optPtr = &SetTrans1M8B;
break;
case 18: /* xXORx : !0src XOR dst */
case 27: /* xANDNx : !0src AND (NOT dst) */
case 30: /* xINVERTx: (NOT dst) */
optPtr = &InvertTrans1M8B;
break;
case 19: /* xNANDx : (NOT !0src) AND dst */
case 20: /* xNREPx : (NOT !0src) */
case 21: /* xNORx : (NOT !0src) OR dst */
case 22: /* xNXORx : (NOT !0src) XOR dst */
case 23: /* xANDx : !0src AND dst */
case 24: /* xCLEARx : 0's */
case 26: /* xNOPx : dst <NOP> */
case 29: /* xNORNx : (NOT !0src) OR (NOT dst) */
case 31: /* xNANDNx : (NOT !0src) AND (NOT dst) */
optPtr = &QuickEnd;
break;
}
/* modify the pen color as necessary */
switch (dstClass)
{
case 3: /* zNANDz */
case 4: /* zNREPz */
case 5: /* zNORz */
case 6: /* zNXORz */
case 13: /* zNORNz */
case 15: /* zNANDNz */
pnColr = ~pnColr; /* this has the effect of notting the
pen color for all operations during this call */
case 0: /* zREPz */
case 1: /* zORz */
case 2: /* zXORz */
case 7: /* zANDz */
case 9: /* zORNz */
case 10: /* zNOPz */
case 11: /* zANDNz */
break;
case 8: /* zCLEARz */
pnColr = 0; /* sets all source bits to 0 */
break;
case 12: /* zSETz */
case 14: /* zINVERTz */
pnColr = (char)-1; /* sets all source bits to 1 */
/* BobB 5/6/98 - added the following for the transparent raster ops */
break;
default: /* all transparent cases */
break;
}
/* set up clipping */
if (Set_Up_Clip(blitRec, &cRect, blitMayOverlap, isLine))
goto WI1_RTN;
dRect = *rListPtr;
/* See if the destination is too wide */
if((dRect.Xmax - dRect.Xmin) > srcImag->imWidth)
dRect.Xmax = dRect.Xmin + srcImag->imWidth;
/* sXmax not adjusted because not used */
/* See if the destination is too high */
if((dRect.Ymax - dRect.Ymin) > srcImag->imHeight)
dRect.Ymax = dRect.Ymin + srcImag->imHeight;
/* sYmax not adjusted because not used */
/* do we need to worry about clipping */
if(clipToRectFlag != 0)
{
if (dRect.Xmin < cRect.Xmin)
{ /* Reset src & dst Xmin clip limit */
sRect.Xmin -= (dRect.Xmin - cRect.Xmin);
dRect.Xmin = cRect.Xmin;
}
if (dRect.Ymin < cRect.Ymin)
{ /* Reset src & dst Ymin clip limit */
sRect.Ymin -= (dRect.Ymin - cRect.Ymin);
dRect.Ymin = cRect.Ymin;
}
if (dRect.Xmax > cRect.Xmax)
{ /* Reset dst Xmax clip limit */
dRect.Xmax = cRect.Xmax;
}
if (dRect.Ymax > cRect.Ymax)
{ /* Reset dst Ymax clip limit */
dRect.Ymax = cRect.Ymax;
}
if ((dRect.Xmin >= dRect.Xmax) || (dRect.Ymin >= dRect.Ymax))
return;
/* do we need to worry about region clipping? */
if (clipToRegionFlag != 0)
{ /* yes, go do it */
FillDrawer = &DrawRectEntryImg1B;
Blit_Clip_Region(blitRec, &dRect, &sRect);
goto WI1_RTN;
}
}
DrawRectEntryImg1B(blitRec);
WI1_RTN:
nuResume(dstBmap);
return;
}
/* Function DrawRectEntryImg1B blits the image to the memory */
void DrawRectEntryImg1B(blitRcd *blitRec)
{
lineCntM1 = dRect.Ymax - dRect.Ymin - 1;
dstBgnByte = dRect.Xmin;
/* BobB 6/14/99 - added the following line to correct write addressing */
srcBgnByte = (sRect.Xmin >> 3);
byteCntM1 = dRect.Xmax - dRect.Xmin - 1;
dstNextRow = dstBmap->pixBytes - byteCntM1 - 1;
/* BobB 6/14/99 - corrected the following lines for write addressing
srcNextRow = srcPixBytes - ((byteCntM1 + 1) >> 3);
srcPtr = (byte *) (srcImag->imData); */
srcNextRow = srcPixBytes - ((sRect.Xmin + byteCntM1 + 1) >> 3)
+ srcBgnByte;
srcPtr = (byte *) (srcImag->imData + (sRect.Ymin * srcPixBytes)
+ srcBgnByte);
dstPtr = (byte *) (*(dstBmap->mapTable[0] + dRect.Ymin))
+ dstBgnByte;
optPtr(); /* blit the rectangle */
return;
}
/* Function mwRDIMA is a special case optimization for ReadImage,
8 bit per pixel, linear memory. */
void mwRDIMA(grafMap * rdiBmap, image *dstImage, int gblYmax, int gblXmax,
int gblYmin, int gblXmin)
{
void nuResume(grafMap *dstBmap);
int srcRowBytes ;/*# of bytes across a source bitmap row */
int dstRowBytes ;/* # of bytes across an dstImage row */
int cXmax,cYmax ;/* bitmap limits */
short grafErrValue;
long *srcMapTable;
int count;
gblXmax--;
gblYmax--;
M_PAUSE(rdiBmap);
srcRowBytes = rdiBmap->pixBytes; /* # of byte across the source */
srcMapTable = (long *)rdiBmap->mapTable[0]; /* store mapTable[0] pointer locally */
/* get the source bitmap's limits */
cXmax = rdiBmap->pixWidth - 1;
cYmax = rdiBmap->pixHeight - 1;
/* Initialize dstImage header and destination copy parameters */
dstImage->imFlags = 0; /* assume no span segment */
dstImage->imPlanes = 1; /* always plane # 1 */
dstImage->imBits = 8; /* 8 bits per pixel */
dstImage->imAlign = gblXmin & 1;/* set to 0 if we start an even address
and one if it is odd */
dstImage->imWidth = gblXmax - gblXmin + 1;
dstImage->imBytes = (dstImage->imWidth + dstImage->imAlign + 1) & ~1;
dstRowBytes = dstImage->imBytes;
dstPtr = (byte *)(((long) &dstImage->imData[0]) + dstImage->imAlign);
/* Calculate dstImage height in pixels */
dstImage->imHeight = gblYmax - gblYmin + 1;
if((dstImage->imWidth > 0x7FFF) || (dstImage->imHeight > 0x7FFF))
{
grafErrValue = c_ReadImag + c_OfloRect;
rdiBmap->cbPostErr(grafErrValue);
dstImage->imWidth = 0;
dstImage->imHeight = 0;
dstImage->imBytes = 0;
goto RI_RTN;
}
if((dstImage->imWidth < 0) || (dstImage->imHeight < 0))
{
grafErrValue = c_ReadImag + c_NullRect;
rdiBmap->cbPostErr(grafErrValue);
dstImage->imWidth = 0;
dstImage->imHeight = 0;
dstImage->imBytes = 0;
goto RI_RTN;
}
if((dstImage->imWidth == 0) || (dstImage->imHeight == 0))
{
dstImage->imWidth = 0;
dstImage->imHeight = 0;
dstImage->imBytes = 0;
goto RI_RTN;
}
/* Now clip to the source bitmap */
/* check that gblXmin is not off bitmap */
if(gblXmin < 0)
{
dstPtr -= gblXmin;
gblXmin = 0;
}
/* Check that gblYmin is not off bitmap */
if(gblYmin < 0)
{
dstPtr = (byte *) (((long) dstPtr) + (dstRowBytes *
(-gblYmin)));
gblYmin = 0;
}
/* Check that gblYmax is not off bitmap */
if(cYmax < gblYmax) gblYmax = cYmax;
/* Check that gblXmax is not off bitmap */
if(cXmax < gblXmax) gblXmax = cXmax;
/* Now set the horizontal and vertical */
byteCntM1 = (gblXmax - gblXmin);
if(byteCntM1 < 0) goto RI_RTN;
lineCntM1 = (gblYmax - gblYmin);
if(lineCntM1 < 0) goto RI_RTN;
/*Set the offset from the end of one dstImage row to the start of the next */
/* BobB 5/26/99 - corrected the following line for the pointer.
dstNextRow = dstRowBytes - byteCntM1; */
dstNextRow = dstRowBytes - byteCntM1 - 1;
/*Set offset from the end of one source rectangle row to the start
of the next */
/* BobB 5/26/99 - corrected the following line for the pointer.
srcNextRow = srcRowBytes - byteCntM1; */
srcNextRow = srcRowBytes - byteCntM1 - 1;
/* point to row table entry for the first row */
srcPtr = (byte *) *(srcMapTable + gblYmin) + gblXmin;
do{
for(count = 0; count <= byteCntM1; count++)
{
*dstPtr++ = *srcPtr++;
}
dstPtr += dstNextRow;
srcPtr += srcNextRow;
}while(--lineCntM1 >= 0);
RI_RTN:
nuResume(rdiBmap);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -