mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-01-04 16:50:19 +01:00
[boilerplate] Strip pdf boilerplate into cairo-boilerplate-pdf*
This commit is contained in:
parent
d9ce7de575
commit
8c9960675b
4 changed files with 186 additions and 108 deletions
|
|
@ -19,6 +19,11 @@ libcairoboilerplate_la_SOURCES += cairo-boilerplate-directfb.c
|
|||
libcairoboilerplate_la_SOURCES += cairo-boilerplate-directfb-private.h
|
||||
endif
|
||||
|
||||
if CAIRO_HAS_PDF_SURFACE
|
||||
libcairoboilerplate_la_SOURCES += cairo-boilerplate-pdf.c
|
||||
libcairoboilerplate_la_SOURCES += cairo-boilerplate-pdf-private.h
|
||||
endif
|
||||
|
||||
if CAIRO_HAS_PS_SURFACE
|
||||
libcairoboilerplate_la_SOURCES += cairo-boilerplate-ps.c
|
||||
libcairoboilerplate_la_SOURCES += cairo-boilerplate-ps-private.h
|
||||
|
|
|
|||
44
boilerplate/cairo-boilerplate-pdf-private.h
Normal file
44
boilerplate/cairo-boilerplate-pdf-private.h
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
|
||||
/*
|
||||
* Copyright © 2004,2006 Red Hat, Inc.
|
||||
*
|
||||
* 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
|
||||
* Red Hat, Inc. not be used in advertising or publicity pertaining to
|
||||
* distribution of the software without specific, written prior
|
||||
* permission. Red Hat, Inc. makes no representations about the
|
||||
* suitability of this software for any purpose. It is provided "as
|
||||
* is" without express or implied warranty.
|
||||
*
|
||||
* RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
||||
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS, IN NO EVENT SHALL RED HAT, INC. 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.
|
||||
*
|
||||
* Author: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#ifndef _CAIRO_BOILERPLATE_PDF_PRIVATE_H_
|
||||
#define _CAIRO_BOILERPLATE_PDF_PRIVATE_H_
|
||||
|
||||
cairo_surface_t *
|
||||
_cairo_boilerplate_pdf_create_surface (const char *name,
|
||||
cairo_content_t content,
|
||||
int width,
|
||||
int height,
|
||||
cairo_boilerplate_mode_t mode,
|
||||
void **closure);
|
||||
|
||||
void
|
||||
_cairo_boilerplate_pdf_cleanup (void *closure);
|
||||
|
||||
cairo_status_t
|
||||
_cairo_boilerplate_pdf_surface_write_to_png (cairo_surface_t *surface, const char *filename);
|
||||
|
||||
#endif
|
||||
134
boilerplate/cairo-boilerplate-pdf.c
Normal file
134
boilerplate/cairo-boilerplate-pdf.c
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
|
||||
/*
|
||||
* Copyright © 2004,2006 Red Hat, Inc.
|
||||
*
|
||||
* 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
|
||||
* Red Hat, Inc. not be used in advertising or publicity pertaining to
|
||||
* distribution of the software without specific, written prior
|
||||
* permission. Red Hat, Inc. makes no representations about the
|
||||
* suitability of this software for any purpose. It is provided "as
|
||||
* is" without express or implied warranty.
|
||||
*
|
||||
* RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
||||
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS, IN NO EVENT SHALL RED HAT, INC. 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.
|
||||
*
|
||||
* Author: Carl D. Worth <cworth@cworth.org>
|
||||
*/
|
||||
|
||||
#include "cairo-boilerplate.h"
|
||||
#include "cairo-boilerplate-pdf-private.h"
|
||||
|
||||
#include "cairo-pdf.h"
|
||||
|
||||
cairo_user_data_key_t pdf_closure_key;
|
||||
|
||||
typedef struct _pdf_target_closure
|
||||
{
|
||||
char *filename;
|
||||
int width;
|
||||
int height;
|
||||
cairo_surface_t *target;
|
||||
} pdf_target_closure_t;
|
||||
|
||||
cairo_surface_t *
|
||||
_cairo_boilerplate_pdf_create_surface (const char *name,
|
||||
cairo_content_t content,
|
||||
int width,
|
||||
int height,
|
||||
cairo_boilerplate_mode_t mode,
|
||||
void **closure)
|
||||
{
|
||||
pdf_target_closure_t *ptc;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
/* Sanitize back to a real cairo_content_t value. */
|
||||
if (content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED)
|
||||
content = CAIRO_CONTENT_COLOR_ALPHA;
|
||||
|
||||
*closure = ptc = xmalloc (sizeof (pdf_target_closure_t));
|
||||
|
||||
ptc->width = width;
|
||||
ptc->height = height;
|
||||
|
||||
xasprintf (&ptc->filename, "%s-pdf-%s-out.pdf",
|
||||
name, cairo_boilerplate_content_name (content));
|
||||
|
||||
surface = cairo_pdf_surface_create (ptc->filename, width, height);
|
||||
if (cairo_surface_status (surface)) {
|
||||
free (ptc->filename);
|
||||
free (ptc);
|
||||
return NULL;
|
||||
}
|
||||
cairo_surface_set_fallback_resolution (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_boilerplate_surface_set_user_data (surface,
|
||||
&pdf_closure_key,
|
||||
ptc, NULL);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
cairo_status_t
|
||||
_cairo_boilerplate_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];
|
||||
|
||||
/* Both surface and ptc->target were originally created at the
|
||||
* same dimensions. We want a 1:1 copy here, so we first clear any
|
||||
* device offset on surface.
|
||||
*
|
||||
* In a more realistic use case of device offsets, the target of
|
||||
* this copying would be of a different size than the source, and
|
||||
* the offset would be desirable during the copy operation. */
|
||||
cairo_surface_set_device_offset (surface, 0, 0);
|
||||
|
||||
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);
|
||||
|
||||
if (system (command) != 0)
|
||||
return CAIRO_STATUS_WRITE_ERROR;
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
void
|
||||
_cairo_boilerplate_pdf_cleanup (void *closure)
|
||||
{
|
||||
pdf_target_closure_t *ptc = closure;
|
||||
if (ptc->target)
|
||||
cairo_surface_destroy (ptc->target);
|
||||
free (ptc->filename);
|
||||
free (ptc);
|
||||
}
|
||||
|
|
@ -50,6 +50,9 @@
|
|||
#if CAIRO_HAS_DIRECTFB_SURFACE
|
||||
#include "cairo-boilerplate-directfb-private.h"
|
||||
#endif
|
||||
#if CAIRO_HAS_PDF_SURFACE
|
||||
#include "cairo-boilerplate-pdf-private.h"
|
||||
#endif
|
||||
#if CAIRO_HAS_PS_SURFACE
|
||||
#include "cairo-boilerplate-ps-private.h"
|
||||
#endif
|
||||
|
|
@ -835,114 +838,6 @@ _cairo_boilerplate_xcb_cleanup (void *closure)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if CAIRO_HAS_PDF_SURFACE && CAIRO_CAN_TEST_PDF_SURFACE
|
||||
#include "cairo-pdf.h"
|
||||
|
||||
cairo_user_data_key_t pdf_closure_key;
|
||||
|
||||
typedef struct _pdf_target_closure
|
||||
{
|
||||
char *filename;
|
||||
int width;
|
||||
int height;
|
||||
cairo_surface_t *target;
|
||||
} pdf_target_closure_t;
|
||||
|
||||
static cairo_surface_t *
|
||||
_cairo_boilerplate_pdf_create_surface (const char *name,
|
||||
cairo_content_t content,
|
||||
int width,
|
||||
int height,
|
||||
cairo_boilerplate_mode_t mode,
|
||||
void **closure)
|
||||
{
|
||||
pdf_target_closure_t *ptc;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
/* Sanitize back to a real cairo_content_t value. */
|
||||
if (content == CAIRO_TEST_CONTENT_COLOR_ALPHA_FLATTENED)
|
||||
content = CAIRO_CONTENT_COLOR_ALPHA;
|
||||
|
||||
*closure = ptc = xmalloc (sizeof (pdf_target_closure_t));
|
||||
|
||||
ptc->width = width;
|
||||
ptc->height = height;
|
||||
|
||||
xasprintf (&ptc->filename, "%s-pdf-%s-out.pdf",
|
||||
name, cairo_boilerplate_content_name (content));
|
||||
|
||||
surface = cairo_pdf_surface_create (ptc->filename, width, height);
|
||||
if (cairo_surface_status (surface)) {
|
||||
free (ptc->filename);
|
||||
free (ptc);
|
||||
return NULL;
|
||||
}
|
||||
cairo_surface_set_fallback_resolution (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_boilerplate_surface_set_user_data (surface,
|
||||
&pdf_closure_key,
|
||||
ptc, NULL);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
static cairo_status_t
|
||||
_cairo_boilerplate_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];
|
||||
|
||||
/* Both surface and ptc->target were originally created at the
|
||||
* same dimensions. We want a 1:1 copy here, so we first clear any
|
||||
* device offset on surface.
|
||||
*
|
||||
* In a more realistic use case of device offsets, the target of
|
||||
* this copying would be of a different size than the source, and
|
||||
* the offset would be desirable during the copy operation. */
|
||||
cairo_surface_set_device_offset (surface, 0, 0);
|
||||
|
||||
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);
|
||||
|
||||
if (system (command) != 0)
|
||||
return CAIRO_STATUS_WRITE_ERROR;
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
_cairo_boilerplate_pdf_cleanup (void *closure)
|
||||
{
|
||||
pdf_target_closure_t *ptc = closure;
|
||||
if (ptc->target)
|
||||
cairo_surface_destroy (ptc->target);
|
||||
free (ptc->filename);
|
||||
free (ptc);
|
||||
}
|
||||
#endif /* CAIRO_HAS_PDF_SURFACE && CAIRO_CAN_TEST_PDF_SURFACE */
|
||||
|
||||
#if CAIRO_HAS_SVG_SURFACE && CAIRO_CAN_TEST_SVG_SURFACE
|
||||
#include "cairo-svg.h"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue