mirror of
https://github.com/holub/mame
synced 2025-04-22 00:11:58 +03:00
added pngcmp to tools (nw)
This commit is contained in:
parent
619b0109b1
commit
0c2201318c
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -8718,6 +8718,7 @@ src/tools/chdman.c svneol=native#text/plain
|
||||
src/tools/jedutil.c svneol=native#text/plain
|
||||
src/tools/ldresample.c svneol=native#text/plain
|
||||
src/tools/ldverify.c svneol=native#text/plain
|
||||
src/tools/pngcmp.c svneol=native#text/plain
|
||||
src/tools/regrep.c svneol=native#text/plain
|
||||
src/tools/romcmp.c svneol=native#text/plain
|
||||
src/tools/runtest.cmd svneol=CRLF#text/plain eol=crlf
|
||||
|
226
src/tools/pngcmp.c
Normal file
226
src/tools/pngcmp.c
Normal file
@ -0,0 +1,226 @@
|
||||
/***************************************************************************
|
||||
|
||||
pngcmp.c
|
||||
|
||||
PNG comparison (based on regrep.c)
|
||||
|
||||
****************************************************************************
|
||||
|
||||
Copyright Aaron Giles
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name 'MAME' nor the names of its contributors may be
|
||||
used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "osdcore.h"
|
||||
#include "png.h"
|
||||
|
||||
#include <new>
|
||||
|
||||
/***************************************************************************
|
||||
CONSTANTS & DEFINES
|
||||
***************************************************************************/
|
||||
|
||||
#define BITMAP_SPACE 4
|
||||
|
||||
/***************************************************************************
|
||||
PROTOTYPES
|
||||
***************************************************************************/
|
||||
|
||||
static int generate_png_diff(const astring& imgfile1, const astring& imgfile2, const astring& outfilename);
|
||||
|
||||
/***************************************************************************
|
||||
MAIN
|
||||
***************************************************************************/
|
||||
|
||||
/*-------------------------------------------------
|
||||
main - main entry point
|
||||
-------------------------------------------------*/
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
/* first argument is the directory */
|
||||
if (argc < 4)
|
||||
{
|
||||
fprintf(stderr, "Usage:\npngcmp <image1> <image2> <outfile>\n");
|
||||
return 10;
|
||||
}
|
||||
astring imgfilename1(argv[1]);
|
||||
astring imgfilename2(argv[2]);
|
||||
astring outfilename(argv[3]);
|
||||
|
||||
try {
|
||||
return generate_png_diff(imgfilename1, imgfilename2, outfilename);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
printf("Exception occured");
|
||||
return 1000;
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
generate_png_diff - create a new PNG file
|
||||
that shows multiple differing PNGs side by
|
||||
side with a third set of differences
|
||||
-------------------------------------------------*/
|
||||
|
||||
static int generate_png_diff(const astring& imgfile1, const astring& imgfile2, const astring& outfilename)
|
||||
{
|
||||
bitmap_argb32 bitmap1;
|
||||
bitmap_argb32 bitmap2;
|
||||
bitmap_argb32 finalbitmap;
|
||||
int width, height, maxwidth;
|
||||
core_file *file = NULL;
|
||||
file_error filerr;
|
||||
png_error pngerr;
|
||||
int error = 100;
|
||||
bool bitmaps_differ;
|
||||
int x, y;
|
||||
|
||||
/* open the source image */
|
||||
filerr = core_fopen(imgfile1, OPEN_FLAG_READ, &file);
|
||||
if (filerr != FILERR_NONE)
|
||||
{
|
||||
printf("Could not open %s (%d)\n", imgfile1.cstr(), filerr);
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* load the source image */
|
||||
pngerr = png_read_bitmap(file, bitmap1);
|
||||
core_fclose(file);
|
||||
if (pngerr != PNGERR_NONE)
|
||||
{
|
||||
printf("Could not read %s (%d)\n", imgfile1.cstr(), pngerr);
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* open the source image */
|
||||
filerr = core_fopen(imgfile2, OPEN_FLAG_READ, &file);
|
||||
if (filerr != FILERR_NONE)
|
||||
{
|
||||
printf("Could not open %s (%d)\n", imgfile2.cstr(), filerr);
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* load the source image */
|
||||
pngerr = png_read_bitmap(file, bitmap2);
|
||||
core_fclose(file);
|
||||
if (pngerr != PNGERR_NONE)
|
||||
{
|
||||
printf("Could not read %s (%d)\n", imgfile2.cstr(), pngerr);
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* if the sizes are different, we differ; otherwise start off assuming we are the same */
|
||||
bitmaps_differ = (bitmap2.width() != bitmap1.width() || bitmap2.height() != bitmap1.height());
|
||||
|
||||
/* compare scanline by scanline */
|
||||
for (y = 0; y < bitmap2.height() && !bitmaps_differ; y++)
|
||||
{
|
||||
UINT32 *base = &bitmap1.pix32(y);
|
||||
UINT32 *curr = &bitmap2.pix32(y);
|
||||
|
||||
/* scan the scanline */
|
||||
for (x = 0; x < bitmap2.width(); x++)
|
||||
if (*base++ != *curr++)
|
||||
break;
|
||||
bitmaps_differ = (x != bitmap2.width());
|
||||
}
|
||||
|
||||
if (bitmaps_differ)
|
||||
{
|
||||
/* determine the size of the final bitmap */
|
||||
height = width = 0;
|
||||
{
|
||||
/* determine the maximal width */
|
||||
maxwidth = MAX(bitmap1.width(), bitmap2.width());
|
||||
width = bitmap1.width() + BITMAP_SPACE + maxwidth + BITMAP_SPACE + maxwidth;
|
||||
|
||||
/* add to the height */
|
||||
height += MAX(bitmap1.height(), bitmap2.height());
|
||||
}
|
||||
|
||||
/* allocate the final bitmap */
|
||||
finalbitmap.allocate(width, height);
|
||||
|
||||
/* now copy and compare each set of bitmaps */
|
||||
int curheight = MAX(bitmap1.height(), bitmap2.height());
|
||||
/* iterate over rows in these bitmaps */
|
||||
for (y = 0; y < curheight; y++)
|
||||
{
|
||||
UINT32 *src1 = (y < bitmap1.height()) ? &bitmap1.pix32(y) : NULL;
|
||||
UINT32 *src2 = (y < bitmap2.height()) ? &bitmap2.pix32(y) : NULL;
|
||||
UINT32 *dst1 = &finalbitmap.pix32(y);
|
||||
UINT32 *dst2 = &finalbitmap.pix32(y, bitmap1.width() + BITMAP_SPACE);
|
||||
UINT32 *dstdiff = &finalbitmap.pix32(y, bitmap1.width() + BITMAP_SPACE + maxwidth + BITMAP_SPACE);
|
||||
|
||||
/* now iterate over columns */
|
||||
for (x = 0; x < maxwidth; x++)
|
||||
{
|
||||
int pix1 = -1, pix2 = -2;
|
||||
|
||||
if (src1 != NULL && x < bitmap1.width())
|
||||
pix1 = dst1[x] = src1[x];
|
||||
if (src2 != NULL && x < bitmap2.width())
|
||||
pix2 = dst2[x] = src2[x];
|
||||
dstdiff[x] = (pix1 != pix2) ? 0xffffffff : 0xff000000;
|
||||
}
|
||||
}
|
||||
|
||||
/* write the final PNG */
|
||||
filerr = core_fopen(outfilename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &file);
|
||||
if (filerr != FILERR_NONE)
|
||||
{
|
||||
printf("Could not open %s (%d)\n", outfilename.cstr(), filerr);
|
||||
goto error;
|
||||
}
|
||||
pngerr = png_write_bitmap(file, NULL, finalbitmap, 0, NULL);
|
||||
core_fclose(file);
|
||||
if (pngerr != PNGERR_NONE)
|
||||
{
|
||||
printf("Could not write %s (%d)\n", outfilename.cstr(), pngerr);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
/* if we get here, we are error free */
|
||||
if (bitmaps_differ)
|
||||
error = 1;
|
||||
else
|
||||
error = 0;
|
||||
|
||||
error:
|
||||
if (error == -1)
|
||||
osd_rmfile(outfilename);
|
||||
return error;
|
||||
}
|
@ -61,6 +61,7 @@ TOOLS += \
|
||||
srcclean$(EXE) \
|
||||
src2html$(EXE) \
|
||||
split$(EXE) \
|
||||
pngcmp$(EXE) \
|
||||
|
||||
|
||||
|
||||
@ -192,3 +193,17 @@ SPLITOBJS = \
|
||||
split$(EXE): $(SPLITOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB) $(EXPAT)
|
||||
@echo Linking $@...
|
||||
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
|
||||
|
||||
|
||||
|
||||
#-------------------------------------------------
|
||||
# pngcmp
|
||||
#-------------------------------------------------
|
||||
|
||||
PNGCMPOBJS = \
|
||||
$(TOOLSOBJ)/pngcmp.o \
|
||||
|
||||
pngcmp$(EXE): $(PNGCMPOBJS) $(LIBUTIL) $(LIBOCORE) $(ZLIB)
|
||||
@echo Linking $@...
|
||||
$(LD) $(LDFLAGS) $^ $(LIBS) -o $@
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user