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

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

?? bitmap.cpp

?? Evc編的一個在wince5.0上運行的flash播放器
?? CPP
字號:
/////////////////////////////////////////////////////////////
// Flash Plugin and Player
// Copyright (C) 1998 Olivier Debon
// 
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
// 
///////////////////////////////////////////////////////////////
//  Author : Olivier Debon  <odebon@club-internet.fr>
//  

#include "swf.h"

#ifdef RCSID
static char *rcsid = "$Id: bitmap.cc,v 1.5 1999/09/09 13:19:01 ode Exp $";
#endif

static unsigned char *inputData;

// Class variables

int Bitmap::haveTables = 0;

struct jpeg_decompress_struct Bitmap::jpegObject;

struct jpeg_source_mgr Bitmap::jpegSourceManager;

MyErrorHandler Bitmap::jpegErrorMgr;

Bitmap::Bitmap(long id, int level) : Character(BitmapType, id )
{
    pixels = NULL;
    alpha_buf = NULL;
    colormap = NULL;
    nbColors = 0;
    defLevel = level;
}

Bitmap::~Bitmap()
{
	if (pixels) {
		delete[] pixels;
	}
        if (alpha_buf) {
            delete[] alpha_buf;
        }
	if (colormap)
	{
		delete colormap;
	}
	if (haveTables) {
		jpeg_destroy_decompress(&jpegObject);
		haveTables = 0;
	}
}

static void errorExit(j_common_ptr info)
{
	(*info->err->output_message) (info);
	longjmp(((MyErrorHandler *)info->err)->setjmp_buffer, 1);
}

// Methods for Source data manager
static void initSource(struct jpeg_decompress_struct *cInfo)
{
	cInfo->src->bytes_in_buffer = 0;
}

static boolean fillInputBuffer(struct jpeg_decompress_struct *cInfo)
{
	cInfo->src->next_input_byte = inputData;
	cInfo->src->bytes_in_buffer = 1;
	inputData++;

	return 1;
}

static void skipInputData(struct jpeg_decompress_struct *cInfo, long count)
{
	cInfo->src->bytes_in_buffer = 0;
	inputData += count;
}

static boolean resyncToRestart(struct jpeg_decompress_struct *cInfo, int desired)
{
	return jpeg_resync_to_restart(cInfo, desired);
}

static void termSource(struct jpeg_decompress_struct *cInfo)
{
}

long Bitmap::getWidth()
{
	return width;
}

long Bitmap::getHeight()
{
	return height;
}

Color *
Bitmap::getColormap(long *n) {
       if (n) *n = nbColors;
       return colormap;
}

unsigned char *
Bitmap::getPixels()
{
       return pixels;
}

// Read Tables and Compressed data to produce an image

static int buildJpegAlpha(Bitmap *b, unsigned char *buffer)
{
    z_stream	stream;
    int		status;
    unsigned char  *data;

    data = new unsigned char[b->width*b->height];
    if (data == NULL) 
        return -1;

    stream.next_in = buffer;
    stream.avail_in = 1;
    stream.next_out = data;
    stream.avail_out = b->width*b->height;
    stream.zalloc = Z_NULL;
    stream.zfree = Z_NULL;
            
    status = inflateInit(&stream);

    while (1) {
        status = inflate(&stream, Z_SYNC_FLUSH) ;
        if (status == Z_STREAM_END) {
            break;
        }
        if (status != Z_OK) {
            printf("Zlib data error : %s\n", stream.msg);
	    delete data;
            return -1;
        }
        stream.avail_in = 1;
    }

    inflateEnd(&stream);
            
    b->alpha_buf = data;

    return 0;
}

int
Bitmap::buildFromJpegInterchangeData(unsigned char *stream, int read_alpha, long offset)
{
	struct jpeg_decompress_struct cInfo;
	struct jpeg_source_mgr mySrcMgr;
	MyErrorHandler errorMgr;
	JSAMPROW buffer[1];
	unsigned char *ptrPix;
	int stride;
	long n;

#if PRINT&1
        printf("flash: loading jpeg (interchange)\n");
#endif

	// Kludge to correct some corrupted files
	if (stream[1] == 0xd9 && stream[3] == 0xd8) {
		stream[3] = 0xd9;
		stream[1] = 0xd8;
	}

	// Setup error handler
	cInfo.err = jpeg_std_error(&errorMgr.pub);
	errorMgr.pub.error_exit = errorExit;

	if (setjmp(errorMgr.setjmp_buffer)) {
		// JPEG data Error
		jpeg_destroy_decompress(&cInfo);
		if (pixels) {
			delete[] pixels;
			pixels = NULL;
		}
		return -1;
	}

	// Set current stream pointer to stream
	inputData = stream;

	// Here it's Ok

	jpeg_create_decompress(&cInfo);

	// Setup source manager structure
	mySrcMgr.init_source = initSource;
	mySrcMgr.fill_input_buffer = fillInputBuffer;
	mySrcMgr.skip_input_data = skipInputData;
	mySrcMgr.resync_to_restart = resyncToRestart;
	mySrcMgr.term_source = termSource;

	// Set default source manager
	cInfo.src = &mySrcMgr;

	jpeg_read_header(&cInfo, FALSE);

	jpeg_read_header(&cInfo, TRUE);
	cInfo.quantize_colors = TRUE;	// Create colormapped image
	jpeg_start_decompress(&cInfo);

	// Set objet dimensions
	height = cInfo.output_height;
	width = cInfo.output_width;
        bpl = width;
	pixels = new unsigned char [height*width];
	if (pixels == NULL) {
		jpeg_finish_decompress(&cInfo);
		jpeg_destroy_decompress(&cInfo);
		return -1;
	}
	ptrPix = pixels;

	stride = cInfo.output_width * cInfo.output_components;

	buffer[0] = (JSAMPROW)malloc(stride);

	while (cInfo.output_scanline < cInfo.output_height) {

		jpeg_read_scanlines(&cInfo, buffer, 1);

		memcpy(ptrPix,buffer[0],stride);

		ptrPix+= stride;
	}

        free(buffer[0]);

	colormap = new Color[cInfo.actual_number_of_colors];
	if (colormap == NULL) {
		delete pixels;
		jpeg_finish_decompress(&cInfo);
		jpeg_destroy_decompress(&cInfo);
		return -1;
	}
	nbColors = cInfo.actual_number_of_colors;

	for(n=0; n < nbColors; n++)
	{
		colormap[n].red = cInfo.colormap[0][n];
		colormap[n].green = cInfo.colormap[1][n];
		colormap[n].blue = cInfo.colormap[2][n];
	}

	jpeg_finish_decompress(&cInfo);
	jpeg_destroy_decompress(&cInfo);

        if (read_alpha) {
            if (buildJpegAlpha(this,  stream + offset) < 0) {
	    	return -1;
	    }
        }
	return 0;
}

// Read JPEG image using pre-loaded Tables

int
Bitmap::buildFromJpegAbbreviatedData(unsigned char *stream)
{
	JSAMPROW buffer[1];
	unsigned char *ptrPix;
	int stride;
	long n;
	int status;

#if PRINT&1
        printf("flash: loading jpeg (abbreviated)\n");
#endif

	// Set current stream pointer to stream
	inputData = stream;

	// Error handler
	if (setjmp(jpegErrorMgr.setjmp_buffer)) {
		// JPEG data Error
		//jpeg_destroy_decompress(&jpegObject);
		if (pixels) {
			delete[] pixels;
			pixels = NULL;
		}
		return -1;
	}

	// Here it's ok

	jpeg_read_header(&jpegObject, TRUE);
	jpegObject.quantize_colors = TRUE;	// Create colormapped image
	jpeg_start_decompress(&jpegObject);

	// Set objet dimensions
	height = jpegObject.output_height;
	width = jpegObject.output_width;
        bpl = width;
	pixels = new unsigned char [height*width];
	if (pixels == NULL) {
		jpeg_finish_decompress(&jpegObject);
		return -1;
	}
	ptrPix = pixels;

	stride = jpegObject.output_width * jpegObject.output_components;

	buffer[0] = (JSAMPROW)malloc(stride);

	while (jpegObject.output_scanline < jpegObject.output_height) {

		status = jpeg_read_scanlines(&jpegObject, buffer, 1);

		memcpy(ptrPix,buffer[0],stride);

		ptrPix+= stride;
	}
        
        free(buffer[0]);

	colormap = new Color[jpegObject.actual_number_of_colors];
	if (colormap == NULL) {
		jpeg_finish_decompress(&jpegObject);
		delete pixels;
		return -1;
	}
	nbColors = jpegObject.actual_number_of_colors;

	for(n=0; n < nbColors; n++)
	{
		colormap[n].red = jpegObject.colormap[0][n];
		colormap[n].green = jpegObject.colormap[1][n];
		colormap[n].blue = jpegObject.colormap[2][n];
	}

	status = jpeg_finish_decompress(&jpegObject);

	return 0;
}

// Just init JPEG object and read JPEG Tables

int
Bitmap::readJpegTables(unsigned char *stream)
{
	if (haveTables) {
		//Error, it has already been initialized
		return -1;
	}

	// Setup error handler
	jpegObject.err = jpeg_std_error(&jpegErrorMgr.pub);
	jpegErrorMgr.pub.error_exit = errorExit;

	if (setjmp(jpegErrorMgr.setjmp_buffer)) {
		// JPEG data Error
		jpeg_destroy_decompress(&jpegObject);
		return -1;
	}

	// Set current stream pointer to stream
	inputData = stream;

	// Here it's Ok

	jpeg_create_decompress(&jpegObject);

	// Setup source manager structure
	jpegSourceManager.init_source = initSource;
	jpegSourceManager.fill_input_buffer = fillInputBuffer;
	jpegSourceManager.skip_input_data = skipInputData;
	jpegSourceManager.resync_to_restart = resyncToRestart;
	jpegSourceManager.term_source = termSource;

	// Set default source manager
	jpegObject.src = &jpegSourceManager;

	jpeg_read_header(&jpegObject, FALSE);

	haveTables = 1;

	return 0;
}

int Bitmap::buildFromZlibData(unsigned char *buffer, int width, int height, int format, int tableSize)
{
	z_stream	stream;
	int		status;
	unsigned char  *data;

#if PRINT&1
        printf("flash: loading with zlib\n");
#endif

	this->width = width;
	this->height = height;
        this->bpl = width;

	stream.next_in = buffer;
	stream.avail_in = 1;
	stream.zalloc = Z_NULL;
	stream.zfree = Z_NULL;

	tableSize++;

	// Uncompress Color Table
	if (format == 3) {
		unsigned char *colorTable;
		long n;

		// Ajust width for 32 bit padding
		width = (width+3)/4*4;
		this->width = width;
		this->bpl = width;

		depth = 1;
		colorTable = new unsigned char[tableSize*3];
		if (colorTable == NULL) {
			return -1;
		}

		stream.next_out = colorTable;
		stream.avail_out = tableSize*3;

		inflateInit(&stream);

		while (1) {
			status = inflate(&stream, Z_SYNC_FLUSH);
			if (status == Z_STREAM_END) {
					break;
			}
			if (status != Z_OK) {
				printf("Zlib cmap error : %s\n", stream.msg);
				return -1;
			}
			stream.avail_in = 1;
			// Colormap if full
			if (stream.avail_out == 0) {
				break;
			}
		}

		nbColors = tableSize;

		colormap = new Color[nbColors];
		if (colormap == NULL) {
			delete colorTable;
			return -1;
		}

		for(n=0; n < nbColors; n++) {
			colormap[n].red = colorTable[n*3+0];
			colormap[n].green = colorTable[n*3+1];
			colormap[n].blue = colorTable[n*3+2];
		}

		delete colorTable;

	} else if (format == 4) {
		depth = 2;
	} else if (format == 5) {
		depth = 4;
	}

	data = new unsigned char[depth*width*height];
	if (data == NULL) {
		if (colormap) delete colormap;
		return -1;
	}

	stream.next_out = data;
	stream.avail_out = depth*width*height;

	if (format != 3) {
		status = inflateInit(&stream);
	}

	while (1) {
		status = inflate(&stream, Z_SYNC_FLUSH) ;
		if (status == Z_STREAM_END) {
				break;
		}
		if (status != Z_OK) {
			printf("Zlib data error : %s\n", stream.msg);
			delete data;
			return -1;
		}
		stream.avail_in = 1;
	}

	inflateEnd(&stream);

	pixels = new unsigned char [height*width];
	if (pixels == NULL) {
		if (colormap) delete colormap;
		delete data;
		return -1;
	}

	if (format != 3) {
		int n,c;
		unsigned char r,g,b,a;
		unsigned char *ptr;

                r = g = b = a = 0; /* to supress warnings */

		nbColors = 0;
		colormap = new Color[256];
		if (colormap == NULL) {
			delete data;
			delete pixels;
			return -1;
		}
                memset(colormap, 0, 256 * sizeof(Color));
		ptr = pixels;
		
		for(n=0; n < width*height*depth; n+=depth,ptr++) {
                    
			switch (format) {
				case 4:
					break;
				case 5:
					a = data[n];
					// Reduce color dynamic range
					r = data[n+1]&0xe0;
					g = data[n+2]&0xe0;
					b = data[n+3]&0xe0;
					break;
			}
			for(c=0; c < nbColors; c++) {
				if (r == colormap[c].red
				&&  g == colormap[c].green
				&&  b == colormap[c].blue) {
					*ptr = c;
					break;
				}
			}
			if (c == nbColors) {
				if (nbColors == 256) continue;
				nbColors++;
				if (nbColors == 256) {
					//printf("Colormap entries exhausted. After %d scanned pixels\n", n/4);
				}
				colormap[c].alpha = a;
				colormap[c].red   = r;
				colormap[c].green = g;
				colormap[c].blue  = b;
				*ptr = c;
			}
		}
	} else {
		memcpy(pixels, data, width*height);
	}

	delete data;
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
51久久夜色精品国产麻豆| 国产精品另类一区| 国产欧美日韩精品在线| 五月综合激情日本mⅴ| 国产精品自在在线| 91精品国产高清一区二区三区| 日本一区二区三区四区| 美腿丝袜亚洲三区| 欧美精品xxxxbbbb| 亚洲免费看黄网站| 成人精品电影在线观看| 精品久久久久久亚洲综合网| 亚洲国产欧美一区二区三区丁香婷| 国产精品99久| 精品欧美乱码久久久久久| 亚洲线精品一区二区三区| 99视频精品全部免费在线| 久久亚洲捆绑美女| 激情综合一区二区三区| 91精品国产色综合久久不卡蜜臀| 亚洲女爱视频在线| 91一区在线观看| 国产精品久久久久久久蜜臀| 国产成人综合网站| 26uuu国产日韩综合| 久久aⅴ国产欧美74aaa| 欧美一级免费观看| 日韩精品1区2区3区| 4438x亚洲最大成人网| 日韩国产精品91| 欧美一区二区三区小说| 青青草成人在线观看| 日韩三级免费观看| 理论片日本一区| 久久久久久麻豆| 国产精品66部| 国产精品久久毛片a| 成人国产精品免费网站| 日韩毛片在线免费观看| 色综合天天在线| 亚洲国产成人精品视频| 欧美精品久久99久久在免费线| 三级影片在线观看欧美日韩一区二区| 欧美性一级生活| 日韩中文字幕区一区有砖一区| 欧美日韩中字一区| 日本不卡高清视频| 欧美精品一区二区三区一线天视频 | 悠悠色在线精品| 欧美亚洲国产一卡| 免费成人av在线播放| 久久久久青草大香线综合精品| 国产.精品.日韩.另类.中文.在线.播放| 欧美国产综合色视频| 91精品福利在线| 亚洲va韩国va欧美va| 久久先锋影音av| 色8久久精品久久久久久蜜| 天使萌一区二区三区免费观看| 精品少妇一区二区三区日产乱码| 国产91精品欧美| 亚洲综合在线第一页| 亚洲精品在线三区| 色综合一区二区三区| 免费三级欧美电影| 国产欧美日韩在线视频| 欧美主播一区二区三区| 精品一区二区三区视频在线观看| 综合久久久久久| 这里只有精品99re| 不卡av免费在线观看| 日本视频免费一区| 中文字幕一区二区三区不卡 | 首页国产欧美久久| 欧美激情一区二区三区| 91精品国产色综合久久不卡电影 | 国内外成人在线视频| 亚洲综合小说图片| 日本一区二区三区久久久久久久久不 | 日本亚洲电影天堂| 国产精品福利一区| 精品欧美一区二区久久| 欧美日韩一区成人| 97久久超碰国产精品电影| 精品一区二区三区日韩| 亚洲va韩国va欧美va精品| 国产精品青草久久| 精品欧美黑人一区二区三区| 色综合久久九月婷婷色综合| 久久er99精品| 欧美aa在线视频| 亚洲午夜久久久久久久久久久 | 久久久精品欧美丰满| 制服丝袜国产精品| 在线观看亚洲一区| 色综合中文综合网| 精品福利一区二区三区免费视频| 日本精品裸体写真集在线观看| 国产老妇另类xxxxx| 伦理电影国产精品| 日韩av一二三| 亚洲第一福利一区| 一区二区视频在线看| 国产精品欧美极品| 国产亲近乱来精品视频 | 国产成人综合亚洲网站| 韩国在线一区二区| 久久精品免费观看| 蜜臀av国产精品久久久久| 日韩av中文字幕一区二区| 亚洲大片精品永久免费| 亚洲图片欧美综合| 亚洲在线中文字幕| 美女精品一区二区| 日本不卡中文字幕| 久久国产精品99精品国产| 美女诱惑一区二区| 精一区二区三区| 国产老肥熟一区二区三区| 国产成人综合在线观看| 国产成人aaa| 99热在这里有精品免费| av在线一区二区三区| 99re热这里只有精品视频| 91小宝寻花一区二区三区| 99re亚洲国产精品| 欧美日韩精品一二三区| 欧美一区二区在线看| 欧美xxxxxxxx| 国产欧美视频在线观看| 亚洲丝袜精品丝袜在线| 亚洲欧美日韩国产中文在线| 亚洲免费观看在线视频| 亚洲大型综合色站| 久久99久久精品| 成人美女视频在线看| 欧美在线短视频| 欧美成人a在线| 久久久国际精品| 亚洲男人的天堂一区二区 | 538prom精品视频线放| 久久午夜色播影院免费高清 | 色综合色狠狠综合色| 欧美日韩一区二区电影| 欧美精品一区二区三区蜜桃视频| 国产精品色眯眯| 午夜伊人狠狠久久| 国产成人免费9x9x人网站视频| 91麻豆国产福利在线观看| 91精品国产入口在线| 国产天堂亚洲国产碰碰| 亚洲高清中文字幕| 国产a精品视频| 欧美精品tushy高清| 久久精品国产网站| 91在线精品一区二区| 欧美精品视频www在线观看 | 亚洲精品国产无天堂网2021 | 久久久国产一区二区三区四区小说 | 日韩免费一区二区三区在线播放| 久久久久久久久久久久久女国产乱| 亚洲精品国产一区二区精华液 | 韩国三级中文字幕hd久久精品| 99久免费精品视频在线观看| 欧美另类videos死尸| 成人欧美一区二区三区| 蜜桃一区二区三区在线观看| 色妞www精品视频| 国产日韩在线不卡| 免费在线观看日韩欧美| 日本韩国一区二区三区视频| 国产亚洲综合在线| 麻豆精品精品国产自在97香蕉| 欧洲一区在线电影| 一区精品在线播放| 成人午夜电影小说| 久久婷婷色综合| 久久精品国产久精国产| 欧美精品亚洲一区二区在线播放| **网站欧美大片在线观看| 国产一区二区三区美女| 日韩欧美一二三区| 亚洲一二三级电影| 在线观看日韩毛片| 亚洲日本护士毛茸茸| a在线播放不卡| 欧美国产日韩a欧美在线观看| 蜜臀精品一区二区三区在线观看 | 国产精品免费视频一区| 国产乱人伦偷精品视频不卡| 欧美成人三级电影在线| 老司机午夜精品| 精品日韩在线观看| 另类综合日韩欧美亚洲| 日韩视频国产视频| 青青青伊人色综合久久| 欧美一级淫片007| 精品一二线国产| 久久午夜电影网| 成人久久视频在线观看|