Exemplo n.º 1
0
def main():
    '''Main program.
    '''

    global options

    # Parse command line options
    optparser = optparse.OptionParser(
        usage='\n\t%prog [options] -- [glretrace options] <trace>',
        version='%%prog')
    optparser.add_option('-r',
                         '--retrace',
                         metavar='PROGRAM',
                         type='string',
                         dest='retrace',
                         default='glretrace',
                         help='retrace command [default: %default]')
    optparser.add_option('--ref-driver',
                         metavar='DRIVER',
                         type='string',
                         dest='ref_driver',
                         default=None,
                         help='force reference driver')
    optparser.add_option('--src-driver',
                         metavar='DRIVER',
                         type='string',
                         dest='src_driver',
                         default=None,
                         help='force source driver')
    optparser.add_option('--ref-arg',
                         metavar='OPTION',
                         type='string',
                         action='append',
                         dest='ref_args',
                         default=[],
                         help='pass argument to reference retrace')
    optparser.add_option('--src-arg',
                         metavar='OPTION',
                         type='string',
                         action='append',
                         dest='src_args',
                         default=[],
                         help='pass argument to source retrace')
    optparser.add_option('--ref-env',
                         metavar='NAME=VALUE',
                         type='string',
                         action='append',
                         dest='ref_env',
                         default=[],
                         help='add variable to reference environment')
    optparser.add_option('--src-env',
                         metavar='NAME=VALUE',
                         type='string',
                         action='append',
                         dest='src_env',
                         default=[],
                         help='add variable to source environment')
    optparser.add_option('--diff-prefix',
                         metavar='PATH',
                         type='string',
                         dest='diff_prefix',
                         default='.',
                         help='prefix for the difference images')
    optparser.add_option('-t',
                         '--threshold',
                         metavar='BITS',
                         type="float",
                         dest="threshold",
                         default=12.0,
                         help="threshold precision  [default: %default]")
    optparser.add_option('-S',
                         '--snapshot-frequency',
                         metavar='CALLSET',
                         type="string",
                         dest="snapshot_frequency",
                         default='draw',
                         help="calls to compare [default: %default]")
    optparser.add_option('--diff-state',
                         action='store_true',
                         dest='diff_state',
                         default=False,
                         help='diff state between failing calls')
    optparser.add_option('-o',
                         '--output',
                         metavar='FILE',
                         type="string",
                         dest="output",
                         help="output file [default: stdout]")

    (options, args) = optparser.parse_args(sys.argv[1:])
    ref_env = parse_env(optparser, options.ref_env)
    src_env = parse_env(optparser, options.src_env)
    if not args:
        optparser.error("incorrect number of arguments")

    if options.ref_driver:
        options.ref_args.insert(0, '--driver=' + options.ref_driver)
    if options.src_driver:
        options.src_args.insert(0, '--driver=' + options.src_driver)

    refRetracer = Retracer(options.retrace, options.ref_args + args, ref_env)
    srcRetracer = Retracer(options.retrace, options.src_args + args, src_env)

    if options.output:
        output = open(options.output, 'wt')
    else:
        output = sys.stdout

    highligher = AutoHighlighter(output)

    highligher.write('call\tprecision\n')

    last_bad = -1
    last_good = 0
    refRun = refRetracer.snapshot(options.snapshot_frequency)
    try:
        srcRun = srcRetracer.snapshot(options.snapshot_frequency)
        try:
            while True:
                # Get the reference image
                refImage, refCallNo = refRun.nextSnapshot()
                if refImage is None:
                    break

                # Get the source image
                srcImage, srcCallNo = srcRun.nextSnapshot()
                if srcImage is None:
                    break

                assert refCallNo == srcCallNo
                callNo = refCallNo

                # Compare the two images
                comparer = Comparer(refImage, srcImage)
                precision = comparer.precision()

                mismatch = precision < options.threshold

                if mismatch:
                    highligher.color(highligher.red)
                    highligher.bold()
                highligher.write('%u\t%f\n' % (callNo, precision))
                if mismatch:
                    highligher.normal()

                if mismatch:
                    if options.diff_prefix:
                        prefix = os.path.join(options.diff_prefix,
                                              '%010u' % callNo)
                        prefix_dir = os.path.dirname(prefix)
                        if not os.path.isdir(prefix_dir):
                            os.makedirs(prefix_dir)
                        refImage.save(prefix + '.ref.png')
                        srcImage.save(prefix + '.src.png')
                        comparer.write_diff(prefix + '.diff.png')
                    if last_bad < last_good and options.diff_state:
                        srcRetracer.diff_state(last_good, callNo, output)
                    last_bad = callNo
                else:
                    last_good = callNo

                highligher.flush()
        finally:
            srcRun.terminate()
    finally:
        refRun.terminate()
Exemplo n.º 2
0
def main():
    '''Main program.
    '''

    global options

    # Parse command line options
    optparser = optparse.OptionParser(
        usage='\n\t%prog [options] -- [glretrace options] <trace>',
        version='%%prog')
    optparser.add_option('-r',
                         '--retrace',
                         metavar='PROGRAM',
                         type='string',
                         dest='retrace',
                         default='glretrace',
                         help='retrace command [default: %default]')
    optparser.add_option('--ref-env',
                         metavar='NAME=VALUE',
                         type='string',
                         action='append',
                         dest='ref_env',
                         default=[],
                         help='add variable to reference environment')
    optparser.add_option('--src-env',
                         metavar='NAME=VALUE',
                         type='string',
                         action='append',
                         dest='src_env',
                         default=[],
                         help='add variable to source environment')
    optparser.add_option('--diff-prefix',
                         metavar='PATH',
                         type='string',
                         dest='diff_prefix',
                         default='.',
                         help='prefix for the difference images')
    optparser.add_option('-t',
                         '--threshold',
                         metavar='BITS',
                         type="float",
                         dest="threshold",
                         default=12.0,
                         help="threshold precision  [default: %default]")
    optparser.add_option('-S',
                         '--snapshot-frequency',
                         metavar='CALLSET',
                         type="string",
                         dest="snapshot_frequency",
                         default='draw',
                         help="calls to compare [default: %default]")
    optparser.add_option('-o',
                         '--output',
                         metavar='FILE',
                         type="string",
                         dest="output",
                         help="output file [default: stdout]")

    (options, args) = optparser.parse_args(sys.argv[1:])
    ref_env = parse_env(optparser, options.ref_env)
    src_env = parse_env(optparser, options.src_env)
    if not args:
        optparser.error("incorrect number of arguments")

    ref_setup = Setup(args, ref_env)
    src_setup = Setup(args, src_env)

    if options.output:
        output = open(options.output, 'wt')
    else:
        output = sys.stdout

    highligher = AutoHighlighter(output)

    highligher.write('call\tprecision\n')

    last_bad = -1
    last_good = 0
    ref_proc = ref_setup.retrace()
    try:
        src_proc = src_setup.retrace()
        try:
            while True:
                # Get the reference image
                ref_image, ref_comment = read_pnm(ref_proc.stdout)
                if ref_image is None:
                    break

                # Get the source image
                src_image, src_comment = read_pnm(src_proc.stdout)
                if src_image is None:
                    break

                assert ref_comment == src_comment

                call_no = int(ref_comment.strip())

                # Compare the two images
                comparer = Comparer(ref_image, src_image)
                precision = comparer.precision()

                mismatch = precision < options.threshold

                if mismatch:
                    highligher.color(highligher.red)
                    highligher.bold()
                highligher.write('%u\t%f\n' % (call_no, precision))
                if mismatch:
                    highligher.normal()

                if mismatch:
                    if options.diff_prefix:
                        prefix = os.path.join(options.diff_prefix,
                                              '%010u' % call_no)
                        prefix_dir = os.path.dirname(prefix)
                        if not os.path.isdir(prefix_dir):
                            os.makedirs(prefix_dir)
                        ref_image.save(prefix + '.ref.png')
                        src_image.save(prefix + '.src.png')
                        comparer.write_diff(prefix + '.diff.png')
                    if last_bad < last_good:
                        src_setup.diff_state(last_good, call_no, output)
                    last_bad = call_no
                else:
                    last_good = call_no

                highligher.flush()
        finally:
            src_proc.terminate()
    finally:
        ref_proc.terminate()