ホームへ 本編1  007-10(1)  本編2  007-10(2)
 png.h  libpng.txt 訳  readme 訳  LISENCE 訳  TODO 訳
libpng1.2.8   <png.h>  訳

<以下の訳を読むにあたって>

     以下の訳は筆者が個人で訳したものです。
下記に間違い、誤訳等があったとしても当方は一切責任を負えません(英語苦手なので)。
正確な情報を求める方は必ず原文をお読みください。


png.h
英文
/* png.h - PNGライブラリ参照用ヘッダファイル
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

 libpng バージョン 1.2.8 - 2004/12/3
 著作 (c) 1998-2004 Glenn Randers-Pehrson
 (Version 0.96 著作 (c) 1996, 1997 Andreas Dilger)
 (Version 0.88 著作 (c) 1995, 1996 Guy Eric Schalnat, グループ 42, Inc.)
 
著者 及び管理者:
 
libpng バージョン 0.71, 1995/5月, 〜 0.88, 1996/1月: Guy Schalnat
 libpng バージョン 0.89c, 1996/6月, 〜 0.96, 1997/5月: Andreas Dilger
 libpng バージョン 0.97, 1998/1月, 〜 1.2.8 - 2004/12/3: Glenn
下記 "寄稿著者"も見て下さい。
 
/* png.h - header file for PNG reference library
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

libpng version 1.2.8 - December 3, 2004
Copyright (c) 1998-2004 Glenn Randers-Pehrson
(Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
(Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)

Authors and maintainers:
libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
libpng versions 0.97, January 1998, through 1.2.8 - December 3, 2004: Glenn
See also "Contributing Authors", below.
*
*
*
*
*
*
*
*
*
*

libpng のバージョン・ナンバー関する解説:

ありえないようなコードの不適合や、著者側からは制御できないような時々起こる現象や、ライブラリのバージョン番号がいつも一致しなかったりまともな数字 でなかったら、それらは何かの誤解か伝達ミスによるものです。
下表では最初に幅広く使われたリリースのバージョン0.89cからのものを集約しています。
*
*
*
*
*
*
*
*
*
*

Note about libpng version numbers:

Due to various miscommunications, unforeseen code incompatibilities and occasional factors outside the authors' control, version numbering on the library has not always been consistent and straightforward.
The following table summarizes matters since version 0.89c, which was the first widely used release:

ソースバージョン png.h
文字列
png.h
数値
共有ライブラリ
バージョン
------- ------ ----- ----------
0.89c "1.0 beta 3" 0.89 89 1.0.89
0.90 "1.0 beta 4" 0.90 90 0.90 [2.0.90 であるはず]
0.95 "1.0 beta 5" 0.95 95 0.95 [2.0.95 であるはず]
0.96 "1.0 beta 6" 0.96 96 0.96 [2.0.96 であるはず]
0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [2.0.97 であるはず]
0.97c 0.97 97 2.0.97
0.98 0.98 98 2.0.98
0.99 0.99 98 2.0.99
0.99a-m 0.99 99 2.0.99
1.00 1.00 100 2.1.0 [100を10000と表記]
1.0.0 (ここから、 png.h 文字列は ソースバージョンと全く同じ) 100 2.1.0 [100を10000と表記]
1.0.1 10001 2.1.0
1.0.1a-e 10002 ここから共有ライブラリは
2.Vです。
Vは注釈があるときを
除いては
ソースコードバージョンです。   
1.0.2 10002
1.0.2a-b 10003
1.0.3 10003
1.0.3a-d 10004
1.0.4 10004
1.0.4a-f 10005  
1.0.5 (+ 2 patches)
10005  
1.0.5a-d
10006  
1.0.5e-r
10100 (ソース非互換)
1.0.5s-v
10006 (バイナリ非互換)
1.0.6 (+ 3 patches)
10006 (まだバイナリ非互換)
1.0.6d-f
10007 (まだバイナリ非互換)
1.0.6g
10007
1.0.6h
10007 10.6h (xy.zテスト、ナンバーこれ付けて)
1.0.6i
10007 10.6i
1.0.6j
10007 2.1.0.6j (1.0.0と非互換)
1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14
(バイナリ互換)
1.0.7beta15-18 1 10007 2.1.0.7beta15-18
(バイナリ互換)
1.0.7rc1-2 1 10007 2.1.0.7rc1-2
(バイナリ互換)
1.0.7 1 10007 (まだ互換)
1.0.8beta1-4 1 10008 2.1.0.8beta1-4
1.0.8rc1 1 10008 2.1.0.8rc1
1.0.8 1 10008 2.1.0.8
1.0.9beta1-6 1 10009 2.1.0.9beta1-6
1.0.9rc1 1 10009 2.1.0.9rc1
1.0.9beta7-10 1 10009 2.1.0.9beta7-10
1.0.9rc2 1 10009 2.1.0.9rc2
1.0.9 1 10009 2.1.0.9
1.0.10beta1 1 10010 2.1.0.10beta1
1.0.10rc1 1 10010 2.1.0.10rc1
1.0.10 1 10010 2.1.0.10
1.0.11beta1-3 1 10011 2.1.0.11beta1-3
1.0.11rc1 1 10011 2.1.0.11rc1
1.0.11 1 10011 2.1.0.11
1.0.12beta1-2 2 10012 2.1.0.12beta1-2
1.0.12rc1 2 10012 2.1.0.12rc1
1.0.12 2 10012 2.1.0.12
1.1.0a-f - 10100 2.1.1.0a-f (廃版へ分岐)
1.2.0beta1-2 2 10200 2.1.2.0beta1-2
1.2.0beta3-5 3 10200 3.1.2.0beta3-5
1.2.0rc1 3 10200 3.1.2.0rc1
1.2.0 3 10200 3.1.2.0
1.2.1beta1-4 3 10201 3.1.2.1beta1-4
1.2.1rc1-2 3 10201 3.1.2.1rc1-2
1.2.1 3 10201 3.1.2.1
1.2.2beta1-6 12 10202 12.x  .0.1.2.2beta1-6
1.0.13beta1 10 10013 10.x  .0.1.0.13beta1
1.0.13rc1 10 10013 10.x  .0.1.0.13rc1
1.2.2rc1 12 10202 12.x  .0.1.2.2rc1
1.0.13 10 10013 10.x  .0.1.0.13
1.2.2 12 10202 12.x  .0.1.2.2
1.2.3rc1-6 12 10203 12.x  .0.1.2.3rc1-6
1.2.3 12 10203 12.x  .0.1.2.3
1.2.4beta1-3 13 10204 12.x  .0.1.2.4beta1-3
1.0.14rc1 13 10014 10.x  .0.1.0.14rc1
1.2.4rc1 13 10204 12.x  .0.1.2.4rc1
1.0.14 10 10014 10.x  .0.1.0.14
1.2.4 13 10204 12.x  .0.1.2.4
1.2.5beta1-2 13 10205 12.x  .0.1.2.5beta1-2
1.0.15rc1-3 10 10015 10.x  .0.1.0.15rc1-3
1.2.5rc1-3 13 10205 12.x  .0.1.2.5rc1-3
1.0.15 10 10015 10.x  .0.1.0.15
1.2.5 13 10205 12.x  .0.1.2.5
1.2.6beta1-4 13 10206 12.x  .0.1.2.6beta1-4
1.0.16 10 10016 10.x  .0.1.0.16
1.2.6 13 10206 12.x  .0.1.2.6
1.2.7beta1-2 13 10207 12.x  .0.1.2.7beta1-2
1.0.17rc1 10 10017 12.x  .0.1.0.17rc1
1.2.7rc1 13 10207 12.x  .0.1.2.7rc1
1.0.17 10 10017 12.x  .0.1.0.17
1.2.7 13 10207 12.x  .0.1.2.7
1.2.8beta1-5 13 10208 12.x  .0.1.2.8beta1-5
1.0.18rc1-5 10 10018 12.x  .0.1.0.18rc1-5
1.2.8rc1-5 13 10208 12.x  .0.1.2.8rc1-5
1.0.18 10 10018 12.x  .0.1.0.18
1.2.8 13 10208 12.x  .0.1.2.8


source png.h png.h shared-lib
version string int version
------- ------ ----- ----------
0.89c "1.0 beta 3" 0.89 89 1.0.89
0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90]
0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95]
0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96]
0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97]
0.97c 0.97 97 2.0.97
0.98 0.98 98 2.0.98
0.99 0.99 98 2.0.99
0.99a-m 0.99 99 2.0.99
1.00 1.00 100 2.1.0 [100 should be 10000]
1.0.0 (from here on, the png.h string is identical to the source version) 100 2.1.0 [100 should be 10000]
1.0.1 10001 2.1.0
1.0.1a-e 10002 from here on, the shared library is 2.V where V is the source code version, except as noted.  
1.0.2 10002
1.0.2a-b 10003
1.0.3 10003
1.0.3a-d 10004
1.0.4 10004  
1.0.4a-f
10005  
1.0.5 (+ 2 patches)
10005  
1.0.5a-d  
10006
1.0.5e-r
10100 (not source compatible)
1.0.5s-v
10006 (not binary compatible)
1.0.6 (+ 3 patches)
10006 (still binary incompatible)
1.0.6d-f
10007 (still binary incompatible)
1.0.6g
10007
1.0.6h
10007 10.6h (testing xy.z so-numbering)
1.0.6i
10007 10.6i
1.0.6j
10007 2.1.0.6j (incompatible with 1.0.0)
1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible)
1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible)
1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible)
1.0.7 1 10007 (still compatible)
1.0.8beta1-4 1 10008 2.1.0.8beta1-4
1.0.8rc1 1 10008 2.1.0.8rc1
1.0.8 1 10008 2.1.0.8
1.0.9beta1-6 1 10009 2.1.0.9beta1-6
1.0.9rc1 1 10009 2.1.0.9rc1
1.0.9beta7-10 1 10009 2.1.0.9beta7-10
1.0.9rc2 1 10009 2.1.0.9rc2
1.0.9 1 10009 2.1.0.9
1.0.10beta1 1 10010 2.1.0.10beta1
1.0.10rc1 1 10010 2.1.0.10rc1
1.0.10 1 10010 2.1.0.10
1.0.11beta1-3 1 10011 2.1.0.11beta1-3
1.0.11rc1 1 10011 2.1.0.11rc1
1.0.11 1 10011 2.1.0.11
1.0.12beta1-2 2 10012 2.1.0.12beta1-2
1.0.12rc1 2 10012 2.1.0.12rc1
1.0.12 2 10012 2.1.0.12
1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned)
1.2.0beta1-2 2 10200 2.1.2.0beta1-2
1.2.0beta3-5 3 10200 3.1.2.0beta3-5
1.2.0rc1 3 10200 3.1.2.0rc1
1.2.0 3 10200 3.1.2.0
1.2.1beta1-4 3 10201 3.1.2.1beta1-4
1.2.1rc1-2 3 10201 3.1.2.1rc1-2
1.2.1 3 10201 3.1.2.1
1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6
1.0.13beta1 10 10013 10.so.0.1.0.13beta1
1.0.13rc1 10 10013 10.so.0.1.0.13rc1
1.2.2rc1 12 10202 12.so.0.1.2.2rc1
1.0.13 10 10013 10.so.0.1.0.13
1.2.2 12 10202 12.so.0.1.2.2
1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6
1.2.3 12 10203 12.so.0.1.2.3
1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3
1.0.14rc1 13 10014 10.so.0.1.0.14rc1
1.2.4rc1 13 10204 12.so.0.1.2.4rc1
1.0.14 10 10014 10.so.0.1.0.14
1.2.4 13 10204 12.so.0.1.2.4
1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2
1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3
1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3
1.0.15 10 10015 10.so.0.1.0.15
1.2.5 13 10205 12.so.0.1.2.5
1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4
1.0.16 10 10016 10.so.0.1.0.16
1.2.6 13 10206 12.so.0.1.2.6
1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2
1.0.17rc1 10 10017 12.so.0.1.0.17rc1
1.2.7rc1 13 10207 12.so.0.1.2.7rc1
1.0.17 10 10017 12.so.0.1.0.17
1.2.7 13 10207 12.so.0.1.2.7
1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5
1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5
1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5
1.0.18 10 10018 12.so.0.1.0.18
1.2.8 13 10208 12.so.0.1.2.8

*
*
*
*
*
*
*
*
*
*
*
*

今後はソ−スバージョンは共有ライブラリのメジャー及びマイナー・ナンバーと同じになります。共有ライブラリのメジャー・バージョン・ナンバーは後の 互換性の変更を表すために使われ、またそれを目的としています。
PNG_LIBPNG_VER マクロは libpng 内で使われてはいませんが、アプリケーションで利用可能であり、xyyzz 形式のunsigned int ならソースバージョン x.y.z に相当します(ただし y と z の 0 は省略)。
ベタ・バージョンは前の公式リリース・ナンバーに文字を加えたもの で、1.0.6j まであります。それ以後は次の公式リリース・ナンバーに"betaNN" や "rcN" の文字を加えたものです。
*
*
*
*
*
*
*
*
*
*
*
*

Henceforth the source version will match the shared-library major and minor numbers; the shared-library major version number will be used for changes in backward compatibility, as it is intended.  The PNG_LIBPNG_VER macro, which is not used within libpng but is available for applications, is an unsigned integer of the form xyyzz corresponding to the source version x.y.z (leading zeros in y and z).  Beta versions were given the previous public release number plus a letter, until version 1.0.6j; from then on they were given the upcoming public release number plus "betaNN" or "rcN".
*
*
*
*
*
*
*
*
*
*
*
*
*

バイナリの非互換は、info_ptr や png_ptr メンバを介さず、コンパイル済アプリケーションが png.h に直接アクセスし、異なるライブラリバージョンで読込を行ったときにのみ起こります。
DLLNUM はバイナリ互換する範囲内で以前も今後も更新時に毎回変更されます (例: 新しい特徴が加えられたときなど)。

 これよりの情報は libpng.txt や libpng.3 を見て下さい。PNG 仕様書は W3C Recommendation や ISO Specification で入手可能です。
 <http://www.w3.org/TR/2003/REC-PNG-20031110/
 */
*
*
*
*
*
*
*
*
*
*
*
*
*

Binary incompatibility exists only when applications make direct access to the info_ptr or png_ptr members through png.h, and the compiled application is loaded with a different version of the library.
DLLNUM will change each time there are forward or backward changes in binary compatibility (e.g., when a new feature is added).

 See libpng.txt or libpng.3 for more information.  The PNG specification  is available as a W3C Recommendation and as an ISO Specification,
 <http://www.w3.org/TR/2003/REC-PNG-20031110/
 */
/*
*
*
*
*
*
*
*
*
*
*
*
*
*

著作権表示、免責条項及びライセンス:
もし libpng を変更するのであれば、直ちにこの文の後に注釈を書き加えて下さい。
 
libpng バージョン 1.2.6, 2004/8/15 〜 1.2.8, 2004/12/3
著作 (c) 2004 Glenn Randers-Pehrson
libpng-1.2.5 と同じ免責条項、ライセンスに準じて配布されています。
下記に寄稿著者のリストは個々に加えています:

     Cosmin Truta
/*
*
*
*
*
*
*
*
*
*
*
*
*
*

COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
If you modify libpng you may insert additional notices immediately following  this sentence.
 
libpng versions 1.2.6, August 15, 2004, through 1.2.8, December 3, 2004, are 
Copyright (c) 2004 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-1.2.5 with the following individual added to the list of Contributing Authors:

     Cosmin Truta
*
*
*
*
*
*
*
*
*
*
*

libpng バ−ジョン 1.0.7, 2000/7/1, 〜 1.2.5 - 2002/10/3
著作 (c) 2000-2002 Glenn Randers-Pehrson
libpng-1.0.6 と同じ免責条項、ライセンスに準じて配布されています。
下記に寄稿著者のリストは個々に加えています。

   Simon-Pierre Cadieux
   Eric S. Raymond
   Gilles Vollant
*
*
*
*
*
*
*
*
*
*
*
*

 下記は追加の免責条項です:
  

享楽や抵触などによるいかなる障害にも保証はありません。また細かな目的や要求に対し、私たちが行動することもライブラリが履行することの保証はありませ ん。このライブラリの全ての障害や、納得のいく質、能力、精度などの全体のリスクは、ユーザと一体になって取り組むものです。
*
*
*
*
*
*
*
*
*
*
*
*

 libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are
 Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-1.0.6 with the following individuals added to the list of Contributing Authors:

   Simon-Pierre Cadieux
   Eric S. Raymond
   Gilles Vollant
*
*
*
*
*
*
*
*
*
*
*

 and with the following additions to the disclaimer:
  

There is no warranty against interference with your enjoyment of the library or against infringement.  There is no warranty that our efforts or the library will fulfill any of your particular purposes or needs.  This library is provided with all faults, and the entire risk of satisfactory quality, performance, accuracy, and effort is with the user.
*
*
*
*
*
*
*
*
*
*
libpng バージョン 0.97, 1998/1月 〜 1.0.6, 2000/3/20
著作 (c) 1998, 1999 Glenn Randers-Pehrson,
libpng-0.96 と同じ免責条項、ライセンスに準じて配布されています。
下記に寄稿著者のリストは個々に加えています:

   Tom Lane
   Glenn Randers-Pehrson
   Willem van Schaik
*
*
*
*
*
*
*
*
*
*
*
*
 libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
 Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson, and are
 distributed according to the same disclaimer and license as libpng-0.96,
 with the following individuals added to the list of Contributing Authors:

    Tom Lane
    Glenn Randers-Pehrson
    Willem van Schaik
*
*
*
*
*
*
*
*
*
*
*
*
*

libpng バージョン 0.89, 1996/6月, 〜 0.96, 1997/3月
著作 (c) 1996, 1997 Andreas Dilger
libpng-0.88 と同じ免責条項、ライセンスに準じて配布されています。
下記に寄稿著者のリストは個々に加えています:

   John Bowler
   Kevin Bracey
   Sam Bushell
   Magnus Holmgren
   Greg Roelofs
   Tom Tanner
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

libpng versions 0.89, June 1996, through 0.96, May 1997, are
Copyright (c) 1996, 1997 Andreas Dilger
Distributed according to the same disclaimer and license as libpng-0.88,
with the following individuals added to the list of Contributing Authors:

   John Bowler
   Kevin Bracey
   Sam Bushell
   Magnus Holmgren
   Greg Roelofs
   Tom Tanner
*
*
*
*
*
*
*
*
*
*
*
*
*

libpng バージョン 0.5, 1995/5月, 〜 0.88, 1996/1月
著作 (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.

この著作権とライセンスがわかるように, "寄稿著者" は下記に明確に個別で書いています:

   Andreas Dilger
   Dave Martindale
   Guy Eric Schalnat
   Paul Schmidt
   Tim Wegner
*
*
*
*
*
*
*
*
*

PNG リファレンスライブラリは「そのまま」提供されています。 寄稿著者と Group 42, Inc. は暗黙にそして明確に、いろいろな目的に適応し、市場性を保証し、なんの制限もないことを含め、全ての保証を放棄します。寄稿著者と Group 42, Inc. は直接、間接、偶発、特殊、典型、必然などのいかなる損害も負いません。たとえPNG リファレンスライブラリを使ったことによる結果だとしても、そういった損害の可能性を示唆していたとしても。
*
*
*
*
*
*
*
*
*
*
*
*
*
*

libpng versions 0.5, May 1995, through 0.88, January 1996, are
Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.

For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:

   Andreas Dilger
   Dave Martindale
   Guy Eric Schalnat
   Paul Schmidt
   Tim Wegner

*
*
*
*
*
*
*
*
*

The PNG Reference Library is supplied "AS IS".  The Contributing Authors and Group 42, Inc. disclaim all warranties, expressed or implied, including, without limitation, the warranties of merchantability and of fitness for any purpose.  The Contributing Authors and Group 42, Inc. assume no liability for direct, indirect, incidental, special, exemplary, or consequential damages, which may result from the use of the PNG Reference Library, even if advised of the possibility of such damage.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

使用に際し与えられた許可は、複製、変更、このソースコード全部または一部の配布など、いかなる目的にも、フリーではありません。下記の制約に従ってくだ さい:

1. このソースコードのオリジナルを誤って伝えてはなりません。

2. 改変バージョンは必ずその旨を明記し、またそしてそれがオリジナルソースであるかのように誤って伝えてはなりません。

3. この著作権表示は改変配布ソースや、いかなるソースからも、変更も削除もしないで下さい。

寄稿著者と Group 42, Inc. はフリーではありませんが、はっきりと許可します。商用製品がPNGファイル・フォーマットをサポートすること、コンポーネント等でこのソースコードを使 うことを奨励します。
もしあなたがこのソースコードをある製品に使うなら、承認を要求するどころか、むしろ喜ばれます。
 */
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

Permission is hereby granted to use, copy, modify, and distribute this source code, or portions hereof, for any purpose, without fee, subject to the following restrictions:

1. The origin of this source code must not be misrepresented.

2. Altered versions must be plainly marked as such and
   must not be misrepresented as being the original source.

3. This Copyright notice may not be removed or altered from
   any source or altered source distribution.

The Contributing Authors and Group 42, Inc. specifically permit, without fee, and encourage the use of this source code as a component to supporting the PNG file format in commercial products.  If you use this source code in a product, acknowledgment is not required but would be appreciated.
 */
/*
*
*
*
*
*
*
*
*
*
"png_get_copyright"という関数が利用出来ます。"製品情報"ボタンと か、そういう風なカンジで使うと便利ですよ:

   printf("%s",png_get_copyright(NULL));

また PNG のロゴ(無論 PNG フォーマットに入ってる)は"pngbar.png"と "pngbar.jpg (88x31) と "pngnow.png" (98x31)というファイルとしてあります。
*/
/*
*
*
*
*
*
*
*
*
*
A "png_get_copyright" function is available, for convenient use in "about" boxes and the like:

printf("%s",png_get_copyright(NULL));

Also, the PNG logo (in PNG format, of course) is supplied in the files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
*/
/*
*
*
*
libpng は OSI Certified Open Source Softwareです。  OSI Certified Open Source は Open Source Initiative の証明マークです。
*/
/*
*
*
*
Libpng is OSI Certified Open Source Software.  OSI Certified is a certification mark of the Open Source Initiative.
*/
/*
*
*
*
*
*
寄稿著者は協力者による実行テストやバグ修正、及びその根気に大変感謝しております。何一つ 欠けたとしてもできなかったでしょう。

Frank J. T. Wojcik の文面協力に感謝を述べます。
*/
/*
*
*
*
*
*
*
The contributing authors would like to thank all those who helped with testing, bug fixes, and patience.  This wouldn't have been possible without all of you.

Thanks to Frank J. T. Wojcik for helping with the documentation.
*/
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
libpng Y2K 準拠:
=========================
  

2004/12/3

PNG 開発グループはその場その場の組織なので、私たちは公式な宣言というものをすることはできません。

これは libpng バージョン 0.71 を含め 1.2.8 までは Y2K に対応しているという非公式な保証です。私はそれ以前のバージョンもまた Y2K に対応していたと信じています。

libpng には3つだけ"年"領域がありました。ひとつは"年"を2バイト符号なし整数の上限65535に上げることです。残り2つは文字列フォーマットの日付の維 持と、"年"の上限を9999に上げることです。

整数は
    png_time_struct の "png_uint_16 year"

文字列は

   
png.c 中のローカル・キャラクタ文字列
png_struct の "png_charp time_buffer" と
"near_time_buffer"


7個の時間関連関数:


png.c: png_convert_to_rfc_1123() … png.c にあります。
  (エラー時 png_convert_to_rfc_1152() 以前)
png_convert_from_struct_tm() … pngwrite.c にあり、 pngwrite.c 内で呼ばれます。
png_convert_from_time_t() … pngwrite.cにあります。
png_get_tIME() … pngget.c にあります。
png_handle_tIME() … pngrutil.c にあり、pngread.c 内で呼ばれます。
png_set_tIME() …pngset.c にあります。
png_write_tIME() …pngwutil.cにあり、pngwrite.c 内で呼ばれます。

/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Y2K compliance in libpng:
=========================
  

December 3, 2004

Since the PNG Development group is an ad-hoc body, we can't make an official declaration.

This is your unofficial assurance that libpng from version 0.71 and upward through 1.2.8 are Y2K compliant.  It is my belief that earlier versions were also Y2K compliant.

Libpng only has three year fields.  One is a 2-byte unsigned integer that will hold years up to 65535.  The other two hold the date in text format, and will hold years up to 9999.

The integer is
    "png_uint_16 year" in png_time_struct.


The strings are

   
"png_charp time_buffer" in png_struct and
"  near_time_buffer", which is a local character string in png.c.


There are seven time-related functions:


png.c: png_convert_to_rfc_1123() in png.c
  (formerly png_convert_to_rfc_1152() in error)
png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c
png_convert_from_time_t() in pngwrite.c
png_get_tIME() in pngget.c
png_handle_tIME() in pngrutil.c, called in pngread.c
png_set_tIME() in pngset.c
png_write_tIME() in pngwutil.c, called in pngwrite.c

*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Y2K 環境でも全てハンドルは、正確に時を刻みます。
png_convert_from_time_t() 関数はシステム時間を変換するために (year - 1900) を返す gmtime() を呼び、正確な4桁の年数に変換します。アプリケーションが、png_convert_to_rfc_1123() 関数に4桁の年数を渡さな い libpng を使っている可能性もありえますし、またpng_convert_from_struct_tm() 関数に "year - 1900"の代わりに2桁の年数を渡した場合も不正確になります。 これは私たちの制御下にないためです。
libpng 文書はいつも4桁年の状態で作業を行うようにしていましたし、API もそのように文書化されていました。

tIME チャンク自身もまた Y2K に対応しています。"年"を2バイト符号なし整数を使っており、65535 までの年を保持できます。.

libpng が依存している zlib ですが、zlib もまた Y2K に対応しています。なぜなら日付関連のコードがないので。

*
*
*
*
  
Glenn Randers-Pehrson
libpng 管理者
PNG 開発グループ
*/
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
All handle dates properly in a Y2K environment.  The png_convert_from_time_t() function calls gmtime() to convert from system clock time, which returns (year - 1900), which we properly convert to the full 4-digit year.  There is a possibility that applications using libpng are not passing 4-digit years into the png_convert_to_rfc_1123() function, or that they are incorrectly passing only a 2-digit year instead of "year - 1900" into the png_convert_from_struct_tm() function, but this is not under our control.  The libpng documentation has always stated that it works with 4-digit years, and the APIs have been documented as such.

The tIME chunk itself is also Y2K compliant.  It uses a 2-byte unsigned integer to hold the year, and can hold years as large as 65535.

zlib, upon which libpng depends, is also Y2K compliant.  It contains no date-related code.

*
*
*
*
  
Glenn Randers-Pehrson
libpng maintainer
PNG Development Group
*/

#ifndef PNG_H
#define PNG_H

/*
*
*
*
*
ここは libpng の使い方について学ぶ場所ではありません。libpng.txt ファイル に libpng の使い方が書いてありますし、example.c ファイルにはビルドするためのコードが簡単にまとめて書いてあります。このファイルは実際の 関数定義と構造体の構成を調べるのに役立ちます。
 */ 

/* png.h 用バージョン情報 - png.c 内のバージョンと一致します */
#define PNG_LIBPNG_VER_STRING "1.2.8"
#define PNG_HEADER_VERSION_STRING \
   " libpng version 1.2.8 - December 3, 2004 (header)\n"

#define PNG_LIBPNG_VER_SONUM   0
#define PNG_LIBPNG_VER_DLLNUM  13

/* こちらは最初の PNG_LIBPNG_VER_STRING の 3構成と一致します: */
#define PNG_LIBPNG_VER_MAJOR   1
#define PNG_LIBPNG_VER_MINOR   2
#define PNG_LIBPNG_VER_RELEASE 8


#ifndef PNG_H
#define PNG_H

/*
*
*
*
*
This is not the place to learn how to use libpng.  The file libpng.txt describes how to use libpng, and the file example.c summarizes it with some code on which to build.  This file is useful for looking at the actual function definitions and structure components.
 */

/* Version information for png.h - this should match the version in png.c */
#define PNG_LIBPNG_VER_STRING "1.2.8"
#define PNG_HEADER_VERSION_STRING \
   " libpng version 1.2.8 - December 3, 2004 (header)\n"

#define PNG_LIBPNG_VER_SONUM   0
#define PNG_LIBPNG_VER_DLLNUM  13

/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR   1
#define PNG_LIBPNG_VER_MINOR   2
#define PNG_LIBPNG_VER_RELEASE 8


/* PNG_LIBPNG_VER_STRING の一番後ろの数値部分と同じです。ただし十の位の0は無視します: */
#define PNG_LIBPNG_VER_BUILD  0

/* リリース 状態 */
#define PNG_LIBPNG_BUILD_ALPHA    1
#define PNG_LIBPNG_BUILD_BETA     2
#define PNG_LIBPNG_BUILD_RC       3
#define PNG_LIBPNG_BUILD_STABLE   4
#define PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK 7
 
/* リリース-詳細フラグ */
#define PNG_LIBPNG_BUILD_PATCH    8 /*
            PNG_LIBPNG_BUILD_STABLE とだけOR演算できます。 */
#define PNG_LIBPNG_BUILD_PRIVATE 16 /*
             PNG_LIBPNG_BUILD_SPECIAL とは OR演算できません。*/
#define PNG_LIBPNG_BUILD_SPECIAL 32 /*
             PNG_LIBPNG_BUILD_PRIVATE とは OR演算できません。*/

#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE


/* This should match the numeric part of the final component of PNG_LIBPNG_VER_STRING, omitting any leading zero: */
#define PNG_LIBPNG_VER_BUILD  0

/* Release Status */
#define PNG_LIBPNG_BUILD_ALPHA    1
#define PNG_LIBPNG_BUILD_BETA     2
#define PNG_LIBPNG_BUILD_RC       3
#define PNG_LIBPNG_BUILD_STABLE   4
#define PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK 7
 
/* Release-Specific Flags */
#define PNG_LIBPNG_BUILD_PATCH    8 /* Can be OR'ed with
                                       PNG_LIBPNG_BUILD_STABLE only */
#define PNG_LIBPNG_BUILD_PRIVATE 16 /* Cannot be OR'ed with
                                       PNG_LIBPNG_BUILD_SPECIAL */
#define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with
                                       PNG_LIBPNG_BUILD_PRIVATE */

#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE

/*
*
*
*
*
*
*
*
注意: 一回だけ、Guy が 082 という数値を8進法で使いました。
が、十の位の0はつけてはいけません。
バージョン 0.7 〜 1.0.0 は 0 〜 100 の間です。 (バージョン 1.0.0 は番号をつけ間違えて 10000 の代わりに 100 になってるだけです。). 
バージョン 1.0.1 からは xxyyzz 形式で、x=メジャー, y=マイナー, z=リリース番号です。*/

#define PNG_LIBPNG_VER 10208 /* 1.2.8 */

#ifndef PNG_VERSION_INFO_ONLY
/* 圧縮 ライブラリ・ヘッダをインクルード */
#include "zlib.h"
#endif

/* ユーザが設定可能な情報を全てインクルード、オプションのアセンブラ・ルーチンをインクルード */
#include "pngconf.h"

/*
*
*
*
*
*
*
Careful here.  At one time, Guy wanted to use 082, but that would be octal.
We must not include leading zeros.
Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only version 1.0.0 was mis-numbered 100 instead of 10000).  From version 1.0.1 it's    xxyyzz, where x=major, y=minor, z=release */

#define PNG_LIBPNG_VER 10208 /* 1.2.8 */

#ifndef PNG_VERSION_INFO_ONLY
/* include the compression library's header */
#include "zlib.h"
#endif

/* include all user configurable info, including optional assembler routines */
#include "pngconf.h"

/*
* libpng-1.2.8 での追加*/
/*
*
*
*
*
*
*
*
*
*
*
*

MSDN 参照: Special(特別)より優先される Private(個用)
VS_FF_PRIVATEBUILD ファイルは標準リリース手順でビルド「されてはいません」。もし値が与えられているようなら StringFileInfo ブロックは PrivateBuild 文字列を含んでいなければなりません。

VS_FF_SPECIALBUILD ファイルがそれぞれの会社により標準リリース手順でビルド「された」としても標準ファイルのバージョン・ナンバーは同じ数値でなければなりません。もし値 が与えられているようなら、StringFileInfo ブロックは SpecialBuild 文字列を含んでいなければなりません。
  */
/*
* Added at libpng-1.2.8 */
/*
*
*
*
*
*
*
*
*
*
*

Ref MSDN: Private as priority over Special
VS_FF_PRIVATEBUILD File *was not* built using standard release procedures. If this value is given, the StringFileInfo block must contain a PrivateBuild string.

VS_FF_SPECIALBUILD File *was* built by the original company using standard release procedures but is a variation of the standard file of the same version number. If this value is given, the StringFileInfo block must contain a SpecialBuild string.
  */

#if defined(PNG_USER_PRIVATEBUILD)
#  define PNG_LIBPNG_BUILD_TYPE PNG_LIBPNG_BUILD_BASE_TYPE | \
          PNG_LIBPNG_BUILD_PRIVATE
#else
#  if defined(PNG_LIBPNG_SPECIALBUILD)
#    define PNG_LIBPNG_BUILD_TYPE PNG_LIBPNG_BUILD_BASE_TYPE | \
            PNG_LIBPNG_BUILD_SPECIAL
#  else
#    define PNG_LIBPNG_BUILD_TYPE PNG_LIBPNG_BUILD_BASE_TYPE
#  endif
#endif

#ifndef PNG_VERSION_INFO_ONLY

/* Inhibit C++ libpng関数用の名前変換です。システム・コール用ではありません。*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*
*
*
*
*
このファイルは何セクションか変更されています。ひとつめのセクションは構造体と型定義を含 む部分です。ふたつめは外殻ライブラリ関数を含む部分、みっつめは内部関数を含む部分です。いづれもアプリケーションが直接使うことはありません。
  */

#if defined(PNG_USER_PRIVATEBUILD)
#  define PNG_LIBPNG_BUILD_TYPE PNG_LIBPNG_BUILD_BASE_TYPE | \
          PNG_LIBPNG_BUILD_PRIVATE
#else
#  if defined(PNG_LIBPNG_SPECIALBUILD)
#    define PNG_LIBPNG_BUILD_TYPE PNG_LIBPNG_BUILD_BASE_TYPE | \
            PNG_LIBPNG_BUILD_SPECIAL
#  else
#    define PNG_LIBPNG_BUILD_TYPE PNG_LIBPNG_BUILD_BASE_TYPE
#  endif
#endif

#ifndef PNG_VERSION_INFO_ONLY

/* Inhibit C++ name-mangling for libpng functions but not for system calls. */
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*
*
*
*
*
This file is arranged in several sections. The first section contains structure and type definitions. The second section contains the external library functions, while the third has the internal library functions, which applications aren't expected to use directly.
  */

#ifndef PNG_NO_TYPECAST_NULL
#define int_p_NULL                (int *)NULL
#define png_bytep_NULL            (png_bytep)NULL
#define png_bytepp_NULL           (png_bytepp)NULL
#define png_doublep_NULL          (png_doublep)NULL
#define png_error_ptr_NULL        (png_error_ptr)NULL
#define png_flush_ptr_NULL        (png_flush_ptr)NULL
#define png_free_ptr_NULL         (png_free_ptr)NULL
#define png_infopp_NULL           (png_infopp)NULL
#define png_malloc_ptr_NULL       (png_malloc_ptr)NULL
#define png_read_status_ptr_NULL  (png_read_status_ptr)NULL
#define png_rw_ptr_NULL           (png_rw_ptr)NULL
#define png_structp_NULL          (png_structp)NULL
#define png_uint_16p_NULL         (png_uint_16p)NULL
#define png_voidp_NULL            (png_voidp)NULL
#define png_write_status_ptr_NULL (png_write_status_ptr)NULL
#else
#define int_p_NULL                NULL
#define png_bytep_NULL            NULL
#define png_bytepp_NULL           NULL
#define png_doublep_NULL          NULL
#define png_error_ptr_NULL        NULL
#define png_flush_ptr_NULL        NULL
#define png_free_ptr_NULL         NULL
#define png_infopp_NULL           NULL
#define png_malloc_ptr_NULL       NULL
#define png_read_status_ptr_NULL  NULL
#define png_rw_ptr_NULL           NULL
#define png_structp_NULL          NULL
#define png_uint_16p_NULL         NULL
#define png_voidp_NULL            NULL
#define png_write_status_ptr_NULL NULL
#endif


#ifndef PNG_NO_TYPECAST_NULL
#define int_p_NULL                (int *)NULL
#define png_bytep_NULL            (png_bytep)NULL
#define png_bytepp_NULL           (png_bytepp)NULL
#define png_doublep_NULL          (png_doublep)NULL
#define png_error_ptr_NULL        (png_error_ptr)NULL
#define png_flush_ptr_NULL        (png_flush_ptr)NULL
#define png_free_ptr_NULL         (png_free_ptr)NULL
#define png_infopp_NULL           (png_infopp)NULL
#define png_malloc_ptr_NULL       (png_malloc_ptr)NULL
#define png_read_status_ptr_NULL  (png_read_status_ptr)NULL
#define png_rw_ptr_NULL           (png_rw_ptr)NULL
#define png_structp_NULL          (png_structp)NULL
#define png_uint_16p_NULL         (png_uint_16p)NULL
#define png_voidp_NULL            (png_voidp)NULL
#define png_write_status_ptr_NULL (png_write_status_ptr)NULL
#else
#define int_p_NULL                NULL
#define png_bytep_NULL            NULL
#define png_bytepp_NULL           NULL
#define png_doublep_NULL          NULL
#define png_error_ptr_NULL        NULL
#define png_flush_ptr_NULL        NULL
#define png_free_ptr_NULL         NULL
#define png_infopp_NULL           NULL
#define png_malloc_ptr_NULL       NULL
#define png_read_status_ptr_NULL  NULL
#define png_rw_ptr_NULL           NULL
#define png_structp_NULL          NULL
#define png_uint_16p_NULL         NULL
#define png_voidp_NULL            NULL
#define png_write_status_ptr_NULL NULL
#endif

/* png.c 用変数宣言 - 必要に応じて PNG_NO_EXTERN を define して下さい。 */
#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
/*
*
Cファイル用バージョン情報、png.c で記憶されます。 上記のバージョンと一致しないとひどいことになります。
  */
/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
/*
*
Version information for C files, stored in png.c. This had better match the version above.
  */

#ifdef PNG_USE_GLOBAL_ARRAYS
PNG_EXPORT_VAR (const char) png_libpng_ver[18];
  /* "99.99.99beta99z" が入るだけの空きが必要 */
#else
#define png_libpng_ver png_get_header_ver(NULL)
#endif

#ifdef PNG_USE_GLOBAL_ARRAYS
/* ここはバージョン 1.0.5c のとき削除されました */
/* インタレースを簡単にする構造体。詳細は png.c を見て下さい。 */
PNG_EXPORT_VAR (const int FARDATA) png_pass_start[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_inc[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_ystart[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_yinc[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_mask[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_dsp_mask[7];
#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
PNG_EXPORT_VAR (const int FARDATA) png_pass_width[7];
#endif

/* これは現行では使いません。詳細が必要なら png.c を見て下さい。 PNG_EXPORT_VAR (const int FARDATA) png_pass_height[7];
*/
#endif

#endif /* PNG_NO_EXTERN */


#ifdef PNG_USE_GLOBAL_ARRAYS
PNG_EXPORT_VAR (const char) png_libpng_ver[18];
  /* need room for 99.99.99beta99z */
#else
#define png_libpng_ver png_get_header_ver(NULL)
#endif

#ifdef PNG_USE_GLOBAL_ARRAYS
/* This was removed in version 1.0.5c */
/* Structures to facilitate easy interlacing.  See png.c for more details */
PNG_EXPORT_VAR (const int FARDATA) png_pass_start[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_inc[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_ystart[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_yinc[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_mask[7];
PNG_EXPORT_VAR (const int FARDATA) png_pass_dsp_mask[7];
#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
PNG_EXPORT_VAR (const int FARDATA) png_pass_width[7];
#endif

/* This isn't currently used.  If you need it, see png.c for more details. PNG_EXPORT_VAR (const int FARDATA) png_pass_height[7];
*/
#endif

#endif /* PNG_NO_EXTERN */
 
/*
*
*
色定義3つ。赤、緑、青の順番(及び正確なサイズ) は重要ではありませんが、領域サイズが png_byte や png_uint_16(下記で定義) で必要になります。
  */
typedef struct png_color_struct
{
   png_byte red;
   png_byte green;
   png_byte blue;
} png_color;
typedef png_color FAR * png_colorp;
typedef png_color FAR * FAR * png_colorpp;

typedef struct png_color_16_struct
{
   png_byte index;    /* パレットファイル用 */
   png_uint_16 red;   /* RGBファイル用 */
   png_uint_16 green;
   png_uint_16 blue;
   png_uint_16 gray;  /* グレースケール・ファイル用 */
} png_color_16;
typedef png_color_16 FAR * png_color_16p;
typedef png_color_16 FAR * FAR * png_color_16pp;

typedef struct png_color_8_struct
{
   png_byte red;   /* RGBファイル用 */
   png_byte green;
   png_byte blue;
   png_byte gray;  /* グレースケールファイル用 */
   png_byte alpha; /* アルファ・チャンネル・ファイル用 */
} png_color_8;
typedef png_color_8 FAR * png_color_8p;
typedef png_color_8 FAR * FAR * png_color_8pp;

/*
*
*
Three color definitions. The order of the red, green, and blue, (and the exact size) is not important, although the size of the fields need to be png_byte or png_uint_16 (as defined below).
  */
typedef struct png_color_struct
{
   png_byte red;
   png_byte green;
   png_byte blue;
} png_color;
typedef png_color FAR * png_colorp;
typedef png_color FAR * FAR * png_colorpp;

typedef struct png_color_16_struct
{
   png_byte index;    /* used for palette files */
   png_uint_16 red;   /* for use in red green blue files */
   png_uint_16 green;
   png_uint_16 blue;
   png_uint_16 gray;  /* for use in grayscale files */
} png_color_16;
typedef png_color_16 FAR * png_color_16p;
typedef png_color_16 FAR * FAR * png_color_16pp;

typedef struct png_color_8_struct
{
   png_byte red;   /* for use in red green blue files */
   png_byte green;
   png_byte blue;
   png_byte gray;  /* for use in grayscale files */
   png_byte alpha; /* for alpha channel files */
} png_color_8;
typedef png_color_8 FAR * png_color_8p;
typedef png_color_8 FAR * FAR * png_color_8pp;

/*
*
*/
下記の2構造体は sPLT チャンクの記述の中心部で
使われています。
 
typedef struct png_sPLT_entry_struct
{
   png_uint_16 red;
   png_uint_16 green;
   png_uint_16 blue;
   png_uint_16 alpha;
   png_uint_16 frequency;
} png_sPLT_entry;
typedef png_sPLT_entry FAR * png_sPLT_entryp;
typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp;

/*
*
*/
The following two structures are used for the in-core representation of sPLT chunks.
 
typedef struct png_sPLT_entry_struct
{
   png_uint_16 red;
   png_uint_16 green;
   png_uint_16 blue;
   png_uint_16 alpha;
   png_uint_16 frequency;
} png_sPLT_entry;
typedef png_sPLT_entry FAR * png_sPLT_entryp;
typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp;

/*
*
*
*
sPLT パレットの深度が 8 ビットのとき、色とアルファのサンプルが各メンバ変数のLSBを占めます。 各メンバ変数のMSBは ゼロで埋められます。frequency(頻度)メンバ変数は常に全 16 ビットです。
  */

/*
*
*
*
*
When the depth of the sPLT palette is 8 bits, the color and alpha samples occupy the LSB of their respective members, and the MSB of each member is zero-filled. The frequency member always occupies the full 16 bits.
  */

●用語の注釈1

LSB : Least Significant Bit/Byte
  数値をバイナリで表現した場合の最下位ビット。または最下位バイト。

MSB : Most Significant Bit/Byte
  数値をバイナリで表現した場合の最上位ビット(特に断わりのないかぎり、符号ビットの有無にかかわらず、最上位のビットを表わす)。または、最上位バイ ト。


typedef struct png_sPLT_struct
{
   png_charp name;           /* パレット名 */
   png_byte depth;           /* パレットサンプルの深度 */
   png_sPLT_entryp entries;  /* パレット・エントリ */
   png_int_32 nentries;      /* パレット・エントリ数 */
} png_sPLT_t;
typedef png_sPLT_t FAR * png_sPLT_tp;
typedef png_sPLT_t FAR * FAR * png_sPLT_tpp;


typedef struct png_sPLT_struct
{
   png_charp name;           /* palette name */
   png_byte depth;           /* depth of palette samples */
   png_sPLT_entryp entries;  /* palette entries */
   png_int_32 nentries;      /* number of palette entries */
} png_sPLT_t;
typedef png_sPLT_t FAR * png_sPLT_tp;
typedef png_sPLT_t FAR * FAR * png_sPLT_tpp;


#ifdef PNG_TEXT_SUPPORTED
/*
*
*
*
*
*
*
*
*
*
*
 png_text は PNGファイル中の text/ztxt/itxt チャンクの内容が圧縮されてようとされてなかろうと関係なく保持します。"key" 変数はふつうのNULL終端の C文字列へのポインタです。"text"、"lang"、 "lang_key" 変数はC文字列の他、空の文字列や NULL ポインタにもなり得ます。
しかしながら png_get_text() が返す構造体は常にふつうのNULL終端の C文字列(空も含む)を持っており、決してNULL ポインタにはなりません。これはprintf() や、他の文字列操作関数の使用に際し、安全を期すためです。
  */

typedef struct png_text_struct
{
   int  compression;       /* 圧縮値:
                             -1: tEXt, 無し
                              0: zTXt, 圧縮
                              1: iTXt, 無し
                              2: iTXt, 圧縮  */
   png_charp key;   /* キーワード, "text"の1〜79文字からなる記述 */
   png_charp text;         /* コメント, 空文字列の場合あり (つまり "")
                              または NULL ポインタ */
   png_size_t text_length; /* text 文字列長 */
#ifdef PNG_iTXt_SUPPORTED
   png_size_t itxt_length; /* itxt 文字列長 */
   png_charp lang;         /* 言語コード, 0〜79 文字
                              または NULL ポインタ */
   png_charp lang_key;     /* UTF-8 文字に変換したキーワード、
                  0以上の文字列または NULL ポインタ */
#endif
} png_text;
typedef png_text FAR * png_textp;
typedef png_text FAR * FAR * png_textpp;
#endif


#ifdef PNG_TEXT_SUPPORTED
/*
*
*
*
*
*
*
*
*
*
*
 png_text holds the contents of a text/ztxt/itxt chunk in a PNG file, and whether that contents is compressed or not. The "key" field points to a regular zero-terminated C string. The "text", "lang", and "lang_key" fields can be regular C strings, empty strings, or NULL pointers.
However, the structure returned by png_get_text() will always contain regular zero-terminated C strings (possibly empty), never NULL pointers, so they can be safely used in printf() and other string-handling functions.
 */

typedef struct png_text_struct
{
   int  compression;       /* compression value:
                             -1: tEXt, none
                              0: zTXt, deflate
                              1: iTXt, none
                              2: iTXt, deflate  */
   png_charp key;      /* keyword, 1-79 character description of "text" */
   png_charp text;      /* comment, may be an empty string (ie "")
                              or a NULL pointer */
   png_size_t text_length; /* length of the text string */
#ifdef PNG_iTXt_SUPPORTED
   png_size_t itxt_length; /* length of the itxt string */
   png_charp lang;         /* language code, 0-79 characters
                              or a NULL pointer */
   png_charp lang_key;     /* keyword translated UTF-8 string,
                                0 or more chars or a NULL pointer */
#endif
} png_text;
typedef png_text FAR * png_textp;
typedef png_text FAR * FAR * png_textpp;
#endif


/* PNGファイル中のテキスト (tEXt, and zTXt)用圧縮タイプ・サポート
 * PNG_TEXT_COMPRESSION_ の値定義は「変更してはいけません」。 */
#define PNG_TEXT_COMPRESSION_NONE_WR -3
#define PNG_TEXT_COMPRESSION_zTXt_WR -2
#define PNG_TEXT_COMPRESSION_NONE    -1
#define PNG_TEXT_COMPRESSION_zTXt     0
#define PNG_ITXT_COMPRESSION_NONE     1
#define PNG_ITXT_COMPRESSION_zTXt     2
#define PNG_TEXT_COMPRESSION_LAST     3  /* 無効値 */


/* Supported compression types for text in PNG files (tEXt, and zTXt).
 * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */
#define PNG_TEXT_COMPRESSION_NONE_WR -3
#define PNG_TEXT_COMPRESSION_zTXt_WR -2
#define PNG_TEXT_COMPRESSION_NONE    -1
#define PNG_TEXT_COMPRESSION_zTXt     0
#define PNG_ITXT_COMPRESSION_NONE     1
#define PNG_ITXT_COMPRESSION_zTXt     2
#define PNG_TEXT_COMPRESSION_LAST     3  /* Not a valid value */


/*
*
*
*
*
*
png_time はマシン内部で独自に時刻を保持します。時間の変換方法には2つあり、それは time_t と tm 構造体から行うものです。 何れの構造体からの変換方法も、私の知る限り移植はされていません。もし移植方法を知ってたら、私にメールください。付け加えておきますが… PNG は以前より2000年問題に対応しております!
  */

typedef struct png_time_struct
{
   png_uint_16 year; /* 1995のように全4桁の年 */
   png_byte month;   /* 月、1〜 12 */
   png_byte day;     /* 日、1 〜 31 */
   png_byte hour;    /* 時間、0 〜 23 */
   png_byte minute;  /* 分、0 〜 59 */
   png_byte second;  /* 秒、 0 〜 60 (うるう秒用) */
} png_time;
typedef png_time FAR * png_timep;
typedef png_time FAR * FAR * png_timepp;


/*
*
*
*
*
*
png_time is a way to hold the time in an machine independent way. Two conversions are provided, both from time_t and struct tm. There is no portable way to convert to either of these structures, as far as I know. If you know of a portable way, send it to me. As a side note - PNG has always been Year 2000 compliant!
  */

typedef struct png_time_struct
{
   png_uint_16 year; /* full year, as in, 1995 */
   png_byte month;   /* month of year, 1 - 12 */
   png_byte day;     /* day of month, 1 - 31 */
   png_byte hour;    /* hour of day, 0 - 23 */
   png_byte minute;  /* minute of hour, 0 - 59 */
   png_byte second;  /* second of minute, 0 - 60 (for leap seconds) */
} png_time;
typedef png_time FAR * png_timep;
typedef png_time FAR * FAR * png_timepp;


#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
/*
*
*
*
png_unknown_chunk は仕様にない形態などを扱うためのキュー型チャンクを使う構造体です。ライブラリの知らないセマンティクスでも、出力用プライベート・チャンクのキュー列 を作って使うという発想です。
   */
typedef struct png_unknown_chunk_t
{
    png_byte name[5];
    png_byte *data;
    png_size_t size;

    /* libpng を使っているアプリケーションはこのバイトを直接「変更してはいけません」。 */
    png_byte location; /* 時間を読み込む命令モード */
}

png_unknown_chunk;
typedef png_unknown_chunk FAR * png_unknown_chunkp;
typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp;
#endif


#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
/*
*
*
*
png_unknown_chunk is a structure to hold queued chunks for which there is no specific support. The idea is that we can use this to queue up private chunks for output even though the library doesn't actually know about their semantics.
   */
typedef struct png_unknown_chunk_t
{
    png_byte name[5];
    png_byte *data;
    png_size_t size;

  /* libpng-using applications should NOT directly modify this byte. */
    png_byte location; /* mode of operation at read time */
}

png_unknown_chunk;
typedef png_unknown_chunk FAR * png_unknown_chunkp;
typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp;
#endif


/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
png_info は画像の特徴をアプリケーションが把握できるようにするためにPNGファイルの情報を扱います。ファイル読込時に、この構造体はPNGファイルにどんなも のが入っているかという情報を提供します。ファイル書込み時には自分がPNGファイルに書き込みたい情報をいれることができ、その際には png_write_info() 関数を呼んでください。名前の選択はPNG 仕様書にとても近似しており、各変数の意味合いについては、情報文書を参考にしています。

0.95より前のlibpng では、png_info_struct内の値を直接読み書きするしかなく、修正後も値の順序や中身は以前のままでした。libpng 0.95 以後は、それでも、現在はアプリケーションからpng_info_struct の内容を抽出する関数があり、それはダイナミック・ライブラリを扱う際の libpng の使用を簡単にし、同様に補助チャ ンクの操作関数も全てはありませんがlibpng で使うことができます。

何があろうとも、png_info_struct 内の変数の順序は「変更すべきでなく」、できる限り png_info_struct に直接アクセスする旧関数との互換用に保持しておくべきです。

下記メンバは構造体が破棄される前に動的に割り当てられたメモリを解放する必要があります: palette、trans、text、pcal_purpose、 pcal_units、pcal_params、hist、iccp_name、iccp_profile、splt_palettes、 scal_unit、row_pointers、unknowns です。デフォルトでは、libpng 内部で確保された情報構造体のメモリは、構造体が解放されるとき同時に自動で解放されます。この動作は png_data_freer() 関数で変更することができます。

メモリ確保関数の詳細: 全てのチャンク読込関数はこれらのメンバを変更するとき png_set_* の名前をもつ関数を通ることになります。
これらのメンバをクリアするのに利用可能な関数があります: png_free_data() を見て下さい。png_set_* 関数は引数(元の値のコピーを作ります)の情報構造体のメンバへのポインタを得ることに依存しません。ただし、png_set_text 関数は text_ptr や itxt_ptr 構造体引数内部の渡された値と同じものを使い、png_set_rows や png_set_unknowns 関数は値のコピーを作らないということを「除きます」。


  */


/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
png_info is a structure that holds the information in a PNG file so that the application can find out the characteristics of the image. If you are reading the file, this structure will tell you what is in the PNG file. If you are writing the file, fill in the information you want to put into the PNG file, then call png_write_info(). The names chosen should be very close to the PNG specification, so consult that document for information about the meaning of each field.

With libpng < 0.95, it was only possible to directly set and read the the values in the png_info_struct, which meant that the contents and order of the values had to remain fixed. With libpng 0.95 and later, however, there are now functions that abstract the contents of png_info_struct from the application, so this makes it easier to use libpng with dynamic libraries, and even makes it possible to use libraries that don't have all of the libpng ancillary chunk-handing functionality.

In any case, the order of the parameters in png_info_struct should NOT be changed for as long as possible to keep compatibility with applications that use the old direct-access method with png_info_struct.

The following members may have allocated storage attached that should be cleaned up before the structure is discarded: palette, trans, text, pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, splt_palettes, scal_unit, row_pointers, and unknowns. By default, these are automatically freed when the info structure is deallocated, if they were allocated internally by libpng. This behavior can be changed by means of the png_data_freer() function.

More allocation details: all the chunk-reading functions that change these members go through the corresponding png_set_* functions.
A function to clear these members is available: see png_free_data(). The png_set_* functions do not depend on being able to point info structure members to any of the storage they are passed (they make their own copies), EXCEPT that the png_set_text functions use the same storage passed to them in the text_ptr or itxt_ptr structure argument, and the png_set_rows and png_set_unknowns functions do not make their own copies.
  */


typedef struct png_info_struct
{
   /* 以下は全てのPNG ファイルで必要になります。 */
   png_uint_32 width;       /* 画像ピクセル横幅 (IHDRより) */
   png_uint_32 height;      /* 画像ピクセル高さ (IHDRより) */
   png_uint_32 valid;    /* 有効チャンク・データ (下記 PNG_INFO_ を見て下さい) */
   png_uint_32 rowbytes;  /* 未変換の1行を保持するのに必要なバイト */
   png_colorp palette;      /* 色配列 (valid & PNG_INFO_PLTE) */
   png_uint_16 num_palette; /* "palette"の色数 (PLTE) */
   png_uint_16 num_trans;   /* パレットの透明色番号 (tRNS) */
   png_byte bit_depth;      /* 1, 2, 4, 8, または 16 ビット/チャンネル (IHDRより) */
   png_byte color_type;     /* 下記 PNG_COLOR_TYPE_ を見て下さい (IHDRより) */
   /* 下記3つは *_method ではなく *_type と名づけられています */
   png_byte compression_type; /* PNG_COMPRESSION_TYPE_BASE でなければなりません (IHDR) */
   png_byte filter_type;    /* PNG_FILTER_TYPE_BASE でなければなりません (IHDRより) */
   png_byte interlace_type; /* PNG_INTERLACE_NONE、 PNG_INTERLACE_ADAM7 のうち1つ */

   /* 下記は読込だけの情報であり、書込みでは使います */
   png_byte channels;       /* 1ピクセルのデータ・チャンネル数 (1, 2, 3, 4) */
   png_byte pixel_depth;    /* 1ピクセルのビット数 */
   png_byte spare_byte;     /* データ整列用、及び将来の使用 用 */
   png_byte signature[8];   /* ファイル先頭のマジック・バイト */

typedef struct png_info_struct
{
   /* the following are necessary for every PNG file */
   png_uint_32 width;       /* width of image in pixels (from IHDR) */
   png_uint_32 height;      /* height of image in pixels (from IHDR) */
   png_uint_32 valid;       /* valid chunk data (see PNG_INFO_ below) */
   png_uint_32 rowbytes;    /* bytes needed to hold an untransformed row */
   png_colorp palette;      /* array of color values (valid & PNG_INFO_PLTE) */
   png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */
   png_uint_16 num_trans;   /* number of transparent palette color (tRNS) */
   png_byte bit_depth;      /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */
   png_byte color_type;     /* see PNG_COLOR_TYPE_ below (from IHDR) */
   /* The following three should have been named *_method not *_type */
   png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */
   png_byte filter_type;    /* must be PNG_FILTER_TYPE_BASE (from IHDR) */
   png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */

   /* The following is informational only on read, and not used on writes. */
   png_byte channels;       /* number of data channels per pixel (1, 2, 3, 4) */
   png_byte pixel_depth;    /* number of bits per pixel */
   png_byte spare_byte;     /* to align the data, and for future use */
   png_byte signature[8];   /* magic bytes read by libpng from start of file */

/*
*
*
*
*/
残ったデータはオプションです。読込時、情報が有効であるか確認するために valid 変数をチェックしてください。書込み時、書き込んだチャンクの下記の対応した変数を初期化し、valid 変数をセットしてください。

#if defined(PNG_gAMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)

/*
*
*
*
*/
gAMA チャンクは生成された画像上にシステムのガンマ特性を反映させ、通常 [1.0, 2.5] の範囲です。 データが有効なら (valid & PNG_INFO_gAMA) は非ゼロです。

   float gamma; /* 画像のガンマ値、 if (valid & PNG_INFO_gAMA) */
#endif

#if defined(PNG_sRGB_SUPPORTED)
    /* GR-P, 0.96a */
    /* データ有効 … if (valid & PNG_INFO_sRGB) 非ゼロ */
   png_byte srgb_intent; /* sRGB 対応表現 [0, 1, 2, 3] */
#endif

/*
*
*
*
*/
The rest of the data is optional.  If you are reading, check the valid field to see if the information in these are valid.  If you are writing, set the valid field to those chunks you want written, and initialize the appropriate fields below.

#if defined(PNG_gAMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)

/*
*
*
*
*/
The gAMA chunk describes the gamma characteristics of the system on which the image was created, normally in the range [1.0, 2.5]. Data is valid if (valid & PNG_INFO_gAMA) is non-zero.

   float gamma; /* gamma value of image, if (valid & PNG_INFO_gAMA) */
#endif

#if defined(PNG_sRGB_SUPPORTED)
    /* GR-P, 0.96a */
    /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */
   png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */
#endif
●用語の注 釈2

sRGB :standard RGB
IEC(国 際電気標準会議)が1998年10月に策定した、色空間の国際標準規格。異なるデバイス間での差や違いによらず、目的の色を再現するための表現形 式。sRGBは他と比べて表現の範囲が狭く、プロには向かない模様。


#if defined(PNG_TEXT_SUPPORTED)

/*
*
*
*
*
*
*
*
非圧縮、圧縮、追加圧縮フォームはそれぞれ、tEXt と zTXt チャンクは人間が読めるテキスト・データを含みます。"text"に入ってるデータ非圧縮、NULL終端の C 文字列の、ポインタの配列です。各チャンクはそのチャンクに入っているテキストデータを表すキーワードを持ちます。キーワードは固有のものである必要は無 く、text 文字列は空でも構いません。text チャンクはみんな画像の中でも構いません。
   */
   int num_text; /* 読込/書込用 コメント長 */
   int max_text; /* text 配列の現行サイズ */
   png_textp text; /* 読込/書込用 コメント配列 */
#endif /* PNG_TEXT_SUPPORTED */

#if defined(PNG_tIME_SUPPORTED)
/*
*
*
tIME チャンクは、表示された画像が変更された更新日時を保持します。この構造体の中身については png_time 構造体を見て下さい。
   */
   png_time mod_time;
#endif

#if defined(PNG_sBIT_SUPPORTED)

/*
*
*
*
*
*/
sBIT チャンクはピクセルデータの上位ビットの有意数を定めます。値は [1, bit_depth] の範囲にあり、ピクセルデータのチャンネルのためにだけ定められます。下位ビットの中身は決められてません。データが有効なら (valid & PNG_INFO_sBIT) は非ゼロです。

   png_color_8 sig_bit; /* カラーチャンネルの有意ビット */
#endif

#if defined(PNG_TEXT_SUPPORTED)

/*
*
*
*
*
*
*
*
The tEXt, and zTXt chunks contain human-readable textual data in uncompressed, compressed, and optionally compressed forms, respectively. The data in "text" is an array of pointers to uncompressed, null-terminated C strings. Each chunk has a keyword that describes the textual data contained in that chunk. Keywords are not required to be unique, and the text string may be empty. Any number of text chunks may be in an image.
   */
   int num_text; /* number of comments read/to write */
   int max_text; /* current size of text array */
   png_textp text; /* array of comments read/to write */
#endif /* PNG_TEXT_SUPPORTED */

#if defined(PNG_tIME_SUPPORTED)
/*
*
*
The tIME chunk holds the last time the displayed image data was modified. See the png_time struct for the contents of this struct.
   */
   png_time mod_time;
#endif

#if defined(PNG_sBIT_SUPPORTED)

/*
*
*
*
*
*/
The sBIT chunk specifies the number of significant high-order bits in the pixel data. Values are in the range [1, bit_depth], and are only specified for the channels in the pixel data. The contents of the low-order bits is not specified. Data is valid if (valid & PNG_INFO_sBIT) is non-zero.

   png_color_8 sig_bit; /* significant bits in color channels */
#endif

#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \
defined(PNG_READ_BACKGROUND_SUPPORTED)
/*
*
*
*
*
*
*
*
*
tRNS チャンクはパレット画像及びアルファチャンネルを必要としない他の画像タイプの透過データを提供します。パレット画像用の透過値 "num_trans" があり、0から始まるインデックス値で、パレットカラーと同じような数値が入っています。データの値は [0, 255] の範囲にあり、それぞれ完全透明から完全不透明まで変動します。パレットを使わない画像ではある一つの色を透明色として処理します。 データが有効なら (valid & PNG_INFO_tRNS) は非ゼロです。
  */
   png_bytep trans; /* パレット画像用透明値 */
   png_color_16 trans_values; /* 非パレット用透明色 */

#endif


#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \
defined(PNG_READ_BACKGROUND_SUPPORTED)
/*
*
*
*
*
*
*
*
*
The tRNS chunk supplies transparency data for paletted images and other image types that don't need a full alpha channel. There are "num_trans" transparency values for a paletted image, stored in the same order as the palette colors, starting from index 0. Values for the data are in the range [0, 255], ranging from fully transparent to fully opaque, respectively. For non-paletted images, there is a single color specified that should be treated as fully transparent. Data is valid if (valid & PNG_INFO_tRNS) is non-zero.
  */
   png_bytep trans; /* transparent values for paletted image */
   png_color_16 trans_values; /* transparent color for non-palette image */

#endif


#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
/*
*
*
*
*
*
*
プログラムが自身の背景色を持たなかったり、画像が表示前に背景色と合成する必要があったり したとき、bKGD チャンクは画像の背景色を示します。"background"にある色は通常ピクセル・データと同じ色空間/深度になります。 データが有効なら (valid & PNG_INFO_bKGD) は非ゼロです。
  */
   png_color_16 background;
#endif


#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
/*
*
*
*
*
*
*
The bKGD chunk gives the suggested image background color if the display program does not have its own background color and the image is needs to composited onto a background before display. The colors in "background" are normally in the same color space/depth as the pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero.
  */
   png_color_16 background;
#endif

#if defined(PNG_oFFs_SUPPORTED)
/*
*
*
*
*
*
oFFs チャンクは、ディスプレイ、ページ、又は他のアプリケーション仕様の座標領域の、左上隅から右方及び下方への "offset_unit_type"単位でのオフセットを示します。単位のタイプについては下記の PNG_OFFSET_ 定義を見て下さい。 有効なら (valid & PNG_INFO_oFFs) は非ゼロです。
  */
   png_int_32 x_offset; /* ページ上 X オフセット */
   png_int_32 y_offset; /* ページ上 Y オフセット */
   png_byte offset_unit_type; /* オフセットの単位タイプ */
#endif


#if defined(PNG_oFFs_SUPPORTED)
/*
*
*
*
*
*
The oFFs chunk gives the offset in "offset_unit_type" units rightwards and downwards from the top-left corner of the display, page, or other application-specific co-ordinate space. See the PNG_OFFSET_ defines below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero.
  */
   png_int_32 x_offset; /* x offset on page */
   png_int_32 y_offset; /* y offset on page */
   png_byte offset_unit_type; /* offset units type */
#endif


#if defined(PNG_pHYs_SUPPORTED)
/*
*
*
*
*
pHYs チャンクは画像の物理ピクセル解像度です。ディスプレイや印刷用に"phys_unit_type" 単位で示します(下記 PNG_RESOLUTION_ 定義を見て下さい)。データが有効なら (valid & PNG_INFO_pHYs) は非ゼロです。
*/
   png_uint_32 x_pixels_per_unit; /* 水平ピクセル解像度 */
   png_uint_32 y_pixels_per_unit; /* 垂直ピクセル解像度 */
   png_byte phys_unit_type; /* 解像度タイプ (下記 PNG_RESOLUTION_ を見て下さい) */
#endif

#if defined(PNG_pHYs_SUPPORTED)
/*
*
*
*
*
The pHYs chunk gives the physical pixel density of the image for display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero.
*/
   png_uint_32 x_pixels_per_unit; /* horizontal pixel density */
   png_uint_32 y_pixels_per_unit; /* vertical pixel density */
   png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */
#endif

#if defined(PNG_hIST_SUPPORTED)
/*
*
*
*
*
hIST チャンクは相対度数や各種パレット・エントリの重要度です。ビューアが減色が要求されたパレットを理知的に選択できるようにします。データは [0,65535]に範囲にある"num_palette" 値の配列です。データが有効なら (valid & PNG_INFO_hIST) は非ゼロです。
  */

   png_uint_16p hist;
#endif


#if defined(PNG_hIST_SUPPORTED)
/*
*
*
*
*
The hIST chunk contains the relative frequency or importance of the various palette entries, so that a viewer can intelligently select a reduced-color palette, if required. Data is an array of "num_palette" values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) is non-zero.
  */
   png_uint_16p hist;
#endif


#ifdef PNG_cHRM_SUPPORTED
/*
*
*
*
*
*
*
cHRM チャンクは PNG が生成されたときにモニタ CIE カラー特性を反映します。このデータはビューアが作成者と同じように画像が見えるようにビューアに入力画像の階域マッピングを行わせます。 値は [0.0, 0.8] の範囲内です。データが有効なら (valid & PNG_INFO_cHRM) は非ゼロです。
 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
   float x_white;
   float y_white;
   float x_red;
   float y_red;
   float x_green;
   float y_green;
   float x_blue;
   float y_blue;
#endif
#endif

#ifdef PNG_cHRM_SUPPORTED
/*
*
*
*
*
*
*
The cHRM chunk describes the CIE color characteristics of the monitor on which the PNG was created. This data allows the viewer to do gamut mapping of the input image to ensure that the viewer sees the same colors in the image as the creator. Values are in the range [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero.
 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
   float x_white;
   float y_white;
   float x_red;
   float y_red;
   float x_green;
   float y_green;
   float x_blue;
   float y_blue;
#endif
#endif
●用語の注釈 3
CIE:
CIE表色系。CIE色度図。1931年CIE(COMMISSION INTERNATIONALE DE  L'ECLAIRAGE 国際照明委員会) が策定した色定義。
XYZ という原色を用いて光のスペクトルを等色に表現するのが目的。(RGBで等色を表現するのが難しいため)

CIE という名前の他の機関・名称・略もあるのでご注意を(かなり沢山あります)
  Civil Information and Education Section …民間情報教育局
  computer-integrated enterprises …コンピュータによる統合企業
  CenterforInternational Education …留学センター
   etc...


#if defined(PNG_pCAL_SUPPORTED)
/*
*
*
*
*
*
*
*
*
*
*
*
pCAL チャンクは画像を生成するのに使うオリジナル物理データとメモリ上のピクセル値の間の変換を描写します。
[0, 2^bit_depth - 1] の整数値が [pcal_X0, pcal_X1] の浮動小数に割り当てられ、"pcal_type" や "pcal_params"、"pcal_units"によって"pcal_units"に与えられる(なるべく非線形な) 変換関数によりさらに変換が行われます。下記の PNG_EQUATION_ 定義を見て下さい。PNGグループ の PNG 拡張文書で、変換に関する完全な記述と方法が、ASCII 文字列パラメータ用に、実装されました。データが有効なら (valid & PNG_INFO_pCAL) は非ゼロです。
  */
   png_charp pcal_purpose;  /* pCAL チャンクの文字列での記述 */
   png_int_32 pcal_X0;      /* 最小値 */
   png_int_32 pcal_X1;      /* 最大値 */
   png_charp pcal_units;    /* Latin-1 文字列による物理単位 */
   png_charpp pcal_params;  /* ASCII 文字列を含むパラメータ */
   png_byte pcal_type;      /* 等式タイプ (下記 PNG_EQUATION_ を見て下さい) */
   png_byte pcal_nparams;   /* pcal_params によるパラメータ番号 */
#endif



#if defined(PNG_pCAL_SUPPORTED)
/*
*
*
*
*
*
*
*
*
*
*
*
The pCAL chunk describes a transformation between the stored pixel values and original physical data values used to create the image.
The integer range [0, 2^bit_depth - 1] maps to the floating-point range given by [pcal_X0, pcal_X1], and are further transformed by a (possibly non-linear) transformation function given by "pcal_type" and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ defines below, and the PNG-Group's PNG extensions document for a complete description of the transformations and how they should be implemented, and for a description of the ASCII parameter strings. Data values are valid if (valid & PNG_INFO_pCAL) non-zero.
  */
   png_charp pcal_purpose;  /* pCAL chunk description string */
   png_int_32 pcal_X0;      /* minimum value */
   png_int_32 pcal_X1;      /* maximum value */
   png_charp pcal_units;    /* Latin-1 string giving physical units */
   png_charpp pcal_params;  /* ASCII strings containing parameter values */
   png_byte pcal_type;      /* equation type (see PNG_EQUATION_ below) */
   png_byte pcal_nparams;   /* number of parameters given in pcal_params */
#endif



/* libpng-1.0.6 で加えられた新メンバ変数 */
#ifdef PNG_FREE_ME_SUPPORTED
   png_uint_32 free_me;     /* メモリ解放の責任があるかないかのフラグ */
#endif

#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
   /* ライブラリが識別不能な未知のチャンク用メモリ */
   png_unknown_chunkp unknown_chunks;
   png_size_t unknown_chunks_num;
#endif

#if defined(PNG_iCCP_SUPPORTED)
   /* iCCP chunk data. */
   png_charp iccp_name;     /* プロフィール名 */
   png_charp iccp_profile;  /* International Color Consortium プロフィール・データ */
                            /* 管理者注: png_bytep にしてください */
   png_uint_32 iccp_proflen;  /* ICC プロフィール・データ長 */
   png_byte iccp_compression; /* 常にゼロ */
#endif

#if defined(PNG_sPLT_SUPPORTED)
   /* sPLT チャンク上のデータ (ひとつ以上あるかも). */
   png_sPLT_tp splt_palettes;
   png_uint_32 splt_palettes_num;
#endif


/* New members added in libpng-1.0.6 */
#ifdef PNG_FREE_ME_SUPPORTED
   png_uint_32 free_me;     /* flags items libpng is responsible for freeing */
#endif

#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
   /* storage for unknown chunks that the library doesn't recognize. */
   png_unknown_chunkp unknown_chunks;
   png_size_t unknown_chunks_num;
#endif

#if defined(PNG_iCCP_SUPPORTED)
   /* iCCP chunk data. */
   png_charp iccp_name;     /* profile name */
   png_charp iccp_profile;   /* International Color Consortium profile data */
                            /* Note to maintainer: should be png_bytep */
   png_uint_32 iccp_proflen;  /* ICC profile data length */
   png_byte iccp_compression; /* Always zero */
#endif

#if defined(PNG_sPLT_SUPPORTED)
   /* data on sPLT chunks (there may be more than one). */
   png_sPLT_tp splt_palettes;
   png_uint_32 splt_palettes_num;
#endif


#if defined(PNG_sCAL_SUPPORTED)
/*
*
*
*
*
*
*
*
sCAL チャンクはグラフィックの主題でもある現実の実寸を表現します。チャンクは仕様1単位のバイト値及び、浮動小数値を表す2つのASCII 文字列を含みます。値は画像の1ピクセルあたりの横幅と高さです。この形式外な表現はここで double 型に変換されます。データが有効なら (valid & PNG_INFO_sCAL) は非ゼロです。
  */
   png_byte scal_unit;         /* 物理スケールの単位 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
   double scal_pixel_width;    /* 1ピクセルの横幅 */
   double scal_pixel_height;   /* 1ピクセルの高さ */
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
   png_charp scal_s_width;     /* 高さ文字列 */
   png_charp scal_s_height;    /* 横幅文字列 */
#endif
#endif


#if defined(PNG_sCAL_SUPPORTED)
/*
*
*
*
*
*
*
*
The sCAL chunk describes the actual physical dimensions of the subject matter of the graphic. The chunk contains a unit specification a byte value, and two ASCII strings representing floating-point values. The values are width and height corresponsing to one pixel in the image. This external representation is converted to double here. Data values are valid if (valid & PNG_INFO_sCAL) is non-zero.
  */
   png_byte scal_unit;         /* unit of physical scale */
#ifdef PNG_FLOATING_POINT_SUPPORTED
   double scal_pixel_width;    /* width of one pixel */
   double scal_pixel_height;   /* height of one pixel */
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
   png_charp scal_s_width;     /* string containing height */
   png_charp scal_s_height;    /* string containing width */
#endif
#endif


#if defined(PNG_INFO_IMAGE_SUPPORTED)
   /* メモリ確保済みなら (valid & PNG_ALLOCATED_INFO_ROWS) は非ゼロです。 */
   /* データが有効なら (valid & PNG_INFO_IDAT) は非ゼロです。 */
   png_bytepp row_pointers;        /* 画像ビット */
#endif

#if defined(PNG_FIXED_POINT_SUPPORTED) && defined(PNG_gAMA_SUPPORTED)
   png_fixed_point int_gamma; /* 画像ガンマ,
                          (valid & PNG_INFO_gAMA) なら有効 */
#endif

#if defined(PNG_cHRM_SUPPORTED) && defined(PNG_FIXED_POINT_SUPPORTED)
   png_fixed_point int_x_white;
   png_fixed_point int_y_white;
   png_fixed_point int_x_red;
   png_fixed_point int_y_red;
   png_fixed_point int_x_green;
   png_fixed_point int_y_green;
   png_fixed_point int_x_blue;
   png_fixed_point int_y_blue;
#endif

} png_info;

typedef png_info FAR * png_infop;
typedef png_info FAR * FAR * png_infopp;


#if defined(PNG_INFO_IMAGE_SUPPORTED)
   /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) non-zero */
   /* Data valid if (valid & PNG_INFO_IDAT) non-zero */
   png_bytepp row_pointers;        /* the image bits */
#endif

#if defined(PNG_FIXED_POINT_SUPPORTED) && defined(PNG_gAMA_SUPPORTED)
   png_fixed_point int_gamma; /* gamma of image, if (valid & PNG_INFO_gAMA) */
#endif

#if defined(PNG_cHRM_SUPPORTED) && defined(PNG_FIXED_POINT_SUPPORTED)
   png_fixed_point int_x_white;
   png_fixed_point int_y_white;
   png_fixed_point int_x_red;
   png_fixed_point int_y_red;
   png_fixed_point int_x_green;
   png_fixed_point int_y_green;
   png_fixed_point int_x_blue;
   png_fixed_point int_y_blue;
#endif

} png_info;

typedef png_info FAR * png_infop;
typedef png_info FAR * FAR * png_infopp;

/* PNG is (2^31)-1 で使う正の最大整数 */
#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL)
#define PNG_UINT_32_MAX ((png_uint_32)(-1))
#define PNG_SIZE_MAX ((png_size_t)(-1))
/* PNG_MAX_UINT は廃止されました; 代わりに PNG_UINT_31_MAX を使ってください */
#define PNG_MAX_UINT PNG_UINT_31_MAX

/* これらは png_infono color_type 変数に使います */
/* カラータイプマスク */
#define PNG_COLOR_MASK_PALETTE    1
#define PNG_COLOR_MASK_COLOR      2
#define PNG_COLOR_MASK_ALPHA      4

/* カラータイプ。全部組み合わせることはできないので注意 */
#define PNG_COLOR_TYPE_GRAY 0
#define PNG_COLOR_TYPE_PALETTE  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)
#define PNG_COLOR_TYPE_RGB        (PNG_COLOR_MASK_COLOR)
#define PNG_COLOR_TYPE_RGB_ALPHA  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)
#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA)
/* aliases */
#define PNG_COLOR_TYPE_RGBA  PNG_COLOR_TYPE_RGB_ALPHA
#define PNG_COLOR_TYPE_GA  PNG_COLOR_TYPE_GRAY_ALPHA

/* 圧縮タイプ用。PNG 1.0-1.2 は1個のタイプのみ定義できる */
#define PNG_COMPRESSION_TYPE_BASE 0 /* 圧縮命令 8, 32K ウィンドウ */
#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE

/* フィルタ・タイプ用。PNG 1.0-1.2 は1個のタイプのみ定義できる */
#define PNG_FILTER_TYPE_BASE      0 /* 1行/バイト フィルタ */
#define PNG_INTRAPIXEL_DIFFERENCING 64 /* MNG データストリームにだけ使用 */
#define PNG_FILTER_TYPE_DEFAULT   PNG_FILTER_TYPE_BASE

/* インタレース・タイプ用。これらの値は「変更されません」 */
#define PNG_INTERLACE_NONE     0 /* インタレース無しの画像 */
#define PNG_INTERLACE_ADAM7    1 /* Adam7インタレース */
#define PNG_INTERLACE_LAST      2 /* 無効値 */

/* oFFs チャンク用。これらの値は「変更されません」 */
#define PNG_OFFSET_PIXEL          0 /* ピクセル数でのオフセット */
#define PNG_OFFSET_MICROMETER     1 /* マイクロメーター (1/10^6 メートル) でのオフセット */
#define PNG_OFFSET_LAST           2 /* 無効値 */

/* pCAL チャンク用。これらの値は「変更されません」 */
#define PNG_EQUATION_LINEAR       0 /* 線形変換 */
#define PNG_EQUATION_BASE_E       1 /* 自然対数 e を底とした指数変換 */
#define PNG_EQUATION_ARBITRARY   2 /* 任意の底を用いた指数変換 */
#define PNG_EQUATION_HYPERBOLIC   3 /* 双曲正弦変換 */
#define PNG_EQUATION_LAST         4 /* 無効値 */

/* sCAL チャンク用。これらの値は「変更されません」 */
#define PNG_SCALE_UNKNOWN      0 /* 不明な単位 (画像スケール) */
#define PNG_SCALE_METER           1 /* メートル/ピクセル */
#define PNG_SCALE_RADIAN          2 /* ラジアン/ピクセル */
#define PNG_SCALE_LAST            3 /* 無効値 */

/* pHYs チャンク用。これらの値は「変更されません」 */
#define PNG_RESOLUTION_UNKNOWN    0 /* ピクセル/不明な単位 (アスペクト比) */
#define PNG_RESOLUTION_METER      1 /* ピクセル/メートル */
#define PNG_RESOLUTION_LAST       2 /* 無効値 */

/* sRGB チャンク用。これらの値は「変更されません」 */
#define PNG_sRGB_INTENT_PERCEPTUAL 0
#define PNG_sRGB_INTENT_RELATIVE   1
#define PNG_sRGB_INTENT_SATURATION 2
#define PNG_sRGB_INTENT_ABSOLUTE   3
#define PNG_sRGB_INTENT_LAST       4 /* 無効値 */

/* This is for text chunks */
#define PNG_KEYWORD_MAX_LENGTH     79

/* PLTE/sPLT/tRNS 配列エントリの最大数 */
#define PNG_MAX_PALETTE_LENGTH    256


/* Maximum positive integer used in PNG is (2^31)-1 */
#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL)
#define PNG_UINT_32_MAX ((png_uint_32)(-1))
#define PNG_SIZE_MAX ((png_size_t)(-1))
/* PNG_MAX_UINT is deprecated; use PNG_UINT_31_MAX instead. */
#define PNG_MAX_UINT PNG_UINT_31_MAX

/* These describe the color_type field in png_info. */
/* color type masks */
#define PNG_COLOR_MASK_PALETTE    1
#define PNG_COLOR_MASK_COLOR      2
#define PNG_COLOR_MASK_ALPHA      4

/* color types.  Note that not all combinations are legal */
#define PNG_COLOR_TYPE_GRAY 0
#define PNG_COLOR_TYPE_PALETTE  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)
#define PNG_COLOR_TYPE_RGB        (PNG_COLOR_MASK_COLOR)
#define PNG_COLOR_TYPE_RGB_ALPHA  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)
#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA)
/* aliases */
#define PNG_COLOR_TYPE_RGBA  PNG_COLOR_TYPE_RGB_ALPHA
#define PNG_COLOR_TYPE_GA  PNG_COLOR_TYPE_GRAY_ALPHA

/* This is for compression type. PNG 1.0-1.2 only define the single type. */
#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */
#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE

/* This is for filter type. PNG 1.0-1.2 only define the single type. */
#define PNG_FILTER_TYPE_BASE      0 /* Single row per-byte filtering */
#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */
#define PNG_FILTER_TYPE_DEFAULT   PNG_FILTER_TYPE_BASE

/* These are for the interlacing type.  These values should NOT be changed. */
#define PNG_INTERLACE_NONE        0 /* Non-interlaced image */
#define PNG_INTERLACE_ADAM7       1 /* Adam7 interlacing */
#define PNG_INTERLACE_LAST        2 /* Not a valid value */

/* These are for the oFFs chunk.  These values should NOT be changed. */
#define PNG_OFFSET_PIXEL          0 /* Offset in pixels */
#define PNG_OFFSET_MICROMETER     1 /* Offset in micrometers (1/10^6 meter) */
#define PNG_OFFSET_LAST           2 /* Not a valid value */

/* These are for the pCAL chunk.  These values should NOT be changed. */
#define PNG_EQUATION_LINEAR       0 /* Linear transformation */
#define PNG_EQUATION_BASE_E       1 /* Exponential base e transform */
#define PNG_EQUATION_ARBITRARY    2 /* Arbitrary base exponential transform */
#define PNG_EQUATION_HYPERBOLIC   3 /* Hyperbolic sine transformation */
#define PNG_EQUATION_LAST         4 /* Not a valid value */

/* These are for the sCAL chunk.  These values should NOT be changed. */
#define PNG_SCALE_UNKNOWN         0 /* unknown unit (image scale) */
#define PNG_SCALE_METER           1 /* meters per pixel */
#define PNG_SCALE_RADIAN          2 /* radians per pixel */
#define PNG_SCALE_LAST            3 /* Not a valid value */

/* These are for the pHYs chunk.  These values should NOT be changed. */
#define PNG_RESOLUTION_UNKNOWN    0 /* pixels/unknown unit (aspect ratio) */
#define PNG_RESOLUTION_METER      1 /* pixels/meter */
#define PNG_RESOLUTION_LAST       2 /* Not a valid value */

/* These are for the sRGB chunk.  These values should NOT be changed. */
#define PNG_sRGB_INTENT_PERCEPTUAL 0
#define PNG_sRGB_INTENT_RELATIVE   1
#define PNG_sRGB_INTENT_SATURATION 2
#define PNG_sRGB_INTENT_ABSOLUTE   3
#define PNG_sRGB_INTENT_LAST       4 /* Not a valid value */

/* This is for text chunks */
#define PNG_KEYWORD_MAX_LENGTH     79

/* Maximum number of entries in PLTE/sPLT/tRNS arrays */
#define PNG_MAX_PALETTE_LENGTH    256


/*
*
*
*
*
*
これらは、補助チャンクがPNG ファイルからきちんと読み込まれたり、アプリケーションが出力ファイルに info_struct 内のデータに相当するデータを書きこんだ時、決定されます。PNG_INFO_<chunk> の値定義は「変更されません」。
  */
#define PNG_INFO_gAMA 0x0001
#define PNG_INFO_sBIT 0x0002
#define PNG_INFO_cHRM 0x0004
#define PNG_INFO_PLTE 0x0008
#define PNG_INFO_tRNS 0x0010
#define PNG_INFO_bKGD 0x0020
#define PNG_INFO_hIST 0x0040
#define PNG_INFO_pHYs 0x0080
#define PNG_INFO_oFFs 0x0100
#define PNG_INFO_tIME 0x0200
#define PNG_INFO_pCAL 0x0400
#define PNG_INFO_sRGB 0x0800   /* GR-P, 0.96a */
#define PNG_INFO_iCCP 0x1000   /* ESR, 1.0.6 */
#define PNG_INFO_sPLT 0x2000   /* ESR, 1.0.6 */
#define PNG_INFO_sCAL 0x4000   /* ESR, 1.0.6 */
#define PNG_INFO_IDAT 0x8000L  /* ESR, 1.0.6 */


/*
*
*
*
*
*
These determine if an ancillary chunk's data has been successfully read from the PNG header, or if the application has filled in the corresponding data in the info_struct to be written into the output file. The values of the PNG_INFO_<chunk> defines should NOT be changed.
  */
#define PNG_INFO_gAMA 0x0001
#define PNG_INFO_sBIT 0x0002
#define PNG_INFO_cHRM 0x0004
#define PNG_INFO_PLTE 0x0008
#define PNG_INFO_tRNS 0x0010
#define PNG_INFO_bKGD 0x0020
#define PNG_INFO_hIST 0x0040
#define PNG_INFO_pHYs 0x0080
#define PNG_INFO_oFFs 0x0100
#define PNG_INFO_tIME 0x0200
#define PNG_INFO_pCAL 0x0400
#define PNG_INFO_sRGB 0x0800   /* GR-P, 0.96a */
#define PNG_INFO_iCCP 0x1000   /* ESR, 1.0.6 */
#define PNG_INFO_sPLT 0x2000   /* ESR, 1.0.6 */
#define PNG_INFO_sCAL 0x4000   /* ESR, 1.0.6 */
#define PNG_INFO_IDAT 0x8000L  /* ESR, 1.0.6 */


/*
*
*
以下は行の値を変更するような変換ルーチンに使われます。また他の目的のルーチンに使うこと もできます。
  */
typedef struct png_row_info_struct
{
   png_uint_32 width; /* 行の横幅 */
   png_uint_32 rowbytes; /* 行のバイト数 */
   png_byte color_type; /* 行のカラータイプ */
   png_byte bit_depth; /* 行のビット深度 */
   png_byte channels; /* チャンネル数 (1, 2, 3, 4のどれか) */
   png_byte pixel_depth; /* 1ピクセルのビット数 (depth * channels) */
} png_row_info;

typedef png_row_info FAR * png_row_infop;
typedef png_row_info FAR * FAR * png_row_infopp;

/*
*
*
This is used for the transformation routines, as some of them change these values for the row. It also should enable using the routines for other purposes.
  */
typedef struct png_row_info_struct
{
   png_uint_32 width; /* width of row */
   png_uint_32 rowbytes; /* number of bytes in row */
   png_byte color_type; /* color type of row */
   png_byte bit_depth; /* bit depth of row */
   png_byte channels; /* number of channels (1, 2, 3, or 4) */
   png_byte pixel_depth; /* bits per pixel (depth * channels) */
} png_row_info;

typedef png_row_info FAR * png_row_infop;
typedef png_row_info FAR * FAR * png_row_infopp;

/*
*
*
*
*
*
以下は I/O 関数及びユーザがデフォルトの関数の I/O 関数を彼・彼女自身でオーバーライドするための関数の型です。データ読込/書込み関数がユーザ提供のpng_rw_ptr 型であるなら、エラー及び警告関数はpng_error_ptr 型でなければなりません。
  */
typedef struct png_struct_def png_struct;
typedef png_struct FAR * png_structp;

typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp));
typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t));
typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp));
typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32,
   int));
typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32,
   int));

#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop));
typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop));
typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep,
   png_uint_32, int));
#endif


/*
*
*
*
*
*
These are the function types for the I/O functions and for the functions that allow the user to override the default I/O functions with his or her own. The png_error_ptr type should match that of user-supplied warning and error functions, while the png_rw_ptr type should match that of the user read/write data functions.
  */
typedef struct png_struct_def png_struct;
typedef png_struct FAR * png_structp;

typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp));
typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t));
typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp));
typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32,
   int));
typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32,
   int));

#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop));
typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop));
typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep,
   png_uint_32, int));
#endif


#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_LEGACY_SUPPORTED)
typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp,
    png_row_infop, png_bytep));
#endif

#if defined(PNG_USER_CHUNKS_SUPPORTED)
typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp));
#endif
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp));
#endif

/* 高水準インターフェース用変換マスク */
#define PNG_TRANSFORM_IDENTITY       0x0000    /* 読み書き */
#define PNG_TRANSFORM_STRIP_16       0x0001    /* 読込のみ */
#define PNG_TRANSFORM_STRIP_ALPHA    0x0002    /* 読込のみ */
#define PNG_TRANSFORM_PACKING        0x0004    /* 読み書き */
#define PNG_TRANSFORM_PACKSWAP       0x0008    /* 読み書き */
#define PNG_TRANSFORM_EXPAND         0x0010    /* 読込のみ */
#define PNG_TRANSFORM_INVERT_MONO    0x0020    /* 読み書き */
#define PNG_TRANSFORM_SHIFT          0x0040    /* 読み書き */
#define PNG_TRANSFORM_BGR            0x0080    /* 読み書き */
#define PNG_TRANSFORM_SWAP_ALPHA     0x0100    /* 読み書き */
#define PNG_TRANSFORM_SWAP_ENDIAN    0x0200    /* 読み書き */
#define PNG_TRANSFORM_INVERT_ALPHA   0x0400    /* 読み書き */
#define PNG_TRANSFORM_STRIP_FILLER   0x0800  /* 「書込のみ」 */

/* MNG 特性サポート・フラグ */
#define PNG_FLAG_MNG_EMPTY_PLTE     0x01
#define PNG_FLAG_MNG_FILTER_64      0x04
#define PNG_ALL_MNG_FEATURES        0x05

typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t));
typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp));


#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_LEGACY_SUPPORTED)
typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp,
    png_row_infop, png_bytep));
#endif

#if defined(PNG_USER_CHUNKS_SUPPORTED)
typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp));
#endif
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp));
#endif

/* Transform masks for the high-level interface */
#define PNG_TRANSFORM_IDENTITY       0x0000    /* read and write */
#define PNG_TRANSFORM_STRIP_16       0x0001    /* read only */
#define PNG_TRANSFORM_STRIP_ALPHA    0x0002    /* read only */
#define PNG_TRANSFORM_PACKING        0x0004    /* read and write */
#define PNG_TRANSFORM_PACKSWAP       0x0008    /* read and write */
#define PNG_TRANSFORM_EXPAND         0x0010    /* read only */
#define PNG_TRANSFORM_INVERT_MONO    0x0020    /* read and write */
#define PNG_TRANSFORM_SHIFT          0x0040    /* read and write */
#define PNG_TRANSFORM_BGR            0x0080    /* read and write */
#define PNG_TRANSFORM_SWAP_ALPHA     0x0100    /* read and write */
#define PNG_TRANSFORM_SWAP_ENDIAN    0x0200    /* read and write */
#define PNG_TRANSFORM_INVERT_ALPHA   0x0400    /* read and write */
#define PNG_TRANSFORM_STRIP_FILLER   0x0800    /* WRITE only */

/* Flags for MNG supported features */
#define PNG_FLAG_MNG_EMPTY_PLTE     0x01
#define PNG_FLAG_MNG_FILTER_64      0x04
#define PNG_ALL_MNG_FEATURES        0x05

typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t));
typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp));

/*
*
*
*
*
*
PNG の読込と書込みを行う情報を保持する構造体です。これの内部にあるものを扱おうとするような人たちだけは、それらの特別な要求に基づきライブラリに変更を 加えてください。ただし、jmp_buf を除いてアプリケーションは直接アクセスすべきではありません。
  */
struct png_struct_def
{
#ifdef PNG_SETJMP_SUPPORTED
   jmp_buf jmpbuf;            /* png_error で使います */
#endif
   png_error_ptr error_fn;    /* 印刷エラー及び中断用関数 */
   png_error_ptr warning_fn;  /* 印刷警告用関数 */
   png_voidp error_ptr;       /* エラー関数用ユーザ提供の構造体 */
   png_rw_ptr write_data_fn;  /* データ出力・書込用関数 */
   png_rw_ptr read_data_fn;   /* データ入力・読込用関数 */
   png_voidp io_ptr;          /* I/O 関数用アプリケーション構造体へのポインタ */

#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
   png_user_transform_ptr read_user_transform_fn; /* ユーザ読込変換 */
#endif

#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
   png_user_transform_ptr write_user_transform_fn; /* ユーザ書込変換 */
#endif


/*
*
*
*
*
*
The structure that holds the information to read and write PNG files. The only people who need to care about what is inside of this are the people who will be modifying the library for their own special needs. It should NOT be accessed directly by an application, except to store the jmp_buf.
  */
struct png_struct_def
{
#ifdef PNG_SETJMP_SUPPORTED
   jmp_buf jmpbuf;            /* used in png_error */
#endif
   png_error_ptr error_fn;    /* function for printing errors and aborting */
   png_error_ptr warning_fn;  /* function for printing warnings */
   png_voidp error_ptr;       /* user supplied struct for error functions */
   png_rw_ptr write_data_fn;  /* function for writing output data */
   png_rw_ptr read_data_fn;   /* function for reading input data */
   png_voidp io_ptr;          /* ptr to application struct for I/O functions */

#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
   png_user_transform_ptr read_user_transform_fn; /* user read transform */
#endif

#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
   png_user_transform_ptr write_user_transform_fn; /* user write transform */
#endif


/* libpng-1.0.2 のときに加えられたもの */
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
   png_voidp user_transform_ptr; /* ユーザ提供のユーザ変換用構造体 */
   png_byte user_transform_depth;    /* ユーザ変換ピクセルのビット深度 */
   png_byte user_transform_channels; /* ユーザ変換ピクセルのチャンネル */
#endif
#endif

   png_uint_32 mode;        /* 自分がPNG ファイルのどこにいるか */
   png_uint_32 flags;         /* libpng の各種事柄のフラグ */
   png_uint_32 transformations; /* 変換実行用 */

   z_stream zstream;          /* (下記)展開構造体ポインタ */
   png_bytep zbuf;            /* zlib 用バッファ */
   png_size_t zbuf_size;      /* zbufサイズ */
   int zlib_level;            /* zlib 圧縮レベル保持 */
   int zlib_method;           /* zlib 圧縮命令保持 */
   int zlib_window_bits;      /* zlib 圧縮ウィンドウ・ビット保持 */
   int zlib_mem_level;        /* zlib 圧縮メモリレベル保持 */
   int zlib_strategy;         /* zlib 圧縮方式保持 */

   png_uint_32 width;         /* 画像ピクセル横幅 */
   png_uint_32 height;        /* 画像ピクセル高さ */
   png_uint_32 num_rows;      /* カレント・パス行数 */
   png_uint_32 usr_width;     /* 書き始め行の横幅 */
   png_uint_32 rowbytes;      /* 行のバイトサイズ */
   png_uint_32 irowbytes;     /* インタレース行カレント・バイトサイズ */
   png_uint_32 iwidth;        /* インタレース行カレント横幅 */
   png_uint_32 row_number;    /* インタレース・パスのカレント行 */
   png_bytep prev_row;      /* 前行(非フィルター)を書込むバッファ */
   png_bytep row_buf;       /* 現行(非フィルター)を書込むバッファ */
   png_bytep sub_row;       /* フィルタリング"sub"行を書込むバッファ */
   png_bytep up_row;        /* フィルタリング"up"行を書込むバッファ */
   png_bytep avg_row;       /* フィルタリング"avg"行を書込むバッファ */
   png_bytep paeth_row; /* フィルタリング"Paeth"行を書込むバッファ */
   png_row_info row_info;     /* 変換ルーチンで使用 */

   png_uint_32 idat_size;     /* 読込用カレント IDAT サイズ */
   png_uint_32 crc;           /* カレントチャンクの CRC 値 */
   png_colorp palette;        /* 入力ファイルのパレット */
   png_uint_16 num_palette;   /* パレットの色エントリ数 */
   png_uint_16 num_trans;     /* 透過値の番号 */
   png_byte chunk_name[5];    /* カレントチャンクのNULL終端の名前 */
   png_byte compression;      /* ファイル圧縮タイプ (常に 0) */
   png_byte filter;           /* ファイルフィルタタイプ (常に 0) */
   png_byte interlaced;       /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
   png_byte pass;             /* カレント・インタレース・パス (0 - 6) */
   png_byte do_filter;        /* 行フィルタ・フラグ (下記 PNG_FILTER_ を見て下さい ) */
   png_byte color_type;       /* ファイルのカラータイプ */
   png_byte bit_depth;        /* ファイルのビット深度 */
   png_byte usr_bit_depth;    /* ユーザ行のビット深度 */
   png_byte pixel_depth;      /* 1ピクセルのビット数 */
   png_byte channels;         /* ファイルのチャンネル数 */
   png_byte usr_channels;     /* 書き始めのチャンネル数 */
   png_byte sig_bytes;        /* ファイルの先頭にある読み書き用マジックバイト。 */

#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
#ifdef PNG_LEGACY_SUPPORTED
   png_byte filler;           /* 拡張ピクセル用補充バイト */
#else
   png_uint_16 filler;           /* 拡張ピクセル用補充バイト */
#endif
#endif


/* These were added in libpng-1.0.2 */
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
   png_voidp user_transform_ptr; /* user supplied struct for user transform */
   png_byte user_transform_depth;    /* bit depth of user transformed pixels */
   png_byte user_transform_channels; /* channels in user transformed pixels */
#endif
#endif

   png_uint_32 mode;          /* tells us where we are in the PNG file */
   png_uint_32 flags;         /* flags indicating various things to libpng */
   png_uint_32 transformations; /* which transformations to perform */

   z_stream zstream;          /* pointer to decompression structure (below) */
   png_bytep zbuf;            /* buffer for zlib */
   png_size_t zbuf_size;      /* size of zbuf */
   int zlib_level;            /* holds zlib compression level */
   int zlib_method;           /* holds zlib compression method */
   int zlib_window_bits;      /* holds zlib compression window bits */
   int zlib_mem_level;        /* holds zlib compression memory level */
   int zlib_strategy;         /* holds zlib compression strategy */

   png_uint_32 width;         /* width of image in pixels */
   png_uint_32 height;        /* height of image in pixels */
   png_uint_32 num_rows;      /* number of rows in current pass */
   png_uint_32 usr_width;     /* width of row at start of write */
   png_uint_32 rowbytes;      /* size of row in bytes */
   png_uint_32 irowbytes;     /* size of current interlaced row in bytes */
   png_uint_32 iwidth;        /* width of current interlaced row in pixels */
   png_uint_32 row_number;    /* current row in interlace pass */
   png_bytep prev_row;        /* buffer to save previous (unfiltered) row */
   png_bytep row_buf;         /* buffer to save current (unfiltered) row */
   png_bytep sub_row;         /* buffer to save "sub" row when filtering */
   png_bytep up_row;          /* buffer to save "up" row when filtering */
   png_bytep avg_row;         /* buffer to save "avg" row when filtering */
   png_bytep paeth_row;       /* buffer to save "Paeth" row when filtering */
   png_row_info row_info;     /* used for transformation routines */

   png_uint_32 idat_size;     /* current IDAT size for read */
   png_uint_32 crc;           /* current chunk CRC value */
   png_colorp palette;        /* palette from the input file */
   png_uint_16 num_palette;   /* number of color entries in palette */
   png_uint_16 num_trans;     /* number of transparency values */
   png_byte chunk_name[5];    /* null-terminated name of current chunk */
   png_byte compression;      /* file compression type (always 0) */
   png_byte filter;           /* file filter type (always 0) */
   png_byte interlaced;       /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
   png_byte pass;             /* current interlace pass (0 - 6) */
   png_byte do_filter;        /* row filter flags (see PNG_FILTER_ below ) */
   png_byte color_type;       /* color type of file */
   png_byte bit_depth;        /* bit depth of file */
   png_byte usr_bit_depth;    /* bit depth of users row */
   png_byte pixel_depth;      /* number of bits per pixel */
   png_byte channels;         /* number of channels in file */
   png_byte usr_channels;     /* channels at start of write */
   png_byte sig_bytes;        /* magic bytes read/written from start of file */

#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
#ifdef PNG_LEGACY_SUPPORTED
   png_byte filler;           /* filler byte for pixel expansion */
#else
   png_uint_16 filler;           /* filler bytes for pixel expansion */
#endif
#endif


#if defined(PNG_bKGD_SUPPORTED)
   png_byte background_gamma_type;
#  ifdef PNG_FLOATING_POINT_SUPPORTED
   float background_gamma;
#  endif
   png_color_16 background;   /* スクリーン・ガンマ空間の背景色 */
#if defined(PNG_READ_GAMMA_SUPPORTED)
   png_color_16 background_1; /* 背景の ガンマ 1.0 への標準化 */
#endif
#endif /* PNG_bKGD_SUPPORTED */

#if defined(PNG_WRITE_FLUSH_SUPPORTED)
   png_flush_ptr output_flush_fn;/* フラッシュ出力用関数 */
   png_uint_32 flush_dist;    /* 何行フラッシュしないか、0 なら無フラッシュ */
   png_uint_32 flush_rows;    /* 最後のフラッシュから書込みした行数 */
#endif


#if defined(PNG_bKGD_SUPPORTED)
   png_byte background_gamma_type;
#  ifdef PNG_FLOATING_POINT_SUPPORTED
   float background_gamma;
#  endif
   png_color_16 background;   /* background color in screen gamma space */
#if defined(PNG_READ_GAMMA_SUPPORTED)
   png_color_16 background_1; /* background normalized to gamma 1.0 */
#endif
#endif /* PNG_bKGD_SUPPORTED */

#if defined(PNG_WRITE_FLUSH_SUPPORTED)
   png_flush_ptr output_flush_fn;/* Function for flushing output */
   png_uint_32 flush_dist;    /* how many rows apart to flush, 0 - no flush */
   png_uint_32 flush_rows;    /* number of rows written since last flush */
#endif


#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
   int gamma_shift;      /* 16ビット・ガンマ "insignificant" ビット数 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
   float gamma;          /* ファイル・ガンマ値 */
   float screen_gamma;   /* スクリーン・ガンマ値 (display_exponent) */
#endif
#endif

#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
   png_bytep gamma_table;     /* 8ビット深度ファイル・ガンマテーブル */
   png_bytep gamma_from_1;    /* 1.0 からスクリーンに変換 */
   png_bytep gamma_to_1;      /* ファイルから 1.0 に変換 */
   png_uint_16pp gamma_16_table; /* 16ビット深度ファイル・ガンマテーブル */
   png_uint_16pp gamma_16_from_1; /* 1.0 からスクリーンに変換 */
   png_uint_16pp gamma_16_to_1; /* ファイルから 1.0 に変換 */
#endif

#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED)
   png_color_8 sig_bit;       /* 各利用可能なチャンネルの有意ビット */
#endif

#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
   png_color_8 shift;         /* 有意ビット変換用シフト */
#endif

#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \
 || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
   png_bytep trans;           /* パレット・ファイル用透過値 */
   png_color_16 trans_values; /* 非パレット・ファイル用透過値 */
#endif


#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
   int gamma_shift;      /* number of "insignificant" bits 16-bit gamma */
#ifdef PNG_FLOATING_POINT_SUPPORTED
   float gamma;          /* file gamma value */
   float screen_gamma;   /* screen gamma value (display_exponent) */
#endif
#endif

#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
   png_bytep gamma_table;     /* gamma table for 8-bit depth files */
   png_bytep gamma_from_1;    /* converts from 1.0 to screen */
   png_bytep gamma_to_1;      /* converts from file to 1.0 */
   png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */
   png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */
   png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */
#endif

#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED)
   png_color_8 sig_bit;       /* significant bits in each available channel */
#endif

#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
   png_color_8 shift;         /* shift for significant bit tranformation */
#endif

#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \
 || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
   png_bytep trans;           /* transparency values for paletted files */
   png_color_16 trans_values; /* transparency values for non-paletted files */
#endif


   png_read_status_ptr read_row_fn;   /* 各行がデコードされた後で呼ばれます */
   png_write_status_ptr write_row_fn; /* 各行がエンコードされた後で呼ばれます */
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
   png_progressive_info_ptr info_fn; /* ヘッダ・データを完全に読み込んだ後で呼ばれます */
   png_progressive_row_ptr row_fn;   /* 各行のデコードが進行した後に呼ばれます */
   png_progressive_end_ptr end_fn;   /* 画像が完全になったとき呼ばれます */
   png_bytep save_buffer_ptr;        /* save_buffer内のカレント位置 */
   png_bytep save_buffer;            /* 事前に読込むデータ用バッファ */
   png_bytep current_buffer_ptr;     /* current_buffer内のカレント位置 */
   png_bytep current_buffer;         /* さっき使ったデータ用バッファ */
   png_uint_32 push_length;          /* カレント入力チャンクサイズ */
   png_uint_32 skip_length;          /* 入力データのスキップバイト */
   png_size_t save_buffer_size;   /* save_buffer 内の現在のデータ量 */
   png_size_t save_buffer_max;       /* save_buffer のトータルサイズ */
   png_size_t buffer_size;           /* 利用可能な入力データのトータルサイズ */
   png_size_t current_buffer_size;   /* current_buffer 内の現在のデータ量 */
   int process_mode;              /* libraryで現在進行している処理 */
   int cur_palette;                  /* libraryで現在使っているパレット・インデックス */

#  if defined(PNG_TEXT_SUPPORTED)
     png_size_t current_text_size;   /* テキスト入力データのカレント・サイズ */
     png_size_t current_text_left;   /* 入力で読込が残ってるテキストはどれくらいか */
     png_charp current_text;         /* カレントテキストのチャンク・バッファ */
     png_charp current_text_ptr;     /* current_text内のカレント位置 */
#  endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */

#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */

#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
/* Borland の特殊 64K セグメント・ハンドラ用 */
   png_bytepp offset_table_ptr;
   png_bytep offset_table;
   png_uint_16 offset_table_number;
   png_uint_16 offset_table_count;
   png_uint_16 offset_table_count_free;
#endif

#if defined(PNG_READ_DITHER_SUPPORTED)
   png_bytep palette_lookup;         /* ディザ用参照テーブル */
   png_bytep dither_index;           /* パレット・ファイル用インデックス変換 */
#endif

#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED)
   png_uint_16p hist;                /* ヒストグラム */
#endif


   png_read_status_ptr read_row_fn;   /* called after each row is decoded */
   png_write_status_ptr write_row_fn; /* called after each row is encoded */
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
   png_progressive_info_ptr info_fn; /* called after header data fully read */
   png_progressive_row_ptr row_fn;   /* called after each prog. row is decoded */
   png_progressive_end_ptr end_fn;   /* called after image is complete */
   png_bytep save_buffer_ptr;        /* current location in save_buffer */
   png_bytep save_buffer;            /* buffer for previously read data */
   png_bytep current_buffer_ptr;     /* current location in current_buffer */
   png_bytep current_buffer;         /* buffer for recently used data */
   png_uint_32 push_length;          /* size of current input chunk */
   png_uint_32 skip_length;          /* bytes to skip in input data */
   png_size_t save_buffer_size;      /* amount of data now in save_buffer */
   png_size_t save_buffer_max;       /* total size of save_buffer */
   png_size_t buffer_size;           /* total amount of available input data */
   png_size_t current_buffer_size;   /* amount of data now in current_buffer */
   int process_mode;                 /* what push library is currently doing */
   int cur_palette;                  /* current push library palette index */

#  if defined(PNG_TEXT_SUPPORTED)
     png_size_t current_text_size;   /* current size of text input data */
     png_size_t current_text_left;   /* how much text left to read in input */
     png_charp current_text;         /* current text chunk buffer */
     png_charp current_text_ptr;     /* current location in current_text */
#  endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */

#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */

#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
/* for the Borland special 64K segment handler */
   png_bytepp offset_table_ptr;
   png_bytep offset_table;
   png_uint_16 offset_table_number;
   png_uint_16 offset_table_count;
   png_uint_16 offset_table_count_free;
#endif

#if defined(PNG_READ_DITHER_SUPPORTED)
   png_bytep palette_lookup;         /* lookup table for dithering */
   png_bytep dither_index;           /* index translation for palette files */
#endif

#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED)
   png_uint_16p hist;                /* histogram */
#endif


#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
   png_byte heuristic_method;        /* 行フィルタ選択用のヒューリスティック */
   png_byte num_prev_filters;        /* 前の行の weight 数 */
   png_bytep prev_filters;           /* 前のrow(複数可) のフィルタタイプ(複数可) */
   png_uint_16p filter_weights;      /* 前のline(複数可) に対する weight(複数可) */
   png_uint_16p inv_filter_weights; /* 前のline(複数可) に対する 1/weight(複数可) */
   png_uint_16p filter_costs;        /* 相対フィルタ演算コスト */
   png_uint_16p inv_filter_costs;    /* 1/相対フィルタ演算コスト */
#endif

#if defined(PNG_TIME_RFC1123_SUPPORTED)
   png_charp time_buffer;     /* RFC 1123 タイム・テキストの文字列 */
#endif

/* libpng 1.0.6 で加えられた新メンバ */

#ifdef PNG_FREE_ME_SUPPORTED
   png_uint_32 free_me;       /* メモリ解放の責任があるかないかのフラグ */
#endif

#if defined(PNG_USER_CHUNKS_SUPPORTED)
   png_voidp user_chunk_ptr;
   png_user_chunk_ptr read_user_chunk_fn; /* ユーザのチャンク読込ハンドラ */
#endif


#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
   png_byte heuristic_method;        /* heuristic for row filter selection */
   png_byte num_prev_filters;        /* number of weights for previous rows */
   png_bytep prev_filters;           /* filter type(s) of previous row(s) */
   png_uint_16p filter_weights;      /* weight(s) for previous line(s) */
   png_uint_16p inv_filter_weights;  /* 1/weight(s) for previous line(s) */
   png_uint_16p filter_costs;        /* relative filter calculation cost */
   png_uint_16p inv_filter_costs;    /* 1/relative filter calculation cost */
#endif

#if defined(PNG_TIME_RFC1123_SUPPORTED)
   png_charp time_buffer;            /* String to hold RFC 1123 time text */
#endif

/* New members added in libpng-1.0.6 */

#ifdef PNG_FREE_ME_SUPPORTED
   png_uint_32 free_me;       /* flags items libpng is responsible for freeing */
#endif

#if defined(PNG_USER_CHUNKS_SUPPORTED)
   png_voidp user_chunk_ptr;
   png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */
#endif


#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
   int num_chunk_list;
   png_bytep chunk_list;
#endif

/* libpng-1.0.3 で加えられた新メンバ */
#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
   png_byte rgb_to_gray_status;
   /* これらは libpng-1.0.6 のときpng_byte から変更されました */
   png_uint_16 rgb_to_gray_red_coeff;
   png_uint_16 rgb_to_gray_green_coeff;
   png_uint_16 rgb_to_gray_blue_coeff;
#endif


#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
   int num_chunk_list;
   png_bytep chunk_list;
#endif

/* New members added in libpng-1.0.3 */
#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
   png_byte rgb_to_gray_status;
   /* These were changed from png_byte in libpng-1.0.6 */
   png_uint_16 rgb_to_gray_red_coeff;
   png_uint_16 rgb_to_gray_green_coeff;
   png_uint_16 rgb_to_gray_blue_coeff;
#endif


/* libpng-1.0.4 で加えられた新メンバ (1.0.9で名前変更されました) */
#if defined(PNG_MNG_FEATURES_SUPPORTED) || \
    defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
    defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
/* バージョン 1.2.0 で png_byte から png_uint_32 に変更されました */
#ifdef PNG_1_0_X
   png_byte mng_features_permitted;
#else
   png_uint_32 mng_features_permitted;
#endif /* PNG_1_0_X */
#endif

/* libpng-1.0.7 で加えられた新メンバ */
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
   png_fixed_point int_gamma;
#endif

/* libpng 1.0.9 で加えられた新メンバ、1.0.12のとき ifdef を追加、1.2.0 で有効化 */
#if defined(PNG_MNG_FEATURES_SUPPORTED)
   png_byte filter_type;
#endif


/* New member added in libpng-1.0.4 (renamed in 1.0.9) */
#if defined(PNG_MNG_FEATURES_SUPPORTED) || \
    defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
    defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
/* changed from png_byte to png_uint_32 at version 1.2.0 */
#ifdef PNG_1_0_X
   png_byte mng_features_permitted;
#else
   png_uint_32 mng_features_permitted;
#endif /* PNG_1_0_X */
#endif

/* New member added in libpng-1.0.7 */
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
   png_fixed_point int_gamma;
#endif

/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */
#if defined(PNG_MNG_FEATURES_SUPPORTED)
   png_byte filter_type;
#endif

#if defined(PNG_1_0_X) || (defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD))
/* libpng-1.0.10 で加えられた新メンバ、1.2.0 のとき ifdef を追加 */
   png_uint_32 row_buf_size;
#endif

/* libpng 1.2.0 で加えられた新メンバ */
#if !defined(PNG_1_0_X) && defined(PNG_ASSEMBLER_CODE_SUPPORTED)
   png_byte     mmx_bitdepth_threshold;
   png_uint_32  mmx_rowbytes_threshold;
   png_uint_32  asm_flags;
#endif


#if defined(PNG_1_0_X) || (defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD))
/* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */
   png_uint_32 row_buf_size;
#endif

/* New members added in libpng-1.2.0 */
#if !defined(PNG_1_0_X) && defined(PNG_ASSEMBLER_CODE_SUPPORTED)
   png_byte     mmx_bitdepth_threshold;
   png_uint_32  mmx_rowbytes_threshold;
   png_uint_32  asm_flags;
#endif


/* libpng 1.0.2 で加えられた新メンバ、ですが 1.2.0 のとき初めてデフォルトでの有効化になりました */
#ifdef PNG_USER_MEM_SUPPORTED
   png_voidp mem_ptr;                /* メモリ関数用ユーザ提供の構造体 */
   png_malloc_ptr malloc_fn;         /* メモリ確保用関数 */
   png_free_ptr free_fn;             /* メモリ解放用関数 */
#endif

/* 1.0.13 と 1.2.0 で加えられた新メンバ */
   png_bytep big_row_buf;         /* カレント行 (非フィルタ) をセーブするバッファ */

#if defined(PNG_READ_DITHER_SUPPORTED)
/* 下記の3つのメンバはバージョン 1.0.14 と 1.2.4 で加えられた */
   png_bytep dither_sort;            /* 配列ソート処理 */
png_bytep index_to_palette;  /* パレットのオリジナル・インデックスのカレント位置 */
png_bytep palette_to_index;  /* パレットカラーのオリジナル・インデックスへのポインタ */
#endif

/* libpng 1.0.16 と 1.2.6 で加えられた新メンバ */
   png_byte compression_type;

#ifdef PNG_SET_USER_LIMITS_SUPPORTED
   png_uint_32 user_width_max;
   png_uint_32 user_height_max;
#endif

};


/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */
#ifdef PNG_USER_MEM_SUPPORTED
   png_voidp mem_ptr;                /* user supplied struct for mem functions */
   png_malloc_ptr malloc_fn;         /* function for allocating memory */
   png_free_ptr free_fn;             /* function for freeing memory */
#endif

/* New member added in libpng-1.0.13 and 1.2.0 */
   png_bytep big_row_buf;         /* buffer to save current (unfiltered) row */

#if defined(PNG_READ_DITHER_SUPPORTED)
/* The following three members were added at version 1.0.14 and 1.2.4 */
   png_bytep dither_sort;            /* working sort array */
png_bytep index_to_palette;  /* where the original index currently is in the palette */
png_bytep palette_to_index;  /* which original index points to this palette color */
#endif

/* New members added in libpng-1.0.16 and 1.2.6 */
   png_byte compression_type;

#ifdef PNG_SET_USER_LIMITS_SUPPORTED
   png_uint_32 user_width_max;
   png_uint_32 user_height_max;
#endif

};

/*
*
*
png.c と png.h のバージョン・ナンバーが一致しないとき、png.c のコンパイル・エラーの原因となります。
  */
typedef png_structp version_1_2_8;

typedef png_struct FAR * FAR * png_structpp;

/*
*
*
*
*
ここにある関数定義は最も一般的なものです。libpng の使い方を見るための場所ではありません。完全な拡張を行うには libpng.txt を、要約したものについては example.c を見て下さい。ここには各関数の仕様に関する記述は、簡単な1行しかありません。
  */

/* ライブラリのバージョンナンバーを返します */
extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void));

/*
*
*
最初の <num_bytes> マジックバイトの処理を行ったことをライブラリに認識させます。ファイルの先頭から8バイト以上処理するとエラーになります。
  */
extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr,
   int num_bytes));

/*
*
*
*
*
*
sig[start] 〜 sig[start + num_to_check - 1] をチェックして、PNG ファイルであるかどうか確認して下さい。得られたバイトがPNG シグネチャ 8バイトと一致すればゼロを返し、そうでなければ非ゼロを返します。num_to_check == 0 や start > 7 なら確実に失敗します。(つまり return 非ゼロ).
 */
extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start,
   png_size_t num_to_check));


/*
*
*
This triggers a compiler error in png.c, if png.c and png.h do not agree upon the version number.
  */
typedef png_structp version_1_2_8;

typedef png_struct FAR * FAR * png_structpp;

/*
*
*
*
*
Here are the function definitions most commonly used. This is not the place to find out how to use libpng. See libpng.txt for the full explanation, see example.c for the summary. This just provides a simple one line description of the use of each function.
  */

/* Returns the version number of the library */
extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void));

/*
*
*
Tell lib we have already handled the first <num_bytes> magic bytes. Handling more than 8 bytes from the beginning of the file is an error.
  */
extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr,
   int num_bytes));

/*
*
*
*
*
*
Check sig[start] through sig[start + num_to_check - 1] to see if it's a PNG file. Returns zero if the supplied bytes match the 8-byte PNG signature, and non-zero otherwise. Having num_to_check == 0 or start > 7 will always fail (ie return non-zero).
  */
extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start,
   png_size_t num_to_check));


/*
*
*
単純なシグネチャチェック関数です。png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n) としても同じです。
  */
extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num));

/* 読込用の png_ptr 構造体及び他のメモリを確保し、初期化します。 */
extern PNG_EXPORT(png_structp,png_create_read_struct)
   PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
   png_error_ptr error_fn, png_error_ptr warn_fn));

/* 書込み用の png_ptr 構造体及び他のメモリを確保し、初期化します。 */
extern PNG_EXPORT(png_structp,png_create_write_struct)
   PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
   png_error_ptr error_fn, png_error_ptr warn_fn));

#ifdef PNG_WRITE_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size)
   PNGARG((png_structp png_ptr));
#endif

#ifdef PNG_WRITE_SUPPORTED
extern PNG_EXPORT(void,png_set_compression_buffer_size)
   PNGARG((png_structp png_ptr, png_uint_32 size));
#endif

/* 圧縮ストリームをリセットします */
extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr));



/*
*
*
Simple signature checking function. This is the same as calling png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n).
  */
extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num));

/* Allocate and initialize png_ptr struct for reading, and any other memory. */
extern PNG_EXPORT(png_structp,png_create_read_struct)
   PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
   png_error_ptr error_fn, png_error_ptr warn_fn));

/* Allocate and initialize png_ptr struct for writing, and any other memory */
extern PNG_EXPORT(png_structp,png_create_write_struct)
   PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
   png_error_ptr error_fn, png_error_ptr warn_fn));

#ifdef PNG_WRITE_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size)
   PNGARG((png_structp png_ptr));
#endif

#ifdef PNG_WRITE_SUPPORTED
extern PNG_EXPORT(void,png_set_compression_buffer_size)
   PNGARG((png_structp png_ptr, png_uint_32 size));
#endif

/* Reset the compression stream */
extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr));


/* libpng-1.0.2 で加えられた新関数です。(1.2.0 までデフォルトでは無効でした) */
#ifdef PNG_USER_MEM_SUPPORTED
extern PNG_EXPORT(png_structp,png_create_read_struct_2)
   PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
   png_malloc_ptr malloc_fn, png_free_ptr free_fn));
extern PNG_EXPORT(png_structp,png_create_write_struct_2)
   PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
   png_malloc_ptr malloc_fn, png_free_ptr free_fn));
#endif

/* PNG チャンクを書きこみます … サイズ、タイプ、(オプション) データ、CRC。 */
extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr,
   png_bytep chunk_name, png_bytep data, png_size_t length));

/* PNG チャンクの最初の部分を書きこみます … 長さとチャンク名。 */
extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr,
   png_bytep chunk_name, png_uint_32 length));

/* png_write_chunk_start() でスタートしたPNG チャンクのデータを書きこみます */
extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr,
   png_bytep data, png_size_t length));

/* png_write_chunk_start() でスタートしたPNG チャンクを最後まで書きこみます (CRC含む)。 */
extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr));


/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */
#ifdef PNG_USER_MEM_SUPPORTED
extern PNG_EXPORT(png_structp,png_create_read_struct_2)
   PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
   png_malloc_ptr malloc_fn, png_free_ptr free_fn));
extern PNG_EXPORT(png_structp,png_create_write_struct_2)
   PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
   png_malloc_ptr malloc_fn, png_free_ptr free_fn));
#endif

/* Write a PNG chunk - size, type, (optional) data, CRC. */
extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr,
   png_bytep chunk_name, png_bytep data, png_size_t length));

/* Write the start of a PNG chunk - length and chunk name. */
extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr,
   png_bytep chunk_name, png_uint_32 length));

/* Write the data of a PNG chunk started with png_write_chunk_start(). */
extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr,
   png_bytep data, png_size_t length));

/* Finish a chunk started with png_write_chunk_start() (includes CRC). */
extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr));


/* 情報構造体のメモリ確保と初期化をします */
extern PNG_EXPORT(png_infop,png_create_info_struct)
   PNGARG((png_structp png_ptr));

/* 情報構造体の初期化をします (旧インターフェース - DEPRECATED) */
extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr));
#undef png_info_init
#define png_info_init(info_ptr) png_info_init_3(&info_ptr,\
    png_sizeof(png_info));
extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr,
    png_size_t png_info_struct_size));

/* 画像を書込む前に PNG 情報を書き込みます。 */
extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr,
   png_infop info_ptr));
extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr,
   png_infop info_ptr));

#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* 実際の画像を読込む前に 情報を読込みます。 */
extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif


/* Allocate and initialize the info structure */
extern PNG_EXPORT(png_infop,png_create_info_struct)
   PNGARG((png_structp png_ptr));

/* Initialize the info structure (old interface - DEPRECATED) */
extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr));
#undef png_info_init
#define png_info_init(info_ptr) png_info_init_3(&info_ptr,\
    png_sizeof(png_info));
extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr,
    png_size_t png_info_struct_size));

/* Writes all the PNG information before the image. */
extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr,
   png_infop info_ptr));
extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr,
   png_infop info_ptr));

#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* read the information before the actual image data. */
extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif

#if defined(PNG_TIME_RFC1123_SUPPORTED)
extern PNG_EXPORT(png_charp,png_convert_to_rfc1123)
   PNGARG((png_structp png_ptr, png_timep ptime));
#endif

#if !defined(_WIN32_WCE)
/* "time.h" 関数は WindowsCE ではサポートされません。 */
#if defined(PNG_WRITE_tIME_SUPPORTED)
/* tm 構造体から png_time へ変換します。 */
extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime,
   struct tm FAR * ttime));

/* time_t から png_time へ変換します。gmtime() を使用します。 */
extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime,
   time_t ttime));
#endif /* PNG_WRITE_tIME_SUPPORTED */
#endif /* _WIN32_WCE */


#if defined(PNG_TIME_RFC1123_SUPPORTED)
extern PNG_EXPORT(png_charp,png_convert_to_rfc1123)
   PNGARG((png_structp png_ptr, png_timep ptime));
#endif

#if !defined(_WIN32_WCE)
/* "time.h" functions are not supported on WindowsCE */
#if defined(PNG_WRITE_tIME_SUPPORTED)
/* convert from a struct tm to png_time */
extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime,
   struct tm FAR * ttime));

/* convert from time_t to png_time.  Uses gmtime() */
extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime,
   time_t ttime));
#endif /* PNG_WRITE_tIME_SUPPORTED */
#endif /* _WIN32_WCE */


#if defined(PNG_READ_EXPAND_SUPPORTED)
/* 24ビットRGB, or 8ビット グレースケール、利用可能であるときのアルファも含めた拡張 */
extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
/* ピクセルの青、緑、赤の順での使用 */
extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
/* 必要に応じてグレースケールを24ビットRGBに拡張 */
extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
/* RGB をグレースケールに減色 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr,
   int error_action, double red, double green ));
#endif
extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr,
   int error_action, png_fixed_point red, png_fixed_point green ));
extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp
   png_ptr));
#endif

extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth,
   png_colorp palette));

#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr));
#endif


#if defined(PNG_READ_EXPAND_SUPPORTED)
/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */
extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
/* Use blue, green, red order for pixels. */
extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
/* Expand the grayscale to 24-bit RGB if necessary. */
extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
/* Reduce RGB to grayscale. */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr,
   int error_action, double red, double green ));
#endif
extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr,
   int error_action, png_fixed_point red, png_fixed_point green ));
extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp
   png_ptr));
#endif

extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth,
   png_colorp palette));

#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr));
#endif


#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
/* 8ビット グレーや24ビット RGB 画像へのバイト補填 */
extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr,
   png_uint_32 filler, int flags));
/* PNG_FILLER_ の値定義は「変更されません」 */
#define PNG_FILLER_BEFORE 0
#define PNG_FILLER_AFTER 1
/* 8ビット グレーや24ビット RGB 画像へのアルファ加装 */
#if !defined(PNG_1_0_X)
extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr,
   png_uint_32 filler, int flags));
#endif
#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */

#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
/* 16ビット深度ファイルのバイトを入れ替え */
extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
/* 1, 2, 4 深度ファイルを1ピクセル1バイトにして使用 */
extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED)
/* バイト内のピクセルの順序を入れ替え */
extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
/* ファイルから適正なビット深度に変換 */
extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr,
   png_color_8p true_bits));
#endif

#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
    defined(PNG_WRITE_INTERLACING_SUPPORTED)
/* インタレースハンドルの使用。通った数が返ります。*/
extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
/* モノクロ・ファイルの反転 */
extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr));
#endif


#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */
extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr,
   png_uint_32 filler, int flags));
/* The values of the PNG_FILLER_ defines should NOT be changed */
#define PNG_FILLER_BEFORE 0
#define PNG_FILLER_AFTER 1
/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */
#if !defined(PNG_1_0_X)
extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr,
   png_uint_32 filler, int flags));
#endif
#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */

#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
/* Swap bytes in 16-bit depth files. */
extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */
extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED)
/* Swap packing order of pixels in bytes. */
extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
/* Converts files to legal bit depths. */
extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr,
   png_color_8p true_bits));
#endif

#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
    defined(PNG_WRITE_INTERLACING_SUPPORTED)
/* Have the code handle the interlacing.  Returns the number of passes. */
extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
/* Invert monochrome files */
extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr));
#endif


#if defined(PNG_READ_BACKGROUND_SUPPORTED)
/* alpha と tRNS を背景色で置き換える処理です。 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr,
   png_color_16p background_color, int background_gamma_code,
   int need_expand, double background_gamma));
#endif
#define PNG_BACKGROUND_GAMMA_UNKNOWN 0
#define PNG_BACKGROUND_GAMMA_SCREEN  1
#define PNG_BACKGROUND_GAMMA_FILE    2
#define PNG_BACKGROUND_GAMMA_UNIQUE  3
#endif

#if defined(PNG_READ_16_TO_8_SUPPORTED)
/* 16ビット深度ファイルから情報の第2バイトを取り除きます。 */
extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_DITHER_SUPPORTED)
/* ディザを適用して、パレットの使う色数ろ減らします */
extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr,
   png_colorp palette, int num_palette, int maximum_colors,
   png_uint_16p histogram, int full_dither));
#endif

#if defined(PNG_READ_GAMMA_SUPPORTED)
/* ガンマ補正処理です。Screen_gamma=(display_exponent) */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr,
   double screen_gamma, double default_file_gamma));
#endif
#endif


#if defined(PNG_READ_BACKGROUND_SUPPORTED)
/* Handle alpha and tRNS by replacing with a background color. */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr,
   png_color_16p background_color, int background_gamma_code,
   int need_expand, double background_gamma));
#endif
#define PNG_BACKGROUND_GAMMA_UNKNOWN 0
#define PNG_BACKGROUND_GAMMA_SCREEN  1
#define PNG_BACKGROUND_GAMMA_FILE    2
#define PNG_BACKGROUND_GAMMA_UNIQUE  3
#endif

#if defined(PNG_READ_16_TO_8_SUPPORTED)
/* strip the second byte of information from a 16-bit depth file. */
extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr));
#endif

#if defined(PNG_READ_DITHER_SUPPORTED)
/* Turn on dithering, and reduce the palette to the number of colors available. */
extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr,
   png_colorp palette, int num_palette, int maximum_colors,
   png_uint_16p histogram, int full_dither));
#endif

#if defined(PNG_READ_GAMMA_SUPPORTED)
/* Handle gamma correction. Screen_gamma=(display_exponent) */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr,
   double screen_gamma, double default_file_gamma));
#endif
#endif

#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
    defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
/* 空のPLTEの許可不許可 (0: 不許可、 1: 許可) */
/* 不評につき削除する予定です。代わりに png_permit_mng_features() を使ってください */
extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr,
   int empty_plte_permitted));
#endif

#if defined(PNG_WRITE_FLUSH_SUPPORTED)
/* 全行フラッシュ〜全くフラッシュしない0のうちどれくらいセットするか */
extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows));
/* カレントの PNG 出力バッファをフラッシュ */
extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr));
#endif

/* 変換要求されたパレットの追加アップデート */
extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr));

/* ユーザの情報構造体を更新するために追加で呼ぶ関数 */
extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr,
   png_infop info_ptr));


#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
    defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
/* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */
/* Deprecated and will be removed.  Use png_permit_mng_features() instead. */
extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr,
   int empty_plte_permitted));
#endif

#if defined(PNG_WRITE_FLUSH_SUPPORTED)
/* Set how many lines between output flushes - 0 for no flushing */
extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows));
/* Flush the current PNG output buffer */
extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr));
#endif

/* optional update palette with requested transformations */
extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr));

/* optional call to update the users info structure */
extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr,
   png_infop info_ptr));


#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* 画像データの1行以上の読込 */
extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr,
   png_bytepp row, png_bytepp display_row, png_uint_32 num_rows));
#endif

#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* データ1行 読込 */
extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr,
   png_bytep row,
   png_bytep display_row));
#endif

#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* 一度に画像をまるごとメモリに読込みます。 */
extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr,
   png_bytepp image));
#endif

/* 画像データの1行書込み */
extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr,
   png_bytep row));

/* 画像データの数行書込み */
extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr,
   png_bytepp row, png_uint_32 num_rows));

/* 画像データの書込み */
extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr,
   png_bytepp image));


#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* read one or more rows of image data. */
extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr,
   png_bytepp row, png_bytepp display_row, png_uint_32 num_rows));
#endif

#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* read a row of data. */
extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr,
   png_bytep row,
   png_bytep display_row));
#endif

#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* read the whole image into memory at once. */
extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr,
   png_bytepp image));
#endif

/* write a row of image data */
extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr,
   png_bytep row));

/* write a few rows of image data */
extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr,
   png_bytepp row, png_uint_32 num_rows));

/* write the image data */
extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr,
   png_bytepp image));


/* PNG ファイルの書込み終わり */
extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr,
   png_infop info_ptr));

#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* PNG ファイルの読込み終わり */
extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif

/*png_info_struct に関連付けられたメモリをみんな解放 */
extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr,
   png_infopp info_ptr_ptr));

/* png_struct と png_info_structs に関連付けられたメモリをみんな解放 */
extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp
   png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr));

/* 読込に使用したメモリをみんな解放 (旧メソッド - DLL EXPORTED しません) */
extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_infop end_info_ptr));

/* png_struct と png_info_structs に関連付けられたメモリをみんな解放 */
extern PNG_EXPORT(void,png_destroy_write_struct)
   PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr));

/* png_ptr 構造体で使用したメモリをみんな解放 (旧メソッド - DLL EXPORTED しません) */
extern void png_write_destroy PNGARG((png_structp png_ptr));

/* CRC チャンクエラーを処理する libpng をセットしてください */
extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr,
   int crit_action, int ancil_action));


/* writes the end of the PNG file. */
extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr,
   png_infop info_ptr));

#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* read the end of the PNG file. */
extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif

/* free any memory associated with the png_info_struct */
extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr,
   png_infopp info_ptr_ptr));

/* free any memory associated with the png_struct and the png_info_structs */
extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp
   png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr));

/* free all memory used by the read (old method - NOT DLL EXPORTED) */
extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_infop end_info_ptr));

/* free any memory associated with the png_struct and the png_info_structs */
extern PNG_EXPORT(void,png_destroy_write_struct)
   PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr));

/* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */
extern void png_write_destroy PNGARG((png_structp png_ptr));

/* set the libpng method of handling chunk CRC errors */
extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr,
   int crit_action, int ancil_action));


/*
*
*
*
*
*
*
*
補助及び重要なチャンクにおいて、CRC エラー処理の方法を伝えるためのpng_set_crc_action() の値と、そこに含まれるデータを使用するかどうかです。重要なチャ ンクにあるデータを「破棄する」のは不可能だということに留意して下さい。。0.90 より前のバージョンではずっと エラー/終了 という処理でしたが、これに対しバージョン 0.90 以降では補助チャンクの CRC エラーが 警告/破棄という処理になりました。これらの値は「変更されません」。
* 値    動作:重要        動作:補助        
  */
#define PNG_CRC_DEFAULT       0 
                     /* エラー/終了         警告/データ破棄 */
#define PNG_CRC_ERROR_QUIT    1
  /* エラー/終了          エラー/終了      */
#define PNG_CRC_WARN_DISCARD  2
  /* (無効)           警告/データ破棄 */
#define PNG_CRC_WARN_USE      3
  /* 警告/データ使用       警告/データ使用 */
#define PNG_CRC_QUIET_USE     4
/* 沈黙/データ使用      沈黙/データ使用 */
#define PNG_CRC_NO_CHANGE     5
/* カレント値使用           カレント値使用 */


/*
*
*
*
*
*
*
*
Values for png_set_crc_action() to say how to handle CRC errors in ancillary and critical chunks, and whether to use the data contained therein. Note that it is impossible to "discard" data in a critical chunk. For versions prior to 0.90, the action was always error/quit, whereas in version 0.90 and later, the action for CRC errors in ancillary chunks is warn/discard. These values should NOT be changed.
* value action:critical       action:ancillary    
  */
#define PNG_CRC_DEFAULT       0 
                     /* error/quit          warn/discard data */
#define PNG_CRC_ERROR_QUIT    1
  /* error/quit          error/quit        */
#define PNG_CRC_WARN_DISCARD  2
  /* (INVALID)           warn/discard data */
#define PNG_CRC_WARN_USE      3
  /* warn/use data       warn/use data     */
#define PNG_CRC_QUIET_USE     4
/* quiet/use data      quiet/use data    */
#define PNG_CRC_NO_CHANGE     5
/* use current value   use current value */

●用語の注釈 4

CRC: 【Cyclic Redundancy Check】
「巡回冗長検査」の略。データの(主に他の媒体へ)読み書きしたとき、正しく伝送(読み書き)できたかどうかを検査する方法の1つ。
連続して出現する誤り(バースト誤り)の検出が可能。 (パリティ・ビットやチェックサム方式では2つ以上の誤りがあったとき検出できないときがある)

/*
*
*
*
*
*
*
*
これらの関数は libpng 及び zlib で使う圧縮命令においてのスキャンライン・フィルタ制御をユーザに渡します。これらの関数は主にテスト用に使うもので、大多数のユー ザはデフォルトの処理に任すべきです。これらの関数を使うようなユーザは、自前で変更する事ができ、圧縮を犠牲にしてより少ないメモリでより早いパフォー マンス 得ようとする人たちです。圧縮関数の説明については圧縮ライブラリのヘッダファイル (zlib.h)を見て下さい。
  */
/*
*
libpng で使うフィルタ命令(複数可) をセットします。現在、"命令"用に使える有効値は 0 だけです。
  */
extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method,
   int filters));


/*
*
*
*
*
*
*
*
These functions give the user control over the scan-line filtering in libpng and the compression methods used by zlib. These functions are mainly useful for testing, as the defaults should work with most users. Those users who are tight on memory or want faster performance at the expense of compression can modify them. See the compression library header file (zlib.h) for an explination of the compression functions.
  */
/*
*
set the filtering method(s) used by libpng.  Currently, the only valid value for "method" is 0.
  */
extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method,
   int filters));


/*
*
*
*
*
フィルタ使用の際の png_set_filter() 用フラグ。#define された定数のかわりに値が提供された場合は、下記のフィルタタイプと矛盾しないようにフラグが選択されます。これらの値は「変更されません」。
  */
#define PNG_NO_FILTERS     0x00
#define PNG_FILTER_NONE    0x08
#define PNG_FILTER_SUB     0x10
#define PNG_FILTER_UP      0x20
#define PNG_FILTER_AVG     0x40
#define PNG_FILTER_PAETH   0x80
#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
                         PNG_FILTER_AVG | PNG_FILTER_PAETH)



/*
*
*
*
*
Flags for png_set_filter() to say which filters to use. The flags are chosen so that they don't conflict with real filter types below, in case they are supplied instead of the #defined constants. These values should NOT be changed.
  */
#define PNG_NO_FILTERS     0x00
#define PNG_FILTER_NONE    0x08
#define PNG_FILTER_SUB     0x10
#define PNG_FILTER_UP      0x20
#define PNG_FILTER_AVG     0x40
#define PNG_FILTER_PAETH   0x80
#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
                         PNG_FILTER_AVG | PNG_FILTER_PAETH)


/*
*
フィルタ値 (非フラグ) … 現在の pngwrite.c、pngwutil.c で使われているもの。 これらの定義は「変更されません」。
 */
#define PNG_FILTER_VALUE_NONE  0
#define PNG_FILTER_VALUE_SUB   1
#define PNG_FILTER_VALUE_UP    2
#define PNG_FILTER_VALUE_AVG   3
#define PNG_FILTER_VALUE_PAETH 4
#define PNG_FILTER_VALUE_LAST  5

#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */


/*
*
Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. These defines should NOT be changed.
 */
#define PNG_FILTER_VALUE_NONE  0
#define PNG_FILTER_VALUE_SUB   1
#define PNG_FILTER_VALUE_UP    2
#define PNG_FILTER_VALUE_AVG   3
#define PNG_FILTER_VALUE_PAETH 4
#define PNG_FILTER_VALUE_LAST  5

#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */


/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
"heuristic_method(ヒューリスティック命令)" は PNG_FILTER_HEURISTIC_ 定義のひとつによって、デフォルト (最小となる絶対差の総和) か、実験的命令 (重みつきの最小となる絶対差の総和)に決まります。

重みは 1.0 以上の値をとる要素であり、行間のフィルタタイプの均一性を維持するため、どのように重要にするか示しています。カレント・フィルタを 意味する大きな数値は、num_weights前のフィルタと同じものであると思われるようなことが何度もあります。 これは重みを持った各前の行が漸増しているということです。重みは filter_weights にある num_weights の値である必要があり、もしくは値が決まってないのであれば NULL にもなり得ります。重みは最初の行へのフィルタには影響しません。良い重みは画像の圧縮率を(理論的には)高めることができます。

コストは 1.0 以上の値をとる要素であり、フィルタタイプのコストを相対デコードすることを示します。高コストはより高いデコードを示し、それゆえ、 より低い計算コストのフィルタを使うことは少ないと思われます。コストは各有効な(PNG_FILTER_VALUE_LASTによって決まる)フィルタ タイプ用に filter_costs の中の値である必要がありますが、コストを使わない場合は NULL にできます。コストは圧縮された画像のサイズより過度に大きくならないように展開速度を上げようとします。

デフォルトを示すマイナス値の重みやコストが使われていることや、[0.0, 1.0) の範囲に値がある場合は変更されないまま残ってる物です。重みとコストのデフォルト値は両方とも 1.0 ですが、いい汎用重み付け/コスト・ヒューリスティクスがあれば変更してもかまいません。もし重みとコストの両方を 1.0 にセットするのは、「重み付け」命令を「重み付けしない」命令に退化させることになりますが、時間/計算 エンコードが加えられます。
 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr,
   int heuristic_method, int num_weights, png_doublep filter_weights,
   png_doublep filter_costs));
#endif
#endif /*  PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */


/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ defines, either the default (minimum-sum-of-absolute-differences), or the experimental method (weighted-minimum-sum-of-absolute-differences).

Weights are factors >= 1.0, indicating how important it is to keep the filter type consistent between rows. Larger numbers mean the current filter is that many times as likely to be the same as the "num_weights" previous filters. This is cumulative for each previous row with a weight. There needs to be "num_weights" values in "filter_weights", or it can be NULL if the weights aren't being specified. Weights have no influence on the selection of the first row filter. Well chosen weights can (in theory) improve the compression for a given image.

Costs are factors >= 1.0 indicating the relative decoding costs of a filter type. Higher costs indicate more decoding expense, and are therefore less likely to be selected over a filter with lower computational costs. There needs to be a value in "filter_costs" for each valid filter type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't setting the costs. Costs try to improve the speed of decompression without unduly increasing the compressed image size.

A negative weight or cost indicates the default value is to be used, and values in the range [0.0, 1.0) indicate the value is to remain unchanged. The default values for both weights and costs are currently 1.0, but may change if good general weighting/cost heuristics can be found. If both the weights and costs are set to 1.0, this degenerates the WEIGHTED method to the UNWEIGHTED method, but with added encoding time/computation.
 */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr,
   int heuristic_method, int num_weights, png_doublep filter_weights,
   png_doublep filter_costs));
#endif
#endif /*  PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */

● 用語の注釈5

ヒューリスティクス、又はヒューリスティック【heuristic】(発見的アルゴリズム、経験 則)
 なるべく正解に近い解を得るような解法のこと。近似解法。多くの場合、経験則に基づいて解を求める。
 ウィ キペディアのヒューリスティクスの説明

フィルタの重みの話
ASR技術研究室 さんのサイトの CG& 映像用語の基礎知識 のコーナーの
簡単な画像フィルター http://www.asr.co.jp/user/nobo/bk/bk07.html のページ
でうまい説明がありました。これを読むとかなりわかりやすいです。

/*
*
*/
ヒューリスティックは行のフィルタを選択するのに使います。これらの値は「変更されませ ん」。

#define PNG_FILTER_HEURISTIC_DEFAULT    0  /* 現在 "重み付け無し" */
#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1  /* libpng が 0.95 より前のとき使用 */
#define PNG_FILTER_HEURISTIC_WEIGHTED   2  /* 実験的特性 */
#define PNG_FILTER_HEURISTIC_LAST       3  /* 無効値 */


/*
*
*/
Heuristic used for row filter selection.  These defines should NOT be changed.

#define PNG_FILTER_HEURISTIC_DEFAULT    0  /* Currently "UNWEIGHTED" */
#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1  /* Used by libpng < 0.95 */
#define PNG_FILTER_HEURISTIC_WEIGHTED   2  /* Experimental feature */
#define PNG_FILTER_HEURISTIC_LAST       3  /* Not a valid value */


/*
*
*
*
*
*
*
*
ライブラリの圧縮レベルをセットします。現在のところ値の有効な範囲は 0 〜 9 で、zlib 圧縮レベル 0 〜 9 にそのまま相当します (0 なら無圧縮、9 なら 最大圧縮)。PNG 画像のテストでは zlib 圧縮レベル 3 〜 6 で普通に実行してもレベル 9 と同じくらいの圧縮率で、相当に少ない計算で済んだことを覚えておいてください。将来は、zlib 圧縮レベルにそのまま相当はしないかもしれません。
  */
extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr,
   int level));

extern PNG_EXPORT(void,png_set_compression_mem_level)
   PNGARG((png_structp png_ptr, int mem_level));

extern PNG_EXPORT(void,png_set_compression_strategy)
   PNGARG((png_structp png_ptr, int strategy));

extern PNG_EXPORT(void,png_set_compression_window_bits)
   PNGARG((png_structp png_ptr, int window_bits));

extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr,
   int method));


/*
*
*
*
*
*
*
*
Set the library compression level. Currently, valid values range from 0 - 9, corresponding directly to the zlib compression levels 0 - 9 (0 - no compression, 9 - "maximal" compression). Note that tests have shown that zlib compression levels 3-6 usually perform as well as level 9 for PNG images, and do considerably fewer caclulations. In the future, these values may not correspond directly to the zlib compression levels.
  */
extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr,
   int level));

extern PNG_EXPORT(void,png_set_compression_mem_level)
   PNGARG((png_structp png_ptr, int mem_level));

extern PNG_EXPORT(void,png_set_compression_strategy)
   PNGARG((png_structp png_ptr, int strategy));

extern PNG_EXPORT(void,png_set_compression_window_bits)
   PNGARG((png_structp png_ptr, int window_bits));

extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr,
   int method));


/*
*
*
*
*
*
*
*
次の関数は入力/出力、メモリ、エラー処理関数に呼ばれる関数です。pngrio.c、 pngwio.c、pngerror.cファイルや、fread(), fwrite(), fprintf() などの標準Cルーチンにあります。png_set_???_fn() 関数を呼ぶことで、異なる動作のI/Oハンドルを必要とするアプリケーションの実行時、これらの関数に他のI/Oルーチンを使わせることができる。詳細は libpng.txt を見て下さい。
  */
#if !defined(PNG_NO_STDIO)
/* デフォルト関数用のPNGファイル入出力の初期化 */
extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp));
#endif


/*
*
*
*
*
*
*
*
These next functions are called for input/output, memory, and error handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, and call standard C I/O routines such as fread(), fwrite(), and fprintf(). These functions can be made to use other I/O routines at run time for those applications that need to handle I/O in a different manner by calling png_set_???_fn(). See libpng.txt for more information.
  */
#if !defined(PNG_NO_STDIO)
/* Initialize the input/output for the PNG file to the default functions. */
extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp));
#endif


/*
*
*
*
*
*
*
(error 及び abort)関数、警告関数をユーザ提供の関数に置き換えます。表示されるメッセージがなかったら、さらに置き換える関数を書込み、使わなければなりま せん。このエラー処理命令を使ってるなら、置き換えた error_fn はまだ最後に setjmp した位置にlongjmp すべきです。error_fn や warning_fn が NULL ならデフォルト関数を使います。
  */
extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr,
   png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn));

/* エラー関数に関連付けられたユーザ・ポインタを返します。 */
extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr));


/*
*
*
*
*
*
*
Replace the (error and abort), and warning functions with user supplied functions. If no messages are to be printed you must still write and use replacement functions. The replacement error_fn should still do a longjmp to the last setjmp location if you are using this method of error handling. If error_fn or warning_fn is NULL, the default function will be used.
  */
extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr,
   png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn));

/* Return the user pointer associated with the error functions */
extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr));


/*
*
*
*
*
*
デフォルトのデータ出力関数をユーザ提供のそれ(複数可)に置き換えます。バッファに格納さ れている出力を使われないなら、 output_flush_fn には NULL. をセットすることができます。libpng のコンパイル時 PNG_WRITE_FLUSH_SUPPORTED を定義してなければ、output_flush_fn は無視されます(以下のようにNULLにできます)。
  */
extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr,
   png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));

/* デフォルトのデータ入力関数をユーザ提供のそれに置き換えます。 */
extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr,
   png_voidp io_ptr, png_rw_ptr read_data_fn));

/* I/O 関数に関連付けられたユーザ・ポインタを返します。 */
extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr));

extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr,
   png_read_status_ptr read_row_fn));

extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr,
   png_write_status_ptr write_row_fn));

#ifdef PNG_USER_MEM_SUPPORTED
/* メモリ関数に関連付けられたユーザ・ポインタを返します。 */
extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr,
   png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn));
/* メモリ関数に関連付けられたユーザ・ポインタを返します。 */
extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr));
#endif


/*
*
*
*
*
*
Replace the default data output functions with a user supplied one(s). If buffered output is not used, then output_flush_fn can be set to NULL. If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time output_flush_fn will be ignored (and thus can be NULL).
  */
extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr,
   png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));

/* Replace the default data input function with a user supplied one. */
extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr,
   png_voidp io_ptr, png_rw_ptr read_data_fn));

/* Return the user pointer associated with the I/O functions */
extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr));

extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr,
   png_read_status_ptr read_row_fn));

extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr,
   png_write_status_ptr write_row_fn));

#ifdef PNG_USER_MEM_SUPPORTED
/* Replace the default memory allocation functions with user supplied one(s). */
extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr,
   png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn));
/* Return the user pointer associated with the memory functions */
extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr));
#endif


#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_LEGACY_SUPPORTED)
extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp
   png_ptr, png_user_transform_ptr read_user_transform_fn));
#endif

#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_LEGACY_SUPPORTED)
extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp
   png_ptr, png_user_transform_ptr write_user_transform_fn));
#endif

#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_LEGACY_SUPPORTED)
extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp
   png_ptr, png_voidp user_transform_ptr, int user_transform_depth,
   int user_transform_channels));
/* 変換関数に関連付けられたユーザ・ポインタを返します。 */
extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr)
   PNGARG((png_structp png_ptr));
#endif

#ifdef PNG_USER_CHUNKS_SUPPORTED
extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr,
   png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn));
extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp
   png_ptr));
#endif


#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_LEGACY_SUPPORTED)
extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp
   png_ptr, png_user_transform_ptr read_user_transform_fn));
#endif

#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_LEGACY_SUPPORTED)
extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp
   png_ptr, png_user_transform_ptr write_user_transform_fn));
#endif

#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
    defined(PNG_LEGACY_SUPPORTED)
extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp
   png_ptr, png_voidp user_transform_ptr, int user_transform_depth,
   int user_transform_channels));
/* Return the user pointer associated with the user transform functions */
extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr)
   PNGARG((png_structp png_ptr));
#endif

#ifdef PNG_USER_CHUNKS_SUPPORTED
extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr,
   png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn));
extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp
   png_ptr));
#endif


#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
/*
*
*/
読込関数と、コールバック関数に使うユーザ定義の構造体のポインタ を、プッシュするためコールバックをセットします。

extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr,
   png_voidp progressive_ptr,
   png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
   png_progressive_end_ptr end_fn));

/* プッシュする読込関数に関連付けられたユーザ・ポインタを返します。 */
extern PNG_EXPORT(png_voidp,png_get_progressive_ptr)
   PNGARG((png_structp png_ptr));

/* データを利用可能にするときに呼ばれます。 */
extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_bytep buffer, png_size_t buffer_size));


#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
/*
*
*/
Sets the function callbacks for the push reader, and a pointer to a user-defined structure available to the callback functions.

extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr,
   png_voidp progressive_ptr,
   png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
   png_progressive_end_ptr end_fn));

/* returns the user pointer associated with the push read functions */
extern PNG_EXPORT(png_voidp,png_get_progressive_ptr)
   PNGARG((png_structp png_ptr));

/* function to be called when data becomes available */
extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_bytep buffer, png_size_t buffer_size));


/*
*
*/
行連結関数です。png_combine_row() とそんなに違いません。
同じに使える?????

extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr,
   png_bytep old_row, png_bytep new_row));
#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */

extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr,
   png_uint_32 size));

#if defined(PNG_1_0_X)
#  define png_malloc_warn png_malloc
#else
/* libpng バージョン 1.2.4 で加えられました。 */
extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr,
   png_uint_32 size));
#endif

/* png_malloc() で確保したメモリを解放します。 */
extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr));

#if defined(PNG_1_0_X)
/* zlib 用メモリ確保関数です。 */
extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items,
   uInt size));

/* zlib 用メモリ解放関数です。 */
extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr));
#endif


/*
*
*/
function that combines rows.  Not very much different than the png_combine_row() call.  Is this even used?????

extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr,
   png_bytep old_row, png_bytep new_row));
#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */

extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr,
   png_uint_32 size));

#if defined(PNG_1_0_X)
#  define png_malloc_warn png_malloc
#else
/* Added at libpng version 1.2.4 */
extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr,
   png_uint_32 size));
#endif

/* frees a pointer allocated by png_malloc() */
extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr));

#if defined(PNG_1_0_X)
/* Function to allocate memory for zlib. */
extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items,
   uInt size));

/* Function to free memory for zlib */
extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr));
#endif


/* 内部で確保されたメモリを解放します。 */
extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 free_me, int num));
#ifdef PNG_FREE_ME_SUPPORTED
/*
*
メモリ確保を行うのががアプリケーションだろうと libpng だろうと存在するデータメモリの解放を委託します。 */
extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int freer, png_uint_32 mask));
#endif
/* assignments for png_data_freer */
#define PNG_DESTROY_WILL_FREE_DATA 1
#define PNG_SET_WILL_FREE_DATA 1
#define PNG_USER_WILL_FREE_DATA 2
/* png_ptr->free_me と info_ptr->free_me 用フラグ */
#define PNG_FREE_HIST 0x0008
#define PNG_FREE_ICCP 0x0010
#define PNG_FREE_SPLT 0x0020
#define PNG_FREE_ROWS 0x0040
#define PNG_FREE_PCAL 0x0080
#define PNG_FREE_SCAL 0x0100
#define PNG_FREE_UNKN 0x0200
#define PNG_FREE_LIST 0x0400
#define PNG_FREE_PLTE 0x1000
#define PNG_FREE_TRNS 0x2000
#define PNG_FREE_TEXT 0x4000
#define PNG_FREE_ALL  0x7fff
#define PNG_FREE_MUL  0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */


/* Free data that was allocated internally */
extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 free_me, int num));
#ifdef PNG_FREE_ME_SUPPORTED
/*
*
Reassign responsibility for freeing existing data, whether allocated by libpng or by the application */
/* Reassign responsibility for freeing existing data, whether allocated
 * by libpng or by the application */
extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int freer, png_uint_32 mask));
#endif
/* assignments for png_data_freer */
#define PNG_DESTROY_WILL_FREE_DATA 1
#define PNG_SET_WILL_FREE_DATA 1
#define PNG_USER_WILL_FREE_DATA 2
/* Flags for png_ptr->free_me and info_ptr->free_me */
#define PNG_FREE_HIST 0x0008
#define PNG_FREE_ICCP 0x0010
#define PNG_FREE_SPLT 0x0020
#define PNG_FREE_ROWS 0x0040
#define PNG_FREE_PCAL 0x0080
#define PNG_FREE_SCAL 0x0100
#define PNG_FREE_UNKN 0x0200
#define PNG_FREE_LIST 0x0400
#define PNG_FREE_PLTE 0x1000
#define PNG_FREE_TRNS 0x2000
#define PNG_FREE_TEXT 0x4000
#define PNG_FREE_ALL  0x7fff
#define PNG_FREE_MUL  0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */

#ifdef PNG_USER_MEM_SUPPORTED
extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr,
   png_uint_32 size));
extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr,
   png_voidp ptr));
#endif

extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr,
   png_voidp s1, png_voidp s2, png_uint_32 size));

extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr,
   png_voidp s1, int value, png_uint_32 size));

#if defined(USE_FAR_KEYWORD)  /* メモリ・モデル変換関数 */
extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr,
   int check));
#endif /* USE_FAR_KEYWORD */

/* libpng の PNG 画像での致命的エラー(Fatal error) - 続行不能 */
extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr,
   png_const_charp error_message));

/* 同じですが、チャンク名の先頭にエラー文字列が付きます。 */
extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr,
   png_const_charp error_message));

/* libpng の 非致命的エラーです。続行可能ですが、不具合を抱えてるかもしれません。 */
extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr,
   png_const_charp warning_message));

/* libpng の 非致命的エラーです。チャンク名の先頭にメッセージが付きます。 */
extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr,
   png_const_charp warning_message));


#ifdef PNG_USER_MEM_SUPPORTED
extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr,
   png_uint_32 size));
extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr,
   png_voidp ptr));
#endif

extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr,
   png_voidp s1, png_voidp s2, png_uint_32 size));

extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr,
   png_voidp s1, int value, png_uint_32 size));

#if defined(USE_FAR_KEYWORD)  /* memory model conversion function */
extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr,
   int check));
#endif /* USE_FAR_KEYWORD */

/* Fatal error in PNG image of libpng - can't continue */
extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr,
   png_const_charp error_message));

/* The same, but the chunk name is prepended to the error string. */
extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr,
   png_const_charp error_message));

/* Non-fatal error in libpng.  Can continue, but may have a problem. */
extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr,
   png_const_charp warning_message));

/* Non-fatal error in libpng, chunk name is prepended to message. */
extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr,
   png_const_charp warning_message));


/*
*
*
*
*
*
*
*
*
*
*
*
*
png_set_<chunk> 関数は png_info_struct 内部での値を記憶させるものです。同様に、png_get_<chunk> 関数は渡された引数を記憶するか、png_info_struct にあるポインタを使うかして、png_info_struct から値を読込むのに使います。png_get_<chunk> 関数は info_ptr 内のデータが有効なら非ゼロを返し、そうでなければゼロを返します。 ちなみにデータが有効でない変数は何ひとつ変更されません。

以下の関数はpng_info_struct の内部配置やサイズを将来変更したときの不具合を避けるため、 png_info に直接アクセスする代わりに使われます。
  */
/* info_ptr 内のチャンクデータが有効なら"flag"を返します。 */
extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr,
png_infop info_ptr, png_uint_32 flag));

/* 変換行の保持する必要なバイト数を返します。 */
extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr,
png_infop info_ptr));

#if defined(PNG_INFO_IMAGE_SUPPORTED)
/* png_read_png() から返されたスキャンラインへのポインタの配列である row_pointers を返します。 */
extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr,
png_infop info_ptr));
/* png_write_png() で使うスキャンラインへのポインタの配列である row_pointers をセットします。 */
extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_bytepp row_pointers));
#endif


/*
*
*
*
*
*
*
*
*
*
*
*
*
The png_set_<chunk> functions are for storing values in the png_info_struct. Similarly, the png_get_<chunk> calls are used to read values from the png_info_struct, either storing the parameters in the passed variables, or setting pointers into the png_info_struct where the data is stored. The png_get_<chunk> functions return a non-zero value if the data was available in info_ptr, or return zero and do not change any of the parameters if the data was not available.

These functions should be used instead of directly accessing png_info to avoid problems with future changes in the size and internal layout of png_info_struct.
  */
/* Returns "flag" if chunk data is valid in info_ptr. */
extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr,
png_infop info_ptr, png_uint_32 flag));

/* Returns number of bytes needed to hold a transformed row. */
extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr,
png_infop info_ptr));

#if defined(PNG_INFO_IMAGE_SUPPORTED)
/* Returns row_pointers, which is an array of pointers to scanlines that was returned from png_read_png(). */
extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr,
png_infop info_ptr));
/* Set row_pointers, which is an array of pointers to scanlines for use by png_write_png(). */
extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_bytepp row_pointers));
#endif


/* 画像内のチャンネルカラー数を返します。 */
extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr,
png_infop info_ptr));

#ifdef PNG_EASY_ACCESS_SUPPORTED
/* ピクセル横幅を返します。 */
extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* ピクセル高さを返します。 */
extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* 画像 bit_depth (ビット深度)を返します。 */
extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* 画像 color_type(カラータイプ)を返します。 */
extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* 画像 filter_type(フィルタタイプ)を返します。 */
extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* 画像 interlace_type(インタレースタイプ)を返します。 */
extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* 画像 compression_type(圧縮タイプ)を返します。 */
extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* pHYs チャンクデータから画像解像度を ピクセル/メーターで 返します */
extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* pHYs チャンクデータから計算した、ピクセル・アスペクト比を返します。  */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp
png_ptr, png_infop info_ptr));
#endif

/* oFFs チャンクデータから、画像 x, y オフセットをピクセルかミクロンで返します。 */
extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp
png_ptr, png_infop info_ptr));

#endif /* PNG_EASY_ACCESS_SUPPORTED */

/* PNG ヘッダから読込んだシグネチャ文字列へのポインタを返します。 */
extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr,
png_infop info_ptr));


/* Returns number of color channels in image. */
extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr,
png_infop info_ptr));

#ifdef PNG_EASY_ACCESS_SUPPORTED
/* Returns image width in pixels. */
extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* Returns image height in pixels. */
extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* Returns image bit_depth. */
extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* Returns image color_type. */
extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* Returns image filter_type. */
extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* Returns image interlace_type. */
extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* Returns image compression_type. */
extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* Returns image resolution in pixels per meter, from pHYs chunk data. */
extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp
png_ptr, png_infop info_ptr));

/* Returns pixel aspect ratio, computed from pHYs chunk data.  */
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp
png_ptr, png_infop info_ptr));
#endif

/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */
extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp
png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp
png_ptr, png_infop info_ptr));

#endif /* PNG_EASY_ACCESS_SUPPORTED */

/* Returns pointer to signature string read from PNG header */
extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr,
png_infop info_ptr));


#if defined(PNG_bKGD_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_color_16p *background));
#endif

#if defined(PNG_bKGD_SUPPORTED)
extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_color_16p background));
#endif

#if defined(PNG_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr,
   png_infop info_ptr, double *white_x, double *white_y, double *red_x,
   double *red_y, double *green_x, double *green_y, double *blue_x,
   double *blue_y));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point
   *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y,
   png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point
   *int_blue_x, png_fixed_point *int_blue_y));
#endif
#endif

#if defined(PNG_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr,
   png_infop info_ptr, double white_x, double white_y, double red_x,
   double red_y, double green_x, double green_y, double blue_x, double blue_y));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y,
   png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
   int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
   png_fixed_point int_blue_y));
#endif
#endif

#if defined(PNG_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr,
   png_infop info_ptr, double *file_gamma));
#endif
extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_fixed_point *int_file_gamma));
#endif


#if defined(PNG_bKGD_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_color_16p *background));
#endif

#if defined(PNG_bKGD_SUPPORTED)
extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_color_16p background));
#endif

#if defined(PNG_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr,
   png_infop info_ptr, double *white_x, double *white_y, double *red_x,
   double *red_y, double *green_x, double *green_y, double *blue_x,
   double *blue_y));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point
   *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y,
   png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point
   *int_blue_x, png_fixed_point *int_blue_y));
#endif
#endif

#if defined(PNG_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr,
   png_infop info_ptr, double white_x, double white_y, double red_x,
   double red_y, double green_x, double green_y, double blue_x, double blue_y));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y,
   png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
   int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
   png_fixed_point int_blue_y));
#endif
#endif

#if defined(PNG_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr,
   png_infop info_ptr, double *file_gamma));
#endif
extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_fixed_point *int_file_gamma));
#endif


#if defined(PNG_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr,
   png_infop info_ptr, double file_gamma));
#endif
extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_fixed_point int_file_gamma));
#endif

#if defined(PNG_hIST_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_16p *hist));
#endif

#if defined(PNG_hIST_SUPPORTED)
extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_16p hist));
#endif

extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 *width, png_uint_32 *height,
   int *bit_depth, int *color_type, int *interlace_method,
   int *compression_method, int *filter_method));

extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth,
   int color_type, int interlace_method, int compression_method,
   int filter_method));

#if defined(PNG_oFFs_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y,
   int *unit_type));
#endif


#if defined(PNG_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr,
   png_infop info_ptr, double file_gamma));
#endif
extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_fixed_point int_file_gamma));
#endif

#if defined(PNG_hIST_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_16p *hist));
#endif

#if defined(PNG_hIST_SUPPORTED)
extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_16p hist));
#endif

extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 *width, png_uint_32 *height,
   int *bit_depth, int *color_type, int *interlace_method,
   int *compression_method, int *filter_method));

extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth,
   int color_type, int interlace_method, int compression_method,
   int filter_method));

#if defined(PNG_oFFs_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y,
   int *unit_type));
#endif


#if defined(PNG_oFFs_SUPPORTED)
extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y,
   int unit_type));
#endif

#if defined(PNG_pCAL_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1,
   int *type, int *nparams, png_charp *units, png_charpp *params));
#endif

#if defined(PNG_pCAL_SUPPORTED)
extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1,
   int type, int nparams, png_charp units, png_charpp params));
#endif

#if defined(PNG_pHYs_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
#endif

#if defined(PNG_pHYs_SUPPORTED)
extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type));
#endif

extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_colorp *palette, int *num_palette));


#if defined(PNG_oFFs_SUPPORTED)
extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y,
   int unit_type));
#endif

#if defined(PNG_pCAL_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1,
   int *type, int *nparams, png_charp *units, png_charpp *params));
#endif

#if defined(PNG_pCAL_SUPPORTED)
extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1,
   int type, int nparams, png_charp units, png_charpp params));
#endif

#if defined(PNG_pHYs_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
#endif

#if defined(PNG_pHYs_SUPPORTED)
extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type));
#endif

extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_colorp *palette, int *num_palette));


extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_colorp palette, int num_palette));

#if defined(PNG_sBIT_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_color_8p *sig_bit));
#endif

#if defined(PNG_sBIT_SUPPORTED)
extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_color_8p sig_bit));
#endif

#if defined(PNG_sRGB_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int *intent));
#endif

#if defined(PNG_sRGB_SUPPORTED)
extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int intent));
extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int intent));
#endif

#if defined(PNG_iCCP_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_charpp name, int *compression_type,
   png_charpp profile, png_uint_32 *proflen));
   /* 管理者より注釈: profile は png_bytepp としてください */
#endif

#if defined(PNG_iCCP_SUPPORTED)
extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_charp name, int compression_type,
   png_charp profile, png_uint_32 proflen));
   /* 管理者より注釈: profile は png_bytep としてください */
#endif

#if defined(PNG_sPLT_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_sPLT_tpp entries));
#endif

#if defined(PNG_sPLT_SUPPORTED)
extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_sPLT_tp entries, int nentries));
#endif

#if defined(PNG_TEXT_SUPPORTED)
/* png_get_text は *num_text にあるテキストチャンク数もまた返します。 */
extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_textp *text_ptr, int *num_text));
#endif


extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_colorp palette, int num_palette));

#if defined(PNG_sBIT_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_color_8p *sig_bit));
#endif

#if defined(PNG_sBIT_SUPPORTED)
extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_color_8p sig_bit));
#endif

#if defined(PNG_sRGB_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int *intent));
#endif

#if defined(PNG_sRGB_SUPPORTED)
extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int intent));
extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int intent));
#endif

#if defined(PNG_iCCP_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_charpp name, int *compression_type,
   png_charpp profile, png_uint_32 *proflen));
   /* Note to maintainer: profile should be png_bytepp */
#endif

#if defined(PNG_iCCP_SUPPORTED)
extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_charp name, int compression_type,
   png_charp profile, png_uint_32 proflen));
   /* Note to maintainer: profile should be png_bytep */
#endif

#if defined(PNG_sPLT_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_sPLT_tpp entries));
#endif

#if defined(PNG_sPLT_SUPPORTED)
extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_sPLT_tp entries, int nentries));
#endif

#if defined(PNG_TEXT_SUPPORTED)
/* png_get_text also returns the number of text chunks in *num_text */
extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_textp *text_ptr, int *num_text));
#endif


/*
*
*
*
*
*
png_set_text() がテキスト、言語、NULLポインタの変換済みキーワードなどの構造体を受け取っている間、png_get_text によって返された構造体は常に普通のゼロ終端のC文字列を含んでいます。それらは空であることはあっても、決してNULLにはなりません。
  */


/*
*
*
*
*
*
Note while png_set_text() will accept a structure whose text, language, and translated keywords are NULL pointers, the structure returned by png_get_text will always contain regular zero-terminated C strings. They might be empty strings but they will never be NULL pointers.
  */


#if defined(PNG_TEXT_SUPPORTED)
extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_textp text_ptr, int num_text));
#endif

#if defined(PNG_tIME_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_timep *mod_time));
#endif

#if defined(PNG_tIME_SUPPORTED)
extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_timep mod_time));
#endif

#if defined(PNG_tRNS_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_bytep *trans, int *num_trans,
   png_color_16p *trans_values));
#endif

#if defined(PNG_tRNS_SUPPORTED)
extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_bytep trans, int num_trans,
   png_color_16p trans_values));
#endif

#if defined(PNG_tRNS_SUPPORTED)
#endif

#if defined(PNG_sCAL_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int *unit, double *width, double *height));
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight));
#endif
#endif
#endif /* PNG_sCAL_SUPPORTED */

#if defined(PNG_sCAL_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int unit, double width, double height));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int unit, png_charp swidth, png_charp sheight));
#endif
#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */


#if defined(PNG_TEXT_SUPPORTED)
extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_textp text_ptr, int num_text));
#endif

#if defined(PNG_tIME_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_timep *mod_time));
#endif

#if defined(PNG_tIME_SUPPORTED)
extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_timep mod_time));
#endif

#if defined(PNG_tRNS_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_bytep *trans, int *num_trans,
   png_color_16p *trans_values));
#endif

#if defined(PNG_tRNS_SUPPORTED)
extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_bytep trans, int num_trans,
   png_color_16p trans_values));
#endif

#if defined(PNG_tRNS_SUPPORTED)
#endif

#if defined(PNG_sCAL_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int *unit, double *width, double *height));
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight));
#endif
#endif
#endif /* PNG_sCAL_SUPPORTED */

#if defined(PNG_sCAL_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int unit, double width, double height));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int unit, png_charp swidth, png_charp sheight));
#endif
#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */

#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
/* 組込みハンドルやデフォルトでの未知チャンクのハンドルが要求され なければ、それらがどのようにハンドルされたかということと、チャンクのリストを供給します。リストにないチャンクはデフォルトの処理ではハンドルされま す。あと IHDR と IEND チャンクはリストにいれてはいけません。

keep  = 0: デフォルトの動作になります


 = 1: 保持しません


 = 2: 安全なときだけ保持


 = 3: たとえ危険でも保持
  */
extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp
   png_ptr, int keep, png_bytep chunk_list, int num_chunks));
extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns));
extern PNG_EXPORT(void, png_set_unknown_chunk_location)
   PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location));
extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp
   png_ptr, png_infop info_ptr, png_unknown_chunkpp entries));
#endif
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep
   chunk_name));
#endif

/* png_free_data() は解放したモノの"valid"フラグをオフにします。自分のアプリケーションが解放したチャンクは自分でオフにして下さい、それには png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); が使えます。 */
extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int mask));


#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
/* provide a list of chunks and how they are to be handled, if the built-in handling or default unknown chunk handling is not desired. Any chunks not listed will be handled in the default manner. The IHDR and IEND chunks must not be listed.

keep  = 0: follow default behavour


 = 1: do not keep


 = 2: keep only if safe-to-copy


 = 3: keep even if unsafe-to-copy
  */
extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp
   png_ptr, int keep, png_bytep chunk_list, int num_chunks));
extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns));
extern PNG_EXPORT(void, png_set_unknown_chunk_location)
   PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location));
extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp
   png_ptr, png_infop info_ptr, png_unknown_chunkpp entries));
#endif
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep
   chunk_name));
#endif

/* Png_free_data() will turn off the "valid" flag for anything it frees.    If you need to turn it off for a chunk that your application has freed, you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */
extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr,
   png_infop info_ptr, int mask));


#if defined(PNG_INFO_IMAGE_SUPPORTED)
/* "params"ポインタは現在のところ使いません。将来の拡張用です。 */
extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr,
                        png_infop info_ptr,
                        int transforms,
                        png_voidp params));
extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr,
                        png_infop info_ptr,
                        int transforms,
                        png_voidp params));
#endif


#if defined(PNG_INFO_IMAGE_SUPPORTED)
/* The "params" pointer is currently not used and is for future expansion. */
extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr,
                        png_infop info_ptr,
                        int transforms,
                        png_voidp params));
extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr,
                        png_infop info_ptr,
                        int transforms,
                        png_voidp params));
#endif


/*
*
*
*
*
*
デバッグ情報はコンパイル時に PNG_DEBUG を定義て下さい。PNG_DEBUG の数値は高いほどデバッグ情報を多く表示します。これはバージョン 0.95 から加えられただけなので、libpng の全てのバージョンに実装されているわけではありませんが、必要に応じてサポートしていきます。
  */

#ifdef PNG_DEBUG
#if (PNG_DEBUG > 0)
#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER)
#include <crtdbg.h>
#if (PNG_DEBUG > 1)
#define png_debug(l,m)  _RPT0(_CRT_WARN,m)
#define png_debug1(l,m,p1)  _RPT1(_CRT_WARN,m,p1)
#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2)
#endif
#else /* PNG_DEBUG_FILE || !_MSC_VER */
#ifndef PNG_DEBUG_FILE
#define PNG_DEBUG_FILE stderr
#endif /* PNG_DEBUG_FILE */
#if (PNG_DEBUG > 1)
#define png_debug(l,m) \
{ \
     int num_tabs=l; \
     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
}
#define png_debug1(l,m,p1) \
{ \
     int num_tabs=l; \
     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
}
#define png_debug2(l,m,p1,p2) \
{ \
     int num_tabs=l; \
     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
}
#endif /* (PNG_DEBUG > 1) */
#endif /* _MSC_VER */
#endif /* (PNG_DEBUG > 0) */
#endif /* PNG_DEBUG */
#ifndef png_debug
#define png_debug(l, m)
#endif
#ifndef png_debug1
#define png_debug1(l, m, p1)
#endif
#ifndef png_debug2
#define png_debug2(l, m, p1, p2)
#endif

extern PNG_EXPORT(png_bytep,png_sig_bytes) PNGARG((void));

extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr));

#ifdef PNG_MNG_FEATURES_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp
   png_ptr, png_uint_32 mng_features_permitted));
#endif


/*
*
*
*
*
*
Define PNG_DEBUG at compile time for debugging information. Higher numbers for PNG_DEBUG mean more debugging information. This has only been added since version 0.95 so it is not implemented throughout libpng yet, but more support will be added as needed.
  */

#ifdef PNG_DEBUG
#if (PNG_DEBUG > 0)
#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER)
#include <crtdbg.h>
#if (PNG_DEBUG > 1)
#define png_debug(l,m)  _RPT0(_CRT_WARN,m)
#define png_debug1(l,m,p1)  _RPT1(_CRT_WARN,m,p1)
#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2)
#endif
#else /* PNG_DEBUG_FILE || !_MSC_VER */
#ifndef PNG_DEBUG_FILE
#define PNG_DEBUG_FILE stderr
#endif /* PNG_DEBUG_FILE */
#if (PNG_DEBUG > 1)
#define png_debug(l,m) \
{ \
     int num_tabs=l; \
     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
}
#define png_debug1(l,m,p1) \
{ \
     int num_tabs=l; \
     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
}
#define png_debug2(l,m,p1,p2) \
{ \
     int num_tabs=l; \
     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
}
#endif /* (PNG_DEBUG > 1) */
#endif /* _MSC_VER */
#endif /* (PNG_DEBUG > 0) */
#endif /* PNG_DEBUG */
#ifndef png_debug
#define png_debug(l, m)
#endif
#ifndef png_debug1
#define png_debug1(l, m, p1)
#endif
#ifndef png_debug2
#define png_debug2(l, m, p1, p2)
#endif

extern PNG_EXPORT(png_bytep,png_sig_bytes) PNGARG((void));

extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr));
extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr));

#ifdef PNG_MNG_FEATURES_SUPPORTED
extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp
   png_ptr, png_uint_32 mng_features_permitted));
#endif


/* png_set_keep_unknownで使用、バージョン 1.2.6 で追加 */
#define PNG_HANDLE_CHUNK_AS_DEFAULT   0
#define PNG_HANDLE_CHUNK_NEVER        1
#define PNG_HANDLE_CHUNK_IF_SAFE      2
#define PNG_HANDLE_CHUNK_ALWAYS       3

/* バージョン 1.2.0 で追加されたもの */
#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
#define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED  0x01  /* not user-settable */
#define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU    0x02  /* not user-settable */
#define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  0x04
#define PNG_ASM_FLAG_MMX_READ_INTERLACE    0x08
#define PNG_ASM_FLAG_MMX_READ_FILTER_SUB   0x10
#define PNG_ASM_FLAG_MMX_READ_FILTER_UP    0x20
#define PNG_ASM_FLAG_MMX_READ_FILTER_AVG   0x40
#define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80
#define PNG_ASM_FLAGS_INITIALIZED          0x80000000  /* not user-settable */

#define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  \
                           | PNG_ASM_FLAG_MMX_READ_INTERLACE    \
                           | PNG_ASM_FLAG_MMX_READ_FILTER_SUB   \
                           | PNG_ASM_FLAG_MMX_READ_FILTER_UP    \
                           | PNG_ASM_FLAG_MMX_READ_FILTER_AVG   \
                           | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH )
#define PNG_MMX_WRITE_FLAGS ( 0 )

#define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \
                      | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU   \
                      | PNG_MMX_READ_FLAGS                \
                      | PNG_MMX_WRITE_FLAGS )

#define PNG_SELECT_READ   1
#define PNG_SELECT_WRITE  2


/* For use in png_set_keep_unknown, added to version 1.2.6 */
#define PNG_HANDLE_CHUNK_AS_DEFAULT   0
#define PNG_HANDLE_CHUNK_NEVER        1
#define PNG_HANDLE_CHUNK_IF_SAFE      2
#define PNG_HANDLE_CHUNK_ALWAYS       3

/* Added to version 1.2.0 */
#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
#define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED  0x01  /* not user-settable */
#define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU    0x02  /* not user-settable */
#define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  0x04
#define PNG_ASM_FLAG_MMX_READ_INTERLACE    0x08
#define PNG_ASM_FLAG_MMX_READ_FILTER_SUB   0x10
#define PNG_ASM_FLAG_MMX_READ_FILTER_UP    0x20
#define PNG_ASM_FLAG_MMX_READ_FILTER_AVG   0x40
#define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80
#define PNG_ASM_FLAGS_INITIALIZED          0x80000000  /* not user-settable */

#define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW  \
                           | PNG_ASM_FLAG_MMX_READ_INTERLACE    \
                           | PNG_ASM_FLAG_MMX_READ_FILTER_SUB   \
                           | PNG_ASM_FLAG_MMX_READ_FILTER_UP    \
                           | PNG_ASM_FLAG_MMX_READ_FILTER_AVG   \
                           | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH )
#define PNG_MMX_WRITE_FLAGS ( 0 )

#define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \
                      | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU   \
                      | PNG_MMX_READ_FLAGS                \
                      | PNG_MMX_WRITE_FLAGS )

#define PNG_SELECT_READ   1
#define PNG_SELECT_WRITE  2


#if !defined(PNG_1_0_X)
/* pngget.c */
extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask)
   PNGARG((int flag_select, int *compilerID));

/* pngget.c */
extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask)
   PNGARG((int flag_select));

/* pngget.c */
extern PNG_EXPORT(png_uint_32,png_get_asm_flags)
   PNGARG((png_structp png_ptr));

/* pngget.c */
extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold)
   PNGARG((png_structp png_ptr));

/* pngget.c */
extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold)
   PNGARG((png_structp png_ptr));

/* pngset.c */
extern PNG_EXPORT(void,png_set_asm_flags)
   PNGARG((png_structp png_ptr, png_uint_32 asm_flags));

/* pngset.c */
extern PNG_EXPORT(void,png_set_mmx_thresholds)
   PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold,
   png_uint_32 mmx_rowbytes_threshold));

#endif /* PNG_1_0_X */
#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */

#if !defined(PNG_1_0_X)
/* png.c, pnggccrd.c, or pngvcrd.c */
extern PNG_EXPORT(int,png_mmx_support) PNGARG((void));

/*
*
エラー及び警告メッセージの先頭に付けられたエラー番号 ("#nnn ") をエラー及び警告ハンドラが無くなる前に取り除きます。 */
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp
   png_ptr, png_uint_32 strip_mode));
#endif

#endif /* PNG_1_0_X */

/* libpng 1.2.6 で追加されたもの */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp
   png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max));
extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp
   png_ptr));
extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp
   png_ptr));
#endif


#if !defined(PNG_1_0_X)
/* pngget.c */
extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask)
   PNGARG((int flag_select, int *compilerID));

/* pngget.c */
extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask)
   PNGARG((int flag_select));

/* pngget.c */
extern PNG_EXPORT(png_uint_32,png_get_asm_flags)
   PNGARG((png_structp png_ptr));

/* pngget.c */
extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold)
   PNGARG((png_structp png_ptr));

/* pngget.c */
extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold)
   PNGARG((png_structp png_ptr));

/* pngset.c */
extern PNG_EXPORT(void,png_set_asm_flags)
   PNGARG((png_structp png_ptr, png_uint_32 asm_flags));

/* pngset.c */
extern PNG_EXPORT(void,png_set_mmx_thresholds)
   PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold,
   png_uint_32 mmx_rowbytes_threshold));

#endif /* PNG_1_0_X */
#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */

#if !defined(PNG_1_0_X)
/* png.c, pnggccrd.c, or pngvcrd.c */
extern PNG_EXPORT(int,png_mmx_support) PNGARG((void));

/*
*
Strip the prepended error numbers ("#nnn ") from error and warning messages before passing them to the error or warning handler. */
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp
   png_ptr, png_uint_32 strip_mode));
#endif

#endif /* PNG_1_0_X */

/* Added at libpng-1.2.6 */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp
   png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max));
extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp
   png_ptr));
extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp
   png_ptr));
#endif


/* 管理者より: 公にする新プロトタイプはここに書いてください。あと、libpng.3 と、プロジェクト定義ファイルも書いてください。 */
#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED
/*
*
*
*
*
*
*
*
*
*
*
*
*
割り算はほとんどのマシンで遅くなるのでそれを避けるルーチンです。しかし、一部のRISC システムを使っている環境では、割り算命令に相当するもの以上の演算を使うとかえって遅くなることがあります。2シフト演算 (8、16ビットで) 及び加算、対 単純な整数除算です。

四捨五入された場合は「同じ値にはならない」ということに留意して下さい。128 と 32768 は「割り算の無い」コードで正確です; 127 と 32767 は標準命令で正確です。

[最適化コード by Greg Roelofs と Mark Adler …バグがあったら私たちの責任です (^ー^) ]
  */
 /* fg と bg は`ガンマ1.0' 空間で使用します; アルファは不透明です。 */

#  define png_composite(composite, fg, alpha, bg)             \
     { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \
                        +        (png_uint_16)(bg)*(png_uint_16)(255 -       \
                        (png_uint_16)(alpha)) + (png_uint_16)128);           \
       (composite) = (png_byte)((temp + (temp >> 8)) >> 8); }

#  define png_composite_16(composite, fg, alpha, bg)            \
     { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \
                        + (png_uint_32)(bg)*(png_uint_32)(65535L -        \
                        (png_uint_32)(alpha)) + (png_uint_32)32768L);      \
       (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }

#else  /* 整数除算を使う標準命令 */

#  define png_composite(composite, fg, alpha, bg)                 \
    (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \
       (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
       (png_uint_16)127) / 255)

#  define png_composite_16(composite, fg, alpha, bg)         \
     (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
       (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \
       (png_uint_32)32767) / (png_uint_32)65535L)

#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */


/* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */
#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED
/*
*
*
*
*
*
*
*
*
*
*
*
*
With these routines we avoid an integer divide, which will be slower on most machines. However, it does take more operations than the corresponding divide method, so it may be slower on a few RISC systems. There are two shifts (by 8 or 16 bits) and an addition, versus a single integer divide.

Note that the rounding factors are NOT supposed to be the same! 128 and 32768 are correct for the NODIV code; 127 and 32767 are correct for the standard method.

[Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ]
  */
 /* fg and bg should be in `gamma 1.0' space; alpha is the opacity          */

#  define png_composite(composite, fg, alpha, bg)             \
     { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \
                        +        (png_uint_16)(bg)*(png_uint_16)(255 -       \
                        (png_uint_16)(alpha)) + (png_uint_16)128);           \
       (composite) = (png_byte)((temp + (temp >> 8)) >> 8); }

#  define png_composite_16(composite, fg, alpha, bg)            \
     { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \
                        + (png_uint_32)(bg)*(png_uint_32)(65535L -        \
                        (png_uint_32)(alpha)) + (png_uint_32)32768L);      \
       (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }

#else  /* standard method using integer division */

#  define png_composite(composite, fg, alpha, bg)                 \
    (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \
       (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
       (png_uint_16)127) / 255)

#  define png_composite_16(composite, fg, alpha, bg)         \
     (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
       (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \
       (png_uint_32)32767) / (png_uint_32)65535L)

#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */

●用語の注 釈6
RISC【リスク】 Reduced Instruction Set Computer
【縮小命令セットコンピュータ】 マイクロプロセッサの設計様式の一つ。個々の命令を簡略化することによりパイプライン処理(並行して複数の命令を処理する方式)の効率を高め、処理性能の 向上をはかっている。ワークステーション用のCPUにはこの型のプロセッサが多い。


/*
*
*
*
*
*
次の関数群はコード内部で使います。自分でlibpngの関数を置き換えたり加えたりしない 限り、一般的には使いません。ほとんどの関数において、詳細はその関数のあるファイルに書いてあります。
  */
#if defined(PNG_INTERNAL)

/*
*
各種演算モード。初期化後、モードは構造体生成時に自動的にゼロにセットされることに注意し てください。
  */
#define PNG_HAVE_IHDR               0x01
#define PNG_HAVE_PLTE               0x02
#define PNG_HAVE_IDAT               0x04
#define PNG_AFTER_IDAT              0x08
#define PNG_HAVE_IEND               0x10
#define PNG_HAVE_gAMA               0x20
#define PNG_HAVE_cHRM               0x40
#define PNG_HAVE_sRGB               0x80
#define PNG_HAVE_CHUNK_HEADER      0x100
#define PNG_WROTE_tIME             0x200
#define PNG_WROTE_INFO_BEFORE_PLTE 0x400
#define PNG_BACKGROUND_IS_GRAY     0x800
#define PNG_HAVE_PNG_SIGNATURE    0x1000


/*
*
*
*
*
*
These next functions are used internally in the code. They generally shouldn't be used unless you are writing code to add or replace some functionality in libpng. More information about most functions can be found in the files where the functions are located.
  */
#if defined(PNG_INTERNAL)


/*
*
Various modes of operation.  Note that after an init, mode is set to zero automatically when the structure is created.
  */
#define PNG_HAVE_IHDR               0x01
#define PNG_HAVE_PLTE               0x02
#define PNG_HAVE_IDAT               0x04
#define PNG_AFTER_IDAT              0x08
#define PNG_HAVE_IEND               0x10
#define PNG_HAVE_gAMA               0x20
#define PNG_HAVE_cHRM               0x40
#define PNG_HAVE_sRGB               0x80
#define PNG_HAVE_CHUNK_HEADER      0x100
#define PNG_WROTE_tIME             0x200
#define PNG_WROTE_INFO_BEFORE_PLTE 0x400
#define PNG_BACKGROUND_IS_GRAY     0x800
#define PNG_HAVE_PNG_SIGNATURE    0x1000


/* PNG ライブラリが画像データ上で行う変換フラグ */
#define PNG_BGR                0x0001
#define PNG_INTERLACE          0x0002
#define PNG_PACK               0x0004
#define PNG_SHIFT              0x0008
#define PNG_SWAP_BYTES         0x0010
#define PNG_INVERT_MONO        0x0020
#define PNG_DITHER             0x0040
#define PNG_BACKGROUND         0x0080
#define PNG_BACKGROUND_EXPAND  0x0100
                          /*   0x0200 は使いません */
#define PNG_16_TO_8            0x0400
#define PNG_RGBA               0x0800
#define PNG_EXPAND             0x1000
#define PNG_GAMMA              0x2000
#define PNG_GRAY_TO_RGB        0x4000
#define PNG_FILLER             0x8000L
#define PNG_PACKSWAP          0x10000L
#define PNG_SWAP_ALPHA        0x20000L
#define PNG_STRIP_ALPHA       0x40000L
#define PNG_INVERT_ALPHA      0x80000L
#define PNG_USER_TRANSFORM   0x100000L
#define PNG_RGB_TO_GRAY_ERR  0x200000L
#define PNG_RGB_TO_GRAY_WARN 0x400000L
#define PNG_RGB_TO_GRAY      0x600000L  /* 2ビット、 RGB_TO_GRAY_ERR|WARN */
                       /*    0x800000L は使いません */
#define PNG_ADD_ALPHA       0x1000000L  /* libpng-1.2.7 にて追加 */

/*   0x2000000L  は使いません */
/*   0x4000000L  は使いません */
/*   0x8000000L  は使いません */
/*  0x10000000L  は使いません */
/*  0x20000000L  は使いません */
/*  0x40000000L  は使いません */


/* flags for the transformations the PNG library does on the image data */
#define PNG_BGR                0x0001
#define PNG_INTERLACE          0x0002
#define PNG_PACK               0x0004
#define PNG_SHIFT              0x0008
#define PNG_SWAP_BYTES         0x0010
#define PNG_INVERT_MONO        0x0020
#define PNG_DITHER             0x0040
#define PNG_BACKGROUND         0x0080
#define PNG_BACKGROUND_EXPAND  0x0100
                          /*   0x0200 unused */
#define PNG_16_TO_8            0x0400
#define PNG_RGBA               0x0800
#define PNG_EXPAND             0x1000
#define PNG_GAMMA              0x2000
#define PNG_GRAY_TO_RGB        0x4000
#define PNG_FILLER             0x8000L
#define PNG_PACKSWAP          0x10000L
#define PNG_SWAP_ALPHA        0x20000L
#define PNG_STRIP_ALPHA       0x40000L
#define PNG_INVERT_ALPHA      0x80000L
#define PNG_USER_TRANSFORM   0x100000L
#define PNG_RGB_TO_GRAY_ERR  0x200000L
#define PNG_RGB_TO_GRAY_WARN 0x400000L
#define PNG_RGB_TO_GRAY      0x600000L  /* two bits, RGB_TO_GRAY_ERR|WARN */
                       /*    0x800000L     Unused */
#define PNG_ADD_ALPHA       0x1000000L  /* Added to libpng-1.2.7 */

/*   0x2000000L  unused */
/*   0x4000000L  unused */
/*   0x8000000L  unused */
/*  0x10000000L  unused */
/*  0x20000000L  unused */
/*  0x40000000L  unused */


/* png_create_struct 用フラグ */
#define PNG_STRUCT_PNG   0x0001
#define PNG_STRUCT_INFO  0x0002

/* フィルタのヒューリスティック重み付け計算用スケーリング要素 */
#define PNG_WEIGHT_SHIFT 8
#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT))
#define PNG_COST_SHIFT 3
#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT))

/* 各バイトの宣言用というよりむしろpng_ptr->flags 用フラグ */
#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY     0x0001
#define PNG_FLAG_ZLIB_CUSTOM_LEVEL        0x0002
#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL    0x0004
#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS  0x0008
#define PNG_FLAG_ZLIB_CUSTOM_METHOD       0x0010
#define PNG_FLAG_ZLIB_FINISHED            0x0020
#define PNG_FLAG_ROW_INIT                 0x0040
#define PNG_FLAG_FILLER_AFTER             0x0080
#define PNG_FLAG_CRC_ANCILLARY_USE        0x0100
#define PNG_FLAG_CRC_ANCILLARY_NOWARN     0x0200
#define PNG_FLAG_CRC_CRITICAL_USE         0x0400
#define PNG_FLAG_CRC_CRITICAL_IGNORE      0x0800
#define PNG_FLAG_FREE_PLTE                0x1000
#define PNG_FLAG_FREE_TRNS                0x2000
#define PNG_FLAG_FREE_HIST                0x4000
#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS      0x8000L
#define PNG_FLAG_KEEP_UNSAFE_CHUNKS       0x10000L
#define PNG_FLAG_LIBRARY_MISMATCH         0x20000L
#define PNG_FLAG_STRIP_ERROR_NUMBERS      0x40000L
#define PNG_FLAG_STRIP_ERROR_TEXT         0x80000L
#define PNG_FLAG_MALLOC_NULL_MEM_OK       0x100000L
#define PNG_FLAG_ADD_ALPHA                0x200000L  /* libpng-1.2.8 にて追加 */
#define PNG_FLAG_STRIP_ALPHA              0x400000L  /* libpng-1.2.8 にて追加 */

/*      0x800000L  は使いません */
/*     0x1000000L  は使いません */
/*     0x2000000L  は使いません */
/*     0x4000000L  は使いません */
/*     0x8000000L  は使いません */
/*    0x10000000L  は使いません */
/*    0x20000000L  は使いません */
/*    0x40000000L  は使いません */


/* flags for png_create_struct */
#define PNG_STRUCT_PNG   0x0001
#define PNG_STRUCT_INFO  0x0002

/* Scaling factor for filter heuristic weighting calculations */
#define PNG_WEIGHT_SHIFT 8
#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT))
#define PNG_COST_SHIFT 3
#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT))

/* flags for the png_ptr->flags rather than declaring a byte for each one */
#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY     0x0001
#define PNG_FLAG_ZLIB_CUSTOM_LEVEL        0x0002
#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL    0x0004
#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS  0x0008
#define PNG_FLAG_ZLIB_CUSTOM_METHOD       0x0010
#define PNG_FLAG_ZLIB_FINISHED            0x0020
#define PNG_FLAG_ROW_INIT                 0x0040
#define PNG_FLAG_FILLER_AFTER             0x0080
#define PNG_FLAG_CRC_ANCILLARY_USE        0x0100
#define PNG_FLAG_CRC_ANCILLARY_NOWARN     0x0200
#define PNG_FLAG_CRC_CRITICAL_USE         0x0400
#define PNG_FLAG_CRC_CRITICAL_IGNORE      0x0800
#define PNG_FLAG_FREE_PLTE                0x1000
#define PNG_FLAG_FREE_TRNS                0x2000
#define PNG_FLAG_FREE_HIST                0x4000
#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS      0x8000L
#define PNG_FLAG_KEEP_UNSAFE_CHUNKS       0x10000L
#define PNG_FLAG_LIBRARY_MISMATCH         0x20000L
#define PNG_FLAG_STRIP_ERROR_NUMBERS      0x40000L
#define PNG_FLAG_STRIP_ERROR_TEXT         0x80000L
#define PNG_FLAG_MALLOC_NULL_MEM_OK       0x100000L
#define PNG_FLAG_ADD_ALPHA                0x200000L  /* Added to libpng-1.2.8 */
#define PNG_FLAG_STRIP_ALPHA              0x400000L  /* Added to libpng-1.2.8 */

/*      0x800000L  unused */
/*     0x1000000L  unused */
/*     0x2000000L  unused */
/*     0x4000000L  unused */
/*     0x8000000L  unused */
/*    0x10000000L  unused */
/*    0x20000000L  unused */
/*    0x40000000L  unused */


#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
                                     PNG_FLAG_CRC_ANCILLARY_NOWARN)

#define PNG_FLAG_CRC_CRITICAL_MASK  (PNG_FLAG_CRC_CRITICAL_USE | \
                                     PNG_FLAG_CRC_CRITICAL_IGNORE)

#define PNG_FLAG_CRC_MASK           (PNG_FLAG_CRC_ANCILLARY_MASK | \
                                     PNG_FLAG_CRC_CRITICAL_MASK)

/* 推敲は抑えて分かり易いコードにしてあります */

#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \
   abs((int)((c1).green) - (int)((c2).green)) + \
   abs((int)((c1).blue) - (int)((c2).blue)))

/* libpng-1.2.6 JB にて追加 */
#define PNG_ROWBYTES(pixel_bits, width) \
    ((pixel_bits) >= 8 ? \
    ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \
    (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) )

/*
*
*
*
ideal-delta 〜 ideal+delta の範囲の外にあるとき PNG_OUT_OF_RANGE は真を返します。 各引数は2度評価されます。"ideal" と "delta" は定数で、普通の単純な整数です。"value" は変数です。libpng-1.2.6 JB にて追加されました。 */
#define PNG_OUT_OF_RANGE(value, ideal, delta) \
        ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) )

/* png.c の変数宣言 … 必要に応じて PNG_NO_EXTERN の定義だけして下さい。 */
#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
/* PNG ファイルのシグネチャ文字列を保持する場所. */
#ifdef PNG_USE_GLOBAL_ARRAYS
   PNG_EXPORT_VAR (const png_byte FARDATA) png_sig[8];
#else
#define png_sig png_sig_bytes(NULL)
#endif
#endif /* PNG_NO_EXTERN */


#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
                                     PNG_FLAG_CRC_ANCILLARY_NOWARN)

#define PNG_FLAG_CRC_CRITICAL_MASK  (PNG_FLAG_CRC_CRITICAL_USE | \
                                     PNG_FLAG_CRC_CRITICAL_IGNORE)

#define PNG_FLAG_CRC_MASK           (PNG_FLAG_CRC_ANCILLARY_MASK | \
                                     PNG_FLAG_CRC_CRITICAL_MASK)

/* save typing and make code easier to understand */

#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \
   abs((int)((c1).green) - (int)((c2).green)) + \
   abs((int)((c1).blue) - (int)((c2).blue)))

/* Added to libpng-1.2.6 JB */
#define PNG_ROWBYTES(pixel_bits, width) \
    ((pixel_bits) >= 8 ? \
    ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \
    (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) )

/*
*
*
*
PNG_OUT_OF_RANGE returns true if value is outside the range ideal-delta..ideal+delta.  Each argument is evaluated twice. "ideal" and "delta" should be constants, normally simple integers, "value" a variable. Added to libpng-1.2.6 JB */
#define PNG_OUT_OF_RANGE(value, ideal, delta) \
        ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) )

/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
/* place to hold the signature string for a PNG file. */
#ifdef PNG_USE_GLOBAL_ARRAYS
   PNG_EXPORT_VAR (const png_byte FARDATA) png_sig[8];
#else
#define png_sig png_sig_bytes(NULL)
#endif
#endif /* PNG_NO_EXTERN */


/*
*
*
既存チャンクタイプの文字列定数。自分でチャンクを加える必要があればここに名前を定義して ください。必要に応じてpng.c にマクロを実装してください。
  */
#define PNG_IHDR const png_byte png_IHDR[5] = { 73,  72,  68,  82, '\0'}
#define PNG_IDAT const png_byte png_IDAT[5] = { 73,  68,  65,  84, '\0'}
#define PNG_IEND const png_byte png_IEND[5] = { 73,  69,  78,  68, '\0'}
#define PNG_PLTE const png_byte png_PLTE[5] = { 80,  76,  84,  69, '\0'}
#define PNG_bKGD const png_byte png_bKGD[5] = { 98,  75,  71,  68, '\0'}
#define PNG_cHRM const png_byte png_cHRM[5] = { 99,  72,  82,  77, '\0'}
#define PNG_gAMA const png_byte png_gAMA[5] = {103,  65,  77,  65, '\0'}
#define PNG_hIST const png_byte png_hIST[5] = {104,  73,  83,  84, '\0'}
#define PNG_iCCP const png_byte png_iCCP[5] = {105,  67,  67,  80, '\0'}
#define PNG_iTXt const png_byte png_iTXt[5] = {105,  84,  88, 116, '\0'}
#define PNG_oFFs const png_byte png_oFFs[5] = {111,  70,  70, 115, '\0'}
#define PNG_pCAL const png_byte png_pCAL[5] = {112,  67,  65,  76, '\0'}
#define PNG_sCAL const png_byte png_sCAL[5] = {115,  67,  65,  76, '\0'}
#define PNG_pHYs const png_byte png_pHYs[5] = {112,  72,  89, 115, '\0'}
#define PNG_sBIT const png_byte png_sBIT[5] = {115,  66,  73,  84, '\0'}
#define PNG_sPLT const png_byte png_sPLT[5] = {115,  80,  76,  84, '\0'}
#define PNG_sRGB const png_byte png_sRGB[5] = {115,  82,  71,  66, '\0'}
#define PNG_tEXt const png_byte png_tEXt[5] = {116,  69,  88, 116, '\0'}
#define PNG_tIME const png_byte png_tIME[5] = {116,  73,  77,  69, '\0'}
#define PNG_tRNS const png_byte png_tRNS[5] = {116,  82,  78,  83, '\0'}
#define PNG_zTXt const png_byte png_zTXt[5] = {122,  84,  88, 116, '\0'}

#ifdef PNG_USE_GLOBAL_ARRAYS
PNG_EXPORT_VAR (const png_byte FARDATA) png_IHDR[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_IDAT[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_IEND[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_PLTE[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_bKGD[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_cHRM[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_gAMA[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_hIST[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_iCCP[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_iTXt[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_oFFs[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_pCAL[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_sCAL[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_pHYs[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_sBIT[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_sPLT[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_sRGB[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_tEXt[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_tIME[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_tRNS[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_zTXt[5];
#endif /* PNG_USE_GLOBAL_ARRAYS */


/*
*
*
Constant strings for known chunk types. If you need to add a chunk, define the name here, and add an invocation of the macro in png.c and wherever it's needed.
  */
#define PNG_IHDR const png_byte png_IHDR[5] = { 73,  72,  68,  82, '\0'}
#define PNG_IDAT const png_byte png_IDAT[5] = { 73,  68,  65,  84, '\0'}
#define PNG_IEND const png_byte png_IEND[5] = { 73,  69,  78,  68, '\0'}
#define PNG_PLTE const png_byte png_PLTE[5] = { 80,  76,  84,  69, '\0'}
#define PNG_bKGD const png_byte png_bKGD[5] = { 98,  75,  71,  68, '\0'}
#define PNG_cHRM const png_byte png_cHRM[5] = { 99,  72,  82,  77, '\0'}
#define PNG_gAMA const png_byte png_gAMA[5] = {103,  65,  77,  65, '\0'}
#define PNG_hIST const png_byte png_hIST[5] = {104,  73,  83,  84, '\0'}
#define PNG_iCCP const png_byte png_iCCP[5] = {105,  67,  67,  80, '\0'}
#define PNG_iTXt const png_byte png_iTXt[5] = {105,  84,  88, 116, '\0'}
#define PNG_oFFs const png_byte png_oFFs[5] = {111,  70,  70, 115, '\0'}
#define PNG_pCAL const png_byte png_pCAL[5] = {112,  67,  65,  76, '\0'}
#define PNG_sCAL const png_byte png_sCAL[5] = {115,  67,  65,  76, '\0'}
#define PNG_pHYs const png_byte png_pHYs[5] = {112,  72,  89, 115, '\0'}
#define PNG_sBIT const png_byte png_sBIT[5] = {115,  66,  73,  84, '\0'}
#define PNG_sPLT const png_byte png_sPLT[5] = {115,  80,  76,  84, '\0'}
#define PNG_sRGB const png_byte png_sRGB[5] = {115,  82,  71,  66, '\0'}
#define PNG_tEXt const png_byte png_tEXt[5] = {116,  69,  88, 116, '\0'}
#define PNG_tIME const png_byte png_tIME[5] = {116,  73,  77,  69, '\0'}
#define PNG_tRNS const png_byte png_tRNS[5] = {116,  82,  78,  83, '\0'}
#define PNG_zTXt const png_byte png_zTXt[5] = {122,  84,  88, 116, '\0'}

#ifdef PNG_USE_GLOBAL_ARRAYS
PNG_EXPORT_VAR (const png_byte FARDATA) png_IHDR[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_IDAT[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_IEND[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_PLTE[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_bKGD[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_cHRM[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_gAMA[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_hIST[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_iCCP[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_iTXt[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_oFFs[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_pCAL[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_sCAL[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_pHYs[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_sBIT[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_sPLT[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_sRGB[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_tEXt[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_tIME[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_tRNS[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_zTXt[5];
#endif /* PNG_USE_GLOBAL_ARRAYS */


/*
*
*
*
*
*
*
*
*
入力バッファから直接バイトを読込むインラインマクロです。PNGバイト順序付け(MSBが先頭)と無整列データ記憶を使う、ユーザのアーキテクチャを要求します。ビッグ・エン ディアン・モードのPowerPC と 680x0 だけがこれをサポートすると思います。x86 のプロセッサ定義づけの行は処理してません。 png_get_int_32() ルーチンもまたマイナス値用に2つ補完フォーマットを使うようになっており、九分九厘 真を返します。
  */
#if defined(PNG_READ_BIG_ENDIAN_SUPPORTED)
#  if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED)
#    define png_get_int_32(buf) ( *((png_int_32p) (buf)))
#  endif
#  define png_get_uint_32(buf) ( *((png_uint_32p) (buf)))
#  define png_get_uint_16(buf) ( *((png_uint_16p) (buf)))
#else
#  if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED)
PNG_EXTERN png_int_32 png_get_int_32 PNGARG((png_bytep buf));
#  endif
PNG_EXTERN png_uint_32 png_get_uint_32 PNGARG((png_bytep buf));
PNG_EXTERN png_uint_16 png_get_uint_16 PNGARG((png_bytep buf));
#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */
PNG_EXTERN png_uint_32 png_get_uint_31 PNGARG((png_structp png_ptr,
  png_bytep buf));


/*
*
*
*
*
*
*
*
*
Inline macros to do direct reads of bytes from the input buffer. These require that you are using an architecture that uses PNG byte ordering (MSB first) and supports unaligned data storage. I think that PowerPC in big-endian mode and 680x0 are the only ones that will support this. The x86 line of processors definitely do not. The png_get_int_32() routine also assumes we are using two's complement format for negative values, which is almost certainly true.
  */
#if defined(PNG_READ_BIG_ENDIAN_SUPPORTED)
#  if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED)
#    define png_get_int_32(buf) ( *((png_int_32p) (buf)))
#  endif
#  define png_get_uint_32(buf) ( *((png_uint_32p) (buf)))
#  define png_get_uint_16(buf) ( *((png_uint_16p) (buf)))
#else
#  if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED)
PNG_EXTERN png_int_32 png_get_int_32 PNGARG((png_bytep buf));
#  endif
PNG_EXTERN png_uint_32 png_get_uint_32 PNGARG((png_bytep buf));
PNG_EXTERN png_uint_16 png_get_uint_16 PNGARG((png_bytep buf));
#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */
PNG_EXTERN png_uint_32 png_get_uint_31 PNGARG((png_structp png_ptr,
  png_bytep buf));


/*
*
*
png_ptr 構造体を読込用に初期化し、他のメモリも確保します。(旧インタフェースにつき「廃止予定」です。… png_create_read_struct を代わりに使ってください。)
  */
extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr));
#undef png_read_init
#define png_read_init(png_ptr) png_read_init_3(&png_ptr, \
    PNG_LIBPNG_VER_STRING,  png_sizeof(png_struct));
extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr,
    png_const_charp user_png_ver, png_size_t png_struct_size));
extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr,
    png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t
    png_info_size));


/*
*
*
Initialize png_ptr struct for reading, and allocate any other memory. (old interface - DEPRECATED - use png_create_read_struct instead).
  */
extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr));
#undef png_read_init
#define png_read_init(png_ptr) png_read_init_3(&png_ptr, \
    PNG_LIBPNG_VER_STRING,  png_sizeof(png_struct));
extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr,
    png_const_charp user_png_ver, png_size_t png_struct_size));
extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr,
    png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t
    png_info_size));


/*
*
*
png_ptr 構造体を書込み用に初期化し、他のメモリも確保します。 (旧インタフェースにつき「廃止予定」です。… png_create_write_struct を代わりに使ってください。)
  */
extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr));
#undef png_write_init
#define png_write_init(png_ptr) png_write_init_3(&png_ptr, \
    PNG_LIBPNG_VER_STRING, png_sizeof(png_struct));
extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr,
    png_const_charp user_png_ver, png_size_t png_struct_size));
extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr,
    png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t
    png_info_size));


/*
*
*
Initialize png_ptr struct for writing, and allocate any other memory. (old interface - DEPRECATED - use png_create_write_struct instead).
  */
extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr));
#undef png_write_init
#define png_write_init(png_ptr) png_write_init_3(&png_ptr, \
    PNG_LIBPNG_VER_STRING, png_sizeof(png_struct));
extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr,
    png_const_charp user_png_ver, png_size_t png_struct_size));
extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr,
    png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t
    png_info_size));


/* 内部 libpng 構造体用メモリ確保 */
PNG_EXTERN png_voidp png_create_struct PNGARG((int type));

/* 内部 libpng 構造体用メモリ解放 */
PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr));

PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr
  malloc_fn, png_voidp mem_ptr));
PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr,
   png_free_ptr free_fn, png_voidp mem_ptr));

/* info_ptr ポインタに確保されてるメモリの解放と構造体のリセット。 */
PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr,
   png_infop info_ptr));

#ifndef PNG_1_0_X
/* zlib 用メモリ確保関数 */
PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size));

/* zlib 用メモリ解放関数 */
PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr));

#ifdef PNG_SIZE_T
/* sizeof アイテムから png_sizeof アイテムへの変換関数 */
   PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
#endif

/* 次の4つの関数は内部でコールバックとして使われます。PNGAPI は要求されても PNG_EXPORT されません。PNGAPI は libpng バージョン 1.2.3. で加えられました。 */

PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr,
   png_bytep data, png_size_t length));

#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr,
   png_bytep buffer, png_size_t length));
#endif

PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr,
   png_bytep data, png_size_t length));

#if defined(PNG_WRITE_FLUSH_SUPPORTED)
#if !defined(PNG_NO_STDIO)
PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr));
#endif
#endif
#else /* PNG_1_0_X */
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr,
   png_bytep buffer, png_size_t length));
#endif
#endif /* PNG_1_0_X */


/* Allocate memory for an internal libpng struct */
PNG_EXTERN png_voidp png_create_struct PNGARG((int type));

/* Free memory from internal libpng struct */
PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr));

PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr
  malloc_fn, png_voidp mem_ptr));
PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr,
   png_free_ptr free_fn, png_voidp mem_ptr));

/* Free any memory that info_ptr points to and reset struct. */
PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr,
   png_infop info_ptr));

#ifndef PNG_1_0_X
/* Function to allocate memory for zlib. */
PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size));

/* Function to free memory for zlib */
PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr));

#ifdef PNG_SIZE_T
/* Function to convert a sizeof an item to png_sizeof item */
   PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
#endif

/* Next four functions are used internally as callbacks.  PNGAPI is required but not PNG_EXPORT.  PNGAPI added at libpng version 1.2.3. */

PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr,
   png_bytep data, png_size_t length));

#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr,
   png_bytep buffer, png_size_t length));
#endif

PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr,
   png_bytep data, png_size_t length));

#if defined(PNG_WRITE_FLUSH_SUPPORTED)
#if !defined(PNG_NO_STDIO)
PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr));
#endif
#endif
#else /* PNG_1_0_X */
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr,
   png_bytep buffer, png_size_t length));
#endif
#endif /* PNG_1_0_X */


/* CRC 変数のリセット */
PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr));

/* 使用中の出力をなんでも "data" バッファに書き込みます。 */
PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data,
   png_size_t length));

/* 使用中の入力からのデータをなんでも"data"バッファに読込みます。 */
PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data,
   png_size_t length));

/* buf にバイト読込み、png_ptr->crc を更新します。 */
PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,
   png_size_t length));

/* 圧縮してあるチャンク内のデータを展開します。 */
#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \
    defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr,
   int comp_type, png_charp chunkdata, png_size_t chunklength,
   png_size_t prefix_length, png_size_t *data_length));
#endif

/* "skip"バイト読込み、及び crc ファイルの読込み、さらに(追加的に) png_ptr->crc を照合します。 */
PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip));

/* ファイルから CRC を読込み、libpng の計算した CRC と比較します */
PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr));


/* Reset the CRC variable */
PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr));

/* Write the "data" buffer to whatever output you are using. */
PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data,
   png_size_t length));

/* Read data from whatever input you are using into the "data" buffer */
PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data,
   png_size_t length));

/* Read bytes into buf, and update png_ptr->crc */
PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,
   png_size_t length));

/* Decompress data in a chunk that uses compression */
#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \
    defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr,
   int comp_type, png_charp chunkdata, png_size_t chunklength,
   png_size_t prefix_length, png_size_t *data_length));
#endif

/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */
PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip));

/* Read the CRC from the file and compare it to the libpng calculated CRC */
PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr));


/*
*
*
*
*
データのセクションを越えて CRC を計算します。メモリの制限があるようなシステム上でも、ただ 64Kの最大値を越えているだけだということに注意してください。これは明確に最大バッファサイズがわかるためです。
  */
PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr,
   png_size_t length));

#if defined(PNG_WRITE_FLUSH_SUPPORTED)
PNG_EXTERN void png_flush PNGARG((png_structp png_ptr));
#endif


/*
*
*
*
*
Calculate the CRC over a section of data.  Note that we are only passing a maximum of 64K on systems that have this as a memory limit, since this is the maximum buffer size we can specify.
  */
PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr,
   png_size_t length));

#if defined(PNG_WRITE_FLUSH_SUPPORTED)
PNG_EXTERN void png_flush PNGARG((png_structp png_ptr));
#endif


/*
*
*
*
*
PNG バイト・オーダ−(ビッグ・エンディアン) のバッファに32ビット数値を代入します。現行の既存の PNG チャンクで、oFFs と pCAL といったマイナス値を使う.だけは補助拡張チャンクになります。
  */
PNG_EXTERN void png_save_uint_32 PNGARG((png_bytep buf, png_uint_32 i));

#if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
PNG_EXTERN void png_save_int_32 PNGARG((png_bytep buf, png_int_32 i));
#endif


/*
*
*
*
*
Place a 32-bit number into a buffer in PNG byte order (big-endian). The only currently known PNG chunks that use signed numbers are the ancillary extension chunks, oFFs and pCAL.
  */
PNG_EXTERN void png_save_uint_32 PNGARG((png_bytep buf, png_uint_32 i));

#if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
PNG_EXTERN void png_save_int_32 PNGARG((png_bytep buf, png_int_32 i));
#endif


/*
*
*
*
PNG バイト・オーダ−のバッファに16ビット数値を代入します。unsigned int で宣言された変数は、png_uint_16 ではなく、ANSI C のプリコンパイルにおける潜在的な問題をとにかく避けられます。
  */
PNG_EXTERN void png_save_uint_16 PNGARG((png_bytep buf, unsigned int i));

/* シグネチャを書きこむ単純な関数です。 */
PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr));


/*
*
*
Place a 16-bit number into a buffer in PNG byte order. The parameter is declared unsigned int, not png_uint_16, just to avoid potential problems on pre-ANSI C compilers.
  */
PNG_EXTERN void png_save_uint_16 PNGARG((png_bytep buf, unsigned int i));

/* simple function to write the signature */
PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr));


/* 各種チャンク書込み */

/*
*
*
IHDR チャンクを書込み、png_struct の必要な情報を更新します。
  */
PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width,
   png_uint_32 height,
   int bit_depth, int color_type, int compression_method, int filter_method,
   int interlace_method));

PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette,
   png_uint_32 num_pal));

PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data,
   png_size_t length));

PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr));

#if defined(PNG_WRITE_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point
    file_gamma));
#endif
#endif


/* write various chunks */

/*
*
*
Write the IHDR chunk, and update the png_struct with the necessary information.
  */
PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width,
   png_uint_32 height,
   int bit_depth, int color_type, int compression_method, int filter_method,
   int interlace_method));

PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette,
   png_uint_32 num_pal));

PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data,
   png_size_t length));

PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr));

#if defined(PNG_WRITE_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point
    file_gamma));
#endif
#endif


#if defined(PNG_WRITE_sBIT_SUPPORTED)
PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit,
   int color_type));
#endif

#if defined(PNG_WRITE_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr,
   double white_x, double white_y,
   double red_x, double red_y, double green_x, double green_y,
   double blue_x, double blue_y));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr,
   png_fixed_point int_white_x, png_fixed_point int_white_y,
   png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
   int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
   png_fixed_point int_blue_y));
#endif
#endif

#if defined(PNG_WRITE_sRGB_SUPPORTED)
PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr,
   int intent));
#endif

#if defined(PNG_WRITE_iCCP_SUPPORTED)
PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr,
   png_charp name, int compression_type,
   png_charp profile, int proflen));
   /* 管理者より注釈: profile は png_bytep にしてください。 */
#endif

#if defined(PNG_WRITE_sPLT_SUPPORTED)
PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr,
   png_sPLT_tp palette));
#endif


#if defined(PNG_WRITE_sBIT_SUPPORTED)
PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit,
   int color_type));
#endif

#if defined(PNG_WRITE_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr,
   double white_x, double white_y,
   double red_x, double red_y, double green_x, double green_y,
   double blue_x, double blue_y));
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr,
   png_fixed_point int_white_x, png_fixed_point int_white_y,
   png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
   int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
   png_fixed_point int_blue_y));
#endif
#endif

#if defined(PNG_WRITE_sRGB_SUPPORTED)
PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr,
   int intent));
#endif

#if defined(PNG_WRITE_iCCP_SUPPORTED)
PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr,
   png_charp name, int compression_type,
   png_charp profile, int proflen));
   /* Note to maintainer: profile should be png_bytep */
#endif

#if defined(PNG_WRITE_sPLT_SUPPORTED)
PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr,
   png_sPLT_tp palette));
#endif

#if defined(PNG_WRITE_tRNS_SUPPORTED)
PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans,
   png_color_16p values, int number, int color_type));
#endif

#if defined(PNG_WRITE_bKGD_SUPPORTED)
PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr,
   png_color_16p values, int color_type));
#endif

#if defined(PNG_WRITE_hIST_SUPPORTED)
PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist,
   int num_hist));
#endif

#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
    defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr,
   png_charp key, png_charpp new_key));
#endif

#if defined(PNG_WRITE_tEXt_SUPPORTED)
PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key,
   png_charp text, png_size_t text_len));
#endif

#if defined(PNG_WRITE_zTXt_SUPPORTED)
PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key,
   png_charp text, png_size_t text_len, int compression));
#endif

#if defined(PNG_WRITE_iTXt_SUPPORTED)
PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr,
   int compression, png_charp key, png_charp lang, png_charp lang_key,
   png_charp text));
#endif

#if defined(PNG_TEXT_SUPPORTED)  /* バージョン 1.0.14 と 1.2.4 にて追加 */
PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_textp text_ptr, int num_text));
#endif

#if defined(PNG_WRITE_oFFs_SUPPORTED)
PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr,
   png_int_32 x_offset, png_int_32 y_offset, int unit_type));
#endif

#if defined(PNG_WRITE_pCAL_SUPPORTED)
PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose,
   png_int_32 X0, png_int_32 X1, int type, int nparams,
   png_charp units, png_charpp params));
#endif


#if defined(PNG_WRITE_tRNS_SUPPORTED)
PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans,
   png_color_16p values, int number, int color_type));
#endif

#if defined(PNG_WRITE_bKGD_SUPPORTED)
PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr,
   png_color_16p values, int color_type));
#endif

#if defined(PNG_WRITE_hIST_SUPPORTED)
PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist,
   int num_hist));
#endif

#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
    defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr,
   png_charp key, png_charpp new_key));
#endif

#if defined(PNG_WRITE_tEXt_SUPPORTED)
PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key,
   png_charp text, png_size_t text_len));
#endif

#if defined(PNG_WRITE_zTXt_SUPPORTED)
PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key,
   png_charp text, png_size_t text_len, int compression));
#endif

#if defined(PNG_WRITE_iTXt_SUPPORTED)
PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr,
   int compression, png_charp key, png_charp lang, png_charp lang_key,
   png_charp text));
#endif

#if defined(PNG_TEXT_SUPPORTED)  /* Added at version 1.0.14 and 1.2.4 */
PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_textp text_ptr, int num_text));
#endif

#if defined(PNG_WRITE_oFFs_SUPPORTED)
PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr,
   png_int_32 x_offset, png_int_32 y_offset, int unit_type));
#endif

#if defined(PNG_WRITE_pCAL_SUPPORTED)
PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose,
   png_int_32 X0, png_int_32 X1, int type, int nparams,
   png_charp units, png_charpp params));
#endif

#if defined(PNG_WRITE_pHYs_SUPPORTED)
PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr,
   png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,
   int unit_type));
#endif

#if defined(PNG_WRITE_tIME_SUPPORTED)
PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr,
   png_timep mod_time));
#endif

#if defined(PNG_WRITE_sCAL_SUPPORTED)
#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr,
   int unit, double width, double height));
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr,
   int unit, png_charp width, png_charp height));
#endif
#endif
#endif


#if defined(PNG_WRITE_pHYs_SUPPORTED)
PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr,
   png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,
   int unit_type));
#endif

#if defined(PNG_WRITE_tIME_SUPPORTED)
PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr,
   png_timep mod_time));
#endif

#if defined(PNG_WRITE_sCAL_SUPPORTED)
#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr,
   int unit, double width, double height));
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr,
   int unit, png_charp width, png_charp height));
#endif
#endif
#endif

/* 画像の処理が1行終わったら呼ばれます。 */
PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));

/* 内部使用のみです。画像の最初の1行目を処理する前に呼ばれます。 */
PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));

#if defined(PNG_READ_GAMMA_SUPPORTED)
PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr));
#endif

/* 必要に応じて、アルファ値その他を扱うデータ行の重ね合わせ処理です。 */
PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
   int mask));


/* Called when finished processing a row of data */
PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));

/* Internal use only.   Called before first row of data */
PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));

#if defined(PNG_READ_GAMMA_SUPPORTED)
PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr));
#endif

/* combine a row of data, dealing with alpha, etc. if requested */
PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
   int mask));

#if defined(PNG_READ_INTERLACING_SUPPORTED)
/* インタレース行展開 */
/* 旧 1.0.9より前のインタフェース:
PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
   png_bytep row, int pass, png_uint_32 transformations));
 */
PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr));
#endif

/* GRR TO DO (2.0 またはいつでも):  他の内部呼び出しインタフェースを簡単にします。 */

#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
/* インタレース・パス用に行のピクセル出力を取得 */
PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
   png_bytep row, int pass));
#endif


#if defined(PNG_READ_INTERLACING_SUPPORTED)
/* expand an interlaced row */
/* OLD pre-1.0.9 interface:
PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
   png_bytep row, int pass, png_uint_32 transformations));
 */
PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr));
#endif

/* GRR TO DO (2.0 or whenever):  simplify other internal calling interfaces */

#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
/* grab pixels out of a row for an interlaced pass */
PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
   png_bytep row, int pass));
#endif


/* 非フィルタ行 */
PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr,
   png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter));

/* 最良フィルタの選択と行データのフィルタ適用 */
PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
   png_row_infop row_info));

/* フィルタ済み行の書き出し */
PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr,
   png_bytep filtered_row));
/* finish a row while reading, dealing with interlacing passes, etc. */
PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr));

/* 行バッファの初期化、他 */
PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr));
/* ユーザ情報構造体を更新の追加呼び出し */
PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
   png_infop info_ptr));

/* 変換を行う関数いろいろ */
#if defined(PNG_READ_FILLER_SUPPORTED)
PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
   png_bytep row, png_uint_32 filler, png_uint_32 flags));
#endif

#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info,
   png_bytep row));
#endif


/* unfilter a row */
PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr,
   png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter));

/* Choose the best filter to use and filter the row data */
PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
   png_row_infop row_info));

/* Write out the filtered row. */
PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr,
   png_bytep filtered_row));
/* finish a row while reading, dealing with interlacing passes, etc. */
PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr));

/* initialize the row buffers, etc. */
PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr));
/* optional call to update the users info structure */
PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
   png_infop info_ptr));

/* these are the functions that do the transformations */
#if defined(PNG_READ_FILLER_SUPPORTED)
PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
   png_bytep row, png_uint_32 filler, png_uint_32 flags));
#endif

#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info,
   png_bytep row, png_uint_32 flags));
#endif

#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED)
PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop
   row_info, png_bytep row));
#endif

#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_READ_PACK_SUPPORTED)
PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_SHIFT_SUPPORTED)
PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row,
   png_color_8p sig_bits));
#endif

#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_16_TO_8_SUPPORTED)
PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_DITHER_SUPPORTED)
PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info,
   png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup));

#  if defined(PNG_CORRECT_PALETTE_SUPPORTED)
PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr,
   png_colorp palette, int num_palette));
#  endif
#endif


#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info,
   png_bytep row, png_uint_32 flags));
#endif

#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED)
PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop
   row_info, png_bytep row));
#endif

#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_READ_PACK_SUPPORTED)
PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_SHIFT_SUPPORTED)
PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row,
   png_color_8p sig_bits));
#endif

#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_16_TO_8_SUPPORTED)
PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_READ_DITHER_SUPPORTED)
PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info,
   png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup));

#  if defined(PNG_CORRECT_PALETTE_SUPPORTED)
PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr,
   png_colorp palette, int num_palette));
#  endif
#endif

#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_WRITE_PACK_SUPPORTED)
PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info,
   png_bytep row, png_uint_32 bit_depth));
#endif

#if defined(PNG_WRITE_SHIFT_SUPPORTED)
PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row,
   png_color_8p bit_depth));
#endif

#if defined(PNG_READ_BACKGROUND_SUPPORTED)
#if defined(PNG_READ_GAMMA_SUPPORTED)
PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row,
   png_color_16p trans_values, png_color_16p background,
   png_color_16p background_1,
   png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1,
   png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1,
   png_uint_16pp gamma_16_to_1, int gamma_shift));
#else
PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row,
   png_color_16p trans_values, png_color_16p background));
#endif
#endif

#if defined(PNG_READ_GAMMA_SUPPORTED)
PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row,
   png_bytep gamma_table, png_uint_16pp gamma_16_table,
   int gamma_shift));
#endif

#if defined(PNG_READ_EXPAND_SUPPORTED)
PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info,
   png_bytep row, png_colorp palette, png_bytep trans, int num_trans));
PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info,
   png_bytep row, png_color_16p trans_value));
#endif


#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row));
#endif

#if defined(PNG_WRITE_PACK_SUPPORTED)
PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info,
   png_bytep row, png_uint_32 bit_depth));
#endif

#if defined(PNG_WRITE_SHIFT_SUPPORTED)
PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row,
   png_color_8p bit_depth));
#endif

#if defined(PNG_READ_BACKGROUND_SUPPORTED)
#if defined(PNG_READ_GAMMA_SUPPORTED)
PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row,
   png_color_16p trans_values, png_color_16p background,
   png_color_16p background_1,
   png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1,
   png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1,
   png_uint_16pp gamma_16_to_1, int gamma_shift));
#else
PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row,
   png_color_16p trans_values, png_color_16p background));
#endif
#endif

#if defined(PNG_READ_GAMMA_SUPPORTED)
PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row,
   png_bytep gamma_table, png_uint_16pp gamma_16_table,
   int gamma_shift));
#endif

#if defined(PNG_READ_EXPAND_SUPPORTED)
PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info,
   png_bytep row, png_colorp palette, png_bytep trans, int num_trans));
PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info,
   png_bytep row, png_color_16p trans_value));
#endif


/*
*
*
下記は特殊なチャンクのデコード、及びエラー修正です。特殊コールバックが有効ならそれを呼 びます。
  */
/* IHDR チャンクをデコード */
PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));

#if defined(PNG_READ_bKGD_SUPPORTED)
PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_cHRM_SUPPORTED)
PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_gAMA_SUPPORTED)
PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_hIST_SUPPORTED)
PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_iCCP_SUPPORTED)
extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif /* PNG_READ_iCCP_SUPPORTED */


/*
*
*
The following decodes the appropriate chunks, and does error correction, then calls the appropriate callback for the chunk if it is valid.
  */
/* decode the IHDR chunk */
PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));

#if defined(PNG_READ_bKGD_SUPPORTED)
PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_cHRM_SUPPORTED)
PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_gAMA_SUPPORTED)
PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_hIST_SUPPORTED)
PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_iCCP_SUPPORTED)
extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif /* PNG_READ_iCCP_SUPPORTED */


#if defined(PNG_READ_iTXt_SUPPORTED)
PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_oFFs_SUPPORTED)
PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_pCAL_SUPPORTED)
PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_pHYs_SUPPORTED)
PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_sBIT_SUPPORTED)
PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_sCAL_SUPPORTED)
PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_sPLT_SUPPORTED)
extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif /* PNG_READ_sPLT_SUPPORTED */

#if defined(PNG_READ_sRGB_SUPPORTED)
PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_tEXt_SUPPORTED)
PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif


#if defined(PNG_READ_iTXt_SUPPORTED)
PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_oFFs_SUPPORTED)
PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_pCAL_SUPPORTED)
PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_pHYs_SUPPORTED)
PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_sBIT_SUPPORTED)
PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_sCAL_SUPPORTED)
PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_sPLT_SUPPORTED)
extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif /* PNG_READ_sPLT_SUPPORTED */

#if defined(PNG_READ_sRGB_SUPPORTED)
PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_tEXt_SUPPORTED)
PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_tIME_SUPPORTED)
PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_tRNS_SUPPORTED)
PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_zTXt_SUPPORTED)
PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));

PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
   png_bytep chunk_name));

/* 読込及び書込み用変換ハンドル */
PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr));
PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr));

PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr));


#if defined(PNG_READ_tIME_SUPPORTED)
PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_tRNS_SUPPORTED)
PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

#if defined(PNG_READ_zTXt_SUPPORTED)
PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
   png_uint_32 length));
#endif

PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));

PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
   png_bytep chunk_name));

/* handle the transformations for reading and writing */
PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr));
PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr));

PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr));


#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr));
PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr,
   png_uint_32 length));
PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr));
PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr));
PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr,
   png_bytep buffer, png_size_t buffer_length));
PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr));
PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr,
   png_bytep buffer, png_size_t buffer_length));
PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr));
PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));
PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row));
PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr));
#if defined(PNG_READ_tEXt_SUPPORTED)
PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));
PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif
#if defined(PNG_READ_zTXt_SUPPORTED)
PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));
PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif
#if defined(PNG_READ_iTXt_SUPPORTED)
PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));
PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif


#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr));
PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr,
   png_uint_32 length));
PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr));
PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr));
PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr,
   png_bytep buffer, png_size_t buffer_length));
PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr));
PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr,
   png_bytep buffer, png_size_t buffer_length));
PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr));
PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));
PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row));
PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr,
   png_infop info_ptr));
PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr));
#if defined(PNG_READ_tEXt_SUPPORTED)
PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));
PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif
#if defined(PNG_READ_zTXt_SUPPORTED)
PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));
PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif
#if defined(PNG_READ_iTXt_SUPPORTED)
PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr,
   png_infop info_ptr, png_uint_32 length));
PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr,
   png_infop info_ptr));
#endif


#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */

#ifdef PNG_MNG_FEATURES_SUPPORTED
PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info,
   png_bytep row));
PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
/* png.c */ /* PRIVATE */
PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr));
#endif
/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */

#endif /* PNG_INTERNAL */

#ifdef __cplusplus
}
#endif

#endif /* PNG_VERSION_INFO_ONLY */
/* この行を過ぎればもう出力はありません。 */
#endif /* PNG_H */


#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */

#ifdef PNG_MNG_FEATURES_SUPPORTED
PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info,
   png_bytep row));
PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info,
   png_bytep row));
#endif

#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
/* png.c */ /* PRIVATE */
PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr));
#endif
/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */

#endif /* PNG_INTERNAL */

#ifdef __cplusplus
}
#endif

#endif /* PNG_VERSION_INFO_ONLY */
/* do not put anything past this line */
#endif /* PNG_H */


誤植と思われるもの
誤 corresponsing → 正 corresponding
誤 explination → 正 explanation



戻る