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

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

?? optblock.c

?? windows gzip source code
?? C
字號:
//
// optblock.c
//
// Outputting blocks
//
#include "deflate.h"
#include <string.h>
#include <stdio.h>
#include <crtdbg.h>
#include "maketbl.h"


//
// Decode a recorded literal
//
#define DECODE_LITERAL(slot) \
	slot = encoder->recording_literal_tree_table[read_bitbuf & REC_LITERALS_DECODING_TABLE_MASK]; \
	while (slot < 0) \
	{  \
		unsigned long mask = 1 << REC_LITERALS_DECODING_TABLE_BITS; \
		do \
		{ \
			slot = -slot; \
			if ((read_bitbuf & mask) == 0) \
				slot = encoder->recording_literal_tree_left[slot]; \
			else \
				slot = encoder->recording_literal_tree_right[slot]; \
			mask <<= 1; \
		} while (slot < 0); \
	}


//
// Decode a recorded distance slot
//
#define DECODE_POS_SLOT(slot) \
	slot = encoder->recording_dist_tree_table[read_bitbuf & REC_DISTANCES_DECODING_TABLE_MASK]; \
	while (slot < 0) \
	{  \
		unsigned long mask = 1 << REC_DISTANCES_DECODING_TABLE_BITS; \
		do \
		{ \
			slot = -slot; \
			if ((read_bitbuf & mask) == 0) \
				slot = encoder->recording_dist_tree_left[slot]; \
			else \
				slot = encoder->recording_dist_tree_right[slot]; \
			mask <<= 1; \
		} while (slot < 0); \
	}


//
// Remove count bits from the bit buffer
//
#define DUMP_READBUF_BITS(count) \
	read_bitbuf >>= count; \
	read_bitcount -= count;


//
// Read more bits into the read buffer if our bit buffer if we need to
//
#define CHECK_MORE_READBUF() \
	if (read_bitcount <= 0) \
	{ \
		read_bitbuf |= ((*read_bufptr++) << (read_bitcount+16)); \
		read_bitcount += 8; \
		if (read_bitcount <= 0) \
		{ \
			read_bitbuf |= ((*read_bufptr++) << (read_bitcount+16)); \
			read_bitcount += 8; \
		} \
	}


// output an element from the literal tree
#define OUTPUT_LITERAL(element) \
{ \
	_ASSERT(encoder->literal_tree_len[element] != 0); \
	outputBits(context, encoder->literal_tree_len[element], encoder->literal_tree_code[element]); \
}


// output an element from the distance tree
#define OUTPUT_DIST_SLOT(element) \
{ \
	_ASSERT(encoder->dist_tree_len[element] != 0); \
	outputBits(context, encoder->dist_tree_len[element], encoder->dist_tree_code[element]); \
}



//
// Output a dynamic block
//
static BOOL OptimalEncoderOutputDynamicBlock(t_encoder_context *context)
{
	unsigned long	read_bitbuf;
	int				read_bitcount;
	byte *			read_bufptr;
    t_optimal_encoder *encoder = context->optimal_encoder;

	if (context->state == STATE_NORMAL)
	{
		//
		// If we haven't started to output a block yet
		//
        read_bufptr     = encoder->lit_dist_buffer;
		read_bitbuf		= 0;
		read_bitcount	= -16;

		read_bitbuf |= ((*read_bufptr++) << (read_bitcount+16)); 
		read_bitcount += 8;

		read_bitbuf |= ((*read_bufptr++) << (read_bitcount+16)); 
		read_bitcount += 8;

		context->outputting_block_bitbuf		= read_bitbuf;
		context->outputting_block_bitcount		= read_bitcount;
		context->outputting_block_bufptr		= read_bufptr;

		outputBits(context, 1, 0); // "final" block flag
		outputBits(context, 2, BLOCKTYPE_DYNAMIC); 

		context->state = STATE_OUTPUTTING_TREE_STRUCTURE;
	}

	if (context->state == STATE_OUTPUTTING_TREE_STRUCTURE)
	{
		//
		// Make sure there is enough room to output the entire tree structure at once
		//
		if (context->output_curpos > context->output_endpos - MAX_TREE_DATA_SIZE)
		{
            _ASSERT(0); // not enough room to output tree structure, fatal error!
			return FALSE;
		}

		outputTreeStructure(context, encoder->literal_tree_len, encoder->dist_tree_len);

		context->state = STATE_OUTPUTTING_BLOCK;
	}

	_ASSERT(context->state == STATE_OUTPUTTING_BLOCK);

	// load state into local variables
	read_bufptr		= context->outputting_block_bufptr;
	read_bitbuf		= context->outputting_block_bitbuf;
	read_bitcount	= context->outputting_block_bitcount;

	// output literals
	while (context->outputting_block_current_literal < context->outputting_block_num_literals)
	{
		int literal;

		// break when we get near the end of our output buffer
		if (context->output_curpos >= context->output_near_end_threshold)
			break;

		DECODE_LITERAL(literal);
		DUMP_READBUF_BITS(encoder->recording_literal_tree_len[literal]);
		CHECK_MORE_READBUF();

		if (literal < NUM_CHARS)
		{
			// it's a char
			OUTPUT_LITERAL(literal);
		}
		else
		{
			// it's a match
			int len_slot, pos_slot, extra_pos_bits;

			// literal == len_slot + (NUM_CHARS+1)
			_ASSERT(literal != END_OF_BLOCK_CODE);

			OUTPUT_LITERAL(literal);

			len_slot = literal - (NUM_CHARS+1);

			//
			// extra_length_bits[len_slot] > 0 when len_slot >= 8
			// (except when length is MAX_MATCH).
			//
			if (len_slot >= 8)
			{
				int extra_bits = g_ExtraLengthBits[len_slot];

				if (extra_bits > 0)
				{
					unsigned int extra_data = read_bitbuf & ((1 << extra_bits)-1);

					outputBits(context, extra_bits, extra_data);
					
					DUMP_READBUF_BITS(extra_bits);
					CHECK_MORE_READBUF();
				}
			}

			DECODE_POS_SLOT(pos_slot);
			DUMP_READBUF_BITS(encoder->recording_dist_tree_len[pos_slot]);
			CHECK_MORE_READBUF();

			_ASSERT(pos_slot < 30);

			OUTPUT_DIST_SLOT(pos_slot);

			extra_pos_bits = g_ExtraDistanceBits[pos_slot];

			if (extra_pos_bits > 0)
			{
				unsigned int extra_data = read_bitbuf & ((1 << extra_pos_bits)-1);

				outputBits(context, extra_pos_bits, extra_data);

				DUMP_READBUF_BITS(extra_pos_bits);
				CHECK_MORE_READBUF();
			}
		}

		context->outputting_block_current_literal++;
	}

	// did we output all of our literals without running out of output space?
	if (context->outputting_block_current_literal >= context->outputting_block_num_literals)
	{
		// output the code signifying end-of-block
		OUTPUT_LITERAL(END_OF_BLOCK_CODE);

		// reset state
		context->state = STATE_NORMAL;
	}
	else
	{
		context->outputting_block_bitbuf	= read_bitbuf;
		context->outputting_block_bitcount	= read_bitcount;
		context->outputting_block_bufptr	= read_bufptr;
		context->state					    = STATE_OUTPUTTING_BLOCK;
	}

    return TRUE;
}



//
// Output a block.  This routine will resume outputting a block that was already being
// output if state != STATE_NORMAL.
//
BOOL OptimalEncoderOutputBlock(t_encoder_context *context)
{
    t_optimal_encoder *encoder = context->optimal_encoder;

    _ASSERT(encoder != NULL);

	//
	// The tree creation routines cannot >= 65536 literals.
	//
	_ASSERT(context->outputting_block_num_literals < 65536);

	if (context->state == STATE_NORMAL)
	{
        //
		// Start outputting literals and distances from the beginning
		//
		context->outputting_block_current_literal = 0;
	
		//
		// Nothing to output?  Then return
		//
		if (context->outputting_block_num_literals == 0)
			return TRUE;

		// make decoding table so that we can decode recorded items
		makeTable(
			MAX_LITERAL_TREE_ELEMENTS,
			REC_LITERALS_DECODING_TABLE_BITS,
			encoder->recording_literal_tree_len,
			encoder->recording_literal_tree_table,
			encoder->recording_literal_tree_left,
			encoder->recording_literal_tree_right
		);

		makeTable(
			MAX_DIST_TREE_ELEMENTS,
			REC_DISTANCES_DECODING_TABLE_BITS,
			encoder->recording_dist_tree_len,
			encoder->recording_dist_tree_table,
			encoder->recording_dist_tree_left,
			encoder->recording_dist_tree_right
		);

		// now make the trees used for encoding
	    makeTree(
    		MAX_LITERAL_TREE_ELEMENTS, 
	    	15, 
    		encoder->literal_tree_freq, 
	    	encoder->literal_tree_code,
    		encoder->literal_tree_len
    	);

	    makeTree(
    		MAX_DIST_TREE_ELEMENTS, 
	    	15, 
    		encoder->dist_tree_freq, 
	    	encoder->dist_tree_code,
    		encoder->dist_tree_len
    	);
	}

	//
	// Try outputting as a dynamic block
	//
	if (OptimalEncoderOutputDynamicBlock(context) == FALSE)
    {
        return FALSE;
    }

    if (context->state == STATE_NORMAL)
    {
   	    encoder->recording_bufptr           = context->optimal_encoder->lit_dist_buffer;
        encoder->recording_bitbuf           = 0;
        encoder->recording_bitcount         = 0;

		context->outputting_block_num_literals = 0;

		// make sure there are no zero frequency items
		NormaliseFrequencies(encoder->literal_tree_freq, encoder->dist_tree_freq);

		// make tree for recording new items
		makeTree(
			MAX_DIST_TREE_ELEMENTS, 
			RECORDING_DIST_MAX_CODE_LEN,
			encoder->dist_tree_freq, 
			encoder->recording_dist_tree_code, 
			encoder->recording_dist_tree_len
		);

		makeTree(
			MAX_LITERAL_TREE_ELEMENTS, 
			RECORDING_LIT_MAX_CODE_LEN,
			encoder->literal_tree_freq, 
			encoder->recording_literal_tree_code, 
			encoder->recording_literal_tree_len
		);

		OptimalEncoderZeroFrequencyCounts(encoder);
    }

    return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
偷拍自拍另类欧美| 国产成人aaa| 国产一区二区三区日韩| 99国产一区二区三精品乱码| 欧美精品第1页| 一区二区三区四区乱视频| 色又黄又爽网站www久久| 天天综合日日夜夜精品| 国产精品一级片| 91麻豆精品国产91久久久使用方法| 国产人伦精品一区二区| 免费日本视频一区| 欧美日本一区二区在线观看| 国产精品九色蝌蚪自拍| 国产东北露脸精品视频| 日韩欧美国产系列| 天天操天天色综合| 欧美综合亚洲图片综合区| 中文在线一区二区| 成人永久aaa| 国产亚洲婷婷免费| 国产在线一区二区综合免费视频| 欧美中文字幕一区二区三区亚洲| 国产精品视频一区二区三区不卡| 国产精品一二三在| 久久网站最新地址| 麻豆91在线观看| 日韩视频123| 免费成人深夜小野草| 在线不卡中文字幕播放| 婷婷综合在线观看| 91麻豆精品国产91久久久使用方法| 亚洲成人1区2区| 欧美日韩国产片| 日韩国产高清影视| 欧美成人伊人久久综合网| 偷拍日韩校园综合在线| 欧美精选在线播放| 免费精品视频在线| 日韩精品一区二区在线观看| 精品午夜久久福利影院| 久久亚洲欧美国产精品乐播| 国产精品1024久久| 亚洲人成在线观看一区二区| 91在线精品一区二区三区| 亚洲欧美国产高清| 欧美日本在线看| 国产在线不卡视频| 国产精品人妖ts系列视频| 99视频精品在线| 亚洲成人高清在线| 欧美精品一区二区三区蜜臀| 国产一区二区久久| 亚洲精品一二三区| 欧美精品vⅰdeose4hd| 久久国产精品一区二区| 国产精品美女久久久久久2018 | 一本久久a久久免费精品不卡| 最新不卡av在线| 在线播放视频一区| 国产盗摄精品一区二区三区在线 | 国产xxx精品视频大全| 国产日韩欧美不卡| 欧美日韩在线播放三区四区| 蜜桃av一区二区在线观看| 国产欧美日韩卡一| 欧美久久久久久蜜桃| 国产福利一区在线| 亚洲国产成人av| 国产精品视频一二三| 欧美日韩高清一区二区| 国产一区二区三区电影在线观看 | 国产精品你懂的在线欣赏| 欧美专区亚洲专区| 国产成人av一区二区三区在线| 亚洲欧美日韩国产手机在线 | 国产伦精品一区二区三区在线观看| 欧美激情一区二区三区全黄| 欧美精品tushy高清| 岛国av在线一区| 美国精品在线观看| 亚洲国产精品影院| 亚洲国产精品成人久久综合一区| 欧美日韩色一区| 成人h版在线观看| 毛片一区二区三区| 亚洲成av人片在www色猫咪| 国产精品视频免费| 久久只精品国产| 欧美日韩激情一区| 色妹子一区二区| 成人黄动漫网站免费app| 精品一区二区久久| 日韩电影免费一区| 日日夜夜免费精品视频| 综合在线观看色| 国产精品国产三级国产有无不卡 | 91在线视频在线| 国产精品66部| 国产精品一区在线| 狠狠色丁香久久婷婷综| 奇米一区二区三区av| 亚洲国产va精品久久久不卡综合| 国产精品超碰97尤物18| 国产精品色婷婷久久58| 国产性天天综合网| 久久久精品tv| 国产亚洲自拍一区| 国产女同性恋一区二区| 欧美精品一区二区精品网| 精品日韩欧美在线| 久久天堂av综合合色蜜桃网| 日韩午夜在线观看| 日韩精品自拍偷拍| 精品第一国产综合精品aⅴ| 日韩三级中文字幕| 久久蜜桃av一区二区天堂| 久久久久久久性| 国产精品你懂的| 亚洲伦在线观看| 亚洲国产精品久久不卡毛片 | 精品视频在线视频| 欧美日韩高清一区| 日韩美女在线视频| 中文字幕 久热精品 视频在线 | 久久人人爽爽爽人久久久| 久久一区二区视频| 中文字幕一区二区三区av| 中文字幕亚洲电影| 亚洲一区二区三区四区在线| 天天射综合影视| 国产精品18久久久| 色哟哟一区二区在线观看| 欧美肥大bbwbbw高潮| 欧美大白屁股肥臀xxxxxx| 久久久久久麻豆| 亚洲一线二线三线久久久| 午夜精品久久久久久久99水蜜桃| 日本v片在线高清不卡在线观看| 国产一区二区91| 日本高清不卡aⅴ免费网站| 欧美日韩午夜精品| 精品日韩av一区二区| 中文字幕一区二区在线播放| 午夜激情久久久| 国产风韵犹存在线视精品| 色综合久久综合中文综合网| 6080亚洲精品一区二区| 国产亚洲一区字幕| 丝袜脚交一区二区| 国产91丝袜在线播放九色| 欧美色倩网站大全免费| www国产成人免费观看视频 深夜成人网| 欧美激情一区二区三区| 亚洲国产成人tv| 成人动漫中文字幕| 欧美大片一区二区| 人人精品人人爱| 国产成人午夜片在线观看高清观看| 日本道免费精品一区二区三区| 欧美大片在线观看一区二区| 亚洲天堂中文字幕| 狠狠色丁香久久婷婷综| 欧美亚洲一区二区在线观看| 精品久久久久久久一区二区蜜臀| 亚洲黄色小说网站| 国产成人亚洲综合a∨婷婷图片| 欧美在线视频全部完| 国产欧美一区二区精品性| 午夜精品一区二区三区电影天堂| a4yy欧美一区二区三区| 久久综合九色综合97婷婷| 亚洲一区二区欧美激情| 波多野结衣在线一区| 精品国产一区二区三区四区四| 亚洲国产精品久久久久婷婷884 | 欧美少妇bbb| 亚洲美腿欧美偷拍| gogo大胆日本视频一区| 久久久精品蜜桃| 国产美女在线精品| 精品日韩一区二区三区免费视频| 五月激情六月综合| 欧美亚洲综合一区| 玉米视频成人免费看| 91浏览器在线视频| 国产精品久久久久影院| 国产99久久久久| 久久男人中文字幕资源站| 激情五月婷婷综合网| 日韩一区二区三区视频| 日韩高清电影一区| 欧美一区二区三区喷汁尤物| 天堂成人免费av电影一区| 欧美三级电影在线看| 亚洲一区二区三区四区的| 欧美无砖专区一中文字| 午夜免费欧美电影| 欧美一区中文字幕| 久久99精品久久久久婷婷|