Blame cairomm/script.cc

Packit Service e3b512
/* Copyright (C) 2014 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/script_surface.h>
Packit Service e3b512
#include <cairomm/private.h>
Packit Service e3b512
Packit Service e3b512
namespace Cairo {
Packit Service e3b512
Packit Service e3b512
#ifdef CAIRO_HAS_SCRIPT_SURFACE
Packit Service e3b512
Packit Service e3b512
Script::Script(cairo_device_t* cobject, bool has_reference) :
Packit Service e3b512
  Device(cobject, has_reference)
Packit Service e3b512
{}
Packit Service e3b512
Packit Service e3b512
Script::~Script()
Packit Service e3b512
{
Packit Service e3b512
  // script device is destroyed in base class
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Script::add_from_recording_surface(const RefPtr<ScriptSurface>& recording_surface)
Packit Service e3b512
{
Packit Service e3b512
  auto status = cairo_script_from_recording_surface(m_cobject,
Packit Service e3b512
                                                           recording_surface->cobj());
Packit Service e3b512
  check_status_and_throw_exception(status);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
ScriptMode Script::get_mode() const
Packit Service e3b512
{
Packit Service e3b512
  return static_cast<ScriptMode>(cairo_script_get_mode(m_cobject));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Script::set_mode(ScriptMode new_mode)
Packit Service e3b512
{
Packit Service e3b512
  cairo_script_set_mode(m_cobject, static_cast<cairo_script_mode_t>(new_mode));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
void Script::write_comment(const std::string& comment)
Packit Service e3b512
{
Packit Service e3b512
  cairo_script_write_comment(m_cobject, comment.data(), comment.length());
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<Script> Script::create(const std::string& filename)
Packit Service e3b512
{
Packit Service e3b512
  auto cobject = cairo_script_create(filename.c_str());
Packit Service e3b512
  check_status_and_throw_exception(cairo_device_status(cobject));
Packit Service e3b512
  return RefPtr<Script>(new Script(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
static cairo_user_data_key_t USER_DATA_KEY_DEVICE_WRITE_FUNC = {0};
Packit Service e3b512
Packit Service e3b512
static void device_free_slot(void* data)
Packit Service e3b512
{
Packit Service e3b512
  // FIXME: duplicates free_slot in surface.cc
Packit Service e3b512
  auto slot = static_cast<Surface::SlotWriteFunc*>(data);
Packit Service e3b512
  delete slot;
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
cairo_status_t device_write_func_wrapper(void* closure, const unsigned char* data,
Packit Service e3b512
                                         unsigned int length)
Packit Service e3b512
{
Packit Service e3b512
  // FIXME: duplicates free_slot in surface.cc
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
static void set_write_slot(cairo_device_t* surface,
Packit Service e3b512
                           Surface::SlotWriteFunc* slot) {
Packit Service e3b512
  // the slot will automatically be freed by device_free_slot() when the
Packit Service e3b512
  // underlying C instance is destroyed
Packit Service e3b512
  cairo_device_set_user_data(surface, &USER_DATA_KEY_DEVICE_WRITE_FUNC, slot,
Packit Service e3b512
                             &device_free_slot);
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
RefPtr<Script> Script::create_for_stream(const Surface::SlotWriteFunc& write_func)
Packit Service e3b512
{
Packit Service e3b512
  auto slot_copy = new Surface::SlotWriteFunc(write_func);
Packit Service e3b512
  auto cobject = cairo_script_create_for_stream(device_write_func_wrapper,
Packit Service e3b512
                                                           slot_copy);
Packit Service e3b512
  check_status_and_throw_exception(cairo_device_status(cobject));
Packit Service e3b512
  set_write_slot(cobject, slot_copy);
Packit Service e3b512
  return RefPtr<Script>(new Script(cobject, true /* has reference */));
Packit Service e3b512
}
Packit Service e3b512
Packit Service e3b512
#endif // CAIRO_HAS_SCRIPT_SURFACE
Packit Service e3b512
Packit Service e3b512
} //namespace Cairo