Windows版Firefoxのビルドメモ・libpngを差し替える

Windows XP + Visual Studio 2005でFirefoxをビルドするメモ。
Firefox 2.0.0.1のソースに含まれてるlibpngを差し替える改造をする。


改造するポイントは2点。

  • libpngのバージョンを現時点の最新版(1.2.16)にする。
  • MMXのコードを使って速度を上げる。


以下手順

ソースファイルを用意

libpngのサイトから、libpngのソースファイルをダウンロードする。


ソースを展開して、次のファイルをFirefoxのlibpngのソースの場所(mozilla\modules\libimg\png)に上書きコピーする。

png.c       pngmem.c    pngrio.c    pngset.c    pngwio.c    pngwutil.c
pngerror.c  pngpread.c  pngrtran.c  pngtrans.c  pngwrite.c
pngget.c    pngread.c   pngrutil.c  pngvcrd.c   pngwtran.c

png.h       pngconf.h

ファイルを編集

そのままではコンパイル出来ないので少し修正する。

★pngpread.c

png_progressive_combine_row関数の、「if(png_ptr == NULL) return;」とある行(1556行目辺り)の位置を、直後の「#endif」の下に下げる。
これをしないと、コンパイラの仕様でエラーになる。

1553:png_progressive_combine_row (png_structp png_ptr,
1554:   png_bytep old_row, png_bytep new_row)
1555:{
1556:#ifdef PNG_USE_LOCAL_ARRAYS
1557:   const int FARDATA png_pass_dsp_mask[7] =
1558:      {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
1559:#endif
1560:   if(png_ptr == NULL) return; /* この位置まで下げる */
1561:   if (new_row != NULL)    /* new_row must == png_ptr->row_buf here. */
1562:      png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
1563:}
★pngconf.h

「#define PNG_1_2_X」の行の下辺りに、「#include "mozpngconf.h"」と書いておく。

★mozpngconf.h

最下行の「#endif」の上に下記の内容を書いて、MMXのコードを使うように設定する。
多分これで大丈夫。

#define PNG_ASSEMBLER_CODE_SUPPORTED
#define PNG_MMX_CODE_SUPPORTED
#define PNG_HAVE_MMX_READ_FILTER_ROW
#define PNG_HAVE_MMX_READ_INTERLACE
#define PNG_HAVE_MMX_COMBINE_ROW
#define PNG_USE_PNGVCRD
Makefile.in

55行目からの、CSRCSにpngvcrd.cを加える。

CSRCS       = \
        png.c \
        pngerror.c \
        pngget.c \
        pngmem.c \
        pngpread.c \
        pngread.c \
        pngrio.c \
        pngrutil.c \
        pngset.c \
        pngtrans.c \
        pngwio.c \
        pngwrite.c \
        pngwtran.c \
        pngrtran.c \
        pngwutil.c \
        pngvcrd.c \
        $(NULL)

ビルド

あとは普通にビルドする。
エラーが出たら、どこかが抜けているので見直すべし。