|
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
|