diff options
| author | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
|---|---|---|
| committer | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
| commit | 7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch) | |
| tree | 4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/vgradientex.cpp | |
| download | scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip | |
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/vgradientex.cpp')
| -rw-r--r-- | scribus/vgradientex.cpp | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/scribus/vgradientex.cpp b/scribus/vgradientex.cpp new file mode 100644 index 0000000..83b9823 --- /dev/null +++ b/scribus/vgradientex.cpp @@ -0,0 +1,189 @@ +/* +For general Scribus (>=1.3.2) copyright and licensing information please refer +to the COPYING file provided with the program. Following this notice may exist +a copyright and/or license notice that predates the release of Scribus 1.3.2 +for which a new license (GPL+exception) is in place. +*/ +/* This file is part of the KDE project + Copyright (C) 2002, The Karbon Developers + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <QtAlgorithms> + +#include "vgradientex.h" +#include "vgradient.h" +#include "scribusdoc.h" + +// comparison function for use with stable_sort +bool compareStopsEx( const VColorStopEx* item1, const VColorStopEx* item2 ) +{ + double r1 = item1->rampPoint; + double r2 = item2->rampPoint; + return ( r1 < r2 ? true : false ); +} + +int VGradientEx::compareItems( const VColorStopEx* item1, const VColorStopEx* item2 ) const +{ + double r1 = item1->rampPoint; + double r2 = item2->rampPoint; + + return ( r1 == r2 ? 0 : r1 < r2 ? -1 : 1 ); +} // VGradientEx::VColorStopList::compareItems + +void VGradientEx::inSort( VColorStopEx* d ) +{ + int index = 0; + register VColorStopEx *n = m_colorStops.value(index); + while (n && compareItems(n,d) <= 0) + { + n = m_colorStops.value(index); + ++index; + } + m_colorStops.insert( qMin(index, m_colorStops.size()), d ); +} + +VGradientEx::VGradientEx( VGradientEx::Type type ) : m_type( type ) +{ + // set up dummy gradient + addStop( ScColor(255,0,0) , 0.0, 0.5, 1.0 ); + addStop( ScColor(255,255,0) , 1.0, 0.5, 1.0 ); + + setOrigin( FPoint( 0, 0 ) ); + setVector( FPoint( 0, 50 ) ); + setRepeatMethod( VGradientEx::reflect ); +} + +VGradientEx::VGradientEx( const VGradientEx& gradient ) +{ + m_origin = gradient.m_origin; + m_focalPoint = gradient.m_focalPoint; + m_vector = gradient.m_vector; + m_type = gradient.m_type; + m_repeatMethod = gradient.m_repeatMethod; + + clearStops(); + QList<VColorStopEx*> cs = gradient.colorStops(); + qStableSort( cs.begin(), cs.end(), compareStopsEx); + for( int i = 0; i < cs.count(); ++i) + m_colorStops.append( new VColorStopEx( *cs[i] ) ); +} + +VGradientEx::VGradientEx( const VGradient& gradient, ScribusDoc& doc ) +{ + m_origin = gradient.origin(); + m_focalPoint = gradient.focalPoint(); + m_vector = gradient.vector(); + m_type = (VGradientEx::Type) gradient.type(); + m_repeatMethod = (VGradientEx::RepeatMethod) gradient.repeatMethod(); + + while (!m_colorStops.isEmpty()) + delete m_colorStops.takeFirst(); + QList<VColorStop*> stops = gradient.colorStops(); + qStableSort( stops.begin(), stops.end(), compareStops); + for( int i = 0; i < stops.count(); ++i) + { + VColorStop stop( *stops[i] ); + ScColor color = doc.PageColors[stop.name]; + double ramp = stop.rampPoint; + double mid = stop.midPoint; + double opacity = stop.opacity; + int shade = stop.shade; + QString name = stop.name; + m_colorStops.append( new VColorStopEx(ramp, mid, color, opacity, name, shade) ); + } +} + +VGradientEx& VGradientEx::operator=( const VGradientEx& gradient ) +{ + if ( this == &gradient ) + return *this; + + m_origin = gradient.m_origin; + m_focalPoint = gradient.m_focalPoint; + m_vector = gradient.m_vector; + m_type = gradient.m_type; + m_repeatMethod = gradient.m_repeatMethod; + + clearStops(); + QList<VColorStopEx*> cs = gradient.colorStops(); + qStableSort( cs.begin(), cs.end(), compareStopsEx); + for( int i = 0; i < cs.count(); ++i ) + m_colorStops.append( new VColorStopEx( *cs[i] ) ); + return *this; +} // VGradientEx::operator= + +VGradientEx::~VGradientEx() +{ + clearStops(); +} + +const QList<VColorStopEx*> VGradientEx::colorStops() const +{ + return m_colorStops; +} // VGradientEx::colorStops() + +void +VGradientEx::clearStops() +{ + while (!m_colorStops.isEmpty()) + delete m_colorStops.takeFirst(); +} + +void +VGradientEx::addStop( const VColorStopEx& colorStop ) +{ + inSort( new VColorStopEx( colorStop ) ); +} // VGradientEx::addStop + +void +VGradientEx::addStop( const ScColor &color, double rampPoint, double midPoint, double opa, QString name, int shade ) +{ + // Clamping between 0.0 and 1.0 + rampPoint = qMax( 0.0, rampPoint ); + rampPoint = qMin( 1.0, rampPoint ); + // Clamping between 0.0 and 1.0 + midPoint = qMax( 0.0, midPoint ); + midPoint = qMin( 1.0, midPoint ); + + inSort( new VColorStopEx( rampPoint, midPoint, color, opa, name, shade ) ); +} + +void VGradientEx::removeStop( VColorStopEx& colorstop ) +{ + int n = m_colorStops.indexOf(&colorstop); + delete m_colorStops.takeAt(n); +} + +void VGradientEx::removeStop( uint n ) +{ + delete m_colorStops.takeAt(n); +} + +void VGradientEx::transform( const QMatrix &m ) +{ + double mx, my; + mx = m.m11() * m_origin.x() + m.m21() * m_origin.y() + m.dx(); + my = m.m22() * m_origin.y() + m.m12() * m_origin.x() + m.dy(); + m_origin = FPoint(mx, my); + mx = m.m11() * m_focalPoint.x() + m.m21() * m_focalPoint.y() + m.dx(); + my = m.m22() * m_focalPoint.y() + m.m12() * m_focalPoint.x() + m.dy(); + m_focalPoint = FPoint(mx, my); + mx = m.m11() * m_vector.x() + m.m21() * m_vector.y() + m.dx(); + my = m.m22() * m_vector.y() + m.m12() * m_vector.x() + m.dy(); + m_vector = FPoint(mx, my); +} |
