2010年3月26日星期五

NTSC Cable TV Channel Frequencies

The visual carrier frequency is shown in this chart. For the aural carrier frequency, add 4.5 MHz to the visual carrier. The lower edge of the channel is 1.25 MHz below the visual carrier and the upper edge is 4.75 MHz above the visual carrier.

Channel designation Visual carrier (MHz)

EIA/NCTA Traditional Standard HRCIRC Broadcast
T Band
T-7 7.00



T-8 13.00



T-9 19.00



T-10 25.00



T-11 31.00



T-12 37.00



T-13 43.00



T-14 49.00


Low Band 2 2 55.25 54.0027 55.2625 55.25
3 3 61.25 60.0030 61.2625 61.25
4 4 67.25 66.0033 67.2625 67.25
1 A-8
72.0036 73.2625
5 5 77.25 78.0039 79.2625 77.25
6 6 83.25 84.0042 85.2625 83.25
FM Band 95 A-5 91.25 90.0045 91.2625
96 A-4 97.25 96.0048 97.2625
97 A-3 103.25 102.0051 103.2625

Channel designation Visual carrier (MHz)

EIA/NCTA Traditional Standard HRCIRC Broadcast
Mid Band 98 A-2 109.275/2 108.0054 109.275
99 A-1 115.275/2 114.0057 115.275
14 A 121.2625/1 120.0060 121.2625 471.25
15 B 127.2625/1 126.0063 127.2625 477.25
16 C 133.2625/1 132.0066 133.2625 483.25
17 D 139.25 138.0069 139.2625 489.25
18 E 145.25 144.0072 145.2625 495.25
19 F 151.25 150.0075 151.2625 501.25
20 G 157.25 156.0078 157.2625 507.25
21 H 163.25 162.0081 163.2625 513.25
22 I 169.25 168.0084 169.2625 519.25

Channel designation Visual carrier (MHz)

EIA/NCTA Traditional Standard HRCIRC Broadcast
High Band 7 7 175.25 174.0087 175.2625 175.25
8 8 181.25 180.0090 181.2625 181.25
9 9 187.25 186.0093 187.2625 187.25
10 10 193.25 192.0096 193.2625 193.25
11 11 199.25 198.0099 199.2625 199.25
12 12 205.25 204.0102 205.2625 205.25
13 13 211.25 210.0105 211.2625 211.25

Channel designation Visual carrier (MHz)

EIA/NCTA Traditional Standard HRCIRC Broadcast
Super Band 23 J 217.25 216.0108 217.2625 525.25
24 K 223.25 222.0111 223.2625 531.25
25 L 229.2625/1 228.0114 229.2625 537.25
26 M 235.2625/1 234.0117 235.2625 543.25
27 N 241.2625/1 240.0120 241.2625 549.25
28 O 247.2625/1 246.0123 247.2625 555.25
29 P 253.2625/1 252.0126 253.2625 561.25
30 Q 259.2625/1 258.0129 259.2625 567.25
31 R 265.2625/1 264.0132 265.2625 573.25
32 S 271.2625/1 270.0135 271.2625 579.25
33 T 277.2625/1 276.0138 277.2625 585.25
34 U 283.2625/1 282.0141 283.2625 591.25
35 V 289.2625/1 288.0144 289.2625 597.25
36 W 295.2625/1 294.0147 295.2625 603.25

Channel designation Visual carrier (MHz)

EIA/NCTA Traditional Standard HRCIRC Broadcast
Hyper Band 37 AA 301.2625/1 300.0150 301.2625 609.25
38 BB 307.2625/1 306.0153 307.2625 615.25
39 CC 313.2625/1 312.0156 313.2625 621.25
40 DD 319.2625/1 318.0159 319.2625 627.25
41 EE 325.2625/1 324.0162 325.2625 633.25
42 FF 331.275/2 330.0165 331.275 639.25
43 GG 337.2625/1 336.0168 337.2625 645.25
44 HH 343.2625/1 342.0171 343.2625 651.25
45 II 349.2625/1 348.0174 349.2625 657.25
46 JJ 355.2625/1 354.0177 355.2625 663.25
47 KK 361.2625/1 360.0180 361.2625 669.25
48 LL 367.2625/1 366.0183 367.2625 675.25
49 MM 373.2625/1 372.0186 373.2625 681.25
50 NN 379.2625/1 378.0189 379.2625 687.25
51 OO 385.2625/1 384.0192 385.2625 693.25
52 PP 391.2625/1 390.0195 391.2625 699.25
53 QQ 397.2625/1 396.0198 397.2625 705.25
54 RR 403.25 402.0201 403.2625 711.25
55 SS 409.25 408.0204 409.2625 717.25
56 TT 415.25 414.0207 415.2625 723.25
57 UU 421.25 420.0210 421.2625 729.25
58 VV 427.25 426.0213 427.2625 735.25
59 WW 433.25 432.0216 433.2625 741.25
60 XX 439.25 438.0219 439.2625 747.25
61 YY 445.25 444.0222 445.2625 753.25
62 ZZ 451.25 450.0225 451.2625 759.25
Channel designation Visual carrier (MHz)
EIA/NCTA Traditional Standard HRCIRC Broadcast
63
457.25 456.0228 457.2625 765.25
64
463.25 462.0231 463.2625 771.25
65
469.25 468.0234 469.2625 777.25
66
475.25 474.0237 475.2625 783.25
67
481.25 480.0240 481.2625 789.25
68
487.25 486.0243 487.2625 795.25
69
493.25 492.0246 493.2625 801.25
70
499.25 498.0249 499.2625 807.25
71
505.25 504.0252 505.2625 813.25
72
511.25 510.0255 511.2625 819.25
73
517.25 516.0258 517.2625 825.25
74
523.25 522.0261 523.2625 831.25
75
529.25 528.0264 529.2625 837.25
76
535.25 534.0267 535.2625 843.25
77
541.25 540.0270 541.2625 849.25
78
547.25 546.0273 547.2625 855.25
79
553.25 552.0276 553.2625 861.25
80
559.25 558.0279 559.2625 867.25
81
565.25 564.0282 565.2625 873.25
82
571.25 570.0285 571.2625 879.25
83
577.25 576.0288 577.2625 885.25
84
583.25 582.0291 583.2625
85
589.25 588.0294 589.2625
86
595.25 594.0297 595.2625
87
601.25 600.0300 601.2625
88
607.25 606.0303 607.2625
89
613.25 612.0306 613.2625
90
619.25 618.0309 619.2625
91
625.25 624.0312 625.2625
92
631.25 630.0315 631.2625
93
637.25 636.0318 637.2625
94
643.25 642.0321 643.2625
100
649.25 648.0324 649.2625
101
655.25 654.0327 655.2625
102
661.25 660.0330 661.2625
103
667.25 666.0333 667.2625
104
673.25 672.0336 673.2625
105
679.25 678.0339 679.2625
106
685.25 684.0342 685.2625
107
691.25 690.0345 691.2625
108
697.25 696.0348 697.2625
109
703.25 702.0351 703.2625
110
709.25 708.0354 709.2625
111
715.25 714.0357 715.2625
112
721.25 720.0360 721.2625
113
727.25 726.0363 727.2625
114
733.25 732.0366 733.2625
115
739.25 738.0369 739.2625
116
745.25 744.0372 745.2625
117
751.25 750.0375 751.2625
118
757.25 756.0378 757.2625
119
763.25 762.0381 763.2625
120
769.25 768.0384 769.2625
121
775.25 774.0387 775.2625
122
781.25 780.0390 781.2625
123
787.25 786.0393 787.2625
124
793.25 792.0396 793.2625
125
799.25 798.0399 799.2625

EIA/NCTA Traditional Standard HRCIRC Broadcast

Channel designation Visual carrier (MHz)

1. Cable channels operating on frequencies used in the aeronautical radiocommunications bands 118-137, 225-328.6 and 335.4-400 MHz are required to be offset by 12.5 kHz from 25 kHz-spaced channels [FCC Rules section 76.612 (a)]. The common offset is positive.

2. Cable channels operating on frequencies used in the aeronautical radiocommunications bands 108-118 and 328.6-335.4 MHz are required to be offset by 25 kHz from 50 kHz-spaced channels [FCC Rules section 76.612 (b)]. The common offset is positive.


More information on television channel frequencies:
  • In 1997, the American National Standards Institute (ANSI) approved standard EIA-542, Cable Television Channel Identification Plan. The standard can be purchased from Global Engineering Documents. The standard specifies HRC channels as shown here except that channel 98 is 108.025 MHz and channel 99 is 114.025 MHz.

    To calculate the frequency of any EIA-542 channel above 99:

    Standard:
    Frequency_in_MHz=(6*(8+channel_designation))+1.25
    HRC:
    Frequency_in_MHz =6.0003*(8+channel_designation)
    IRC:
    Frequency_in_MHz =(6*(8+channel_designation))+1.2625
  • The frequency of over-the-air broadcast channels 2 through 69 is specified in FCC Rule 73.603. Channels 70 through 83 were re-allocated for other services but older equipment is capable of receiving on those channels.
  • "HRC" is harmonically related carriers. "IRC" is incrementally related carriers. These are schemes that some cable systems use to reduce the visibility of beat products.
    "By harmonically relating the carrier frequencies themselves it is ... possible to improve system performance. This does not reduce the beats produced, but positions them within the system transmission spectrum such that they are more tolerable. In effect, all signal carriers are spaced precisely 6 MHz apart, thus all beats generated are at 6 MHz increments.

    "Since the television signals are vestigial sideband modulated, if the beat products can be manipulated to fall on or near the RF carriers themselves, they are much less offensive.."

    --from William Grant, Cable Television, 2nd edition, GWG Associates, Schoharie, NY, 1988, page 82

    The FCC rules suggest that the actual frequency of the fundamental oscillator in HRC comb generators "shall be 6.0003 MHz [
    FCC Rule 76.612 (a) (2)]."


  • 2010年3月23日星期二

    samba 也是个好东东

    这段时间一直用虚拟机跑linux
    虽然虚拟机提供了host-OS XP 上文件夹对 客户机的共享,但是如果把代码直接在XP上编译,就会变得很慢。
    如果把代码放到linux上呢,又舍不得sourceinsight(没办法,谁叫我先习惯了这玩意儿呢)
    虽然说可以在linux上wine一个SI,但毕竟 PC 旧已,跑不动了...
    所以呢,还只能代码放到linux系统中,然后samba共享出去。
    yum install samba*
    然后就装完了(再次感叹YUM是个好东东)
    本来来说一个优秀的程序员是应该自己去/etc/samba/smb.conf 手动配置一番的。
    但是我这回就懒得管理了,毕竟不是什么大事情,在yum下一个图形界面配置samba滴好东东。
    yum install system-config-samba
    完了之后直接在system->administration->samba就打开了
    图形界面很简单很直观的说,设置完了就可以直接在XP上打linux的IP地址访问了


    /* 转摘请留言 俺是 zzview */

    2010年3月16日星期二

    专家介绍慢性失眠等九类睡眠问题解决方法_新闻中心_新浪网

    专家介绍慢性失眠等九类睡眠问题解决方法
    http://www.sina.com.cn 2010年03月16日10:42 家庭保健报

      目前,睡眠障碍已经成为全球性问题,很多人不同程度地受到失眠、打鼾等困扰。美国《真简单》杂志近日总结出人们最爱发生的9大睡眠问题,并请专家有针对性地提出了具体的解决办法。

      夜醒型:

      晚上10点半能正常入睡,但3~4个小时后却异常清醒,每晚深睡眠时间不足4小时,早上起床后头昏眼花。洗热水澡、睡前喝热牛奶,甚至吃安眠药都毫无效果。

      专家建议:首先应考虑是否与近期发生的某种压力巨大的生活变故有关,比如感情破裂等。找准病因,对症下药,失眠就会逐渐好转。具体包括:

      1.心理疏导,最好通过心理医生,帮你认清阻碍睡眠的绊脚石。

      2.针灸有助于减轻焦虑,诱导深度睡眠。

      3.不喝酒。饮酒的确有助入睡,但是从睡眠质量看,它会导致更多的睡眠问题。

      4.坦然接受“夜醒”。夜醒属于正常现象,并非大难临头,无需为此忧心忡忡,焦虑不安,否则容易形成恶性循环。

      5.将闹钟从床头移开,深夜盯着闹钟只会更加焦虑。

      晨鸟型

      白天忙忙碌碌,晚上一黑天就上床呼呼大睡,但凌晨3点左右会习惯性醒来。原因可能是孩子吵闹、家人鼾声或是被大小便憋醒。醒来之后就无法重新入睡,躺在床上,大脑飞快地思考问题,最终放弃睡眠。

      专家建议:

      1.此类失眠者应当设定一个固定的起床时间,并坚持一周,由此可以计算出一周睡眠时间。比如,按每晚7个小时睡眠计算,要想早上5点起床,就应该在晚上10点睡觉。之后逐步调整睡眠时间,使早晨醒来的时间逐渐晚些,从而达到调准生物钟的作用。

      2.为了减少“早醒”焦虑,建议醒来时不要躺在床上,最好起床放松一下,比如喝一杯果汁或牛奶。越是躺在床上“努力睡”,反而越清醒。

      夜猫子型:

      通常在夜间更兴奋,看电视、看书、上网、做家务,一直熬到凌晨两三点才睡觉。

      早晨因为要上班,还得正常起床,但起来后会觉得头昏眼花。

      专家建议:

      1.睡前一定要放慢生活节奏,尽量利用白天时间处理工作、安排家务。

      2.电视、电脑显示器发出的光可抑制褪黑素,导致睡眠障碍,可以给它们增加蓝光滤光片。3.晚上光照太强,就相当于摄入了咖啡因,因此睡觉前至少2小时应调暗灯光。

      焦虑型:

      入睡时很顺利,但睡眠中会多次醒来,虽然躺在床上,脑子却转个不停,想东想西,为工作生活琐事而焦虑。如果睡眠环境差(室外交通嘈杂等),或者从事了新的工作,那么失眠会进一步加重。

      专家建议:

      1.放松身心,转移注意力,比如关注自己的呼吸。

      2.让睡眠环境更加恬静,比如加厚窗帘以遮住窗外路灯的灯光等。

      3.睡觉时戴耳塞。

      赖床型:


      入睡困难,可能需要1小时左右。而一旦入睡,早晨就怎么也不愿起床,经常睡懒觉。

      专家建议:

      1.下午和晚上不喝含咖啡因的饮料。

      2.上午尽量多接受阳光照射,适当参加户外运动。

      3.必要时可在睡前补充0.3毫克褪黑激素,促进睡眠。

      慢性失眠型:

      入睡需要1个小时或更长时间;睡眠过程中醒来多次,每次清醒持续几分钟到1个小时;常说梦话。

      专家建议:1.改善晚间生活习惯和睡眠环境。理想的睡眠环境包括:适当降低卧室室温;光线稍暗;播放包含雨声、海浪声或树叶沙沙声的CD,可掩饰环境里令人心烦的杂音;只把床作为睡觉之所,不在床上看电视。

      2.及时就医,配合医生诊断失眠病因。

      3.白天适当锻炼。

      过度刺激型:

      为了完成工作加班到午夜或凌晨两三点,想倒头大睡时,却发现由于过度兴奋无法入眠。

      专家建议:

      1.在白天小睡有助于平衡睡眠时间,但是时间不宜过长。

      2.即使工作很晚,也应该设定一个固定的睡觉时间。

      3.养成睡前放松习惯,如睡前半小时洗温水澡、看书读报、调低灯光亮度等。

      缺觉型:

      由于工作、生活或学习的缘故,正常情况下睡眠不足5个小时,导致经常感觉昏昏沉沉,注意力不集中,记忆力减退等。

      专家建议:

      1.白天在规定时间内完成应做的工作。

      2.戴上耳塞,避免噪音干扰睡眠。

      3.学会“放弃”,从某些事务中脱身。

      4.多参加体育锻炼。

      激素导致失眠型:

      多为更年期女性,表现为入睡难,半夜常醒,醒来后辗转反侧,直到起床,起床后常常精神萎靡。

      专家建议:

      1.女性绝经后,激素的变化可能会影响到睡眠,如果潮热很严重,卧室最好保持较低温度。2.服用睡眠类非处方药物需当心,此类药物中含有会在人体内长时间停留的抗组胺剂,会导致嗜睡,并持续大约18个小时。

      3.睡前20分钟服用0.3毫克非处方药褪黑激素。

      4.接受体检。女性在更年期前后可能开始出现睡眠呼吸暂停等严重睡眠问题。

      顺德市第一人民医院中医内科

      李成坤供稿


    2010年3月11日星期四

    研究称中国社保缴费占工资比例全球第一_新闻中心_新浪网

    研究称中国社保缴费占工资比例全球第一
    http://www.sina.com.cn 2010年03月11日14:58 新民晚报

      中国的社会保险缴费在181个国家中排名第一,约为“金砖四国”其他三国平均水平的2倍,是北欧五国的3倍,是G7国家的2.8倍,是东亚邻国和邻近地区(中国香港和中国台湾)的4.6倍。

      中国五项社会保险法定缴费之和相当于工资水平的40%,有的地区甚至达到50%,这一比例超过了世界上绝大多数国家。这是清华大学教授白重恩的研究发现。

      研究称,目前按照世界银行2009年最新测算的实际承受税率,中国的社会保险缴费在181个国家中排名第一,约为“金砖四国”其他三国平均水平的2倍,是北欧五国的3倍,是G7国家的2.8倍,是东亚邻国和邻近地区(中国香港和中国台湾)的4.6倍。

      白重恩认为,当前的社保缴费费率过高,不但加重了参保企业和职工的负担,不利于扩大就业;更限制了家庭可支配收入的增长、挤压了补充保险和商业保险的发展空间。

      鉴于当前社保缴费比例过高,减少了居民消费,对经济发展已经产生负面影响,清华大学中国经济研究中心教授魏杰建议,政府应提出“十二五”期间,加大国企分红用于充实社会保障的比例,以降低居民和企业社保缴费负担。

      “现在国有企业资本预算,没拿什么钱给社保基金。这样社保就只能靠居民、企业,等于减少居民收入。但是,央企的利润应该有相当大的部分给社保基金。”曾参与国家国有资产管理研究的魏杰说。

      根据国资委的报告,2007年和2008年两年间,财政部共计收取国有资本经营收益(即通常所说的国企分红)共584亿元,而这584亿大部分投向了2008年出现流动性困难或受到自然灾害打击的一些央企,以及新设央企的资本金。

      因此,这两年国企分红的节余仅为12亿元,这其中有多少被用于充实社保尚不为外界所知。这与国有资本经营预算制度设立时,备受支持的开拓非税收入用于社保等民生项目的缘由相去甚远。


    2010年3月8日星期一

    公众交通与节能环保

    深圳的私家车越来越多了,道路越来越拥挤。
    在提倡节能环保的口号中,私家车的增量也着实让人吃惊的说。
    为了把不到100公斤的肉体从一个地方挪到另一个地方,却要附带增加超过5吨的负重,这性价比也太低了吧......
    自行车道呢?快速公交呢?性价比高的在哪?Technorati 标签:

    2010年2月28日星期日

    今天颁 5 years Long service Award

    “一不小心”在这公司呆了5年了,5年来收获了不少,也付出了不少。
    按照惯例,每一个同事每满5年“大限”,公司就会在当年的Annual Dinner 颁发一个玻璃樽和一个红包以资鼓励。
    09年以来,公司限制支出,取消了所有旅行和dinner,当然这个“5年认证”也推迟到了年后,“Sui”的是俺刚好是这一批次的,虽然玻璃樽还和往年一样,但郁闷的是最最重要的红包给和谐了,大哭ing,勿打扰~~~

    2010年2月16日星期二

    今天100天

    今天鸣鸣100天了,上午拉便便的时候就有些不对劲,后来一直不肯喝奶,连水都不肯喝。早上六点到下午四点才喝不到一百毫升,就一个劲大哭,怎么都哄不好,脸都哭成酱紫色了。让大人担心死了
    后来带到妇儿医院看儿科,无德的医生先开了个腹部CT,然后让自己量体温,天杀的,宝宝才百天口嘞!
    无良医生就开了个什么助消化的菌,然后在病历本上写个随诊!气死人。
    回家后已是晚上七点了,宝宝依然不舒服,只好再跑去药店买个脐贴试试,也不知是脐帖作用还是哭累了,宝宝终于睡上一会儿,在十点还喝了些许奶。


    -- 发送自我的 iPhone

    2010年2月10日星期三

    负债10W

    人背到不只是“喝水塞牙缝”,要真只是这么简单的话,拿个牙签捅捅就过了,充其量最大也就拔颗牙。
    09年蛮倒霉的,电视里面的桥段全TM到我身上来了,一连4、5个事情,没一件小时,生病的生病,手术的手术……
    啥事没干,人受不了了,钱财也差不多了......
    09年快点过去,看能在虎年爽点不

    嵌入式linux GUI--DirectFB + GTK至尊秘笈

    GTK, GUI, 秘笈, linux, 嵌入式
    转来的,不是我自己的,有问题请问 kendych@sina.com.cn 大大                                                                                                                     www.directfb.com.cn                                                                                                            kendych@sina.com.cn

    版权申明: 本文档一切权利归(kendych@sina.com.cn)所有,用于商业用途徐征得本人同意,如无法联系到本人,须征得www.directfb.com.cn所有者同意;用于非商业用途的,无需任何许可,但请尊重本人的署名权,并注明出处www.directfb.com.cn及附加本申明。


    关键词: 嵌入式 GUI arm linux DirectFB GTK tslib
    1 前言
          数年前,曾经开发过 一个嵌入式的产品,如今市场依然存在,但由于电子产品的升级换代很快,许多元器件都采购不到了,为了延续产品的生命周期,计划在linux平台上开发新的 版本。而在linux上的GUI上成了大问题,最开始有用Minigui的打算,也同飞漫公司联系过,但费用我这里无法承受。(Minigui作为国产优 秀的嵌入式GUI,如果不是费用的问题,应该是最优的选择。) QT我也看了下,也是收费的,没有仔细研究。最开始我打算用MicroWindow的,但后来发现这个东西好久没有更新了,bug一大堆。最后的目光停留 在GTK上,最开始无从下手,不知道到底适合不适合做嵌入式GUI,最后不知道在哪里看到一个介绍说诺基亚有产品是用GTK的,觉得既然别人能做得,我也 能做得。最开始做这个,相关资料太少,一点底都没有,但经过两个月(长了点)的努力,终于解决了所有问题,才一颗石头落地。个人认为,在本文的帮助下,如果你拥有初中级的嵌入式linux的知识,也许一天就能解决问题,最长也不会超过一个星期。
    2 准备工作
    硬件环境:linux主机一台,如果你喜欢用windows,可以在windows主机上用vmware虚拟一个linux系统。嵌入式开发套件,包括嵌入式开发板、带触屏的液晶屏及相关连接电缆。
    软件环境:x86 linux发行版,配置好framebuffer,并安装好ftp server、telnet server、tftp server、nfs server、gcc及相关软件、交叉编译器、开发套件的kernel 2.6的源码包。
        本人用的是Ubuntu 7.10的发行版,嵌入式开发版采用三星的2440系列cpu,如何搭建开发环境不在本文讨论范围之类,请参考其他文档。交叉编译器用的是自己编译的 3.4.1,最开始采用的是开发套件带的3.4.1,为什么要用自己编译的而不用开发套件自带的呢? 这里说本文第一个秘笈:由于GTK采用的矢量字体里 一些算法使用了浮点运算,而24xx系列的cpu硬浮点不支持(我没有相关知识,这是我的一个同事说得,是不是他本来意思,我都不敢确定,如果你的cpu 不是这个系列的,请查看相关资料),只要在交叉编译器里加上软浮点运算支持,就应该没有问题了,所以在开始之前,先检查交叉编译器里有没有--with- float=soft这个选项。在我使用开发版自带的编译完成编译后,运行gtk的程序,总是有这个提示” shape engine failure, expect ugly output. the offending font is”,而屏幕上所有字符都显示不出来,button由于字符无法显示,被压缩成一条线,这个问题困扰我好几天,我开始以为是字库设置的问题,后来求助同事,他听了我的描述后,猜测可能是浮点运算的问题,让我用我们自己编译的交叉编译器重新编译一下,看看能不能解决问题,结果真的解决了。
    3 源码包的选择
         选用GTK做嵌入式GUI是个痛苦的选择,如果选用商业GUI如MiniGui,别人都给你整好了,你拿过来用就可以了,或者用Wince,还是与 windows兼容的。而选用GTK做GUI,不同组织(个人)编写的15个软件包,各个软件包又有不同的版本,而网上又没有权威的指南,如何选择合适的 版本以及如何整合确实是个非常复杂的问题。
    我是先从在x86上搭建GTK环境开始的,首先我选用最新版本,然后,看到介绍说,GTK在framebuffer上运行有两种模式: DirectFB 和linux-fb,而linux-fb的项目好像已经停止,主要方向是DirectFB,后来查的有个DirectFB + GTK的英文文档,基本都选用最新的版本,而且很多包都可以使用系统自带的,编译必须的源码就可以了,最开始怎么也编译不成功,我快绝望的时候,发现释放 出一个最新的GTK源码版本(大概是08年7月4日),我第一时间下载下来,很快就编译出来了,并且在framebuffer模式下gtk-demo以及一些test运行一点问题都没有。
          熟悉了编译过程后,我先尝试用交叉编译这个最新版本,编译第一个包glib-2.16.4就失败了。 我在网上阅读了很多关于交叉编译DirectFB+GTK的的资料,有个用shell脚本写的好像不错,但是看不懂呀,虽然我接触unix都十多年了,还 曾经在unix下做个一比较大型的项目,但后来,linux都是个人兴趣,看了一些,玩了一些,没做过东西,shell编程看过,好多东西一直半解,他那 篇文档看的我都傻了,这人真牛。但源码包的选择是可以借鉴的。
    我的选择:
    1) tslib-1.0.tar.bz2
         触摸屏本来我是最后弄的,但如果你需要触屏支持,最好在一开始就搞定他。这个其实是tslib.14,为啥成了1.0的了,我也不知道,如何编译不 是很难,难在怎么配置,相关文档请阅读本人的另外一篇文档《arm-linux之tslib》,当然哪片文档可能并不能帮你搞定,你需要动用你的聪明才 智,你也许需要阅读kernel里触屏驱动的源码。我的开发套件触屏控制器是用的cpu本身的AD转换器,kernel里的驱动是兼容H3600的,所以我在ts.conf文件里module_raw模块设置为h3600。如果你用的三星的24XX系列的cpu,也许使用的方式跟我相同,使用同样的配置也许可以,如果不行,可能要阅读触屏驱动的源码及tslib的module_raw的源码,找到匹配的模块就行了。
    《arm-linux之tslib》的位置http://www.directfb.com.cn/viewthread.php?tid=388&extra=page%3D1

    2) freetype-2.3.5.tar.bz2
    3) glib-2.12.13.tar.bz2

    4) libpng-1.2.19.tar.bz2
        这个模块本来我是不需要的,我在编译GTK的时候想disable这个模块,configure无法完成。
    5) zlib-1.2.3.tar.bz2
    6) jpegsrc.v6b.tar.gz

        这个模块是我必须的,但编译GTK的时候,configure说找不到这个模块的jpeglib.h,我也研究了好久,
    7) tiff-3.7.4.tar.gz
    这个模块我不需要,但编译了,最终,我不会采用这个模块。
    8) DirectFB-1.1.1.tar.gz
        最开始我采用的是1.1.0,基本正常,最后弄触屏的时候,运行程序DirectFB怎么也加载不成功nputdrivers里的模块 libdirectfb_tslib.so,阅读了相关代码后,发现这个版本的DFB的这个模块加载后,不读取tslib的相关环境变量,直接加载 /dev/input/tslibn些设备, 而我的开发板起来后,根本没有这些设备,1.1.0之后的版本,相关代码做过修正,我也尝试了最新版本的DFB 1.2.1,但这个版本的DF B跟好核后面选用的GTK的版本配合有点问题,无法编译后面的GTK,我阅读DFB 1.1.1的相关代码,发现已经修正,选用了这个版本,运行GTK程序,DFB开始加载tslib的相关模块,但只加载成功tslib的 module_raw的模块,后面的模块加载失败。什么原因这里不做解释,后面再说。
    9) atk-1.19.3.tar.bz2
    10) expat-2.0.1.tar.gz

    11) libxml2-2.6.29.tar.gz
    12) fontconfig-2.4.2.tar.gz
    13) pango-1.16.4.tar.bz2
    14) cairo-1.4.10.tar.gz
    15) gtk+-2.10.14.tar.bz2

        这个模块最后编译,编译完成意味着我们成功完成了编译工作,我configure这个模块的时候碰到了两个问题:第一找不到pango,最后看到好多,才 知道在configure前需要设置这个环境变量export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib" 这个啥意思,我不知道,为什么这样设我也不知道。第二找不到jpeglib.h,我分析了log,发现是在测试g++编译的时候,找不到 jpeglib.h,而测试gcc编译是没有问题的,我在configure前设置了这个export CPPFLAGS="-I$PREFIX/include"环境变量,告诉g++编译器到哪里找 jpeglib.h。
    4 交叉编译
        在宿主系统上交叉编译后的所有包的安装目录为/usr/gtkdfb,当然,你可以使用其他的目录,但绝不能跟主机环境相冲突,将交叉编译后东西安装到宿主系统的默认位置,可能会导致你的宿主系统某些不可预知的后果。下面开始编译
    1) Tslib
    export PREFIX=/usr/gtkdfb
    echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
    ./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache --enable-inputapi=no
    make
    make install

    编译前只需要指定PREFIX一个环境变量,这个模块编译下面的编译基本都需要以下三个
    export LDFLAGS=-L$PREFIX/lib
    export CFLAGS="-g -I$PREFIX/include"
    export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig

    2) glib
    echo ac_cv_type_long_long=yes>arm-linux.cache
    echo glib_cv_stack_grows=no>>arm-linux.cache
    echo glib_cv_uscore=no>>arm-linux.cache
    echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache
    CC=arm-linux-gcc ./configure --host=arm-linux --build=i686-pc-linux --prefix=$PREFIX --cache-file=arm-linux.cache
    make
    make install

    3) atk
    ./configure --host=arm-linux --prefix=$PREFIX
    make
    make install
    4) jpeg-6b
    ./configure  --prefix=$PREFIX --enable-shared --enable-static
    修改生成的Makefile文件:
           # The name of your C compiler:
           CC= gcc  该成  CC=arm-linux-gcc (根据你自己交叉编译器的位置修改)
           # library (.a) file creation command
           AR= ar rc 该成  AR= arm-linux-ar rc  (同上)
           # second step in .a creation (use "touch" if not needed)
           AR2= ranlib 该成  AR2=arm-linux-ranlib (同上)
    mkdir $PREFIX/man
    mkdir $PREFIX/man/man1

    make
    make install-lib

    5) zlib
    CC=arm-linux-gcc ./configure --prefix=$PREFIX --shared
    make
    make install

    6) libpng
    ./configure --host=arm-linux --prefix=$PREFIX
    make
    make install

    7) expat
    ./configure --host=arm-linux  --prefix=$PREFIX
    make
    make install
    8) freetype
    ./configure --host=arm-linux  --prefix=$PREFIX
    make
    make install

    9) libxml
    ./configure --host=arm-linux  --prefix=$PREFIX
    make
    make install

    10) fontconfig
    export LIBXML2_CFLAGS=-I$PREFIX/include/libxml2
    export LIBXML2_LIBS="-L$PREFIX/lib -lxml2"
    ./configure --host=arm-linux --prefix=$PREFIX --with-freetype-config=$PREFIX/bin/freetype-config --with-arch=arm
    make
    make install

    11) tiff
    ./configure --host=arm-linux --prefix=$PREFIX --enable-shared
    make
    make install

    12) DirectFB
    ./configure --host=arm-linux --prefix=$PREFIX --with-gfxdrivers=none --with-inputdrivers=all --enable-png --enable-jpeg --disable-tiff --enable-zlib --enable-sdl=no --enable-gif=no --disable-x11
    make
    make install

    13) cairo
    ./configure --host=arm-linux --prefix=$PREFIX --without-x --disable-xlib --disable-xlib-xrender --enable-directfb --enable-freetype --disable-win32 --enable-pdf --enable-ps --disable-svg --enable-png
    make
    make install

          不知道为什么,gtk非要有pdf和ps的支持,没有就无法完成configure,没办法,我只好在这里就打开,其实也不能真正支持,因为pdf等东西根本没有加进来。不知道后来的gtk版本有无改进。
    14) Pango
         修改configure文件,将下面一些参数改成true
    have_cairo=true
    have_cairo_png=true         
    have_cairo_ps=true
    have_cairo_pdf=true
    have_cairo_freetype=true
    ./configure --host=arm-linux --prefix=$PREFIX --enable-cairo --without-x
    make
    make install

    15) gtk
    export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib"
    export CPPFLAGS="-I$PREFIX/include"
    ./configure --host=arm-linux --prefix=$PREFIX --with-gdktarget=directfb --without-x --without-libtiff
    make
    make install
    5 开发板运行环境
        开发板的内核是2.6的,一切驱动都已完毕,文件系统采用nfs加载,在宿主系统上位于/arm/root/root_nfs上,我是编译好后,才弄板子的,但最好,在编译之前,最好先熟悉熟悉开发板,我弄好好几天才使开发板运行起来,因为2.6的kernel使用的uboot里某些东西跟2.4 kernel使用的uboot不同。我以前根本没有弄过,困扰了好几天。
    在宿主系统上,将/usr/gtkdfb目录复制到/arm/root/root_nfs/usr目录下,开发板运行起来后,编译好的东西都会在/usr/gktdfb目录下。
    1) Pangorc
    mkdir /arm/root/root_nfs/usr/gtkdfb/etc/pango
    创建文件 /arm/root/root_nfs/usr/gtkdfb/etc/pango/pangorc文件内容如下
    # pangorc file for uninstalled operation.
    # We set the path as ../modules, such that it works from any of
    # top level build subdirs.
    #

    [Pango]
    ModuleFiles = /usr/gtkdfb/etc/pango/pango.modules
    ModulesPath = /usr/gtkdfb/lib/pango/1.6.0/modules

    上面在宿主系统上运行
    下面的命令在开发板上运行
    /usr/gtkdfb/bin/pango-querymodules > /usr/gtkdfb/etc/pango/pango.modules
    2) gfxdrivers
         下面的命令本行在开发板上运行,只是消除一个警告
    mkdir /usr/gtkdfb/lib/directfb-1.1-0/gfxdrivers
    3) gdk-pixbuf.loaders
         下面的命令本行在开发板上运行
    mkdir /usr/gtkdfb/etc/gtk-2.0
    /usr/gtkdfb/bin/gdk-pixbuf-query-loaders > /usr/gtkdfb/etc/gtk-2.0/gdk-pixbuf.loaders

    4) gtk.immodules
         下面的命令本行在开发板上运行
    /usr/gtkdfb/bin/gtk-query-immodules-2.0 > /usr/gtkdfb/etc/gtk-2.0/gtk.immodules
    5) fonts.conf
         在/usr/gtkdfb/etc/fonts目录下有fonts.conf这么个文件,在这个文件配置了一些字库的信息,在宿主系统中打开文件 /arm/root/root_nfs/usr/gtkdfb/etc/fonts/fonts.conf,修改<!-- Font directory list -->这行以下的东西,设置正确的字库目录。当然前提需要将字库复制到/arm/root/root_nfs的合适目录下。比如 ubuntu的设置如下
    <!-- Font directory list -->
            <dir>/usr/share/fonts</dir>
            <dir>/usr/X11R6/lib/X11/fonts</dir>
            <dir>~/.fonts</dir>

    最简单的方法就是将ubuntu的这些目录里的内容复制到/arm/root/root_nfs相对目录下,这样,这个文件都可以不修改。但最后你肯定不能这样做,因为嵌入式是不需要这么多字库的,我们只要需要的,不需要的统统砍掉,了解一下这个文件也应该是必须的。
    6) directfbrc
          这个文件我还没用过,我曾经相弄它,因为当初碰到一个问题以为是他的问题,但不是它的问题,所以到现在为止,我还没弄。论坛上VCVC0说,没有这个文件,程序加载很慢,有了,就快很多,这里给个链接,我就不详述
    http://www.directfb.com.cn/viewthread.php?tid=373
    下面是帖子的内容。也现在也不臆想我的用法了
    如何配置基于arm的directfbrc配置文件?
    我在我的开发板里跑了一下应用。如果/etc目录下没有directfbrc文件的话,程序需要很久才能显示出来。
    我简单设置了一下directfbrc内容如下:
    system=fbdev
    fbdev=/dev/fb/0
    wm=default
    mode=640x480
    depth=32
    pixelformat=RGB32
    程序的启动速度就快了很多,不知道是什么原因。

    还有问题就是direct的wm能否管理gtk的窗口。或者有没有基于嵌入式开发的窗口管理器可以使用的。
    6 最后的秘笈
        现在你在板子上运行GTK源码包里的test,应该是没有问题,如果有问题,就要回头苦修了。最后的一个问题来了,usb鼠标可以控制屏幕上的鼠标指针, 触屏不反应,明明我的tslib测试程序运行一定问题也没有,DFB编译也正确失败了tslib这个库,怎么回事呢? 这就是最后的秘笈,我只所以敢将本文档称为至尊秘笈,也就因为这个秘笈,我认为,解决这个问题需要相当的技术水平。
         首先,要说明这个问题都是复杂的。先说DFB的初始化,DFB加载先读directfbrc,读取一些设置,然后加载辅助模块,模块的加载都是动态的, 采用dlopen方式加载的。tslib加载一些模块也是采用这种方式加载的。应用程序动态链接到DFB的库,加载能加载的模块,同时加载了 libdirectfb_tslib.so,这个模块动态链接到libts.so这个库,动态加载libdirectfb_tslib.so同时做一些初 始化tslib的工作,初始tslib又会动态加载tslib的一些模块,这四个模块pthres、variance、dejitter、linear会 用到libts.so这个库里的一个函数tslib_parse_vars, 由于libdirectfb_tslib.so是用dlopen加载的,加载tslib的上四个模块时,根本就不知道到何处去找函数 tslib_parse_vars,而tslib的测试程序已经动态链接了libts.so,加载tslib的上速模块时能够正确识别函数 tslib_parse_vars。
          原因知道了,解决问题就简单了。链接应用程序时动态链接到库libts.so就可以了,我修改gtk源码tests目录下的Makefile
    LDFLAGS = -L/usr/gtkdfb/lib -lts -Wl,-rpath,/usr/gtkdfb/lib
    重新编译了这些测试程序,复制到开发板上,运行,一切都OK了
    7 结语
          回想起来,搭建一个嵌入式的DFB+GTK的GUI开发平台真的很困难,且不说如此多不同组织和个人编写的包,就是每个人的环境也是千差万别的,能够给你提供帮助的人几乎没有,碰到问题,你只能在浩瀚的网络里 找寻解决的方法。解决任何一个问题也许都要耗费巨大的精力。如果你的项目资金允许,还是请支持一下国产的优秀GUI软件――MiniGUI,你碰到的问 题,应该都很得到迅速,圆满的解决,无疑会加快你的项目开发进度。当然,DFB+GTK也是很好的选择,在你自己解决问题的时候,你会学到很多的东西,还 会带给你带来巨大的成就感。
        最后,要感谢这些开源软件包的写作者们,是他们无私的奉献,才让我们能够有机会学习这些优秀的代码。还要感谢哪些在网上共享了自己经验的 先驱们,是他们的点点星火,给了我灵感,为我指引了解决问题的方向。谨以本文献给他们,再次感谢他们。同时,将本文献给 www.directfb.com.cn及坛主echo先生以及论坛的每一个现在的和将来的会员。我只不过在论坛上发表了两篇很短小的陋文,echo先生 竟邀请我当版主,使我倍感荣幸。
        环境的搭建工作我基本完成了,项目的需要,我要做其他的事情了。如果你也在做类似的工作,碰到了一些问题,希望本文能给你帮助。如果你在其他地方看到本文(本人希望有网站转载本文),请访问www.direcfb.com.cn,也许你能的得到更多的信息。

    2010年2月8日星期一

    第四代iPhone细节曝光:个头变高(组图)

    第四代iPhone细节曝光:个头变高(组图)

    http://www.sina.com.cn  2010年02月09日 08:25  新浪科技
    第四代iPhone细节曝光:个头变高(组图)
    从左至右,依次为iPhone(手机上网) 3G、iPhone 3GS和第四代iPhone的前面板
    第四代iPhone细节曝光:个头变高(组图)
    iPhone 3GS和第四代iPhone的前面板

      新浪科技讯 北京时间2月9日早间消息,美国数码产品维修网站iResQ今天刊文,曝光了苹果第四代iPhone的更多细节及图片,第四代iPhone要比当前的iPhone 3GS略高。

      以下为该网站曝光了第四代iPhone值得关注之处:

      1.第四代iPhone的液晶显示屏出厂时与数字转换器胶合在一起,这类似于第一代iPhone的设计,与iPhone 3G和iPhone 3GS不同。在iPhone 3G和iPhone 3GS中,数字转换器可以与液晶显示屏分离。这意味着第四代iPhone的屏幕维修成本更高,因为如果需要更换屏幕,那么必须同时更换数字转换器。

      2.第四代iPhone的前面板看起来比前一代产品长0.25英寸(约合6.3毫米)。

      3.扬声器上覆盖了一层类似镜面的反光表面,似乎为近距离传感器。

      iResQ网站表示,目前获得的这些图片是可靠的,然而苹果第四代iPhone尚未最终定型,苹果有可能再度改变设计。(维金)



    2010年2月1日星期一

    zlib 与 libpng 的配置与使用

    AMD首款“APU”下半年量产

    http://www.sina.com.cn  2010年02月02日 07:23  京华时报

      AMD:不是简单地把两个芯片攒一块

      晨报讯 (记者 焦立坤) 经历了64位、双核、多核等各个层面的技术较量,电脑芯片领域最顶尖的技术军备竞赛一个新的阵地已经形成。AMD昨天公开了最新的产品路线图,其中最令业 界关注的是,其把CPU和GPU整合到一块硅片里(统称为APU) ,第一个果实就要瓜熟蒂落。

      昨天访华的AMD高级副总裁兼技术事业部总经理Chekib Akrout(见右图) 透露,AMD正在全力开发的第一款APU名为LIano,下半年开始量产,并将于明年正式上市。据悉,LIano将采用32纳米制程,主要面向笔记本电脑和台式机电脑两大市场。

      对CPU我们并不陌生,而GPU指的是图形处理器,其在电脑中的地位越来越被重视,比如玩3D游戏就离不开它。AMD早在七年前就产生了将两者 合而为一的想法,不过当时技术条件还不成熟。而自从三年前成功收购了全球顶级的GPU厂商ATI后,AMD就开始实现这一设想。

      无独有偶,英特尔不久前发布的全新酷睿产品中,其台式机酷睿i3处理器也第一次把图形芯片集成在处理器的封装中,采用双芯片方案。

      Chekib Akrout强调,APU不是简单地把两个芯片攒一块,而是需要克服很多技术难关。他甚至称,目前只有AMD的融聚技术才能做到这一点。在其描述中,APU不仅需要最佳的CPU、GPU产品以及优化技术,而且要用特殊的设计技术才能实现。

      APU堪称目前AMD最倚重的拳头产品。去年AMD重组全球组织架构,最大的亮点莫过于将显示芯片与微处理器产品以及芯片设计工作集中于一个部门--产品部门,将CPU和GPU后台打通,为融合铺平道路。

      APU能给消费者带来什么呢?在其描述中,APU将带来更强大的计算能力、更逼真的显示效果、更小的能耗、更长的电池续航时间等等。



    2010年1月20日星期三

    zlib 与 libpng 的配置与使用

    zlib 与 libpng 的配置与使用-转载--爱蓝天的网络日记
    zlib 与 libpng 的配置与使用

    Solstice 2003/04/3

    说明:本文节选自我主页上的一篇文章,原文介绍了1) Wave 文件的格式、2)读取 Wave 文件内容,并显示文件的基本信息、3)压缩库 zlib 的安装与简单应用、4)PNG 库 libpng 的安装、5)使用 libpng 生成 PNG 文件、6)绘制 Wave 文件的波形,这里只截取3、4、5这三部分内容。本文涉及的源码可从我的主页下载(http://www.chenshuo.com)。

    PNG 格式的图片在网络上非常流行,几乎所有浏览器都支持这种格式。PNG 代表 Portable Network Graphics——可移植网络图形格式。我偏爱 PNG 图片的另一个原因是,在 LaTeX 生成的 PDF 文件中,可以直接嵌入 PNG 文件。PNG 与 GIF 类似,是无损压缩的光栅图形格式。与 GIF 文件不同,编写生成 PNG 文件的软件不需要支付任何版权费用。因此,PNG 的非官方名称为 Png's Not Gif,够搞笑,是吧?

    尽管 PNG 文件的格式并不复杂,我还是决定用一套现成的程序库来读写它,不要总是自己重新发明轮子嘛。我们先来看看怎么安装使用 PNG 文件的官方程序库——libpng 和 zlib。常见的 Linux 系统都配备了这两个程序库,因此我只打算介绍在 Windows 下的安装方法。
    以下的操作以免费的 Borland C++ Compiler 5.5.1 free 编译器为例,Microsoft Visual C++ 安装方法大致与此类似,但我没有条件测试。


    zlib 的安装

    libpng 是一套免费的、公开源代码的程序库,支持对 PNG 图形文件的创建、读写等操作。libpng 使用 zlib 程序库作为压缩引擎,zlib 也是著名的 gzip (GNU zip) 所采用的压缩引擎。

    我们首先安装zlib,从其官方网站下载最新的源程序,不妨假设文件名是zlib-1.1.4.tar.gz。网址:http://www.gzip.org/zlib/。

    在 D:\ 建立 libpng 目录,将 zlib-1.1.4.tar.gz 释放到这个目录。尽管没有合适的makefile,我们仍然可以直接编译链接 zlib.lib:

    D:\libpng\zlib-1.1.4>bcc32 -c -O2 -6 -w-8004 -w-8057 -w-8012 *.c

    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

    adler32.c:

    compress.c:

    crc32.c:

    deflate.c:

    example.c:

    gzio.c:

    infblock.c:

    infcodes.c:

    inffast.c:

    inflate.c:

    inftrees.c:

    infutil.c:

    maketree.c:

    minigzip.c:

    trees.c:

    uncompr.c:

    zutil.c:

    D:\libpng\zlib-1.1.4>tlib zlib.lib +adler32.obj +compress.obj +crc32.obj

    +deflate.obj +gzio.obj +infblock.obj +infcodes.obj +inffast.obj

    +inflate.obj +inftrees.obj +infutil.obj +maketree.obj +trees.obj

    +uncompr.obj +zutil.obj

    TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation

    注意,在 tlib 的命令行中,没有 example.obj 和 minigzip.obj。接下来,测试 zlib.lib 是否编译成功,执行:

    D:\libpng\zlib-1.1.4>bcc32 minigzip.obj zlib.lib

    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

    Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

    D:\libpng\zlib-1.1.4>bcc32 example.obj zlib.lib

    Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

    Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

    D:\libpng\zlib-1.1.4>example

    uncompress(): hello, hello!

    gzread(): hello, hello!

    gzgets() after gzseek: hello!

    inflate(): hello, hello!

    large_inflate(): OK

    after inflateSync(): hello, hello!

    inflate with dictionary: hello, hello!

    执行 example.exe,看见“hello, hello!”,表明生成的 zlib.lib 是好的。

    zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)。zlib 也支持读写 gzip (.gz) 格式的文件。下面介绍两个最有用的函数——compress 和 uncompress。

    int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

    compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen表示 dest 缓冲区的大小,destLen > (sourceLen + 12)*100.1%。当函数退出后,destLen 表示压缩后缓冲区的实际大小。此时 destLen / sourceLen 正好是压缩率。

    compress 若成功,则返回 Z_OK;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。

    int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

    uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。

    uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR。

    zlib 带的 example.c 是个很好的学习范例,值得一观。我们写个程序,验证 zlib 的压缩功能。所写的测试程序保存为 testzlib.cpp ,放在 zlib-1.1.4 目录下。程序源代码:

    // testzlib.cpp 简单测试 zlib 的压缩功能

    #include

    #include

    #include

    #include "zlib.h"

    using namespace std;

    int main()

    {

    int err;

    Byte compr[200], uncompr[200]; // big enough

    uLong comprLen, uncomprLen;

    const char* hello = "12345678901234567890123456789012345678901234567890";

    uLong len = strlen(hello) + 1;

    comprLen = sizeof(compr) / sizeof(compr[0]);

    err = compress(compr, &comprLen, (const Bytef*)hello, len);

    if (err != Z_OK) {

    cerr << "compess error: " << err << '\n';

    exit(1);

    }

    cout << "orignal size: " << len

    << " , compressed size : " << comprLen << '\n';

    strcpy((char*)uncompr, "garbage");

    err = uncompress(uncompr, &uncomprLen, compr, comprLen);

    if (err != Z_OK) {

    cerr << "uncompess error: " << err << '\n';

    exit(1);

    }

    cout << "orignal size: " << len

    << " , uncompressed size : " << uncomprLen << '\n';

    if (strcmp((char*)uncompr, hello)) {

    cerr << "BAD uncompress!!!\n";

    exit(1);

    } else {

    cout << "uncompress() succeed: \n" << (char *)uncompr;

    }

    }

    编译执行这个程序,输出应该是

    D:\libpng\zlib-1.1.4>bcc32 testzlib.cpp zlib.lib

    D:\libpng\zlib-1.1.4>testzlib

    orignal size: 51 , compressed size : 22

    orignal size: 51 , uncompressed size : 51

    uncompress() succeed:

    12345678901234567890123456789012345678901234567890

    至此, zlib的安装任务算是完成了。为了以后使用方便,我将zlib.lib、zlib.h、zconf.h拷贝到D:\mylibs\。

    libpng 的安装

    接下来,安装 libpng 的过程要稍微轻松些。先下载最新的 libpng 程序库源文件。网址是http://sourceforge.net/projects/libpng/或http://www.libpng.org/pub/png/。不妨设下载的文件是 libpng-1.2.5.tar.gz,将这个文件释放到D:\libpng\。

    修改D:\libpng\libpng-1.2.5\scripts\makefile.bc32,这是为Borland C++ 32-bit 版准备的 makefile。将第12行的ZLIB_DIR=..\zlib改为ZLIB_DIR=D:\mylibs,再将第20行的#TARGET_CPU=6前的井号(#)去掉。然后执行

    D:\libpng\libpng-1.2.5>make -fscripts\makefile.bc32

    MAKE Version 5.2 Copyright (c) 1987, 2000 Borland

    D:\libpng\libpng-1.2.5>pngtest

    Testing libpng version 1.2.5

    with zlib version 1.1.4

    . . .

    PASS (9782 zero samples)

    . . .

    libpng passes test

    看到“9782 zero samples”字样,表明 libpng 安装成功。新生成的 pngout.png应该与原有的 pngtest.png 完全一样。将 png.h、pngconf.h 连同编译生成的libpng.lib 一起拷贝到D:\mylibs\。

    生成 PNG 文件

    我们自己写一两个程序来测试 libpng 生成 PNG 文件的功能。testpng1.cpp 生成灰度(gray)图象;testpng2.cpp 生成256色图象,其中调色盘(palette)有多种配置。这两个程序生成的图片文件分别展示于图1和图2中。编译参数为:

    bcc32 -Id:\mylibs -Ld:\mylibs testpng1.cpp libpng.lib zlib.lib

    为了日后使用方便,我把D:\mylibs\ 加入到 BCC 5.5 的 include 搜索路径和 lib 搜索路径中。

    // testpng1.cpp

    // test for black & white pictures.

    // 请下载文章的配套源码 http://www.chenshuo.com

    testpng1.cpp 和 testpng2.cpp 的差别在png_set_IHDR这行,前一个是png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_GRAY, ...);,
    后一个是
    png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_PALETTE, ...);。

    // testpng2.cpp

    // test for colorful pictures

    // 请下载文章的配套源码 http://www.chenshuo.com



    图1 灰度 PNG 图片


    图2 彩色 PNG 图片

    libpng 带的 example.c 是很好的学习范例。使用 libpng 时,先要 include png.h。这个头文件包含了 libpng 自定义的许多类型,如程序中出现的 png_struct、png_info 等等,前者是 libpng 内部使用的结构体,后者用来表示某个 PNG 文件的相关信息。

    编写生成PNG的程序先声明几个必要的变量,其中 png_structp 就是 png_struct* :

    FILE *fp;

    png_structp png_ptr;

    png_infop info_ptr;

    png_colorp palette;

    然后以 binary write 方式打开欲写入的 PNG 文件。

    fp = fopen(filename.c_str(), "wb");

    欲使用 libpng ,先分配并初始化 png_struct :

    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);

    然后以 png_ptr 为参数初始化 info_ptr 。以后用 png_get_*() 或 png_set_*() 函数来读取或设置 PNG 文件的属性。

    info_ptr = png_create_info_struct(png_ptr);

    设置错误处理方式,也可以在第6行指定处理错误的 callback 函数。

    if (setjmp(png_jmpbuf(png_ptr)))

    {

    // . . .

    }

    接下来告诉 libpng 用 fwrite 来写入 PNG 文件,并传给它已按二进制方式打开的 FILE* fp :

    png_init_io(png_ptr, fp);

    设置 PNG 文件的基本属性,如高度、宽度、色深(单色、16色、256色或真彩色)、色彩类型(灰度、调色板、RGB)等等。这里我们生成一个256 (28=256)色、采用调色板(PNG_COLOR_TYPE_PALETTE )的 PNG 文件。

    const int width = 120;

    const int height = 512;

    png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_PALETTE,

    PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);

    接下来设置调色板,先分配空间。常数 PNG_MAX_PALETTE_LENGTH 的值是256:

    palette = (png_colorp)png_malloc(png_ptr,

    PNG_MAX_PALETTE_LENGTH * sizeof (png_color));

    这里的 png_color 表示调色板中某一种颜色的 RGB 分量。

    typedef struct png_color_struct

    {

    png_byte red;

    png_byte green;

    png_byte blue;

    } png_color;

    然后用自己写的 set_palette 函数设置调色板。

    set_palette(palette, RED_BLACK);

    set_palette 函数能生成三种类型的调色板, GRAY 灰度、 RED_BLACK 红与黑、 SPECTRUM 频谱。

    其中生成 GRAY 调色板的代码是:

    for (int i = 0; i < PNG_MAX_PALETTE_LENGTH; ++i ) {

    palette[i].red = palette[i].green = palette[i].blue = i;

    }

    告诉 libpng 采用我们准备好的调色板,并写 PNG 文件的头部。

    png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);

    png_write_info(png_ptr, info_ptr);

    在这些准备工作做完之后,进入最关键的一步——绘制图片内容,这里我们只是依次使用调色板的各种颜色来绘制水平直线。我们准备足够大的一块内存 image 来表示整幅图像中的所有点,这些点按从左到右,从上到下的顺序排列。注意,PNG 文件是行优先,在写入 PNG 文件时,不用告诉它整幅图形在哪,只要告诉它每一行(由数组 row_pointers 表示)在哪就行了。所以如果图像中某些行是相同的,就可以让行指针 row_pointer 重复指向这些行的地址,这样能节省内存空间。我写的这个程序没有采用这个办法,必尽内存不是什么大问题。

    png_uint_32 k;

    png_byte image[height][width];

    png_bytep row_pointers[height];

    for (k = 0; k < height; k++) {

    memset(image[k], k / 2, width);

    row_pointers[k] = image[k];

    }

    接下来一次写入整幅图像,是最省力的办法:

    png_write_image(png_ptr, row_pointers);

    末了,进行必要的扫尾工作:

    png_write_end(png_ptr, info_ptr);

    png_free(png_ptr, palette);

    png_destroy_write_struct(&png_ptr, &info_ptr);

    fclose(fp);

    至此,大功告成。


    2010年1月11日星期一

    test




    -- 发送自我的 iPhone