Blame cairomm/script.cc

Packit 908522
/* Copyright (C) 2014 The cairomm Development Team
Packit 908522
 *
Packit 908522
 * This library is free software; you can redistribute it and/or
Packit 908522
 * modify it under the terms of the GNU Library General Public
Packit 908522
 * License as published by the Free Software Foundation; either
Packit 908522
 * version 2 of the License, or (at your option) any later version.
Packit 908522
 *
Packit 908522
 * This library is distributed in the hope that it will be useful,
Packit 908522
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 908522
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 908522
 * Library General Public License for more details.
Packit 908522
 *
Packit 908522
 * You should have received a copy of the GNU Library General Public
Packit 908522
 * License along with this library; if not, write to the Free Software
Packit 908522
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 908522
 * 02110-1301, USA.
Packit 908522
 */
Packit 908522
Packit 908522
#include <cairomm/script_surface.h>
Packit 908522
#include <cairomm/private.h>
Packit 908522
Packit 908522
namespace Cairo {
Packit 908522
Packit 908522
#ifdef CAIRO_HAS_SCRIPT_SURFACE
Packit 908522
Packit 908522
Script::Script(cairo_device_t* cobject, bool has_reference) :
Packit 908522
  Device(cobject, has_reference)
Packit 908522
{}
Packit 908522
Packit 908522
Script::~Script()
Packit 908522
{
Packit 908522
  // script device is destroyed in base class
Packit 908522
}
Packit 908522
Packit 908522
void Script::add_from_recording_surface(const RefPtr<ScriptSurface>& recording_surface)
Packit 908522
{
Packit 908522
  auto status = cairo_script_from_recording_surface(m_cobject,
Packit 908522
                                                           recording_surface->cobj());
Packit 908522
  check_status_and_throw_exception(status);
Packit 908522
}
Packit 908522
Packit 908522
ScriptMode Script::get_mode() const
Packit 908522
{
Packit 908522
  return static_cast<ScriptMode>(cairo_script_get_mode(m_cobject));
Packit 908522
}
Packit 908522
Packit 908522
void Script::set_mode(ScriptMode new_mode)
Packit 908522
{
Packit 908522
  cairo_script_set_mode(m_cobject, static_cast<cairo_script_mode_t>(new_mode));
Packit 908522
}
Packit 908522
Packit 908522
void Script::write_comment(const std::string& comment)
Packit 908522
{
Packit 908522
  cairo_script_write_comment(m_cobject, comment.data(), comment.length());
Packit 908522
}
Packit 908522
Packit 908522
RefPtr<Script> Script::create(const std::string& filename)
Packit 908522
{
Packit 908522
  auto cobject = cairo_script_create(filename.c_str());
Packit 908522
  check_status_and_throw_exception(cairo_device_status(cobject));
Packit 908522
  return RefPtr<Script>(new Script(cobject, true /* has reference */));
Packit 908522
}
Packit 908522
Packit 908522
static cairo_user_data_key_t USER_DATA_KEY_DEVICE_WRITE_FUNC = {0};
Packit 908522
Packit 908522
static void device_free_slot(void* data)
Packit 908522
{
Packit 908522
  // FIXME: duplicates free_slot in surface.cc
Packit 908522
  auto slot = static_cast<Surface::SlotWriteFunc*>(data);
Packit 908522
  delete slot;
Packit 908522
}
Packit 908522
Packit 908522
cairo_status_t device_write_func_wrapper(void* closure, const unsigned char* data,
Packit 908522
                                         unsigned int length)
Packit 908522
{
Packit 908522
  // FIXME: duplicates free_slot in surface.cc
Packit 908522
  if (!closure)
Packit 908522
    return CAIRO_STATUS_WRITE_ERROR;
Packit 908522
  auto write_func = static_cast<Surface::SlotWriteFunc*>(closure);
Packit 908522
  return static_cast<cairo_status_t>((*write_func)(data, length));
Packit 908522
}
Packit 908522
Packit 908522
static void set_write_slot(cairo_device_t* surface,
Packit 908522
                           Surface::SlotWriteFunc* slot) {
Packit 908522
  // the slot will automatically be freed by device_free_slot() when the
Packit 908522
  // underlying C instance is destroyed
Packit 908522
  cairo_device_set_user_data(surface, &USER_DATA_KEY_DEVICE_WRITE_FUNC, slot,
Packit 908522
                             &device_free_slot);
Packit 908522
}
Packit 908522
Packit 908522
RefPtr<Script> Script::create_for_stream(const Surface::SlotWriteFunc& write_func)
Packit 908522
{
Packit 908522
  auto slot_copy = new Surface::SlotWriteFunc(write_func);
Packit 908522
  auto cobject = cairo_script_create_for_stream(device_write_func_wrapper,
Packit 908522
                                                           slot_copy);
Packit 908522
  check_status_and_throw_exception(cairo_device_status(cobject));
Packit 908522
  set_write_slot(cobject, slot_copy);
Packit 908522
  return RefPtr<Script>(new Script(cobject, true /* has reference */));
Packit 908522
}
Packit 908522
Packit 908522
#endif // CAIRO_HAS_SCRIPT_SURFACE
Packit 908522
Packit 908522
} //namespace Cairo