2009年3月19日星期四

IJG JPEG 函数库:文件列表说明

IJG JPEG 函数库:代码规则

版权 (C) 1991-1996, Thomas G. Lane.
本文是Independent JPEG Group软件中的一部分。
针对于如何分发与使用,请参照随本库一起发放的README 文件。


由于很多程序员将会为完善代码与bug修复中而共同努力,因此,统一编码风格将是很重要的一件事。使用相似的编码风格的目的不在于风格的细枝末节,而在统一的重要性。

一般,我们遵从推荐标准"Recommended C Style and Coding
Standards"(C代码标准和编码风格推荐标准)的6.1版(Cannon等人。由Spencer,
Keppel和Brader修订)。该文档可在IJG
FTP目录中找到(参见jpeg/doc/cstyle.ms.tbl.Z,或者专为没有nroff/tbl
r的使用者提供的cstyle.txt.Z)。

注释块应以下列方式布局:
/*
* Block comments in this style.
*/

我们使用K&R风格来对语句进行缩排,例如,
if (test) {
then-part;
} else {
else-part;
}
每一级缩排使用两个空格。(这种缩排习俗由GNU
Emacs或其他文本编辑器自动完成。)

多个单词组成的名称应该以小写加下划线方式,例如,multi_word_name
(不是multiWordName)。预处理器符号和枚举常量相似,但应使用大写形式(MULTI_WORD_NAME)。在前15个字符之内,名称应该保持唯一。(对一些老系统而言,全局变量名应在6位以内保持唯一。我们在不引起混乱的情况下,通过使用宏来代替较短的名称的方法来解决这个问题。)

我们可在任何地方使用函数原形;我们依赖于自动代码转换来弥补缺少原型的C编译器。转换是通过简单轻便的工具'ansi2knr.c'(蒙Ghostscript的好意)来完成的。ansi2knr并不是很智能化,因此要求在函数声明时要注意格式问题:函数名MUST
BEGIN IN COLUMN 1。因此所有的函数都应该这样写:

LOCAL(int *)
function_name (int a, char *b)
{
code...
}
注:每个函数定义必须以GLOBAL(type), LOCAL(type),或
METHODDEF(type)开头。这些宏适当地扩充了"static type"
或仅仅是"type"。它们为函数的用法提供了一种可读性较好的标识且可为特殊的需求备用。(例如,特殊的链接词可被插入以便Windows
DLLs使用。)

ansi2knr不能转换方法声明(结构体的中的函数声明)。我们用JMETHOD来解决,JMETHOD的定义如下:
#ifdef HAVE_PROTOTYPES
#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
#else
#define JMETHOD(type,methodname,arglist) type (*methodname) ()

JPEG软编解码器介绍

首先介绍几个名词:
IJG:Independent JPEG Group
IJL: Intel JPEG Library
IPP: Intel Integrated Performance Primitives

IJG提供的JPEG软编解码器是使用最广泛的,可以从官方网站www.ijg.org下载最新版本6b。
优点:免费、开源;纯C编写,支持众多硬件平台和操作系统;
缺点:速度一般

IJL是Intel提供的JPEG软编解码器,2001以前IJL是免费的。
你可以编程实现从buffer读取jpeg图像数据然后解码到输出buffer,实现如下:

//read JPEG image from buffer and decompress it and write to output buffer.

JPEG_CORE_PROPERTIES jcprops;

// Initialize the IntelR JPEG Library.
IJLERR jerr = ijlInit(&jcprops);
..
..
// Use the IJL to read data from a buffer or a file.
jerr = ijlRead(&jcprops, iotype);
..
..
// Now get the actual JPEG image data into the pixel buffer.
jerr = ijlRead(&jcprops, IJL_JBUFF_READWHOLEIMAGE);

// Use the IJL to write data into a buffer or a file.
IJLERR ijlWrite (JPEG_CORE_PROPERTIES *jcprops, IJLIOTYPE iotype);

// Clean up the IJL.

但是,2001年以后,IJL就被集成到IPP里面了。注意:IPP是收费的,不提供源码。现在,你要使用IPP来进行JPEG编解码。
首先,你需要安装IPP,然后下载IPP
Sample解压,里面的image-codecs提供了jpeg的编解码例程,其中提供ijp、jpeg-ijl,此处的ijp源码文件中,intel已经加入了IPP的函数,你可以通过修改头文件jconfig.h来决定是否使用调用IPP库进行编译,据intel称:使用IPP后,ijg的性能提高了1.5~2倍。
优点:针对intel CPU优化过,速度很快;
缺点:收费,只针对Intel CPU

AMD开源了它的处理库FrameWave,也有jpeg实现,有空儿也可以研究研究。

漂亮的桌面日历 Rainlendar

linux下面的"事务计划""日记""提醒"三个功能一直没有什么好的软件能给通通实现了,可能有,但我不知道or没找到,我喜欢小巧、简洁、功能强大的如软件。目前的临时之法是:
事务计划:shell脚本实现一个todo功能;
日记:vim写日记;
就是"提醒"功能还差个好点儿趁手的工具。
今天偶尔发现,Rainlendar也有linux版本,太好了,这东东我以前在windows下就百里挑一选中了它,小巧强大绿色免费,用了好几年了,太符合我的要求了。只是不知道它还是跨平台的,也有linux的版本,推荐使用。查看了它的实现,使用lua实现的。

Rainlendar 是一个比较漂亮的桌面日历工具,带事件提醒功能
下载地址http://www.rainlendar.net/

下载解压之后
$tar jxvf Rainlendar-Lite.tar.bz2
就可以运行
$./rainlendar2

默认英文界面,支持中文,如果想用,下载简体中文包Simplified_Chinese.r2lang:
方法:在终端中运行
$./rainlendar2 -i /你下载语言包的路径/Simplified_Chinese.r2lang

最后,重新运行rainlendar2,在界面上右键,Options...
/Language中选择Chinese(Simplified)/OK,
中文界面出现了。


现在,感觉window到linux的转换越来越小了。因为我以前windows下用的东西,linux下照样儿用。比如:
浏览器:opera,连我的配置profile都一样,自定义的快捷键等等,无差异,而且opera
linux更新频率一点儿不慢;
编辑工具:vim,配置也平台通吃;
计划提醒:rainlendar
影音播放:mplayer

换平台,不一致的地方:
邮件:windows下我用becky,小巧强大;可惜无linux版本,试了好几个,都不中意,现在用opera
mail,还行;
文件管理器:windows下用totalcmd,linux下无匹敌工具
下载工具:迅雷无人可比;