Blame cairomm/surface.cc

Packit Service e3b512
/* Copyright (C) 2005 The cairomm Development Team
Packit Service e3b512
 *
Packit Service e3b512
 * This library is free software; you can redistribute it and/or
Packit Service e3b512
 * modify it under the terms of the GNU Library General Public
Packit Service e3b512
 * License as published by the Free Software Foundation; either
Packit Service e3b512
 * version 2 of the License, or (at your option) any later version.
Packit Service e3b512
 *
Packit Service e3b512
 * This library is distributed in the hope that it will be useful,
Packit Service e3b512
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service e3b512
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service e3b512
 * Library General Public License for more details.
Packit Service e3b512
 *
Packit Service e3b512
 * You should have received a copy of the GNU Library General Public
Packit Service e3b512
 * License along with this library; if not, write to the Free Software
Packit Service e3b512
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service e3b512
 * 02110-1301, USA.
Packit Service e3b512
 */
Packit Service e3b512
Packit Service e3b512
#include <cairomm/surface.h>
Packit Service e3b512
#include <cairomm/script.h>
Packit Service e3b512
#include <cairomm/private.h>
Packit Service e3b512
Packit Service e3b512
namespace Cairo
Packit Service e3b512
{
Packit Service e3b512
Packit Service e3b512
static cairo_user_data_key_t USER_DATA_KEY_WRITE_FUNC = {0};
Packit Service e3b512
static cairo_user_data_key_t USER_DATA_KEY_READ_FUNC = {0};
Packit Service e3b512
Packit Service e3b512
static void
Packit Service e3b512
free_slot(void* data)
Packit Service e3b512
{
Packit Service e3b512
  auto slot = static_cast<Surface::SlotWriteFunc*>(data);
Packit Service e3b512
  delete slot;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
static Surface::SlotWriteFunc*
Packit Service e3b512
get_slot(cairo_surface_t* surface) {
Packit Service e3b512
  return static_cast<Surface::SlotWriteFunc*>(cairo_surface_get_user_data(surface,
Packit Service e3b512
                                                                 &USER_DATA_KEY_WRITE_FUNC));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
static void
Packit Service e3b512
set_read_slot(cairo_surface_t* surface, Surface::SlotReadFunc* slot) {
Packit Service e3b512
  // the slot will automatically be freed by free_slot() when the underlying C
Packit Service e3b512
  // instance is destroyed
Packit Service e3b512
  cairo_surface_set_user_data(surface, &USER_DATA_KEY_READ_FUNC, slot, &free_slot);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
static void
Packit Service e3b512
set_write_slot(cairo_surface_t* surface, Surface::SlotWriteFunc* slot) {
Packit Service e3b512
  // the slot will automatically be freed by free_slot() when the underlying C
Packit Service e3b512
  // instance is destroyed
Packit Service e3b512
  cairo_surface_set_user_data(surface, &USER_DATA_KEY_WRITE_FUNC, slot, &free_slot);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
cairo_status_t read_func_wrapper(void* closure, unsigned char* data, unsigned int length)
Packit Service e3b512
{
Packit Service e3b512
  if (!closure)
Packit Service e3b512
    return CAIRO_STATUS_READ_ERROR;
Packit Service e3b512
  auto read_func = static_cast<Surface::SlotReadFunc*>(closure);
Packit Service e3b512
  return static_cast<cairo_status_t>((*read_func)(data, length));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
cairo_status_t write_func_wrapper(void* closure, const unsigned char* data, unsigned int length)
Packit Service e3b512
{
Packit Service e3b512
  if (!closure)
Packit Service e3b512
    return CAIRO_STATUS_WRITE_ERROR;
Packit Service e3b512
  auto write_func = static_cast<Surface::SlotWriteFunc*>(closure);
Packit Service e3b512
  return static_cast<cairo_status_t>((*write_func)(data, length));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Surface::Surface(cairo_surface_t* cobject, bool has_reference)
Packit Service e3b512
: m_cobject(nullptr)
Packit Service e3b512
{
Packit Service e3b512
  if(has_reference)
Packit Service e3b512
    m_cobject = cobject;
Packit Service e3b512
  else
Packit Service e3b512
    m_cobject = cairo_surface_reference(cobject);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Surface::~Surface()
Packit Service e3b512
{
Packit Service e3b512
  if(m_cobject)
Packit Service e3b512
    cairo_surface_destroy(m_cobject);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::finish()
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_finish(cobj());
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
const unsigned char* Surface::get_mime_data(const std::string& mime_type, unsigned long& length)
Packit Service e3b512
{
Packit Service e3b512
  const unsigned char* data = nullptr;
Packit Service e3b512
  cairo_surface_get_mime_data(const_cast<cobject*>(cobj()), mime_type.c_str(), &data, &length);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
  return data;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
static void on_cairo_destroy(void *data)
Packit Service e3b512
{
Packit Service e3b512
  auto slot = static_cast<Surface::SlotDestroy*>(data);
Packit Service e3b512
  if(!slot)
Packit Service e3b512
    return;
Packit Service e3b512
Packit Service e3b512
  (*slot)();
Packit Service e3b512
  delete slot;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::set_mime_data(const std::string& mime_type, unsigned char* data, unsigned long length, const SlotDestroy& slot_destroy)
Packit Service e3b512
{
Packit Service e3b512
  auto copy = new SlotDestroy(slot_destroy); //Deleted when the callback is called once.
Packit Service e3b512
  cairo_surface_set_mime_data(const_cast<cobject*>(cobj()), mime_type.c_str(), data, length,
Packit Service e3b512
    &on_cairo_destroy, copy);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::unset_mime_data(const std::string& mime_type)
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_set_mime_data(const_cast<cobject*>(cobj()), mime_type.c_str(),
Packit Service e3b512
    0, 0, 0, 0);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::get_font_options(FontOptions& options) const
Packit Service e3b512
{
Packit Service e3b512
  auto cfontoptions = cairo_font_options_create();
Packit Service e3b512
  cairo_surface_get_font_options(const_cast<cobject*>(cobj()), cfontoptions);
Packit Service e3b512
  options = FontOptions(cfontoptions);
Packit Service e3b512
  cairo_font_options_destroy(cfontoptions);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::flush()
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_flush(cobj());
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::mark_dirty()
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_mark_dirty(cobj());
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::mark_dirty(int x, int y, int width, int height)
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_mark_dirty_rectangle(cobj(), x, y, width, height);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::set_device_offset(double x_offset, double y_offset)
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_set_device_offset(cobj(), x_offset, y_offset);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::get_device_offset(double& x_offset, double& y_offset) const
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_get_device_offset(const_cast<cobject*>(cobj()), &x_offset, &y_offset);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::set_fallback_resolution(double x_pixels_per_inch, double y_pixels_per_inch)
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_set_fallback_resolution(cobj(), x_pixels_per_inch, y_pixels_per_inch);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::get_fallback_resolution(double& x_pixels_per_inch,
Packit Service e3b512
                                      double& y_pixels_per_inch) const
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_get_fallback_resolution(const_cast<cairo_surface_t*>(cobj()),
Packit Service e3b512
                                        &x_pixels_per_inch,
Packit Service e3b512
                                        &y_pixels_per_inch);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
SurfaceType Surface::get_type() const
Packit Service e3b512
{
Packit Service e3b512
  auto surface_type =
Packit Service e3b512
    cairo_surface_get_type(const_cast<cobject*>(cobj()));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
  return static_cast<SurfaceType>(surface_type);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Content Surface::get_content() const
Packit Service e3b512
{
Packit Service e3b512
  auto content = cairo_surface_get_content(const_cast<cairo_surface_t*>(cobj()));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
  return static_cast<Content>(content);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::copy_page()
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_copy_page(cobj());
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::show_page()
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_show_page(cobj());
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
bool Surface::has_show_text_glyphs() const
Packit Service e3b512
{
Packit Service e3b512
  bool result = cairo_surface_has_show_text_glyphs(const_cast<cairo_surface_t*>(cobj()));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
  return result;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
#ifdef CAIRO_HAS_PNG_FUNCTIONS
Packit Service e3b512
void Surface::write_to_png(const std::string& filename)
Packit Service e3b512
{
Packit Service e3b512
  auto status = cairo_surface_write_to_png(cobj(), filename.c_str());
Packit Service e3b512
  check_status_and_throw_exception(status);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::write_to_png_stream(const SlotWriteFunc& write_func)
Packit Service e3b512
{
Packit Service e3b512
  auto old_slot = get_slot(cobj());
Packit Service e3b512
  if (old_slot)
Packit Service e3b512
    delete old_slot;
Packit Service e3b512
  auto slot_copy = new SlotWriteFunc(write_func);
Packit Service e3b512
  set_write_slot(cobj(), slot_copy);
Packit Service e3b512
  auto status = cairo_surface_write_to_png_stream(cobj(),
Packit Service e3b512
                                                         &write_func_wrapper,
Packit Service e3b512
                                                         slot_copy /*closure*/);
Packit Service e3b512
  check_status_and_throw_exception(status);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::write_to_png(cairo_write_func_t write_func, void *closure)
Packit Service e3b512
{
Packit Service e3b512
  auto status = cairo_surface_write_to_png_stream(cobj(), write_func, closure);
Packit Service e3b512
  check_status_and_throw_exception(status);
Packit Service e3b512
}
Packit Service e3b512
#endif
Packit Service e3b512
Packit Service e3b512
RefPtr<Device> Surface::get_device()
Packit Service e3b512
{
Packit Service e3b512
  auto *d = cairo_surface_get_device (m_cobject);
Packit Service e3b512
Packit Service e3b512
  if (!d)
Packit Service e3b512
    return RefPtr<Device>();
Packit Service e3b512
Packit Service e3b512
  auto surface_type = cairo_surface_get_type(m_cobject);
Packit Service e3b512
  switch (surface_type)
Packit Service e3b512
  {
Packit Service e3b512
#if CAIRO_HAS_SCRIPT_SURFACE
Packit Service e3b512
    case CAIRO_SURFACE_TYPE_SCRIPT:
Packit Service e3b512
      return RefPtr<Script>(new Script(d, true /* has reference */));
Packit Service e3b512
      break;
Packit Service e3b512
#endif
Packit Service e3b512
    default:
Packit Service e3b512
      return RefPtr<Device>(new Device(d, true /* has reference */));
Packit Service e3b512
  }
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::reference() const
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_reference(const_cast<cobject*>(cobj()));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Surface::unreference() const
Packit Service e3b512
{
Packit Service e3b512
  cairo_surface_destroy(const_cast<cobject*>(cobj()));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<Surface> Surface::create(const RefPtr<Surface> other, Content content, int width, int height)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_surface_create_similar(other->cobj(), (cairo_content_t)content, width, height);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<Surface>(new Surface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<Surface> Surface::create(const RefPtr<Surface>& target, double x, double y, double width, double height)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_surface_create_for_rectangle(target->cobj(), x, y, width, height);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<Surface>(new Surface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
ImageSurface::ImageSurface(cairo_surface_t* cobject, bool has_reference)
Packit Service e3b512
: Surface(cobject, has_reference)
Packit Service e3b512
{ }
Packit Service e3b512
Packit Service e3b512
ImageSurface::~ImageSurface()
Packit Service e3b512
{
Packit Service e3b512
  // surface is destroyed in base class
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<ImageSurface> ImageSurface::create(Format format, int width, int height)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_image_surface_create((cairo_format_t)format, width, height);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<ImageSurface>(new ImageSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<ImageSurface> ImageSurface::create(unsigned char* data, Format format, int width, int height, int stride)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_image_surface_create_for_data(data, (cairo_format_t)format, width, height, stride);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<ImageSurface>(new ImageSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
#ifdef CAIRO_HAS_PNG_FUNCTIONS
Packit Service e3b512
Packit Service e3b512
RefPtr<ImageSurface> ImageSurface::create_from_png(std::string filename)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_image_surface_create_from_png(filename.c_str());
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<ImageSurface>(new ImageSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<ImageSurface> ImageSurface::create_from_png_stream(const SlotReadFunc& read_func)
Packit Service e3b512
{
Packit Service e3b512
  auto slot_copy = new SlotReadFunc(read_func);
Packit Service e3b512
  auto cobject =
Packit Service e3b512
    cairo_image_surface_create_from_png_stream(&read_func_wrapper, slot_copy);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  set_read_slot(cobject, slot_copy);
Packit Service e3b512
  return RefPtr<ImageSurface>(new ImageSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<ImageSurface> ImageSurface::create_from_png(cairo_read_func_t read_func, void *closure)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_image_surface_create_from_png_stream(read_func, closure);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<ImageSurface>(new ImageSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
#endif // CAIRO_HAS_PNG_FUNCTIONS
Packit Service e3b512
Packit Service e3b512
int ImageSurface::get_width() const
Packit Service e3b512
{
Packit Service e3b512
  const auto result =
Packit Service e3b512
    cairo_image_surface_get_width(const_cast<cobject*>(cobj()));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
  return result;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
int ImageSurface::get_height() const
Packit Service e3b512
{
Packit Service e3b512
  const auto result =
Packit Service e3b512
    cairo_image_surface_get_height(const_cast<cobject*>(cobj()));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
  return result;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
unsigned char* ImageSurface::get_data()
Packit Service e3b512
{
Packit Service e3b512
  return cairo_image_surface_get_data(cobj());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
const unsigned char* ImageSurface::get_data() const
Packit Service e3b512
{
Packit Service e3b512
  return cairo_image_surface_get_data(const_cast<cobject*>(cobj()));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Format ImageSurface::get_format() const
Packit Service e3b512
{
Packit Service e3b512
  return static_cast<Format>(cairo_image_surface_get_format(const_cast<cobject*>(cobj())));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
int ImageSurface::get_stride() const
Packit Service e3b512
{
Packit Service e3b512
  return cairo_image_surface_get_stride(const_cast<cobject*>(cobj()));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
int ImageSurface::format_stride_for_width (Cairo::Format format, int width)
Packit Service e3b512
{
Packit Service e3b512
  return cairo_format_stride_for_width(static_cast<cairo_format_t>(format), width);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
/*******************************************************************************
Packit Service e3b512
 * THE FOLLOWING SURFACE TYPES ARE EXPERIMENTAL AND NOT FULLY SUPPORTED
Packit Service e3b512
 ******************************************************************************/
Packit Service e3b512
Packit Service e3b512
#ifdef CAIRO_HAS_PDF_SURFACE
Packit Service e3b512
Packit Service e3b512
PdfSurface::PdfSurface(cairo_surface_t* cobject, bool has_reference) :
Packit Service e3b512
    Surface(cobject, has_reference)
Packit Service e3b512
{}
Packit Service e3b512
Packit Service e3b512
PdfSurface::~PdfSurface()
Packit Service e3b512
{
Packit Service e3b512
  // surface is destroyed in base class
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<PdfSurface> PdfSurface::create(std::string filename, double width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_pdf_surface_create(filename.c_str(), width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<PdfSurface>(new PdfSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<PdfSurface> PdfSurface::create(cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_pdf_surface_create_for_stream(write_func, closure, width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<PdfSurface>(new PdfSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<PdfSurface> PdfSurface::create_for_stream(const SlotWriteFunc& write_func, double
Packit Service e3b512
                                                 width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto slot_copy = new SlotWriteFunc(write_func);
Packit Service e3b512
  auto cobject =
Packit Service e3b512
    cairo_pdf_surface_create_for_stream(write_func_wrapper, slot_copy,
Packit Service e3b512
                                        width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  set_write_slot(cobject, slot_copy);
Packit Service e3b512
  return RefPtr<PdfSurface>(new PdfSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void PdfSurface::set_size(double width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  cairo_pdf_surface_set_size(cobj(), width_in_points, height_in_points);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void PdfSurface::restrict_to_version(PdfVersion version)
Packit Service e3b512
{
Packit Service e3b512
  cairo_pdf_surface_restrict_to_version(cobj(), static_cast<cairo_pdf_version_t>(version));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
const std::vector<PdfVersion> PdfSurface::get_versions()
Packit Service e3b512
{
Packit Service e3b512
  cairo_pdf_version_t const *versions;
Packit Service e3b512
  int num_versions;
Packit Service e3b512
  cairo_pdf_get_versions(&versions, &num_versions);
Packit Service e3b512
Packit Service e3b512
  // Just copy the version array out into a std::vector.
Packit Service e3b512
  std::vector<PdfVersion> vec;
Packit Service e3b512
  for (int i = 0; i < num_versions; ++i)
Packit Service e3b512
  {
Packit Service e3b512
    vec.push_back(static_cast<PdfVersion>(versions[i]));
Packit Service e3b512
  }
Packit Service e3b512
  return vec;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
std::string PdfSurface::version_to_string(PdfVersion version)
Packit Service e3b512
{
Packit Service e3b512
  const char *cstring = cairo_pdf_version_to_string(static_cast<cairo_pdf_version_t>(version));
Packit Service e3b512
  return cstring ? std::string(cstring) : std::string();
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
#endif // CAIRO_HAS_PDF_SURFACE
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
#ifdef CAIRO_HAS_PS_SURFACE
Packit Service e3b512
Packit Service e3b512
PsSurface::PsSurface(cairo_surface_t* cobject, bool has_reference) :
Packit Service e3b512
    Surface(cobject, has_reference)
Packit Service e3b512
{}
Packit Service e3b512
Packit Service e3b512
PsSurface::~PsSurface()
Packit Service e3b512
{
Packit Service e3b512
  // surface is destroyed in base class
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<PsSurface> PsSurface::create(std::string filename, double width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_ps_surface_create(filename.c_str(), width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<PsSurface>(new PsSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<PsSurface> PsSurface::create_for_stream(const SlotWriteFunc& write_func, double
Packit Service e3b512
                                               width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto slot_copy = new SlotWriteFunc(write_func);
Packit Service e3b512
  auto cobject =
Packit Service e3b512
    cairo_ps_surface_create_for_stream(write_func_wrapper, slot_copy,
Packit Service e3b512
                                       width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  set_write_slot(cobject, slot_copy);
Packit Service e3b512
  return RefPtr<PsSurface>(new PsSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<PsSurface> PsSurface::create(cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_ps_surface_create_for_stream(write_func, closure, width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<PsSurface>(new PsSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void PsSurface::set_size(double width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  cairo_ps_surface_set_size(cobj(), width_in_points, height_in_points);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
void PsSurface::dsc_comment(std::string comment)
Packit Service e3b512
{
Packit Service e3b512
  cairo_ps_surface_dsc_comment(cobj(), comment.c_str());
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void PsSurface::dsc_begin_setup()
Packit Service e3b512
{
Packit Service e3b512
  cairo_ps_surface_dsc_begin_setup(cobj());
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void PsSurface::dsc_begin_page_setup()
Packit Service e3b512
{
Packit Service e3b512
  cairo_ps_surface_dsc_begin_page_setup(cobj());
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
bool PsSurface::get_eps() const
Packit Service e3b512
{
Packit Service e3b512
  auto result = cairo_ps_surface_get_eps(const_cast<cairo_surface_t*>(cobj()));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
  return result;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void PsSurface::set_eps(bool eps)
Packit Service e3b512
{
Packit Service e3b512
  cairo_ps_surface_set_eps(cobj(), eps);
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void PsSurface::restrict_to_level(PsLevel level)
Packit Service e3b512
{
Packit Service e3b512
  cairo_ps_surface_restrict_to_level(cobj(), static_cast<cairo_ps_level_t>(level));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
const std::vector<PsLevel> PsSurface::get_levels()
Packit Service e3b512
{
Packit Service e3b512
  cairo_ps_level_t const *levels;
Packit Service e3b512
  int num_levels;
Packit Service e3b512
  cairo_ps_get_levels(&levels, &num_levels);
Packit Service e3b512
Packit Service e3b512
  // Just copy the level array out into a std::vector.  This is a rarely used
Packit Service e3b512
  // function and the array of levels is going to be very small, so there's no
Packit Service e3b512
  // real performance hit.
Packit Service e3b512
  std::vector<PsLevel> vec;
Packit Service e3b512
  for (int i = 0; i < num_levels; ++i)
Packit Service e3b512
  {
Packit Service e3b512
    vec.push_back(static_cast<PsLevel>(levels[i]));
Packit Service e3b512
  }
Packit Service e3b512
  return vec;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
std::string PsSurface::level_to_string(PsLevel level)
Packit Service e3b512
{
Packit Service e3b512
  return std::string(cairo_ps_level_to_string(static_cast<cairo_ps_level_t>(level)));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
#endif // CAIRO_HAS_PS_SURFACE
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
#ifdef CAIRO_HAS_SVG_SURFACE
Packit Service e3b512
Packit Service e3b512
SvgSurface::SvgSurface(cairo_surface_t* cobject, bool has_reference) :
Packit Service e3b512
    Surface(cobject, has_reference)
Packit Service e3b512
{}
Packit Service e3b512
Packit Service e3b512
SvgSurface::~SvgSurface()
Packit Service e3b512
{
Packit Service e3b512
  // surface is destroyed in base class
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<SvgSurface> SvgSurface::create(std::string filename, double width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_svg_surface_create(filename.c_str(), width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<SvgSurface>(new SvgSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<SvgSurface> SvgSurface::create_for_stream(const SlotWriteFunc& write_func,
Packit Service e3b512
                                                 double width_in_points,
Packit Service e3b512
                                                 double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto slot_copy = new SlotWriteFunc(write_func);
Packit Service e3b512
  auto cobject =
Packit Service e3b512
    cairo_svg_surface_create_for_stream(write_func_wrapper, slot_copy,
Packit Service e3b512
                                        width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  set_write_slot(cobject, slot_copy);
Packit Service e3b512
  return RefPtr<SvgSurface>(new SvgSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<SvgSurface> SvgSurface::create(cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_svg_surface_create_for_stream(write_func, closure, width_in_points, height_in_points);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<SvgSurface>(new SvgSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void SvgSurface::restrict_to_version(SvgVersion version)
Packit Service e3b512
{
Packit Service e3b512
  cairo_svg_surface_restrict_to_version(cobj(), static_cast<cairo_svg_version_t>(version));
Packit Service e3b512
  check_object_status_and_throw_exception(*this);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
const std::vector<SvgVersion> SvgSurface::get_versions()
Packit Service e3b512
{
Packit Service e3b512
  cairo_svg_version_t const *versions;
Packit Service e3b512
  int num_versions;
Packit Service e3b512
  cairo_svg_get_versions(&versions, &num_versions);
Packit Service e3b512
Packit Service e3b512
  // Just copy the version array out into a std::vector.  This is a rarely used
Packit Service e3b512
  // function and the array of versions is going to be very small, so there's no
Packit Service e3b512
  // real performance hit.
Packit Service e3b512
  std::vector<SvgVersion> vec;
Packit Service e3b512
  for (int i = 0; i < num_versions; ++i)
Packit Service e3b512
  {
Packit Service e3b512
    vec.push_back(static_cast<SvgVersion>(versions[i]));
Packit Service e3b512
  }
Packit Service e3b512
  return vec;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
std::string SvgSurface::version_to_string(SvgVersion version)
Packit Service e3b512
{
Packit Service e3b512
  return std::string(cairo_svg_version_to_string(static_cast<cairo_svg_version_t>(version)));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
#endif // CAIRO_HAS_SVG_SURFACE
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
Packit Service e3b512
#ifdef CAIRO_HAS_GLITZ_SURFACE
Packit Service e3b512
Packit Service e3b512
GlitzSurface::GlitzSurface(cairo_surface_t* cobject, bool has_reference)
Packit Service e3b512
: Surface(cobject, has_reference)
Packit Service e3b512
{ }
Packit Service e3b512
Packit Service e3b512
GlitzSurface::~GlitzSurface()
Packit Service e3b512
{
Packit Service e3b512
  // surface is destroyed in base class
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<GlitzSurface> GlitzSurface::create(glitz_surface_t *surface)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_glitz_surface_create(surface);
Packit Service e3b512
  check_status_and_throw_exception(cairo_surface_status(cobject));
Packit Service e3b512
  return RefPtr<GlitzSurface>(new GlitzSurface(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
#endif // CAIRO_HAS_GLITZ_SURFACE
Packit Service e3b512
Packit Service e3b512
} //namespace Cairo
Packit Service e3b512
Packit Service e3b512
// vim: ts=2 sw=2 et