亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fonttext.h

?? Windows 圖形編程 書籍
?? H
字號:
#pragma once

//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : fonttext.h				                                             //
//  Description: Font &  text routines and classes                                   //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

// convert point size to logical coordinate space size
int PointSizetoLogical(HDC hDC, int points, int divisor=1);

// Create a font as large as EM square size for accurate metrics
HFONT CreateReferenceFont(HFONT hFont, int & emsquare);

// justify text string within a left..right margin
BOOL TextOutJust(HDC hDC, int left, int right, int y, LPCTSTR lpStr, int nCount, bool bAllowNegative=false, TCHAR cBreakChar=' ');


// ABC extent of a text string
// ( A0, B0, C0 ) + ( A1, B1, C1 ) = ( A0, B0+C0+A1+B1, C1 }
BOOL GetTextABCExtent(HDC hDC, LPCTSTR lpString, int cbString, long * pHeight, ABC * pABC);

BOOL GetOpaqueBox(HDC hDC, LPCTSTR lpString, int cbString, RECT * pRect, int x, int y);

// Pixel-level precise text alignment
BOOL PreciseTextOut(HDC hDC, int x, int y, LPCTSTR lpString, int cbString);


class KLogFont
{
public:
	LOGFONT m_lf;

	KLogFont(int height, const TCHAR * typeface=NULL)
	{
		m_lf.lfHeight         = height;
		m_lf.lfWidth          = 0;
		m_lf.lfEscapement     = 0;
		m_lf.lfOrientation    = 0;
		m_lf.lfWeight         = FW_NORMAL;
		m_lf.lfItalic         = FALSE;
		m_lf.lfUnderline      = FALSE;
		m_lf.lfStrikeOut      = FALSE;
		m_lf.lfCharSet        = ANSI_CHARSET;
		m_lf.lfOutPrecision   = OUT_TT_PRECIS;
		m_lf.lfClipPrecision  = CLIP_DEFAULT_PRECIS;
		m_lf.lfQuality        = DEFAULT_QUALITY;
		m_lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;

		if ( typeface )
			_tcsncpy(m_lf.lfFaceName, typeface, LF_FACESIZE-1);
		else
			m_lf.lfFaceName[0] = 0;
	}

	HFONT CreateFont(void)
	{
		return ::CreateFontIndirect(& m_lf);
	}

	int GetObject(HFONT hFont)
	{
		return ::GetObject(hFont, sizeof(m_lf), & m_lf);
	}
};


template <int maxlength>
class KPlacement
{
public:
	GCP_RESULTS m_gcp;

	TCHAR		m_strOut[maxlength];
	int			m_dx    [maxlength];
	unsigned	m_order [maxlength];
	int			m_caret [maxlength];
	char		m_class [maxlength];
	WORD		m_glyphs[maxlength];

	DWORD GetPlacement(HDC hDC, const TCHAR * mess, DWORD flags=0, int maxextent=0)
	{
		memset(&m_gcp, 0, sizeof(m_gcp));
	
		m_gcp.lStructSize = sizeof(GCP_RESULTS);
		m_gcp.lpOutString = m_strOut;
		m_gcp.lpOrder     = m_order;
		m_gcp.lpDx        = m_dx;
		m_gcp.lpCaretPos  = m_caret;
		m_gcp.lpClass     = m_class;
		m_gcp.lpGlyphs    = m_glyphs;
		m_gcp.nGlyphs     = maxlength;

		return GetCharacterPlacement(hDC, mess, _tcslen(mess), maxextent, & m_gcp, flags);
	}

	BOOL GlyphTextOut(HDC hDC, int x, int y)
	{
		return ExtTextOut(hDC, x, y, ETO_GLYPH_INDEX, NULL, (LPCTSTR) m_glyphs, m_gcp.nGlyphs, m_dx);
	}
};


class KKerningPair
{
public:
	KERNINGPAIR * m_pKerningPairs;
	int			  m_nPairs;

	KKerningPair(HDC hDC)
	{
		m_nPairs = GetKerningPairs(hDC, 0, NULL);

		if ( m_nPairs==0 )
			m_pKerningPairs = NULL;
		else
		{
			m_pKerningPairs = new KERNINGPAIR[m_nPairs];
			assert(m_pKerningPairs);

			GetKerningPairs(hDC, m_nPairs, m_pKerningPairs);
		}
	}

	int GetKerning(TCHAR first, TCHAR second)
	{
		for (int i=0; i<m_nPairs; i++)
			if ( (m_pKerningPairs[i].wFirst ==first) && 
				 (m_pKerningPairs[i].wSecond==second) )
				 return m_pKerningPairs[i].iKernAmount;

		return 0;
	}

	~KKerningPair(void)
	{
		if ( m_pKerningPairs )
		{
			delete m_pKerningPairs;
			m_pKerningPairs = NULL;
		}
	}
};


class KGlyph
{
public:
	GLYPHMETRICS  m_metrics;
	BYTE *        m_pPixels;
	DWORD		  m_nAllocSize;
	DWORD		  m_nDataSize;
	int			  m_uFormat;

	KGlyph()
	{
		m_pPixels = NULL;
	}

	~KGlyph(void);

	DWORD GetGlyph(HDC hDC, UINT uChar, UINT uFormat, const MAT2 * pMat2=NULL);
	
	BOOL  DrawGlyphROP(HDC HDC, int x, int y, DWORD rop, COLORREF crBack, COLORREF crFore);
	BOOL  DrawGlyph(HDC HDC, int x, int y, int & dx, int & dy);
};


template <int MAX_POINTS>
class KGlyphOutline
{
public:
	POINT m_Point[MAX_POINTS];
	BYTE  m_Flag [MAX_POINTS];

	int   m_nPoints;

private:
	void AddPoint(int x, int y, BYTE flag)
	{
		if ( m_nPoints < MAX_POINTS )
		{
			m_Point[m_nPoints].x = x;
			m_Point[m_nPoints].y = y;
			m_Flag [m_nPoints]   = flag;
			m_nPoints ++;
		}
		else
			assert(false);
	}

	void AddQSpline(int x1, int y1, int x2, int y2)
	{
		assert(m_nPoints);

		// p0 p1 p2 -> p0 (p0+2p1)/3 (2p1+p2)/3, p2
		int x0 = m_Point[m_nPoints-1].x;
		int y0 = m_Point[m_nPoints-1].y;

		AddCSpline((x0+2*x1)/3, (y0+2*y1)/3, (2*x1+x2)/3, (2*y1+y2)/3, x2, y2);
	}

	void AddCSpline(int x1, int y1, int x2, int y2, int x3, int y3)
	{
		assert(m_nPoints);

		AddPoint(x1, y1, PT_BEZIERTO);
		AddPoint(x2, y2, PT_BEZIERTO);
		AddPoint(x3, y3, PT_BEZIERTO);
	}

	void MarkLast(BYTE flag)
	{
		assert(m_nPoints);
		m_Flag[m_nPoints-1] |= flag;
	}

	void Transform(int dx, int dy)
	{
		for (int i=0; i<m_nPoints; i++)
		{
			m_Point[i].x = (   m_Point[i].x + 32768 ) / 65536 + dx;
			m_Point[i].y = ( - m_Point[i].y + 32768 ) / 65536 + dy;
		}
	}

public:
	int DecodeTTPolygon(const TTPOLYGONHEADER * lpHeader, int size);

	BOOL Draw(HDC hDC, int x, int y)
	{
		Transform(x, y);
	
		return PolyDraw(hDC, m_Point, m_Flag, m_nPoints);
	}

	int DecodeOutline(KGlyph & glyph)
	{
		if ( (glyph.m_uFormat==GGO_NATIVE) || (glyph.m_uFormat==GGO_BEZIER) )
			return DecodeTTPolygon((const TTPOLYGONHEADER *) glyph.m_pPixels, glyph.m_nDataSize);
		else
			return 0;
	}

};


template <int MAX_POINTS>
int KGlyphOutline<MAX_POINTS>::DecodeTTPolygon(const TTPOLYGONHEADER * pHeader, int size)
{
	m_nPoints = 0;

	while ( size>sizeof(TTPOLYGONHEADER) )
    {
		int curvesize = pHeader->cb;

		size -= curvesize;

		if ( size<0 )
		{
			assert(false);
			break;
		}

		if (pHeader->dwType != TT_POLYGON_TYPE)
		{
			assert(false);
			break;
		}

		const POINT * p = (const POINT *) & pHeader->pfxStart;

		AddPoint(p[0].x, p[0].y, PT_MOVETO);

		const TTPOLYCURVE * pCurve = (const TTPOLYCURVE *) & pHeader[1];
		
		while ( (unsigned) pCurve < ( ((unsigned) pHeader) + curvesize) )
		{
			int i;

			p = (const POINT *) pCurve->apfx;

			switch ( pCurve->wType )
			{
				case TT_PRIM_LINE:		// polyline. 
					for (i=0; i<pCurve->cpfx; i++)
						AddPoint(p[i].x, p[i].y, PT_LINETO);
					break;

				case TT_PRIM_QSPLINE:	// quadratic B閦ier spline.
					assert(pCurve->cpfx>=2);

					for (i=0; i<(pCurve->cpfx-1); i++)
						if ( i==(pCurve->cpfx-2) )
							AddQSpline(p[i].x, p[i].y, p[i+1].x, p[i+1].y);
						else
							AddQSpline(
								p[i].x, 
								p[i].y, 
								( p[i].x + p[i+1].x ) / 2, 
								( p[i].y + p[i+1].y ) / 2);
					break;

				case TT_PRIM_CSPLINE:	// cubic Bezier spline
					assert((pCurve->cpfx % 3) ==0);
					for (i=0; i<pCurve->cpfx; i+=3)
						AddCSpline(p[i].x, p[i].y, p[i+1].x, p[i+1].y, p[i+2].x, p[i+2].y);
					break;

				default:
					assert(false);
					return 0;
			}

			pCurve = (const TTPOLYCURVE *) & pCurve->apfx[pCurve->cpfx];
		}

		MarkLast(PT_CLOSEFIGURE);

		pHeader = (const TTPOLYGONHEADER *) ((unsigned) pHeader + curvesize);
    }

	return m_nPoints;
}

BOOL BitmapTextOut(HDC hDC, int x, int y, const TCHAR * str, int count, int format = GGO_BITMAP);
BOOL BitmapTextOutROP(HDC hDC, int x, int y, const TCHAR * str, int count, DWORD rop);

BOOL OutlineTextOut(HDC hDC, int x, int y, const TCHAR * str, int count);

///////////////////////////////////////////////////////////

class KTextFormator
{
	typedef enum { MaxCharNo = 256 };

	float m_fCharWidth[MaxCharNo];
	float m_fHeight;
	float m_fLinespace;

public:

	BOOL  SetupPixel(HDC hDC, HFONT hFont, float pixelsize);
	BOOL  Setup(HDC hDC, HFONT hFont, float pointsize);

	float GetLinespace(void) const
	{
		return m_fLinespace;
	}

	BOOL  GetTextExtent(HDC hdc, LPCTSTR pString, int cbString, float & width, float & height);
	BOOL  TextOut(HDC hDC, int x, int y, LPCTSTR pString, int nCount);
	DWORD DrawText(HDC hDC, LPCTSTR pString, int nCount, const RECT * pRect, UINT uFormat);
};


BOOL ColorText(HDC hDC, int x, int y, LPCTSTR pString, int nCount, HBRUSH hFore);
 BOOL BitmapText(HDC hDC, int x, int y, LPCTSTR pString, int nCount, HBITMAP hBmp);
BOOL BitmapText2(HDC hDC, int x, int y, LPCTSTR pString, int nCount, HBITMAP hBmp);
BOOL OffsetTextOut(HDC hDC, int x, int y, LPCTSTR pStr, int nCount, 
				   int dx1, int dy1, COLORREF cr1,
				   int dx2, int dy2, COLORREF cr2);

BOOL DrawChar(HDC hDC, double x0, double y0, double x1, double y1, TCHAR ch);
void PathTextOut(HDC hDC, LPCTSTR pString, POINT point[], int no);
BOOL PathTextOut(HDC hDC, LPCTSTR pString);


// 3x3 average filter for any 8-bpp, 24-bpp, or 32-bpp frame buffer
template <int bytepp>
void Average(BYTE * pBits, int pitch, int width, int height)
{
	BYTE * buffer = new BYTE[pitch*2];

	for (int y=1; y<height; y++)
	{
		pBits += pitch; // first channel of pixel 0

		if ( y<(height-1) )
		{
			BYTE * P = pBits + bytepp;				// pixel 1
			BYTE * B = buffer + pitch * (y & 1);	// pixel 1..n-2	

			for (int x=1; x<(width-1); x++)
			{
				for (int b=0; b<bytepp; b++)
				{
					B[0] = ( P[-pitch-bytepp] + P[-pitch] + P[-pitch+bytepp] +
							 P[      -bytepp] + P[     0] + P[       bytepp] +
							 P[ pitch-bytepp] + P[ pitch] + P[ pitch+bytepp])/9;

					P ++;
					B ++;
				}
			}
		}

		if ( y>=2 )
		{
			memcpy(pBits-pitch+bytepp, buffer + pitch * ( 1 - (y & 1)), (width-2) * bytepp);
		}
	}

	delete [] buffer;
}


// Conver text string to bitmap
class KTextBitmap
{
public:
	
	HBITMAP		m_hBitmap;
	HDC		    m_hMemDC;
	HGDIOBJ		m_hOldBmp;
	int			m_width;
	int			m_height;
	int			m_dx;
	int			m_dy;
	BYTE *      m_pBits;

	BOOL Convert(HDC hDC, LPCTSTR pString, int nCount, int extra);

	void ReleaseBitmap(void)
	{
		if ( m_hOldBmp )
		{
			SelectObject(m_hMemDC, m_hOldBmp);
			m_hOldBmp = NULL;
		}

		if ( m_hBitmap )
		{
			DeleteObject(m_hBitmap);
			m_hBitmap = NULL;
		}
	}

	KTextBitmap()
	{
		m_hBitmap = NULL;
		m_hMemDC  = NULL;
		m_hOldBmp = NULL;
	}

	~KTextBitmap()
	{
		if ( m_hMemDC )
		{
			DeleteObject(m_hMemDC);
			m_hMemDC = NULL;
		}
	}

	void Blur(void);

	BOOL Draw(HDC hDC, int x, int y, int rop=SRCCOPY)
	{
		return BitBlt(hDC, x - m_dx, y - m_dy, m_width, m_height,
			          m_hMemDC, 0, 0, rop);
	}

	BOOL RenderText(HDC hDC, int x, int y, const TCHAR * pString, int nCount);
};

// Embossing or Engraving by change edges only, good for non-solod background
void TransparentEmboss(HDC hDC, const TCHAR * pString, int nCount, COLORREF crTL, COLORREF crBR, int offset, int x, int y);
	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久精品国产99久久精品芒果 | 亚洲欧美激情小说另类| 一区二区三区精品视频| 狠狠色狠狠色综合日日91app| 94-欧美-setu| 久久老女人爱爱| 亚洲第一激情av| 99久久久精品| 国产免费久久精品| 免费一区二区视频| 91久久精品午夜一区二区| 国产偷国产偷亚洲高清人白洁| 日本人妖一区二区| 欧美日韩视频专区在线播放| 国产欧美综合色| 国产一二精品视频| 正在播放一区二区| 一区2区3区在线看| 91色porny在线视频| 国产精品免费视频观看| 精品一区二区三区在线观看国产| 欧美丰满少妇xxxbbb| 亚洲午夜在线视频| 欧美日韩国产首页在线观看| 最新中文字幕一区二区三区| 福利一区福利二区| 久久嫩草精品久久久精品| 美女一区二区三区在线观看| 8v天堂国产在线一区二区| 亚洲国产日韩一级| 欧美日韩在线播| 视频在线观看91| 7777精品伊人久久久大香线蕉完整版| 亚洲国产视频直播| 欧美群妇大交群中文字幕| 亚洲国产精品欧美一二99| 91国偷自产一区二区开放时间| 亚洲女爱视频在线| 91色porny| 亚洲v精品v日韩v欧美v专区| 欧美色电影在线| 天堂午夜影视日韩欧美一区二区| 欧美日韩国产123区| 日本aⅴ亚洲精品中文乱码| 日韩欧美的一区二区| 免费观看久久久4p| 国产精品网友自拍| 在线观看一区日韩| 日韩成人午夜电影| www国产亚洲精品久久麻豆| 国产毛片精品视频| 国产精品不卡视频| 欧美亚洲国产怡红院影院| 午夜精品久久久久久久| 日韩欧美综合在线| 成人午夜视频免费看| 成人免费一区二区三区在线观看| 色婷婷国产精品综合在线观看| 香蕉加勒比综合久久| 日韩色视频在线观看| 国产精品69毛片高清亚洲| 亚洲三级在线播放| 9191精品国产综合久久久久久| 九一久久久久久| 国产精品成人免费| 欧美一二三区在线观看| 国产成人精品免费看| 亚洲综合图片区| 久久久久久久久免费| 在线国产亚洲欧美| 国v精品久久久网| 日韩福利电影在线观看| 国产精品网站一区| 日韩欧美高清在线| 日本黄色一区二区| 经典三级视频一区| 天堂蜜桃91精品| 亚洲精品高清在线观看| 精品乱码亚洲一区二区不卡| 91看片淫黄大片一级在线观看| 美国三级日本三级久久99| 亚洲欧美日本韩国| 久久久久青草大香线综合精品| 色猫猫国产区一区二在线视频| 精品一区二区三区不卡| 一区二区在线观看视频| xnxx国产精品| 91精品国产91综合久久蜜臀| 91在线看国产| 粗大黑人巨茎大战欧美成人| 免费人成精品欧美精品| 一区二区不卡在线视频 午夜欧美不卡在| 欧美精品一区视频| 欧美乱熟臀69xxxxxx| 91玉足脚交白嫩脚丫在线播放| 经典三级视频一区| 日韩av在线免费观看不卡| 一区二区三区在线视频观看58| 亚洲国产成人午夜在线一区| 日韩欧美黄色影院| 欧美一卡2卡3卡4卡| 欧美性xxxxxx少妇| 色素色在线综合| 91丨九色porny丨蝌蚪| 国产精品一区专区| 国产福利一区在线观看| 九九九久久久精品| 麻豆视频观看网址久久| 首页国产欧美久久| 午夜激情久久久| 五月婷婷欧美视频| 婷婷夜色潮精品综合在线| 亚洲一区二区中文在线| 亚洲五码中文字幕| 一区二区在线看| 亚欧色一区w666天堂| 午夜精品福利一区二区蜜股av| 性久久久久久久| 六月丁香婷婷色狠狠久久| 日本成人在线不卡视频| 男女男精品网站| 精品一区二区三区视频| 国产裸体歌舞团一区二区| 国产成人在线色| 波多野结衣亚洲| 99re在线精品| 欧美日韩中文精品| 欧美一区二区三级| 久久九九久久九九| 亚洲女女做受ⅹxx高潮| 亚洲成人av一区| 麻豆成人久久精品二区三区红 | 在线成人av网站| 欧美大片一区二区| 2023国产精品视频| 国产精品乱码一区二区三区软件| **欧美大码日韩| 天天影视色香欲综合网老头| 久久99精品一区二区三区| 国产一区二区在线看| 99热这里都是精品| 91精品国产全国免费观看| 精品国产乱码久久| 亚洲精品日韩一| 免费人成精品欧美精品| 成人精品视频一区二区三区尤物| 在线免费不卡视频| 欧美精品一区二| 中文字幕亚洲成人| 日韩国产一区二| 波多野结衣91| 欧美一区二区三区免费视频| 国产亚洲一区二区三区四区 | 2020国产成人综合网| 国产精品大尺度| 开心九九激情九九欧美日韩精美视频电影 | 亚洲摸摸操操av| 日本亚洲免费观看| 不卡视频在线看| 91精品国产综合久久香蕉的特点| 久久婷婷成人综合色| 一区二区三区精品| 国产99久久久国产精品免费看 | 成人爽a毛片一区二区免费| 欧美日韩在线一区二区| 国产亚洲欧美日韩俺去了| 亚洲国产成人porn| www.日韩av| 精品国产污污免费网站入口| 亚洲一区二区中文在线| 成人午夜碰碰视频| 精品国产髙清在线看国产毛片| 亚洲美女免费视频| 国产+成+人+亚洲欧洲自线| 欧美一区二区播放| 亚洲成人免费在线观看| 99re这里只有精品首页| 久久精品一区二区三区四区| 日本美女视频一区二区| 欧美日韩精品免费| 一区二区三区资源| 色狠狠一区二区三区香蕉| 久久精品无码一区二区三区| 日本视频免费一区| 欧美精品精品一区| 亚洲一区在线电影| 欧美午夜电影网| 一区二区三区欧美日| 99精品一区二区三区| 欧美国产精品中文字幕| 韩国三级中文字幕hd久久精品| 欧美一区二区视频免费观看| 亚洲第一狼人社区| 欧美日韩国产高清一区二区三区| 一区二区激情小说| 91黄色小视频| 亚洲小说春色综合另类电影| 欧美又粗又大又爽| 亚洲最新视频在线播放| 欧美怡红院视频|