sp-marker.cpp revision 6b15695578f07a3f72c4c9475c1a261a3021472a
#define __SP_MARKER_C__
/*
* SVG <marker> implementation
*
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
*
* Copyright (C) 1999-2003 Lauris Kaplinski
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include "config.h"
#include "libnr/nr-matrix-fns.h"
#include "libnr/nr-matrix-ops.h"
#include "libnr/nr-scale-matrix-ops.h"
#include "libnr/nr-rotate-fns.h"
#include "display/nr-arena-group.h"
#include "attributes.h"
#include "sp-marker.h"
struct SPMarkerView {
unsigned int key;
unsigned int size;
};
static Inkscape::XML::Node *sp_marker_write (SPObject *object, Inkscape::XML::Node *repr, guint flags);
static NRArenaItem *sp_marker_private_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
static void sp_marker_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsigned const flags);
static void sp_marker_view_remove (SPMarker *marker, SPMarkerView *view, unsigned int destroyitems);
static SPGroupClass *parent_class;
sp_marker_get_type (void)
{
if (!type) {
sizeof (SPMarkerClass),
sizeof (SPMarker),
16,
NULL, /* value_table */
};
}
return type;
}
static void
{
}
static void
{
}
static void
{
}
static void
{
/* Destroy all NRArenaitems etc. */
/* Parent class ::hide method */
}
}
static void
{
switch (key) {
case SP_ATTR_MARKERUNITS:
if (value) {
}
}
break;
case SP_ATTR_REFX:
break;
case SP_ATTR_REFY:
break;
case SP_ATTR_MARKERWIDTH:
break;
case SP_ATTR_MARKERHEIGHT:
break;
case SP_ATTR_ORIENT:
if (value) {
}
}
break;
case SP_ATTR_VIEWBOX:
if (value) {
char *eptr;
/* fixme: We have to take original item affine into account */
/* fixme: Think (Lauris) */
/* Set viewbox */
}
}
break;
/* Do setup before, so we can use break to escape */
if (value) {
int len;
gchar c[256];
const gchar *p, *e;
p = value;
while (*p && *p == 32) p += 1;
if (!*p) break;
e = p;
while (*e && *e != 32) e += 1;
len = e - p;
if (len > 8) break;
c[len] = 0;
/* Now the actual part */
if (!strcmp (c, "none")) {
} else if (!strcmp (c, "xMinYMin")) {
} else if (!strcmp (c, "xMidYMin")) {
} else if (!strcmp (c, "xMaxYMin")) {
} else if (!strcmp (c, "xMinYMid")) {
} else if (!strcmp (c, "xMidYMid")) {
} else if (!strcmp (c, "xMaxYMin")) {
} else if (!strcmp (c, "xMinYMax")) {
} else if (!strcmp (c, "xMidYMax")) {
} else if (!strcmp (c, "xMaxYMax")) {
} else {
break;
}
while (*e && *e == 32) e += 1;
if (e) {
if (!strcmp (e, "meet")) {
} else if (!strcmp (e, "slice")) {
} else {
break;
}
}
}
break;
default:
break;
}
}
/*
* Updating <marker> - we are not renderable anyways, so
* we as well cascade with identity transforms
*/
static void
{
NRMatrix q;
SPMarkerView *v;
/* fixme: We have to set up clip here too */
/* Copy parent context */
/* Initialize tranformations */
/* Set up viewport */
/* Start with identity transform */
/* Viewbox is always present, either implicitly or explicitly */
if (marker->viewBox_set) {
} else {
}
/* Now set up viewbox transformation */
/* Determine actual viewbox in viewport coordinates */
x = 0.0;
y = 0.0;
} else {
/* Things are getting interesting */
/* Now place viewbox to requested position */
switch (marker->aspect_align) {
case SP_ASPECT_XMIN_YMIN:
x = 0.0;
y = 0.0;
break;
case SP_ASPECT_XMID_YMIN:
y = 0.0;
break;
case SP_ASPECT_XMAX_YMIN:
y = 0.0;
break;
case SP_ASPECT_XMIN_YMID:
x = 0.0;
break;
case SP_ASPECT_XMID_YMID:
break;
case SP_ASPECT_XMAX_YMID:
break;
case SP_ASPECT_XMIN_YMAX:
x = 0.0;
break;
case SP_ASPECT_XMID_YMAX:
break;
case SP_ASPECT_XMAX_YMAX:
break;
default:
x = 0.0;
y = 0.0;
break;
}
}
/* Compose additional transformation from scale and position */
q.c[1] = 0.0;
q.c[2] = 0.0;
/* Append viewbox transformation */
/* Append reference translation */
/* fixme: lala (Lauris) */
/* If viewBox is set reinitialize child viewport */
/* Otherwise it already correct */
if (marker->viewBox_set) {
}
/* And invoke parent method */
/* As last step set additional transform of arena group */
for (unsigned i = 0 ; i < v->size ; i++) {
if (v->items[i]) {
}
}
}
}
{
}
if (marker->markerUnits_set) {
} else {
}
} else {
}
} else {
}
} else {
}
} else {
}
} else {
}
if (marker->orient_set) {
if (marker->orient_auto) {
} else {
}
} else {
}
/* fixme: */
return repr;
}
static NRArenaItem *
{
/* Break propagation */
return NULL;
}
static void
{
/* Break propagation */
}
static void
{
/* Break propagation */
}
static void
{
/* Break propagation */
}
/* fixme: Remove link if zero-sized (Lauris) */
/**
* First of all, removes any SPMarkerViews that a marker has with a specific key.
* Set up the NRArenaItem array's size in the specified SPMarker's SPMarkerView.
* \param marker Marker to create views in.
* \param key Key to give each SPMarkerView.
* \param size Number of NRArenaItems to put in the SPMarkerView.
*/
void
{
unsigned int i;
}
/* Free old view and allocate new */
/* Parent class ::hide method */
}
if (!view) {
}
}
{
return NULL;
}
/* Parent class ::show method */
/* fixme: Position (Lauris) */
/* nr_arena_item_unref (v->items[pos]); */
}
}
if (marker->orient_auto) {
m = base;
} else {
/* fixme: Orient units (Lauris) */
m *= get_translation(base);
}
}
}
}
}
return NULL;
}
/* This replaces SPItem implementation because we have own views */
/**
* \param key SPMarkerView key to hide.
*/
void
{
SPMarkerView *v;
while (v != NULL) {
/* Parent class ::hide method */
return;
}
v = next;
}
}
static void
{
unsigned int i;
} else {
SPMarkerView *v;
}
if (destroyitems) {
/* We have to walk through the whole array because there may be hidden items */
}
}
}