// EPX3 scaled down to 2X void RenderEPXC(unsigned char *src, unsigned int srcpitch, unsigned char *dst, unsigned int dstpitch, int nWidth, int nHeight, int vidDepth) { // E D H // A X C // F B G #define DrawPix(on00,on01,on10,on11) /* on00 on01 */ \ { /* on10 on11 */ \ if ((((on00||on10)?colorA:colorX) != ((on01||on11)?colorC:colorX)) \ && (((on10||on11)?colorB:colorX) != ((on00||on01)?colorD:colorX))) \ { \ const bool XnE = colorX != colorE; \ const bool XnF = colorX != colorF; \ const bool XnG = colorX != colorG; \ const bool XnH = colorX != colorH; \ const bool DA = on00 && colorD == colorA && (XnE || XnG || colorD != colorH || colorA != colorF); \ const bool AB = on10 && colorA == colorB && (XnF || XnH || colorA != colorE || colorB != colorG); \ const bool BC = on11 && colorB == colorC && (XnG || XnE || colorB != colorF || colorC != colorH); \ const bool CD = on01 && colorC == colorD && (XnH || XnF || colorC != colorG || colorD != colorE); \ if (!on00||!on01||!on10||!on11 || ((colorA != colorC) && (colorB != colorD) && \ ((colorX == colorA) || (colorX==colorB) || (colorX==colorC) || (colorX==colorD) || (colorX==colorE) || (colorX==colorF) || (colorX==colorG) || (colorX==colorH)))) \ { \ const uint16 colorAA = on00&&on10 && ((DA && XnF) || (AB && XnE)) ? colorA : colorX; \ const uint16 colorBB = on10&&on11 && ((AB && XnG) || (BC && XnF)) ? colorB : colorX; \ const uint16 colorCC = on01&&on11 && ((BC && XnH) || (CD && XnG)) ? colorC : colorX; \ const uint16 colorDD = on00&&on01 && ((CD && XnE) || (DA && XnH)) ? colorD : colorX; \ *dP1++ = _TWO_PIX(Interp44(on00 && DA ? colorA : colorX, colorDD, colorAA, colorX), Interp44(on01 && CD ? colorC : colorX, colorBB, colorCC, colorX)); \ *dP2++ = _TWO_PIX(Interp44(on10 && AB ? colorA : colorX, colorAA, colorBB, colorX), Interp44(on11 && BC ? colorC : colorX, colorCC, colorDD, colorX)); \ } else { \ *dP1++ = _TWO_PIX(Interp01(colorX, on00 && DA && (colorX!=colorB&&colorX!=colorC) ? colorA : colorX), Interp01(colorX, on01 && CD && (colorX!=colorA&&colorX!=colorB) ? colorC : colorX)); \ *dP2++ = _TWO_PIX(Interp01(colorX, on10 && AB && (colorX!=colorC&&colorX!=colorD) ? colorA : colorX), Interp01(colorX, on11 && BC && (colorX!=colorD&&colorX!=colorA) ? colorC : colorX)); \ } \ } else { \ *dP1++ = _TWO_PIX(colorX, colorX); \ *dP2++ = _TWO_PIX(colorX, colorX); \ } \ } if(vidDepth == 32) { #define _TWO_PIX TWO_PIX_32 DrawInit(2,uint64); DrawRows(2,1); // 2x scale, and diags is on since we do use all 8 surrounding pixels #undef _TWO_PIX } else { #define _TWO_PIX TWO_PIX DrawInit(2,uint32); DrawRows(2,1); // 2x scale, and diags is on since we do use all 8 surrounding pixels #undef _TWO_PIX } #undef DrawPix }
// code for improved 2X EPX, which tends to do better with diagonal edges than regular EPX void RenderEPXB(unsigned char *src, unsigned int srcpitch, unsigned char *dst, unsigned int dstpitch, int nWidth, int nHeight, int vidDepth) { // E D H // A X C // F B G #define DrawPix(on00,on01,on10,on11) /* on00 on01 */ \ { /* on10 on11 */ \ if ((((on00||on10)?colorA:colorX) != ((on01||on11)?colorC:colorX)) \ && (((on10||on11)?colorB:colorX) != ((on00||on01)?colorD:colorX)) \ && ((!on00||!on01||!on10|!on11) || \ ((colorX == colorA) || (colorX == colorB) || (colorX == colorC) || (colorX == colorD) || /* diagonal */ \ (((colorE != colorG) || (colorX == colorF) || (colorX == colorH)) && /* edge */ \ ((colorF != colorH) || (colorX == colorE) || (colorX == colorG)))))) /* smoothing */ \ { \ *dP1++ = _TWO_PIX((on00 && colorD == colorA && (colorX != colorE || colorX != colorG || colorD != colorH || colorA != colorF)) ? colorD : colorX, \ (on01 && colorC == colorD && (colorX != colorH || colorX != colorF || colorC != colorG || colorD != colorE)) ? colorC : colorX); \ *dP2++ = _TWO_PIX((on10 && colorA == colorB && (colorX != colorF || colorX != colorH || colorA != colorE || colorB != colorG)) ? colorA : colorX, \ (on11 && colorB == colorC && (colorX != colorG || colorX != colorE || colorB != colorF || colorC != colorH)) ? colorB : colorX); \ } else { \ *dP1++ = _TWO_PIX(colorX, colorX); \ *dP2++ = _TWO_PIX(colorX, colorX); \ } \ } // again, this supports 32-bit or 16-bit rendering if(vidDepth == 32) { #define _TWO_PIX TWO_PIX_32 DrawInit(2,uint64); DrawRows(2,1); // 2x scale, and diags is on since we do use all 8 surrounding pixels #undef _TWO_PIX } else { #define _TWO_PIX TWO_PIX DrawInit(2,uint32); DrawRows(2,1); // 2x scale, and diags is on since we do use all 8 surrounding pixels #undef _TWO_PIX } #undef DrawPix }
void CPhylogenView::CallBackFromSeq(CObject *pPSB) { switch ( m_CallBackSwitch ) { case CB_DRAWROWS: DrawRows(m_DrawpDC, pPSB ); break; case CB_GETMAX: GetPhyloGenMax( pPSB ); break; } }
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ void CDrawer::DrawList () { AllocRowsColumns(); DrawRows(); DrawColumns(); }