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

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

?? pluginpng.cpp

?? 一款最完整的工業(yè)組態(tài)軟源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// ==========================================================
// PNG Loader and Writer
//
// Design and implementation by
// - Floris van den Berg (flvdberg@wxs.nl)
// - Herve Drolon (drolon@infonie.fr)
// - Detlev Vendt (detlev.vendt@brillit.de)
// - Aaron Shumate (trek@startreker.com)
//
// This file is part of FreeImage 3
//
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
// THIS DISCLAIMER.
//
// Use at your own risk!
// ==========================================================

#pragma warning (disable : 4786) // identifier was truncated to 'number' characters

#include "FreeImage.h"
#include "Utilities.h"

#include "../Metadata/FreeImageTag.h"

// ----------------------------------------------------------

#define PNG_ASSEMBLER_CODE_SUPPORTED
#define PNG_BYTES_TO_CHECK 8

// ----------------------------------------------------------

#include "../LibPNG/png.h"

// ----------------------------------------------------------

static FreeImageIO *s_io;
static fi_handle s_handle;

/////////////////////////////////////////////////////////////////////////////
// libpng interface 
// 

static void
_ReadProc(struct png_struct_def *, unsigned char *data, png_size_t size) {
	s_io->read_proc(data, size, 1, s_handle);
}

static void
_WriteProc(struct png_struct_def *, unsigned char *data, png_size_t size) {
	s_io->write_proc(data, size, 1, s_handle);
}

static void
_FlushProc(png_structp png_ptr) {
	// empty flush implementation
}

static void
error_handler(struct png_struct_def *, const char *error) {
	throw error;
}

// in FreeImage warnings disabled

static void
warning_handler(struct png_struct_def *, const char *warning) {
}

// ==========================================================
// Metadata routines
// ==========================================================

static BOOL 
ReadMetadata(png_structp png_ptr, png_infop info_ptr, FIBITMAP *dib) {
	// XMP keyword
	char *g_png_xmp_keyword = "XML:com.adobe.xmp";

	png_textp text_ptr = NULL;
	int num_text = 0;

	// iTXt/tEXt/zTXt chuncks
	if(png_get_text(png_ptr, info_ptr, &text_ptr, &num_text) > 0) {
		for(int i = 0; i < num_text; i++) {
			FITAG tag;
			memset(&tag, 0, sizeof(FITAG));

			tag.length = MAX(text_ptr[i].text_length, text_ptr[i].itxt_length);
			tag.count = tag.length;
			tag.type = FIDT_ASCII;
			tag.value = (char*)text_ptr[i].text;

			if(strcmp(text_ptr[i].key, g_png_xmp_keyword) == 0) {
				// store the tag as XMP
				tag.key = g_TagLib_XMPFieldName;
				FreeImage_SetMetadata(FIMD_XMP, dib, tag.key, &tag);
			} else {
				// store the tag as a comment
				tag.key = text_ptr[i].key;
				FreeImage_SetMetadata(FIMD_COMMENTS, dib, tag.key, &tag);
			}
		}
	}

	return TRUE;
}

static BOOL 
WriteMetadata(png_structp png_ptr, png_infop info_ptr, FIBITMAP *dib) {
	// XMP keyword
	char *g_png_xmp_keyword = "XML:com.adobe.xmp";

	FITAG *tag = NULL;
	FIMETADATA *mdhandle = NULL;
	BOOL bResult = TRUE;

	png_text text_metadata;
	int num_text = 0;

	// set the 'Comments' metadata as iTXt chuncks

	mdhandle = FreeImage_FindFirstMetadata(FIMD_COMMENTS, dib, &tag);

	if(mdhandle) {
		do {
			memset(&text_metadata, 0, sizeof(png_text));
			text_metadata.compression = 1;			 // iTXt, none
			text_metadata.key = tag->key;			 // keyword, 1-79 character description of "text"
			text_metadata.text = (char*)tag->value;	 // comment, may be an empty string (ie "")
			text_metadata.text_length = tag->length; // length of the text string
			text_metadata.itxt_length = tag->length; // length of the itxt string
			text_metadata.lang = 0;					 // language code, 0-79 characters or a NULL pointer
			text_metadata.lang_key = 0;				 // keyword translated UTF-8 string, 0 or more chars or a NULL pointer

			// set the tag 
			png_set_text(png_ptr, info_ptr, &text_metadata, 1);

		} while(FreeImage_FindNextMetadata(mdhandle, &tag));

		FreeImage_FindCloseMetadata(mdhandle);
		bResult &= TRUE;
	}

	// set the 'XMP' metadata as iTXt chuncks
	tag = NULL;
	FreeImage_GetMetadata(FIMD_XMP, dib, g_TagLib_XMPFieldName, &tag);
	if(tag && tag->length) {
		memset(&text_metadata, 0, sizeof(png_text));
		text_metadata.compression = 1;			 // iTXt, none
		text_metadata.key = g_png_xmp_keyword;	 // keyword, 1-79 character description of "text"
		text_metadata.text = (char*)tag->value;	 // comment, may be an empty string (ie "")
		text_metadata.text_length = tag->length; // length of the text string
		text_metadata.itxt_length = tag->length; // length of the itxt string
		text_metadata.lang = 0;					 // language code, 0-79 characters or a NULL pointer
		text_metadata.lang_key = 0;				 // keyword translated UTF-8 string, 0 or more chars or a NULL pointer

		// set the tag 
		png_set_text(png_ptr, info_ptr, &text_metadata, 1);
		bResult &= TRUE;
	}

	return bResult;
}

// ==========================================================
// Plugin Interface
// ==========================================================

static int s_format_id;

// ==========================================================
// Plugin Implementation
// ==========================================================

static const char * DLL_CALLCONV
Format() {
	return "PNG";
}

static const char * DLL_CALLCONV
Description() {
	return "Portable Network Graphics";
}

static const char * DLL_CALLCONV
Extension() {
	return "png";
}

static const char * DLL_CALLCONV
RegExpr() {
	return "^.PNG\r";
}

static const char * DLL_CALLCONV
MimeType() {
	return "image/png";
}

static BOOL DLL_CALLCONV
Validate(FreeImageIO *io, fi_handle handle) {
	BYTE png_signature[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
	BYTE signature[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };

	io->read_proc(&signature, 1, 8, handle);

	return (memcmp(png_signature, signature, 8) == 0);
}

static BOOL DLL_CALLCONV
SupportsExportDepth(int depth) {
	return (
			(depth == 1) ||
			(depth == 4) ||
			(depth == 8) ||
			(depth == 24) ||
			(depth == 32)
		);
}

static BOOL DLL_CALLCONV 
SupportsExportType(FREE_IMAGE_TYPE type) {
	return (
		(type == FIT_BITMAP) ||
		(type == FIT_UINT16)
	);
}

static BOOL DLL_CALLCONV
SupportsICCProfiles() {
	return TRUE;
}

// ----------------------------------------------------------

static FIBITMAP * DLL_CALLCONV
Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
	png_structp png_ptr;
	png_infop info_ptr;
	png_uint_32 width, height;
	png_colorp png_palette;
	int color_type, palette_entries;
	int bit_depth, pixel_depth;		// pixel_depth = bit_depth * channels

	FIBITMAP *dib = NULL;
	RGBQUAD *palette = NULL;		// pointer to dib palette
	png_bytepp  row_pointers = NULL;
	int i;

	s_io = io;
	s_handle = handle;

	if (handle) {
		try {		
			// check to see if the file is in fact a PNG file

			unsigned char png_check[PNG_BYTES_TO_CHECK];

			io->read_proc(png_check, PNG_BYTES_TO_CHECK, 1, handle);

			if (png_sig_cmp(png_check, (png_size_t)0, PNG_BYTES_TO_CHECK) != 0)
				return NULL;	// Bad signature
			
			// create the chunk manage structure

			png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)error_handler, error_handler, warning_handler);

			if (!png_ptr)
				return NULL;			

			// create the info structure

		    info_ptr = png_create_info_struct(png_ptr);

			if (!info_ptr) {
				png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
				return NULL;
			}

			// init the IO

			png_set_read_fn(png_ptr, info_ptr, _ReadProc);

			if (setjmp(png_jmpbuf(png_ptr))) {
				png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
				return NULL;
			}

			// because we have already read the signature...

			png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK);

			// read the IHDR chunk

			png_read_info(png_ptr, info_ptr);
			png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);
			pixel_depth = info_ptr->pixel_depth;

			// get image data type (assume standard image type)

			FREE_IMAGE_TYPE image_type = FIT_BITMAP;
			if (bit_depth == 16) {
				if (color_type == PNG_COLOR_TYPE_GRAY) {
					image_type = FIT_UINT16;
#ifndef FREEIMAGE_BIGENDIAN
					// turn on 16 bit byte swapping
					png_set_swap(png_ptr);
#endif
				} else {
					// tell libpng to strip 16 bit/color files down to 8 bits/color
					png_set_strip_16(png_ptr);
					bit_depth = 8;
				}
			}


			// set some additional flags

			switch(color_type) {
				case PNG_COLOR_TYPE_RGB:
				case PNG_COLOR_TYPE_RGB_ALPHA:
#ifndef FREEIMAGE_BIGENDIAN
					// flip the RGB pixels to BGR (or RGBA to BGRA)

					png_set_bgr(png_ptr);
#endif
					break;

				case PNG_COLOR_TYPE_PALETTE:
					// expand palette images to the full 8 bits from 2 or 4 bits/pixel

					if ((pixel_depth == 2) || (pixel_depth == 4)) {
						png_set_packing(png_ptr);
						pixel_depth = 8;
					}					

					break;

				case PNG_COLOR_TYPE_GRAY:
					// expand grayscale images to the full 8 bits from 2 or 4 bits/pixel

					if ((pixel_depth == 2) || (pixel_depth == 4)) {
						png_set_expand(png_ptr);
						pixel_depth = 8;
					}

					break;

				case PNG_COLOR_TYPE_GRAY_ALPHA:
					// expand 8-bit greyscale + 8-bit alpha to 32-bit

					png_set_gray_to_rgb(png_ptr);
#ifndef FREEIMAGE_BIGENDIAN
					// flip the RGBA pixels to BGRA

					png_set_bgr(png_ptr);
#endif
					pixel_depth = 32;

					break;

				default:
					throw "PNG format not supported";
			}

			// Get the background color to draw transparent and alpha images over.
			// Note that even if the PNG file supplies a background, you are not required to
			// use it - you should use the (solid) application background if it has one.

			png_color_16p image_background = NULL;
			RGBQUAD rgbBkColor;

			if (png_get_bKGD(png_ptr, info_ptr, &image_background)) {
				rgbBkColor.rgbRed      = (BYTE)image_background->red;
				rgbBkColor.rgbGreen    = (BYTE)image_background->green;
				rgbBkColor.rgbBlue     = (BYTE)image_background->blue;
				rgbBkColor.rgbReserved = 0;
			}

			// if this image has transparency, store the trns values

			png_bytep trans               = NULL;
			int num_trans                 = 0;
			png_color_16p trans_values    = NULL;
			png_uint_32 transparent_value = png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &trans_values);

			// unlike the example in the libpng documentation, we have *no* idea where
			// this file may have come from--so if it doesn't have a file gamma, don't
			// do any correction ("do no harm")

			double gamma = 0;
			double screen_gamma = 2.2;

			if (png_get_gAMA(png_ptr, info_ptr, &gamma) && ( flags & PNG_IGNOREGAMMA ) != PNG_IGNOREGAMMA)
				png_set_gamma(png_ptr, screen_gamma, gamma);

			// all transformations have been registered; now update info_ptr data

			png_read_update_info(png_ptr, info_ptr);

			// color type may have changed, due to our transformations

			color_type = png_get_color_type(png_ptr,info_ptr);

			// create a DIB and write the bitmap header
			// set up the DIB palette, if needed

			switch (color_type) {
				case PNG_COLOR_TYPE_RGB:
					png_set_invert_alpha(png_ptr);

					dib = FreeImage_Allocate(width, height, 24, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
					break;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产黑色紧身裤美女| 国模无码大尺度一区二区三区| 亚洲日本va午夜在线电影| 亚洲高清中文字幕| 国产精品自拍三区| 日韩视频一区二区三区| 亚洲激情男女视频| 国产精品亚洲成人| 日韩欧美一区二区不卡| 亚洲永久免费av| 不卡一二三区首页| 欧美精品一区二区三区蜜桃视频| 亚洲一区av在线| 成人avav影音| 欧美一级午夜免费电影| 精品国产一区二区亚洲人成毛片| 一区二区三区精品| 成人免费va视频| 国产亚洲精品久| 久久99深爱久久99精品| 欧美一区二区三区在线视频 | 欧美一区午夜精品| 亚洲电影你懂得| 在线亚洲一区观看| 一区二区三区在线观看欧美| 成人美女视频在线看| 久久久一区二区三区| 激情综合五月天| 精品成人佐山爱一区二区| 麻豆免费看一区二区三区| 91精品麻豆日日躁夜夜躁| 亚洲国产va精品久久久不卡综合| 欧美亚洲一区二区在线| 亚洲国产一二三| 在线成人免费视频| 日本中文字幕一区| 日韩一卡二卡三卡四卡| 韩国精品主播一区二区在线观看 | 欧美日韩国产在线播放网站| 亚洲自拍另类综合| 欧美性大战久久久久久久蜜臀| 亚洲精品第1页| 欧美天堂亚洲电影院在线播放| 亚洲成年人网站在线观看| 欧美精品一二三| 精品在线免费视频| 国产欧美日韩麻豆91| 91麻豆免费在线观看| 亚洲综合丁香婷婷六月香| 欧美精品丝袜中出| 国产综合久久久久影院| 中文在线一区二区 | 懂色av一区二区三区免费看| 国产精品福利一区| 精品视频资源站| 国产综合色在线视频区| 国产精品国产精品国产专区不蜜 | 在线观看视频一区二区| 三级不卡在线观看| 日本一区二区在线不卡| 日本久久电影网| 久久黄色级2电影| 欧美高清在线视频| 欧美日韩国产色站一区二区三区| 精品一区二区三区在线播放| 中文字幕中文字幕一区| 欧美日韩卡一卡二| 国产成人综合在线| 亚洲成在人线在线播放| 久久精品日产第一区二区三区高清版 | 国产在线国偷精品免费看| 综合色中文字幕| 91精品国产aⅴ一区二区| 成人动漫在线一区| 三级欧美在线一区| 中文字幕中文在线不卡住| 制服丝袜av成人在线看| voyeur盗摄精品| 精品亚洲成a人在线观看| 夜夜爽夜夜爽精品视频| 国产人久久人人人人爽| 欧美一区二区国产| 91久久人澡人人添人人爽欧美| 久久精品国产秦先生| 亚洲精品免费播放| 2023国产精品| 欧美天天综合网| 成人免费电影视频| 免播放器亚洲一区| 亚洲欧美日韩国产成人精品影院| 日韩精品自拍偷拍| 欧美男女性生活在线直播观看| 国产v日产∨综合v精品视频| 麻豆精品在线播放| 石原莉奈在线亚洲二区| 亚洲福利视频三区| 亚洲黄色在线视频| 国产精品久久久99| 国产精品三级久久久久三级| 亚洲精品一区在线观看| 欧美一区中文字幕| 777午夜精品视频在线播放| 91久久精品国产91性色tv| 成人精品国产福利| 成人综合婷婷国产精品久久| 国产麻豆成人传媒免费观看| 奇米一区二区三区av| 日本一区中文字幕| 日韩和欧美一区二区| 午夜精品久久久久久| 亚洲一卡二卡三卡四卡| 亚洲国产乱码最新视频| 亚洲成年人影院| 亚洲aaa精品| 三级亚洲高清视频| 日韩av一级电影| 免费成人小视频| 久久97超碰国产精品超碰| 激情综合色综合久久综合| 久久国产精品免费| 国产精品一级在线| 成人av影视在线观看| av在线不卡免费看| 91福利精品第一导航| 欧美三级视频在线| 91精品国产入口| 精品乱人伦小说| 国产精品理论片在线观看| 国产精品污污网站在线观看| 亚洲欧美一区二区三区孕妇| 有坂深雪av一区二区精品| 视频一区在线播放| 经典三级视频一区| 成人免费看视频| 欧美日韩一区二区三区四区| 欧美一级一区二区| 国产日韩欧美综合在线| 亚洲乱码一区二区三区在线观看| 亚洲尤物在线视频观看| 麻豆传媒一区二区三区| 东方欧美亚洲色图在线| 色香蕉成人二区免费| 91麻豆精品国产自产在线观看一区| 日韩欧美国产一区二区在线播放| 国产婷婷精品av在线| 亚洲免费视频成人| 久久精品国产77777蜜臀| a在线播放不卡| 欧美一三区三区四区免费在线看 | 国产日产精品1区| 亚洲一二三四久久| 精品写真视频在线观看 | 懂色av一区二区在线播放| 欧美最猛黑人xxxxx猛交| 精品国产一区a| 亚洲精品v日韩精品| 久久精品国内一区二区三区| 91香蕉国产在线观看软件| 日韩三级av在线播放| 亚洲免费观看高清| 国产一区二区三区高清播放| 欧美三级日本三级少妇99| 久久精品人人做人人爽人人| 午夜国产不卡在线观看视频| 成人免费福利片| 欧美精品一区二区三区在线| 一区二区三区自拍| 国产不卡在线一区| 欧美一区二区三区的| 亚洲免费观看高清完整版在线观看 | 97久久久精品综合88久久| 日韩欧美电影一二三| 五月天中文字幕一区二区| 国产福利视频一区二区三区| 欧美一区二区三区免费在线看 | 欧美激情中文字幕一区二区| 日韩在线卡一卡二| 色猫猫国产区一区二在线视频| 中文字幕av在线一区二区三区| 奇米精品一区二区三区在线观看 | 一本久久a久久免费精品不卡| 国产精品一区一区三区| 久久你懂得1024| 亚洲国产精品久久一线不卡| 成人精品在线视频观看| 欧美成人免费网站| 丝袜亚洲另类欧美综合| 精品污污网站免费看| 一区二区三区在线视频观看58| youjizz久久| 亚洲国产高清aⅴ视频| 国产精品1区二区.| 久久久久久免费网| 国产一区二区免费看| 精品国产免费久久| 狠狠色伊人亚洲综合成人| 日韩片之四级片| 九色综合狠狠综合久久| 欧美精品一区二区三区蜜桃| 激情综合色综合久久|