summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2006-01-19 17:48:22 +0000
committerCarl Worth <cworth@cworth.org>2006-01-19 17:48:22 +0000
commit074f886c00d560daec90f1d6f6212ecf923f4d66 (patch)
treedab9ad37b53c99a449d612daba6a739b69f4a3ec
parent14acc7f132fd90d1ba37ddf7ffe9688261cd587b (diff)
Rip the cairo_content_t argument out of ps/pdf_surface_create as per discussion on cairo mailing list. Instead these surface will behave as if CONTENT_COLOR_ALPHA had been passed (that is, compositing operators will behave as if destination alpha were available).
This also has the benefit of preserving the API that has been in place for PS/PDF surface since the (experimental) stuff in 1.0.0. Track API change. Continue testing PS/PDF surfaces in the CAIRO_CONTENT_COLOR mode but do it by rendering to an intermediate similar surface rather than constructing the target surface differently.
-rw-r--r--ChangeLog29
-rw-r--r--src/cairo-pdf-surface.c27
-rw-r--r--src/cairo-pdf.h2
-rw-r--r--src/cairo-ps-surface.c24
-rw-r--r--src/cairo-ps.h2
-rw-r--r--test/cairo-test.c71
-rw-r--r--test/multi-page.c4
7 files changed, 98 insertions, 61 deletions
diff --git a/ChangeLog b/ChangeLog
index 611438646..61fb84ce3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,32 @@
+2006-01-19 Carl Worth <cworth@cworth.org>
+
+ * src/cairo-pdf.h:
+ * src/cairo-pdf-surface.c:
+ (_cairo_pdf_surface_create_for_stream_internal),
+ (cairo_pdf_surface_create_for_stream), (cairo_pdf_surface_create):
+ * src/cairo-ps.h:
+ * src/cairo-ps-surface.c:
+ (_cairo_ps_surface_create_for_stream_internal),
+ (cairo_ps_surface_create), (cairo_ps_surface_create_for_stream):
+
+ Rip the cairo_content_t argument out of ps/pdf_surface_create as
+ per discussion on cairo mailing list. Instead these surface will
+ behave as if CONTENT_COLOR_ALPHA had been passed (that is,
+ compositing operators will behave as if destination alpha were
+ available).
+
+ This also has the benefit of preserving the API that has been in
+ place for PS/PDF surface since the (experimental) stuff in 1.0.0.
+
+ * test/cairo-test.c: (create_ps_surface), (create_pdf_surface):
+ * test/multi-page.c: (main): Track API change.
+
+ * test/cairo-test.c: (ps_surface_write_to_png),
+ (pdf_surface_write_to_png): Continue testing PS/PDF surfaces in
+ the CAIRO_CONTENT_COLOR mode but do it by rendering to an
+ intermediate similar surface rather than constructing the target
+ surface differently.
+
2005-01-19 Emmanuel Pacaud <emmanuel.pacaud@free.fr>
* test/svg2png.c: add missing header. Fix #5544.
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c
index b33db42a3..ee5c482cf 100644
--- a/src/cairo-pdf-surface.c
+++ b/src/cairo-pdf-surface.c
@@ -287,7 +287,6 @@ _cairo_pdf_surface_add_font (cairo_pdf_surface_t *surface, unsigned int id)
static cairo_surface_t *
_cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *stream,
- cairo_content_t content,
double width,
double height)
{
@@ -305,27 +304,21 @@ _cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *stream,
document->owner = target;
_cairo_pdf_document_destroy (document);
- return _cairo_paginated_surface_create (target, content, width, height);
+ return _cairo_paginated_surface_create (target,
+ CAIRO_CONTENT_COLOR_ALPHA,
+ width, height);
}
/**
* cairo_pdf_surface_create_for_stream:
* @write: a #cairo_write_func_t to accept the output data
* @closure: the closure argument for @write
- * @content: CAIRO_CONTENT_COLOR_ALPHA or CAIRO_CONTENT_COLOR
* @width_in_points: width of the surface, in points (1 point == 1/72.0 inch)
* @height_in_points: height of the surface, in points (1 point == 1/72.0 inch)
*
* Creates a PDF surface of the specified size in points to be written
* incrementally to the stream represented by @write and @closure.
*
- * The @content argument is used to specify whether the rendering
- * semantics should behave as if destination alpha is available. The
- * expectation is that the value for @content will be selected to
- * achieve consistent results with a display surface that either has
- * or does not have destination alpha (for example,
- * CAIRO_FORMAT_ARGB32 vs. CAIRO_FORMAT_RGB24).
- *
* Return value: a pointer to the newly created surface. The caller
* owns the surface and should call cairo_surface_destroy when done
* with it.
@@ -337,7 +330,6 @@ _cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *stream,
cairo_surface_t *
cairo_pdf_surface_create_for_stream (cairo_write_func_t write,
void *closure,
- cairo_content_t content,
double width_in_points,
double height_in_points)
{
@@ -349,7 +341,7 @@ cairo_pdf_surface_create_for_stream (cairo_write_func_t write,
return (cairo_surface_t*) &_cairo_surface_nil;
}
- return _cairo_pdf_surface_create_for_stream_internal (stream, content,
+ return _cairo_pdf_surface_create_for_stream_internal (stream,
width_in_points,
height_in_points);
}
@@ -357,19 +349,11 @@ cairo_pdf_surface_create_for_stream (cairo_write_func_t write,
/**
* cairo_pdf_surface_create:
* @filename: a filename for the PDF output (must be writable)
- * @content: CAIRO_CONTENT_COLOR_ALPHA or CAIRO_CONTENT_COLOR
* @width_in_points: width of the surface, in points (1 point == 1/72.0 inch)
* @height_in_points: height of the surface, in points (1 point == 1/72.0 inch)
*
* Creates a PDF surface of the specified size in points to be written
* to @filename.
- *
- * The @content argument is used to specify whether the rendering
- * semantics should behave as if destination alpha is available. The
- * expectation is that the value for @content will be selected to
- * achieve consistent results with a display surface that either has
- * or does not have destination alpha (for example,
- * CAIRO_FORMAT_ARGB32 vs. CAIRO_FORMAT_RGB24).
*
* Return value: a pointer to the newly created surface. The caller
* owns the surface and should call cairo_surface_destroy when done
@@ -381,7 +365,6 @@ cairo_pdf_surface_create_for_stream (cairo_write_func_t write,
**/
cairo_surface_t *
cairo_pdf_surface_create (const char *filename,
- cairo_content_t content,
double width_in_points,
double height_in_points)
{
@@ -393,7 +376,7 @@ cairo_pdf_surface_create (const char *filename,
return (cairo_surface_t*) &_cairo_surface_nil;
}
- return _cairo_pdf_surface_create_for_stream_internal (stream, content,
+ return _cairo_pdf_surface_create_for_stream_internal (stream,
width_in_points,
height_in_points);
}
diff --git a/src/cairo-pdf.h b/src/cairo-pdf.h
index 1740a4700..abcab0f3f 100644
--- a/src/cairo-pdf.h
+++ b/src/cairo-pdf.h
@@ -45,14 +45,12 @@ CAIRO_BEGIN_DECLS
cairo_public cairo_surface_t *
cairo_pdf_surface_create (const char *filename,
- cairo_content_t content,
double width_in_points,
double height_in_points);
cairo_public cairo_surface_t *
cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func,
void *closure,
- cairo_content_t content,
double width_in_points,
double height_in_points);
diff --git a/src/cairo-ps-surface.c b/src/cairo-ps-surface.c
index 78e0aee01..6cf862170 100644
--- a/src/cairo-ps-surface.c
+++ b/src/cairo-ps-surface.c
@@ -122,7 +122,6 @@ _cairo_ps_surface_emit_footer (cairo_ps_surface_t *surface)
static cairo_surface_t *
_cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream,
- cairo_content_t content,
double width,
double height)
{
@@ -157,26 +156,19 @@ _cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream,
_cairo_ps_surface_emit_header (surface);
return _cairo_paginated_surface_create (&surface->base,
- content, width, height);
+ CAIRO_CONTENT_COLOR_ALPHA,
+ width, height);
}
/**
* cairo_ps_surface_create:
* @filename: a filename for the PS output (must be writable)
- * @content: CAIRO_CONTENT_COLOR_ALPHA or CAIRO_CONTENT_COLOR
* @width_in_points: width of the surface, in points (1 point == 1/72.0 inch)
* @height_in_points: height of the surface, in points (1 point == 1/72.0 inch)
*
* Creates a PostScript surface of the specified size in points to be
* written to @filename.
*
- * The @content argument is used to specify whether the rendering
- * semantics should behave as if destination alpha is available. The
- * expectation is that the value for @content will be selected to
- * achieve consistent results with a display surface that either has
- * or does not have destination alpha (for example,
- * CAIRO_FORMAT_ARGB32 vs. CAIRO_FORMAT_RGB24).
- *
* Return value: a pointer to the newly created surface. The caller
* owns the surface and should call cairo_surface_destroy when done
* with it.
@@ -187,7 +179,6 @@ _cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream,
**/
cairo_surface_t *
cairo_ps_surface_create (const char *filename,
- cairo_content_t content,
double width_in_points,
double height_in_points)
{
@@ -200,7 +191,6 @@ cairo_ps_surface_create (const char *filename,
}
return _cairo_ps_surface_create_for_stream_internal (stream,
- content,
width_in_points,
height_in_points);
}
@@ -209,7 +199,6 @@ cairo_ps_surface_create (const char *filename,
* cairo_ps_surface_create_for_stream:
* @write: a #cairo_write_func_t to accept the output data
* @closure: the closure argument for @write
- * @content: CAIRO_CONTENT_COLOR_ALPHA or CAIRO_CONTENT_COLOR
* @width_in_points: width of the surface, in points (1 point == 1/72.0 inch)
* @height_in_points: height of the surface, in points (1 point == 1/72.0 inch)
*
@@ -217,13 +206,6 @@ cairo_ps_surface_create (const char *filename,
* written incrementally to the stream represented by @write and
* @closure.
*
- * The @content argument is used to specify whether the rendering
- * semantics should behave as if destination alpha is available. The
- * expectation is that the value for @content will be selected to
- * achieve consistent results with a display surface that either has
- * or does not have destination alpha (for example,
- * CAIRO_FORMAT_ARGB32 vs. CAIRO_FORMAT_RGB24).
- *
* Return value: a pointer to the newly created surface. The caller
* owns the surface and should call cairo_surface_destroy when done
* with it.
@@ -235,7 +217,6 @@ cairo_ps_surface_create (const char *filename,
cairo_surface_t *
cairo_ps_surface_create_for_stream (cairo_write_func_t write_func,
void *closure,
- cairo_content_t content,
double width_in_points,
double height_in_points)
{
@@ -248,7 +229,6 @@ cairo_ps_surface_create_for_stream (cairo_write_func_t write_func,
}
return _cairo_ps_surface_create_for_stream_internal (stream,
- content,
width_in_points,
height_in_points);
}
diff --git a/src/cairo-ps.h b/src/cairo-ps.h
index b37c99656..0db0c0220 100644
--- a/src/cairo-ps.h
+++ b/src/cairo-ps.h
@@ -49,14 +49,12 @@ CAIRO_BEGIN_DECLS
cairo_public cairo_surface_t *
cairo_ps_surface_create (const char *filename,
- cairo_content_t content,
double width_in_points,
double height_in_points);
cairo_public cairo_surface_t *
cairo_ps_surface_create_for_stream (cairo_write_func_t write_func,
void *closure,
- cairo_content_t content,
double width_in_points,
double height_in_points);
diff --git a/test/cairo-test.c b/test/cairo-test.c
index 0f4a1b0a4..58ec000c5 100644
--- a/test/cairo-test.c
+++ b/test/cairo-test.c
@@ -1100,8 +1100,10 @@ cairo_user_data_key_t ps_closure_key;
typedef struct _ps_target_closure
{
- char *filename;
- int width, height;
+ char *filename;
+ int width;
+ int height;
+ cairo_surface_t *target;
} ps_target_closure_t;
static cairo_surface_t *
@@ -1116,24 +1118,35 @@ create_ps_surface (cairo_test_t *test,
/* Sanitize back to a real cairo_content_t value. */
if (content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED)
- content = CAIRO_CONTENT_COLOR_ALPHA;
+ content = CAIRO_CONTENT_COLOR_ALPHA;
*closure = ptc = xmalloc (sizeof (ps_target_closure_t));
- ptc->width = width;
- ptc->height = height;
-
xasprintf (&ptc->filename, "%s-ps-%s-out.ps",
test->name, _cairo_test_content_name (content));
- surface = cairo_ps_surface_create (ptc->filename, content, width, height);
+ ptc->width = width;
+ ptc->height = height;
+
+ surface = cairo_ps_surface_create (ptc->filename, width, height);
if (cairo_surface_status (surface)) {
free (ptc->filename);
free (ptc);
return NULL;
}
cairo_ps_surface_set_dpi (surface, 72., 72.);
+
+ if (content == CAIRO_CONTENT_COLOR) {
+ ptc->target = surface;
+ surface = cairo_surface_create_similar (ptc->target,
+ CAIRO_CONTENT_COLOR,
+ width, height);
+ } else {
+ ptc->target = NULL;
+ }
+
cairo_surface_set_user_data (surface, &ps_closure_key, ptc, NULL);
+
return surface;
}
@@ -1143,6 +1156,18 @@ ps_surface_write_to_png (cairo_surface_t *surface, const char *filename)
ps_target_closure_t *ptc = cairo_surface_get_user_data (surface, &ps_closure_key);
char command[4096];
+ if (ptc->target) {
+ cairo_t *cr;
+ cr = cairo_create (ptc->target);
+ cairo_set_source_surface (cr, surface, 0, 0);
+ cairo_paint (cr);
+ cairo_show_page (cr);
+ cairo_destroy (cr);
+
+ cairo_surface_finish (surface);
+ surface = ptc->target;
+ }
+
cairo_surface_finish (surface);
sprintf (command, "gs -q -r72 -g%dx%d -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -sOutputFile=%s %s",
ptc->width, ptc->height, filename, ptc->filename);
@@ -1167,9 +1192,10 @@ cairo_user_data_key_t pdf_closure_key;
typedef struct _pdf_target_closure
{
- char *filename;
- int width;
- int height;
+ char *filename;
+ int width;
+ int height;
+ cairo_surface_t *target;
} pdf_target_closure_t;
static cairo_surface_t *
@@ -1194,14 +1220,25 @@ create_pdf_surface (cairo_test_t *test,
xasprintf (&ptc->filename, "%s-pdf-%s-out.pdf",
test->name, _cairo_test_content_name (content));
- surface = cairo_pdf_surface_create (ptc->filename, content, width, height);
+ surface = cairo_pdf_surface_create (ptc->filename, width, height);
if (cairo_surface_status (surface)) {
free (ptc->filename);
free (ptc);
return NULL;
}
cairo_pdf_surface_set_dpi (surface, 72., 72.);
+
+ if (content == CAIRO_CONTENT_COLOR) {
+ ptc->target = surface;
+ surface = cairo_surface_create_similar (ptc->target,
+ CAIRO_CONTENT_COLOR,
+ width, height);
+ } else {
+ ptc->target = NULL;
+ }
+
cairo_surface_set_user_data (surface, &pdf_closure_key, ptc, NULL);
+
return surface;
}
@@ -1211,6 +1248,18 @@ pdf_surface_write_to_png (cairo_surface_t *surface, const char *filename)
pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, &pdf_closure_key);
char command[4096];
+ if (ptc->target) {
+ cairo_t *cr;
+ cr = cairo_create (ptc->target);
+ cairo_set_source_surface (cr, surface, 0, 0);
+ cairo_paint (cr);
+ cairo_show_page (cr);
+ cairo_destroy (cr);
+
+ cairo_surface_finish (surface);
+ surface = ptc->target;
+ }
+
cairo_surface_finish (surface);
sprintf (command, "./pdf2png %s %s 1",
ptc->filename, filename);
diff --git a/test/multi-page.c b/test/multi-page.c
index 9e28c3247..f6780b493 100644
--- a/test/multi-page.c
+++ b/test/multi-page.c
@@ -139,7 +139,7 @@ main (void)
#if CAIRO_HAS_PS_SURFACE
filename = "multi-page.ps";
- surface = cairo_ps_surface_create (filename, CAIRO_CONTENT_COLOR,
+ surface = cairo_ps_surface_create (filename,
WIDTH_IN_POINTS, HEIGHT_IN_POINTS);
status = cairo_surface_status (surface);
if (status) {
@@ -158,7 +158,7 @@ main (void)
#if CAIRO_HAS_PDF_SURFACE
filename = "multi-page.pdf";
- surface = cairo_pdf_surface_create (filename, CAIRO_CONTENT_COLOR,
+ surface = cairo_pdf_surface_create (filename,
WIDTH_IN_POINTS, HEIGHT_IN_POINTS);
status = cairo_surface_status (surface);
if (status) {