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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usplib.c

?? 支持Unicode及Uniscribe的多語言輸入的文本編輯器源碼。
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
//	UspLib.c
//
//	USPLIB is a Unicode text-display support library. It is a wrapper
//	around the low-level Uniscribe API and provides routines
//	used to display Unicode text with the ability to
//	apply styles (colours/fonts etc) with a user-supplied attribute-run-list 
//	
//	UspAllocate
//	UspFree
//	UspAnalyze
//
//	UspApplySelection
//	UspApplyAttributes
//	
//	Written by J Brown 2006 Freeware
//	www.catch22.net
//

#define _WIN32_WINNT 0x501

#ifndef _UNICODE
#define _UNICODE
#endif

#ifndef UNICODE
#define UNICODE
#endif

#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <usp10.h>
#include <tchar.h>
#include <stdlib.h>
#include <malloc.h>
#include "usplib.h"

// UspCtrl.c
int  CtrlCharWidth(USPFONT *uspFont, HDC hdc, ULONG chValue);

//
//	Return an item-run based on visual-order
//
ITEM_RUN *GetItemRun(USPDATA *uspData, int visualIdx)
{
	int logicalIdx = uspData->visualToLogicalList[visualIdx];
	return &uspData->itemRunList[logicalIdx];
}

//
//	Locate tabs in the original character array, and then modify the
//	corresponding glyph-width (which will be zero) to a value reflecting
//	the size of the tab in pixels. This is all that is required to support
//	tabs, the mouse+drawing routines just treat them as regular glyphs
//	after this.
//
static 
BOOL ExpandTabs(USPDATA *uspData, WCHAR *wstr, int wlen, SCRIPT_TABDEF *tabdef)
{
	int i;
	int xpos	 = tabdef->iTabOrigin;
	int tabidx   = 0;
	int tabWidth;
	int tab;

	// calculate average character-width
	int charWidth = uspData->uspFontList ? uspData->uspFontList[0].tm.tmAveCharWidth :
										   uspData->defaultFont.tm.tmAveCharWidth; 

 	// validate the SCRIPT_TABDEF structure
	if(tabdef->cTabStops != 0 && tabdef->pTabStops == 0 || tabdef->cTabStops < 0)
		return FALSE;

	// All tab-stops are the length of the first entry in pTabStops
	if(tabdef->cTabStops == 1)
	{
		tabWidth = tabdef->pTabStops[0];
	}
	// Tab-stops occur every eight average-character widths
	else
	{
		tabWidth = charWidth;
	}

	// Do the scaling
	if(tabdef->iScale != 0)
	{
		xpos	 *= tabdef->iScale / 4;
		tabWidth *= tabdef->iScale / 4;
	}
	else
	{
		xpos	 *= charWidth;
		tabWidth *= charWidth;
	}

	// scan item-runs in *visual* order (think this is right!)
	for(i = 0; i < uspData->itemRunCount; i++)
	{
		ITEM_RUN *itemRun = GetItemRun(uspData, i);

		// match tabs
		if(wstr[itemRun->charPos] == '\t')
		{
			// calculate distance to next tab-stop position
			if(tabdef->cTabStops <= 1)
			{
				tab = tabWidth - (xpos % tabWidth);
			}
			else 
			{
				// search for the next tab-stop position
				for( ; tabidx < tabdef->cTabStops; tabidx++)
				{
					if(xpos > tabdef->pTabStops[tabidx])
					{
						tab = 0; 
						break;
					}
				}

				//tab = uspData->
			}

			uspData->widthList[itemRun->glyphPos] = tab;
			itemRun->width	= tab;
			itemRun->tab	= TRUE;
		}

		xpos += itemRun->width;
	}

	return TRUE;
}

//
//	Non-complex scripts can be merged into a single item
//
static
int MergeSimpleScripts(SCRIPT_ITEM *itemList, int itemCount)
{
	// global script-table, used for merging non-complex runs together :)
	SCRIPT_PROPERTIES **propList;
	int					propCount;
	int					i;

	// get pointer to the global script table
	ScriptGetProperties(&propList, &propCount);

	//	coalesce item-runs that are based on simple-scripts
	for(i = 0; i < itemCount - 1; i++)
	{
		// use each item-run's SCRIPT_ANALYSIS::eScript member to lookup the
		// appropriate script in the global-table
		if(propList[itemList[i+0].a.eScript]->fComplex == FALSE && 
		   propList[itemList[i+1].a.eScript]->fComplex == FALSE)
		{
			// be careful which SCRIPT_ITEM we overwrite as we need to
			// maintain correct iCharPos members
			memmove(&itemList[i+1], &itemList[i+2], (itemCount-i-1) * sizeof(SCRIPT_ITEM));
			itemCount--;

			itemList[i].a.eScript = SCRIPT_UNDEFINED;
		}
	}

	return itemCount;
}

//	
//	Wrapper around ScriptItemize. Merges the results of ScriptItemize with
//  "application-defined style runs". In our case, we take the ATTR[] array 
//  of runs and inspect the font and control-character flags *only* - colours
//  and selection flags are *not* used to split the runs.
//
//	Note that for scripts that do *not* have the fComplex property set, (obtained
//  via ScriptGetProperties) we can merge item-runs together to form a single
//	run with SCRIPT_UNDEFINED...this makes text-display *much* faster for simple
//  scripts such as english.
//
static 
BOOL BuildMergedItemRunList (
		USPDATA			* uspData, 
		WCHAR			* wstr, 
		int				  wlen, 
		ATTR			* attrList,
		SCRIPT_CONTROL	* scriptControl,
		SCRIPT_STATE	* scriptState
	)
{
	// attribute-list index+position
	int				  a = 0;
	int				  attrPos = 0;
	int				  attrLen = 0;
	ATTR			  attr = attrList[0];

	// item-list index+position (only needed in this function)
	int				  i = 0;
	int				  itemPos;
	int				  itemLen;
	int				  itemCount;
	SCRIPT_ITEM		* itemList		 = uspData->tempItemList;
	int				  allocLen		 = max(uspData->tempItemAllocLen, 16);

	// merged-list index+position
	int				  m = 0;
	int				  mergePos		 = 0;
	ITEM_RUN		* mergedList	 = uspData->itemRunList;
	int				  mergedAllocLen = uspData->itemRunAllocLen;

	HRESULT			  hr;

	//	Create the Uniscribe SCRIPT_ITEM list which just describes
	//  the spans of plain unicode text (grouped by script)
	do
	{
		// allocate memory for SCRIPT_ITEM list
		if(uspData->tempItemAllocLen < allocLen)
		{
			itemList = realloc(itemList, allocLen * sizeof(SCRIPT_ITEM));
			
			if(itemList == 0)
				return FALSE;

			// store this temporary-item list so we don't have to free/alloc all the time
			uspData->tempItemAllocLen	= allocLen;
			uspData->tempItemList		= itemList;
		}

		hr = ScriptItemize(
				wstr, 
				wlen, 
				allocLen, 
				scriptControl, 
				scriptState, 
				itemList, 
				&itemCount
			);

		if(hr != S_OK && hr != E_OUTOFMEMORY)
			return FALSE;

		allocLen *= 2;
	}
	while(hr != S_OK);

	// any non-complex scripts can be merged into a single item
	// itemCount could be decremented after this call
	itemCount = MergeSimpleScripts(itemList, itemCount);

	//
	//	Merge SCRIPT_ITEMs with the ATTR runlist to produce finer-grained 
	//  item-runs which describes spans of text *and* style 
	//
	while(i < itemCount)
	{
		if(attrPos + attrLen < wlen)
			attr = attrList[a];

		// grow the merge-list if necessary
		if(m >= mergedAllocLen)
		{
			mergedAllocLen += 16;
			mergedList = realloc(mergedList, mergedAllocLen * sizeof(ITEM_RUN));
		}

		// build an ITEM_RUN with default settings
		ZeroMemory(&mergedList[m], sizeof(ITEM_RUN));
		mergedList[m].analysis		= itemList[i].a;
		mergedList[m].font			= attr.font;
		mergedList[m].ctrl			= attr.ctrl;
		mergedList[m].eol			= attr.eol;

		// control-characters have their Unicode code-point stored in the item-run
		// (there will always be 1 ctrlchar per run)
		if(mergedList[m].ctrl)
			mergedList[m].chcode = wstr[mergePos];

		// safeguard against incorrect font usage when the user didn't specify a font-list
		if(uspData->uspFontList == &uspData->defaultFont)
			mergedList[m].font = 0;

		itemPos = itemList[i].iCharPos;
		itemLen = itemList[i+1].iCharPos - itemPos;

		//
		// coalesce identical attribute cells into one contiguous run. Ignore all style 
		// attributes except the ::font flags so even ATTR with different colours 
		// will be merged together if they share the same font. 
		//
		// However, any ATTR with the ::ctrl  flag set will be isolated as a single 
		// ITEM_RUN representing one control-character exactly.
		//
		if(attrLen == 0)
		{
			while(attrPos + attrLen < wlen)
			{
				attrLen += attrList[a].len;		

				if(attrPos + attrLen < wlen &&
				  (attrList[a].font != attrList[a+1].font ||
				   attrList[a].ctrl != attrList[a+1].ctrl ||
				   attrList[a].eol  != attrList[a+1].eol  ||
				   attrList[a].ctrl ||
				   attrList[a].eol)
				  ) 
				   break;

				// skip to next (coalesce)
				a++;
			} 
		}

		//	Detect overlapping run boundaries 
		if(attrPos+attrLen < itemPos+itemLen)
		{
			mergedList[m].charPos	= mergePos;
			mergedList[m].len		= (attrPos+attrLen) - mergePos;

			attrPos += attrLen;
			attrLen = 0;
			a++;
		}
		else if(attrPos+attrLen >= itemPos+itemLen)
		{
			mergedList[m].charPos	= mergePos;
			mergedList[m].len		= (itemPos+itemLen) - mergePos;
			i++;

			if(attrPos+attrLen == itemPos+itemLen)
			{
				attrPos += attrLen;
				attrLen = 0;
				a++;
			}
		}

		// advance position in merge-list
		mergePos += mergedList[m].len;
		m++;
	}

	// store the results
	uspData->itemRunList	   = mergedList;
	uspData->itemRunCount	   = m;
	uspData->itemRunAllocLen   = mergedAllocLen;

	return TRUE;
}

static 
BOOL BuildVisualMapping (
		ITEM_RUN *	mergedRunList, 
		int			mergedRunCount, 
		BYTE		bidiLevels[], 
		int			visualToLogicalList[]
	)
{
	int		i;

	//	Manually extract bidi-embedding-levels ready for ScriptLayout
	for(i = 0; i < mergedRunCount; i++)
		bidiLevels[i] = (BYTE)mergedRunList[i].analysis.s.uBidiLevel;

	//	Build a visual-to-logical mapping order
	ScriptLayout(
			mergedRunCount,
			bidiLevels,
			visualToLogicalList,
			0
		);

	return TRUE;
}

/*
// 
//	Reverse logical-cluster array, and the clusters within the array
//	For RTL runs, this changes the logical-cluster list to visual-order 
//
//	Unused but left just in-case I need it again
//
static
void ReverseClusterRun(WORD *sourceList, WORD *destList, int runLen)
{
	int i, lasti;

	for(i = runLen - 1, lasti = i; i >= -1; i--)
	{
		if(i == -1 || sourceList[i] != sourceList[lasti])
		{
			int clusterlen = lasti - i;
			int pos = sourceList[lasti] - (clusterlen - 1);

			while(clusterlen--)
				*destList++ = pos;

			lasti = i;
		}
	}
}*/

//
//	Call ScriptShape and ScriptPlace to return glyph information
//	for the specified run of text. 
//
static 
BOOL ShapeAndPlaceItemRun(USPDATA *uspData, ITEM_RUN *itemRun, HDC hdc, WCHAR *wrunstr)
{
	ABC			abc;
	HRESULT		hr;
	USPFONT   *	uspFont		= 0;
	HANDLE		holdFont	= 0;
	int			reallocSize = 0;
	
	// select the appropriate font
	uspFont  = &uspData->uspFontList[itemRun->font];
	holdFont = SelectObject(hdc, uspFont->hFont);

	// glyph data for this run is appended to the end 
	itemRun->glyphPos = uspData->glyphCount;

	//
	// Generate glyph information for each character in the run
	// keep looping until we find a buffer big enough
	//
	do
	{
		// guess at 1.5x the run-length
		reallocSize += itemRun->len * 3 / 2;

		// perform memory allocations. Let ScriptShape catch any alloc-failures
		if(uspData->glyphCount + reallocSize >= uspData->glyphAllocLen)
		{
			uspData->glyphAllocLen += reallocSize;

			uspData->glyphList	 = realloc(uspData->glyphList,	 uspData->glyphAllocLen * sizeof(WORD));
			uspData->offsetList  = realloc(uspData->offsetList,  uspData->glyphAllocLen * sizeof(GOFFSET));

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩高清一区二区三区| 精品国产制服丝袜高跟| 欧美日韩色一区| 国产欧美一区二区精品性色超碰| 亚洲一区二区欧美激情| 国产1区2区3区精品美女| 在线观看91精品国产麻豆| 亚洲视频一二三| 高清不卡在线观看| 成人欧美一区二区三区1314| 激情综合五月婷婷| 日韩亚洲欧美综合| 午夜视频一区在线观看| 91久久精品网| 亚洲精品一卡二卡| 91网站最新地址| 中文字幕一区二区三区蜜月| 在线观看欧美精品| 亚洲精品日韩综合观看成人91| 色88888久久久久久影院按摩| 亚洲高清免费视频| 欧美日本国产一区| 国产精品中文字幕日韩精品| 久久女同精品一区二区| 国产伦理精品不卡| 日本一区二区三区在线不卡| 色女孩综合影院| 亚洲欧美日韩国产另类专区| 94-欧美-setu| 亚洲午夜精品一区二区三区他趣| 日韩一级成人av| 91麻豆精品视频| 狠狠色丁香婷综合久久| 欧美精品一区二区久久久| 91无套直看片红桃| 精品一区二区三区在线观看| 亚洲精品菠萝久久久久久久| 亚洲精品在线观看视频| 欧美中文字幕一区| 岛国精品一区二区| 亚洲激情自拍视频| 久久久久久久久久电影| 欧美精选在线播放| 97超碰欧美中文字幕| 极品销魂美女一区二区三区| 亚洲综合999| 中文字幕成人在线观看| 一道本成人在线| 国产精品亚洲一区二区三区在线 | 国产成人鲁色资源国产91色综| 国产视频在线观看一区二区三区 | 欧美放荡的少妇| av在线播放成人| 亚洲成a天堂v人片| 日韩免费看网站| 粉嫩13p一区二区三区| 日韩av一级片| 日本一区二区三区视频视频| 精品日韩欧美一区二区| aaa欧美日韩| 国产福利一区二区三区在线视频| 日韩精品一级二级| 国产欧美日韩视频一区二区| 欧美成人官网二区| 制服视频三区第一页精品| 福利电影一区二区| 国产精选一区二区三区| 精品午夜久久福利影院| 久久精品国产精品亚洲精品| 国产精品电影一区二区| 欧美一级国产精品| 91精品国产色综合久久ai换脸| 国产精一区二区三区| 激情深爱一区二区| 国产福利精品一区| 懂色av中文字幕一区二区三区| 国产真实乱子伦精品视频| 激情综合一区二区三区| 国产主播一区二区| 国产91综合一区在线观看| 国产a久久麻豆| 成人黄色片在线观看| 裸体歌舞表演一区二区| 极品少妇一区二区| 国产精品99久久久久久似苏梦涵 | 26uuu成人网一区二区三区| 91久久香蕉国产日韩欧美9色| 99re成人在线| 欧美中文字幕不卡| 在线不卡中文字幕| 日韩精品中文字幕在线一区| 精品国产区一区| 国产欧美日本一区视频| 亚洲三级电影全部在线观看高清| 亚洲精品午夜久久久| 午夜影院久久久| 寂寞少妇一区二区三区| 懂色av一区二区三区蜜臀| 99精品视频一区二区| 欧美日韩一区二区在线观看视频| 欧美高清精品3d| 久久久午夜精品| 亚洲免费看黄网站| 亚洲va欧美va人人爽| 精品一区二区三区在线视频| 成人自拍视频在线| 欧美色视频在线观看| 日韩午夜三级在线| 国产精品女同互慰在线看| 国产欧美精品一区| 一区二区三区日韩| 一区二区三区不卡视频在线观看 | 国产精品伦理一区二区| 亚洲国产毛片aaaaa无费看| 美女网站在线免费欧美精品| 日韩精品高清不卡| 国产**成人网毛片九色| 欧洲人成人精品| 久久久久久久网| 五月天亚洲精品| 成人三级伦理片| 91精品国产综合久久福利软件| 日本一区二区免费在线观看视频| 亚洲成人黄色影院| 成人自拍视频在线观看| 91精品一区二区三区在线观看| 国产精品入口麻豆九色| 日韩电影一二三区| 色综合中文字幕国产| 99精品欧美一区二区蜜桃免费 | 懂色av一区二区夜夜嗨| 欧美人妇做爰xxxⅹ性高电影| 久久精品一级爱片| 欧美aaaaaa午夜精品| 激情综合网av| 欧美少妇一区二区| 日韩一区二区电影| 亚洲在线视频一区| 成人动漫一区二区| 久久青草国产手机看片福利盒子| 亚洲国产精品久久人人爱蜜臀| 国产精品77777竹菊影视小说| 欧美色男人天堂| 中文字幕佐山爱一区二区免费| 另类专区欧美蜜桃臀第一页| 欧美亚州韩日在线看免费版国语版| 国产三级欧美三级日产三级99 | 免费在线一区观看| 欧美色网一区二区| 《视频一区视频二区| 国产经典欧美精品| 精品国产第一区二区三区观看体验| 亚洲午夜三级在线| 91福利视频在线| 亚洲猫色日本管| 91社区在线播放| 亚洲色图欧美激情| aaa国产一区| 亚洲日本在线a| 97久久超碰国产精品电影| 国产精品卡一卡二卡三| 成人网在线播放| 中文字幕在线不卡| 99国产精品99久久久久久| 国产精品久久福利| 成人福利视频在线看| 国产精品毛片大码女人| av中文字幕不卡| 亚洲三级小视频| 日本道免费精品一区二区三区| 亚洲伦理在线精品| 色先锋aa成人| 亚洲亚洲人成综合网络| 欧美日韩免费不卡视频一区二区三区| 亚洲在线视频网站| 8x8x8国产精品| 日本特黄久久久高潮| 日韩欧美一级二级| 狠狠久久亚洲欧美| 亚洲国产精品ⅴa在线观看| 成人激情av网| 亚洲六月丁香色婷婷综合久久| 欧洲一区二区三区在线| 日韩影院免费视频| 久久天天做天天爱综合色| 成人综合在线观看| 樱桃国产成人精品视频| 欧美日韩国产bt| 久久99精品国产.久久久久 | 成av人片一区二区| 亚洲免费色视频| 欧美一级片免费看| 国产成人啪午夜精品网站男同| 国产精品美女www爽爽爽| 91福利视频久久久久| 欧美aaaaaa午夜精品| 国产精品免费视频网站| 91国偷自产一区二区三区成为亚洲经典| 亚洲成av人片| 久久免费视频色|