Files
core/ASCImageStudio3/ASCGraphics/Common/Pixels.h

251 lines
6.1 KiB
C++

#pragma once
#include "..\stdafx.h"
#include "..\VectorGraphics\STypes.h"
#include "..\VectorGraphics\MemoryUtils.h"
#include "..\Interfaces\IASCPattern.h"
#include "..\..\..\Common\ASCUtils.h"
class CPixels
{
public:
BYTE* m_pPixels;
SColorMode m_eMode;
LONG m_lStride;
LONG m_lPitch;
LONG m_lLeft;
LONG m_lTop;
LONG m_lWidth;
LONG m_lHeight;
BYTE* m_pAlpha; // Óêàçàòåëü íà íà÷àëî äàííûõ àëüôà êàíàëà (íå çàâèñèò îò flip)
// èñïîëüçóåòñÿ òîëüêî äëÿ colorspaces, íå ñîäåðæàùèõ àëüôó
LONG m_lPitchAlpha;
private:
BOOL m_bIsDestroy;
public:
CPixels()
{
m_bIsDestroy = FALSE;
m_pPixels = NULL;
m_pAlpha = NULL;
}
CPixels(BYTE* pPixels, LONG nWidth, LONG nHeight, LONG nRowPad = 0, SColorMode eMode = colorModeBGRA8, BOOL bAlpha = FALSE, LONG lPitch = 0, BOOL bTopDown = TRUE)
{
//Release();
Create(pPixels, nWidth, nHeight, nRowPad, eMode, bAlpha, lPitch, bTopDown);
}
~CPixels()
{
Release();
}
void Release()
{
if (m_bIsDestroy)
{
RELEASEARRAYOBJECTS(m_pPixels);
}
RELEASEARRAYOBJECTS(m_pAlpha);
}
void Create(BYTE* pPixels, LONG nWidth = 0, LONG nHeight = 0, LONG nRowPad = 0, SColorMode eMode = colorModeBGRA8, BOOL bAlpha = FALSE, LONG lPitch = 0, BOOL bTopDown = TRUE, BOOL bIsPixOffset = FALSE)
{
m_lWidth = nWidth;
m_lHeight = nHeight;
m_eMode = eMode;
m_lPitchAlpha = lPitch;
switch ( m_eMode )
{
case colorModeMono1:
m_lStride = ( m_lWidth + 7 ) >> 3;
m_lPitch = ( m_lPitchAlpha + 7) >> 3;
break;
case colorModeMono8:
m_lStride = m_lWidth;
m_lPitch = m_lPitchAlpha;
break;
case colorModeRGB8:
case colorModeBGR8:
m_lStride = m_lWidth * 3;
m_lPitch = m_lPitchAlpha * 3;
break;
case colorModeBGRA8:
case colorModeRGBA8:
m_lStride = m_lWidth * 4;
m_lPitch = m_lPitchAlpha * 4;
bAlpha = FALSE;
break;
}
m_lStride += nRowPad - 1;
m_lStride -= m_lStride % nRowPad;
if (NULL == pPixels)
{
m_pPixels = (BYTE*)MemUtilsMalloc( m_lStride * m_lHeight );
m_bIsDestroy = TRUE;
}
else
{
m_pPixels = pPixels;
m_bIsDestroy = FALSE;
}
if ( !bTopDown )
{
if (!bIsPixOffset)
{
m_pPixels += ( m_lHeight - 1 ) * m_lStride;
}
m_lStride = -m_lStride;
m_lPitch = -m_lPitch;
}
if ( bAlpha )
{
m_pAlpha = (BYTE*)MemUtilsMalloc( m_lWidth * m_lHeight );
}
else
{
m_pAlpha = NULL;
}
}
public:
void GetPixel(int nX, int nY, SColorPointer pPixel)
{
SColorPointer pColor = NULL;
if ( nY < 0 || nY >= m_lHeight || nX < 0 || nX >= m_lWidth )
{
return;
}
LONG lStride = m_lStride + m_lPitch;
switch (m_eMode)
{
case colorModeMono1:
lStride += (m_lPitch + 7) >> 3;
pColor = &m_pPixels[nY * lStride + (nX >> 3)];
pPixel[0] = (pColor[0] & (0x80 >> (nX & 7))) ? 0xff : 0x00;
break;
case colorModeMono8:
pColor = &m_pPixels[nY * lStride + nX];
pPixel[0] = pColor[0];
break;
case colorModeRGB8:
pColor = &m_pPixels[nY * lStride + 3 * nX];
pPixel[0] = pColor[0];
pPixel[1] = pColor[1];
pPixel[2] = pColor[2];
break;
case colorModeBGR8:
pColor = &m_pPixels[nY * lStride + 3 * nX];
pPixel[0] = pColor[2];
pPixel[1] = pColor[1];
pPixel[2] = pColor[0];
break;
case colorModeRGBA8:
pColor = &m_pPixels[nY * lStride + 4 * nX];
pPixel[0] = pColor[2];
pPixel[1] = pColor[1];
pPixel[2] = pColor[0];
break;
case colorModeBGRA8:
pColor = &m_pPixels[nY * lStride + 4 * nX];
pPixel[0] = pColor[2];
pPixel[1] = pColor[1];
pPixel[2] = pColor[0];
pPixel[3] = pColor[3];
break;
}
}
};
struct SPipe
{
int nX; // Êîîðäèíàòû
int nY; //
IAVSPattern* pPattern; // Source Pattern
double dAlphaInput; //
BOOL bUsesShape; //
unsigned char unAlphaSrc; // Source Alpha
SColorPointer pColorSrc; // Source Color
SColor arrColorSrcVal; //
unsigned char* pAlpha0; // Àëüôà-êàíàë äëÿ Non-isolated ãðóïï
SColorPointer pSMask; // Soft Mask
SColorPointer pColorDst; // Destination Color
int nColorMaskDst; // Destination Color Mask
unsigned char* pAlphaDst; // Destination Alpha
double dShape; // Shape
BOOL bNoTransparency; //
int nNonIsolatedGroup;// Non-isolated group correction
SPipeResultColorCtrl eResultColorCtrl;
};
class CGlyph
{
public:
int nX; // Ñäâèã ïî X íà÷àëüíîé òî÷êè äëÿ ðèñîâàíèÿ ñèìâîëà
int nY; // Ñäâèã ïî Y íà÷àëüíîé òî÷êè äëÿ ðèñîâàíèÿ ñèìâîëà
int nWidth; // Øèðèíà ñèìâîëà
int nHeight; // Âûñîòà ñèìâîëà
BOOL bAA; // Anti-aliased: True îçíà÷àåò, ÷òî Bitmap 8-áèòíûé(ò.å. ñ àëüôîé); False - Bitmap 1-áèòíûé
unsigned char *pData; // Bitmap data(êàðòèíêà ñ ñèìâîëîì)
BOOL bFreeData; // True, åñëè ïàìÿòü â pData íóæíî îñâîáîäèòü
};
class CState
{
public:
double m_arrdMatrix[6];
double m_dStrokeAlpha;
double m_dLineWidth;
int m_nLineCap;
int m_nLineJoin;
double m_dMiterLimit;
double m_dFlatness;
double *m_pdLineDash;
int m_nLineDashCount;
double m_dLineDashPhase;
BOOL m_bStrokeAdjust;
};
//-------------------------------------------------------------------------------------------------------------------------------
// Line cap
//-------------------------------------------------------------------------------------------------------------------------------
//#define LineCapButt 0
//#define LineCapRound 1
//#define LineCapProjecting 2
//
////-------------------------------------------------------------------------------------------------------------------------------
//// Line join
////-------------------------------------------------------------------------------------------------------------------------------
//
//#define LineJoinMiter 0
//#define LineJoinRound 1
//#define LineJoinBevel 2