diff --git a/Makefile.win32 b/Makefile.win32 index 770df70fb..f475246cb 100644 --- a/Makefile.win32 +++ b/Makefile.win32 @@ -9,5 +9,8 @@ all: cairo cairo: inform @$(MAKE) -C src -f Makefile.win32 +perf: inform + @$(MAKE) -C perf -f Makefile.win32 perf + test: inform @$(MAKE) -C test -f Makefile.win32 test diff --git a/configure.ac b/configure.ac index 5d72c24fa..66877917b 100644 --- a/configure.ac +++ b/configure.ac @@ -815,6 +815,7 @@ src/Makefile test/Makefile test/pdiff/Makefile perf/Makefile +perf/micro/Makefile util/Makefile util/cairo-fdr/Makefile util/cairo-gobject/Makefile diff --git a/perf/Makefile.am b/perf/Makefile.am index 1e1bf5bc8..d01ea0697 100644 --- a/perf/Makefile.am +++ b/perf/Makefile.am @@ -1,5 +1,7 @@ include $(top_srcdir)/build/Makefile.am.common +include $(top_srcdir)/perf/Makefile.sources + AM_CPPFLAGS = \ -I$(srcdir) \ -I$(top_srcdir)/boilerplate \ @@ -22,105 +24,46 @@ EXTRA_LTLIBRARIES += libcairoperf.la LDADD = libcairoperf.la \ $(top_builddir)/boilerplate/libcairoboilerplate.la \ - $(top_builddir)/src/libcairo.la \ - $(CAIROPERF_LIBS) + $(top_builddir)/src/libcairo.la -cairo_perf_micro_SOURCES = \ - cairo-perf-micro.c \ - cairo-perf.h \ - micro/cairo-perf-cover.c \ - micro/box-outline.c \ - micro/composite-checker.c \ - micro/fill.c \ - micro/long-lines.c \ - micro/mosaic.c \ - micro/mosaic.h \ - micro/paint.c \ - micro/paint-with-alpha.c \ - micro/mask.c \ - micro/pattern_create_radial.c \ - micro/rectangles.c \ - micro/rounded-rectangles.c \ - micro/stroke.c \ - micro/subimage_copy.c \ - micro/tessellate.c \ - micro/text.c \ - micro/glyphs.c \ - micro/twin.c \ - micro/unaligned-clip.c \ - micro/wave.c \ - micro/world-map.c \ - micro/world-map.h \ - micro/zrusin.c \ - micro/zrusin-another.h \ - micro/long-dashed-lines.c \ - micro/dragon.c \ - micro/pythagoras-tree.c \ - micro/intersections.c \ - micro/spiral.c - -if CAIRO_HAS_WIN32_SURFACE -cairo_perf_micro_SOURCES += cairo-perf-win32.c -else -if CAIRO_HAS_OS2_SURFACE -cairo_perf_micro_SOURCES += cairo-perf-os2.c -else -cairo_perf_micro_SOURCES += cairo-perf-posix.c -endif -endif -cairo_perf_micro_LDADD = $(LDADD) +cairo_perf_micro_SOURCES = $(cairo_perf_micro_sources) +cairo_perf_micro_LDADD = \ + $(top_builddir)/perf/micro/libcairo-perf-micro.la \ + $(LDADD) cairo_perf_micro_DEPENDENCIES = \ - $(top_builddir)/boilerplate/libcairoboilerplate.la \ - $(top_builddir)/src/libcairo.la \ - libcairoperf.la + $(top_builddir)/perf/micro/libcairo-perf-micro.la \ + $(LDADD) libcairoperf_la_SOURCES = \ - cairo-perf-report.c \ - cairo-stats.c \ - cairo-stats.h + $(libcairoperf_sources) \ + $(libcairoperf_headers) +libcairoperf_la_LIBADD = $(CAIROPERF_LIBS) -cairo_perf_trace_SOURCES = \ - cairo-perf-trace.c \ - ../src/cairo-error.c \ - ../src/cairo-hash.c -if CAIRO_HAS_WIN32_SURFACE -cairo_perf_trace_SOURCES += cairo-perf-win32.c -else -if CAIRO_HAS_OS2_SURFACE -cairo_perf_trace_SOURCES += cairo-perf-os2.c -else -cairo_perf_trace_SOURCES += cairo-perf-posix.c -endif -endif +cairo_perf_trace_SOURCES = \ + $(cairo_perf_trace_sources) \ + $(cairo_perf_trace_external_sources) cairo_perf_trace_LDADD = \ $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ $(LDADD) cairo_perf_trace_DEPENDENCIES = \ $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \ - $(top_builddir)/boilerplate/libcairoboilerplate.la \ - $(top_builddir)/src/libcairo.la \ - libcairoperf.la + $(LDADD) -cairo_perf_diff_files_SOURCES = \ - cairo-perf-diff-files.c - -cairo_perf_print_SOURCES = \ - cairo-perf-print.c - -cairo_perf_chart_SOURCES = \ - cairo-perf-chart.c - -cairo_perf_compare_backends_SOURCES = \ - cairo-perf-compare-backends.c +cairo_perf_diff_files_SOURCES = $(cairo_perf_diff_files_sources) +cairo_perf_print_SOURCES = $(cairo_perf_print_sources) +cairo_perf_chart_SOURCES = $(cairo_perf_chart_sources) +cairo_perf_compare_backends_SOURCES = $(cairo_perf_compare_backends_sources) cairo_perf_graph_files_SOURCES = \ - cairo-perf-graph.h \ - cairo-perf-graph-files.c \ - cairo-perf-graph-widget.c + $(cairo_perf_graph_files_sources) \ + $(cairo_perf_graph_files_headers) cairo_perf_graph_files_CFLAGS = @gtk_CFLAGS@ cairo_perf_graph_files_LDADD = @gtk_LIBS@ $(LDADD) # Install rules to rebuild the libraries and add explicit dependencies +$(top_builddir)/perf/micro/libcairo-perf-micro.la: + cd $(top_builddir)/perf/micro && $(MAKE) $(AM_MAKEFLAGS) libcairo-perf-micro.la + $(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la diff --git a/perf/Makefile.sources b/perf/Makefile.sources new file mode 100644 index 000000000..9867ea526 --- /dev/null +++ b/perf/Makefile.sources @@ -0,0 +1,35 @@ +libcairoperf_sources = \ + cairo-perf-os2.c \ + cairo-perf-posix.c \ + cairo-perf-report.c \ + cairo-perf-win32.c \ + cairo-stats.c \ + $(NULL) + +libcairoperf_headers = \ + cairo-perf.h \ + cairo-stats.h \ + $(NULL) + +cairo_perf_trace_sources = cairo-perf-trace.c +cairo_perf_trace_external_sources = \ + ../src/cairo-error.c \ + ../src/cairo-hash.c \ + $(NULL) + +cairo_perf_micro_sources = cairo-perf-micro.c + +cairo_perf_diff_files_sources = cairo-perf-diff-files.c + +cairo_perf_print_sources = cairo-perf-print.c + +cairo_perf_chart_sources = cairo-perf-chart.c + +cairo_perf_compare_backends_sources = cairo-perf-compare-backends.c + +cairo_perf_graph_files_sources = \ + cairo-perf-graph-files.c \ + cairo-perf-graph-widget.c \ + $(NULL) + +cairo_perf_graph_files_headers = cairo-perf-graph.h diff --git a/perf/Makefile.win32 b/perf/Makefile.win32 index ef993a783..084abf00e 100644 --- a/perf/Makefile.win32 +++ b/perf/Makefile.win32 @@ -1,44 +1,78 @@ top_srcdir = .. include $(top_srcdir)/build/Makefile.win32.common +include $(top_srcdir)/perf/Makefile.sources -LDFLAGS += ../src/$(CFG)/cairo-static.lib $(PIXMAN_LIBS) ../boilerplate/$(CFG)/boiler.lib $(EXE_LDFLAGS) +CFLAGS += -I$(top_srcdir)/boilerplate -I$(top_srcdir)/util/cairo-script/ -PERF_SOURCES = \ - box-outline.c \ - cairo-perf-win32.c \ - cairo-perf-cover.c \ - cairo-perf.c \ - cairo-stats.c \ - fill.c \ - long-dashed-lines.c \ - long-lines.c \ - mosaic.c \ - paint.c \ - paint-with-alpha.c \ - pattern_create_radial.c \ - rectangles.c \ - stroke.c \ - subimage_copy.c \ - tessellate.c \ - text.c \ - unaligned-clip.c \ - world-map.c \ - zrusin.c \ -# extend-pad.c \ +PERF_LIBS = \ + $(CFG)/libcairoperf.lib \ + $(top_builddir)/boilerplate/$(CFG)/boiler.lib \ + $(top_builddir)/src/$(CFG)/cairo-static.lib \ + $(NULL) + +PERF_EXES = \ + $(CFG)/cairo-perf-trace.exe \ + $(CFG)/cairo-perf-micro.exe \ + $(CFG)/cairo-perf-diff-files.exe \ + $(CFG)/cairo-perf-print.exe \ + $(CFG)/cairo-perf-chart.exe \ + $(CFG)/cairo-perf-compare-backends.exe \ + $(NULL) + +all: inform $(PERF_EXES) + +perf: inform $(CFG)/cairo-perf-micro.exe + ./$(CFG)/cairo-perf-micro.exe + + +libcairoperf_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(libcairoperf_sources)) + +$(CFG)/libcairoperf.lib: $(libcairoperf_OBJECTS) + @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(libcairoperf_OBJECTS) + +cairo_perf_trace_OBJECTS = \ + $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_trace_sources)) \ + $(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib \ $(NULL) -OBJECTS = $(patsubst %.c, $(CFG)/%.obj, $(PERF_SOURCES)) +cairo_perf_micro_OBJECTS = \ + $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_micro_sources)) \ + ./micro/$(CFG)/libcairo-perf-micro.lib \ + $(NULL) -all: inform $(CFG)/cairo-perf.exe +cairo_perf_diff_files_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_diff_files_sources)) +cairo_perf_print_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_print_sources)) +cairo_perf_chart_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_chart_sources)) +cairo_perf_compare_backends_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_compare_backends_sources)) -$(CFG)/cairo-perf.exe: $(OBJECTS) - @mkdir -p $(CFG) - @$(CC) $(CFLAGS) -Fe"$@" $^ -link $(LDFLAGS) -cairo-perf-diff-files: - @mkdir -p $(CFG) - @$(CC) $(CFLAGS) -Fe"$@" cairo-perf-diff-files.c cairo-perf-report.c cairo-stats.c -link $(LDFLAGS) +$(CFG)/cairo-perf-trace.exe: $(cairo_perf_trace_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_trace_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) -cairo-perf-graph-files: - @mkdir -p $(CFG) - @$(CC) $(CFLAGS) -Fe"$@" cairo-perf-graph-files.c cairo-perf-report.c cairo-stats.c -link $(LDFLAGS) +$(CFG)/cairo-perf-micro.exe: $(cairo_perf_micro_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_micro_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-diff-files.exe: $(cairo_perf_diff_files_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_diff_files_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-print.exe: $(cairo_perf_print_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_print_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-chart.exe: $(cairo_perf_chart_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_chart_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + +$(CFG)/cairo-perf-compare-backends.exe: $(cairo_perf_compare_backends_OBJECTS) $(PERF_LIBS) + @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_compare_backends_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS) + + +./micro/$(CFG)/libcairo-perf-micro.lib: + $(MAKE) -C micro -f Makefile.win32 + +$(top_builddir)/src/$(CFG)/cairo-static.lib: + $(MAKE) -C $(top_srcdir)/src -f Makefile.win32 + +$(top_builddir)/boilerplate/$(CFG)/boiler.lib: + $(MAKE) -C $(top_srcdir)/boilerplate -f Makefile.win32 + +$(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib: + $(MAKE) -C $(top_srcdir)/util/cairo-script -f Makefile.win32 diff --git a/perf/cairo-perf-os2.c b/perf/cairo-perf-os2.c index 5f4f07830..18499387f 100644 --- a/perf/cairo-perf-os2.c +++ b/perf/cairo-perf-os2.c @@ -27,11 +27,13 @@ * Carl Worth (win32/linux code) */ +#include "cairo-perf.h" + +#if CAIRO_HAS_OS2_SURFACE + #define INCL_BASE #include -#include "cairo-perf.h" - /* timers */ typedef struct _cairo_perf_timer { @@ -93,3 +95,5 @@ cairo_perf_yield (void) { /* try to deactivate this thread until the scheduler calls it again */ DosSleep (0); } + +#endif /* CAIRO_HAS_OS2_SURFACE */ diff --git a/perf/cairo-perf-posix.c b/perf/cairo-perf-posix.c index 84064b0ba..59d8e3c1b 100644 --- a/perf/cairo-perf-posix.c +++ b/perf/cairo-perf-posix.c @@ -55,6 +55,10 @@ #define _XOPEN_SOURCE 600 /* for round() */ +#include "cairo-perf.h" + +#if !CAIRO_HAS_OS2_SURFACE && !CAIRO_HAS_WIN32_SURFACE + #include "config.h" #include @@ -65,8 +69,6 @@ #include #endif -#include "cairo-perf.h" - /* timers */ #if defined(HAVE_CLOCK_GETTIME) @@ -251,3 +253,5 @@ cairo_perf_yield (void) sched_yield (); #endif } + +#endif /* !CAIRO_HAS_OS2_SURFACE && !CAIRO_HAS_WIN32_SURFACE */ diff --git a/perf/cairo-perf-trace.c b/perf/cairo-perf-trace.c index 2d454cb7f..ff2288246 100644 --- a/perf/cairo-perf-trace.c +++ b/perf/cairo-perf-trace.c @@ -51,8 +51,44 @@ #include #include + +#ifdef _MSC_VER +#include "dirent-win32.h" + +typedef SSIZE_T ssize_t; + +static char * +basename_no_ext (char *path) +{ + static char name[_MAX_FNAME + 1]; + + _splitpath (path, NULL, NULL, name, NULL); + + name[_MAX_FNAME] = '\0'; + + return name; +} + + +#else #include +static char * +basename_no_ext (char *path) +{ + char *dot, *name; + + name = basename (path); + + dot = strchr (name, '.'); + if (dot) + *dot = '\0'; + + return name; +} + +#endif + #if HAVE_UNISTD_H #include #endif @@ -319,18 +355,19 @@ execute (cairo_perf_t *perf, cairo_perf_ticks_t *times; cairo_stats_t stats = {0.0, 0.0}; int low_std_dev_count; - char *trace_cpy, *name, *dot; + char *trace_cpy, *name; const cairo_script_interpreter_hooks_t hooks = { - .closure = args, - .surface_create = _similar_surface_create, - .context_create = _context_create + args, + _similar_surface_create, + NULL, /* surface_destroy */ + _context_create, + NULL, /* context_destroy */ + NULL, /* show_page */ + NULL /* copy_page */ }; trace_cpy = xstrdup (trace); - name = basename (trace_cpy); - dot = strchr (name, '.'); - if (dot) - *dot = '\0'; + name = basename_no_ext (trace_cpy); if (perf->list_only) { printf ("%s\n", name); diff --git a/perf/cairo-perf-win32.c b/perf/cairo-perf-win32.c index 9a09679b6..23b8fb47e 100644 --- a/perf/cairo-perf-win32.c +++ b/perf/cairo-perf-win32.c @@ -25,13 +25,15 @@ * Carl Worth */ +#include "cairo-perf.h" + +#if CAIRO_HAS_WIN32_SURFACE + #define USE_WINAPI #define WIN32_LEAN_AND_MEAN #include -#include "cairo-perf.h" - /* timers */ typedef struct _cairo_perf_timer @@ -87,3 +89,5 @@ void cairo_perf_yield (void) { SleepEx(0, TRUE); } + +#endif /* CAIRO_HAS_WIN32_SURFACE */ diff --git a/perf/dirent-win32.h b/perf/dirent-win32.h new file mode 100644 index 000000000..0f2ed05e5 --- /dev/null +++ b/perf/dirent-win32.h @@ -0,0 +1,102 @@ +/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ +/* + * Copyright 2011 Andrea Canciani + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * the authors not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. The authors make no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Authors: Andrea Canciani + */ + +#include "cairo-compiler-private.h" + +#define WIN32_LEAN_AND_MEAN +#include + +#define stat _stat + +#define S_ISDIR(s) ((s) & _S_IFDIR) + +struct dirent { + ino_t d_ino; + char d_name[FILENAME_MAX + 1]; +}; + +typedef struct _DIR { + HANDLE handle; + cairo_bool_t has_next; + WIN32_FIND_DATA data; + struct dirent de; +} DIR; + +static DIR * +opendir(const char *dirname) +{ + DIR *dirp; + + dirp = malloc (sizeof (*dirp)); + if (unlikely (dirp == NULL)) + return NULL; + + dirp->handle = FindFirstFile(dirname, &dirp->data); + + if (unlikely (dirp->handle == INVALID_HANDLE_VALUE)) { + free (dirp); + return NULL; + } + + memcpy (dirp->de.d_name, dirp->data.cFileName, + sizeof (dirp->data.cFileName)); + dirp->de.d_name[FILENAME_MAX] = '\0'; + + dirp->has_next = TRUE; + + return dirp; +} + +static int +closedir(DIR *dirp) +{ + int ret; + + ret = ! FindClose (dirp->handle); + + free (dirp); + + /* TODO: set errno */ + + return ret; +} + +static struct dirent * +readdir(DIR *dirp) +{ + if (! dirp->has_next) + return NULL; + + /* COMPILE_TIME_ASSERT (FILENAME_MAX == sizeof (dirp->data.cFileName)); */ + + memcpy (dirp->de.d_name, dirp->data.cFileName, + sizeof (dirp->data.cFileName)); + dirp->de.d_name[FILENAME_MAX] = '\0'; + + dirp->has_next = FindNextFile (dirp->handle, &dirp->data); + + return &dirp->de; +} diff --git a/perf/micro/Makefile.am b/perf/micro/Makefile.am new file mode 100644 index 000000000..3edbf531c --- /dev/null +++ b/perf/micro/Makefile.am @@ -0,0 +1,16 @@ +include $(top_srcdir)/build/Makefile.am.common + +include $(top_srcdir)/perf/micro/Makefile.sources + +noinst_LTLIBRARIES = libcairo-perf-micro.la +libcairo_perf_micro_la_SOURCES = \ + $(libcairo_perf_micro_sources) \ + $(libcairo_perf_micro_headers) + +AM_CPPFLAGS = \ + -I$(srcdir) \ + -I$(top_srcdir)/boilerplate \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/perf \ + -I$(top_builddir)/src \ + $(CAIRO_CFLAGS) diff --git a/perf/micro/Makefile.sources b/perf/micro/Makefile.sources new file mode 100644 index 000000000..794ed6208 --- /dev/null +++ b/perf/micro/Makefile.sources @@ -0,0 +1,35 @@ +libcairo_perf_micro_sources = \ + cairo-perf-cover.c \ + box-outline.c \ + composite-checker.c \ + fill.c \ + long-lines.c \ + mosaic.c \ + paint.c \ + paint-with-alpha.c \ + mask.c \ + pattern_create_radial.c \ + rectangles.c \ + rounded-rectangles.c \ + stroke.c \ + subimage_copy.c \ + tessellate.c \ + text.c \ + glyphs.c \ + twin.c \ + unaligned-clip.c \ + wave.c \ + world-map.c \ + zrusin.c \ + long-dashed-lines.c \ + dragon.c \ + pythagoras-tree.c \ + intersections.c \ + spiral.c \ + $(NULL) + +libcairo_perf_micro_headers = \ + mosaic.h \ + world-map.h \ + zrusin-another.h \ + $(NULL) diff --git a/perf/micro/Makefile.win32 b/perf/micro/Makefile.win32 new file mode 100644 index 000000000..f41f781d7 --- /dev/null +++ b/perf/micro/Makefile.win32 @@ -0,0 +1,12 @@ +top_srcdir = ../.. +include $(top_srcdir)/build/Makefile.win32.common +include $(top_srcdir)/perf/micro/Makefile.sources + +CFLAGS += -I$(top_srcdir)/perf -I$(top_srcdir)/boilerplate/ + +OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(libcairo_perf_micro_sources)) + +all: inform $(CFG)/libcairo-perf-micro.lib + +$(CFG)/libcairo-perf-micro.lib: $(OBJECTS) + @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(OBJECTS)