View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0015560 | Scribus | Graphics / Image Frames | public | 2019-01-28 09:02 | 2024-01-08 03:59 |
| Reporter | ale | Assigned To | ale | ||
| Priority | normal | Severity | feature | Reproducibility | N/A |
| Status | assigned | Resolution | open | ||
| Target Version | 1.5.5.svn | ||||
| Summary | 0015560: [PATCH (needs review)] fill a frame with the image | ||||
| Description | - the frame has a fixed size, - the image has different proportions than the frame - i want the frame to be 100% filled. this is a common use case for me and i can get there with scribus but it's more painful than it should. (see the screencast in the first note) i propose to add a third option to the image scaling: - free - fit to frame size - fill the frame filling the frame means: - by default scale to the minimal scale that fills the frame - only allow movements that do not create a white padding (see 0015448) - (optional: allow scaling in) | ||||
| Tags | patch | ||||
| Attached Files | image-fill-mode.diff (67,043 bytes)
diff --git a/scribus/appmodehelper.cpp b/scribus/appmodehelper.cpp
index 2f6a32801..d26be66fa 100644
--- a/scribus/appmodehelper.cpp
+++ b/scribus/appmodehelper.cpp
@@ -570,7 +570,7 @@ void AppModeHelper::enableActionsForSelection(ScribusMainWindow* scmw, ScribusDo
(*a_scrActions)["toolsUnlinkTextFrame"]->setEnabled(false);
(*a_scrActions)["toolsUnlinkTextFrameAndCutText"]->setEnabled(false);
(*a_scrActions)["toolsLinkTextFrame"]->setEnabled(false);
- (*a_scrActions)["toolsEditContents"]->setEnabled(currItem->ScaleType);
+ (*a_scrActions)["toolsEditContents"]->setEnabled(true);
(*a_scrActions)["toolsEditWithStoryEditor"]->setEnabled(false);
(*a_scrActions)["toolsRotate"]->setEnabled(!inAnEditMode);
(*a_scrActions)["toolsCopyProperties"]->setEnabled(!inAnEditMode);
diff --git a/scribus/canvasgesture_resize.cpp b/scribus/canvasgesture_resize.cpp
index a43ef1f63..52fceaefe 100644
--- a/scribus/canvasgesture_resize.cpp
+++ b/scribus/canvasgesture_resize.cpp
@@ -313,7 +313,7 @@ void ResizeGesture::doResize(bool scaleContent)
double imgScX = (newBounds.width() - m_extraWidth) / divX * currItem->imageXScale();
double imgScY = (newBounds.height() - m_extraHeight) / divY * currItem->imageYScale();
// The aspect ratio has been fixed, so make the modification in the direction of the larger movement.
- if (currItem->keepAspectRatio() && currItem->fitImageToFrame())
+ if (currItem->keepAspectRatio() && currItem->isImageScaleFit())
{
if (qAbs((newBounds.width() - m_extraWidth) - currItem->width()) > qAbs((newBounds.height() - m_extraHeight) - currItem->height()))
imgScY = imgScX;
@@ -322,7 +322,7 @@ void ResizeGesture::doResize(bool scaleContent)
}
currItem->setImageXYScale(imgScX, imgScY);
}
- else if (currItem->itemType() == PageItem::ImageFrame && currItem->imageIsAvailable && !currItem->fitImageToFrame())
+ else if (currItem->itemType() == PageItem::ImageFrame && currItem->imageIsAvailable && !currItem->isImageScaleFit())
{
QTransform mm = currItem->getTransform();
QPointF itPos = mm.map(QPointF(-m_extraX, -m_extraY));
diff --git a/scribus/canvasmode.cpp b/scribus/canvasmode.cpp
index 036fbaf5d..a39463b65 100644
--- a/scribus/canvasmode.cpp
+++ b/scribus/canvasmode.cpp
@@ -1313,7 +1313,7 @@ void CanvasMode::commonkeyPressEvent_NormalNodeEdit(QKeyEvent *e)
double radRotation = rotationFC * M_PI / 180.0;
bool moveImage = false;
- if ((currItem->asImageFrame() || currItem->asLatexFrame() || currItem->asOSGFrame()) && currItem->imageIsAvailable && !currItem->fitImageToFrame())
+ if ((currItem->asImageFrame() || currItem->asLatexFrame() || currItem->asOSGFrame()) && currItem->imageIsAvailable && !currItem->isImageScaleFit())
moveImage = true;
switch (kk)
diff --git a/scribus/canvasmode_edit.cpp b/scribus/canvasmode_edit.cpp
index cbf5eabea..863ee8ee9 100644
--- a/scribus/canvasmode_edit.cpp
+++ b/scribus/canvasmode_edit.cpp
@@ -417,8 +417,7 @@ void CanvasMode_Edit::mouseMoveEvent(QMouseEvent *m)
{
if (m->modifiers() & Qt::ShiftModifier)
{
- // only rotate if free scale
- if (currItem->ScaleType)
+ if (currItem->isImageScaleFree())
{
m_view->setCursor(IconManager::instance()->loadCursor("Rotieren2.png"));
QTransform p = currItem->getTransform();
diff --git a/scribus/canvasmode_normal.cpp b/scribus/canvasmode_normal.cpp
index 9688f569c..c6331a338 100644
--- a/scribus/canvasmode_normal.cpp
+++ b/scribus/canvasmode_normal.cpp
@@ -196,7 +196,7 @@ void CanvasMode_Normal::mouseDoubleClickEvent(QMouseEvent *m)
{
if (currItem->asLatexFrame())
{
- if (currItem->locked()) // || (!currItem->ScaleType))
+ if (currItem->locked())
{
return;
}
@@ -209,7 +209,7 @@ void CanvasMode_Normal::mouseDoubleClickEvent(QMouseEvent *m)
}
else if ((currItem->itemType() == PageItem::Polygon) || (currItem->itemType() == PageItem::PolyLine) || (currItem->itemType() == PageItem::Group) || (currItem->itemType() == PageItem::ImageFrame) || (currItem->itemType() == PageItem::PathText))
{
- if (currItem->locked()) //|| (!currItem->ScaleType))
+ if (currItem->locked())
{
//mousePressEvent(m);
return;
diff --git a/scribus/pageitem.cpp b/scribus/pageitem.cpp
index c6a8bce2f..594d48757 100644
--- a/scribus/pageitem.cpp
+++ b/scribus/pageitem.cpp
@@ -192,7 +192,7 @@ PageItem::PageItem(const PageItem & other)
OldH2(other.OldH2),
Sizing(other.Sizing),
m_layerID(other.m_layerID),
- ScaleType(other.ScaleType),
+ m_scaleMode{other.m_scaleMode},
AspectRatio(other.AspectRatio),
DashValues(other.DashValues),
DashOffset(other.DashOffset),
@@ -650,7 +650,7 @@ PageItem::PageItem(ScribusDoc *pa, ItemType newType, double x, double y, double
groupWidth = 1.0;
groupHeight = 1.0;
m_layerID = m_Doc->activeLayer();
- ScaleType = true;
+ m_scaleMode = ImageScaleMode::free;
AspectRatio = true;
NamedLStyle = "";
DashValues.clear();
@@ -4219,24 +4219,44 @@ void PageItem::flipImageV()
m_ImageIsFlippedV = !m_ImageIsFlippedV;
}
-void PageItem::setImageScalingMode(bool freeScale, bool keepRatio)
+void PageItem::setImageScalingMode(ImageScaleMode scaleMode, bool keepRatio)
{
- if (ScaleType == freeScale && AspectRatio == keepRatio)
+ if (scaleMode == ImageScaleMode::free && AspectRatio == keepRatio)
+ {
+ m_scaleMode = scaleMode;
+ update();
return;
+ }
+
if (UndoManager::undoEnabled())
{
- QString from = ScaleType ? Um::FreeScaling : Um::FrameSize;
+ QString from = "";
+ if (m_scaleMode == ImageScaleMode::free)
+ from += Um::FreeScaling;
+ else if (m_scaleMode == ImageScaleMode::fit)
+ from += Um::FrameSize;
+ else if (m_scaleMode == ImageScaleMode::fill)
+ from += Um::FrameFill;
from += ", ";
from += AspectRatio ? Um::KeepRatio : Um::BreakRatio;
- QString to = freeScale ? Um::FreeScaling : Um::FrameSize;
+
+ QString to = "";
+ if (scaleMode == ImageScaleMode::free)
+ to += Um::FreeScaling;
+ else if (scaleMode == ImageScaleMode::fit)
+ to += Um::FrameSize;
+ else if (scaleMode == ImageScaleMode::fill)
+ to += Um::FrameFill;
to += ", ";
to += keepRatio ? Um::KeepRatio : Um::BreakRatio;
+
SimpleState *ss = new SimpleState(Um::ImageScaling, QString(Um::FromTo).arg(from, to), Um::IImageScaling);
ss->set("SCALE_MODE");
- if (freeScale != ScaleType)
+ if (scaleMode != m_scaleMode)
{
- ss->set("SCALE_TYPE", freeScale);
- if (!freeScale)
+ ss->set("OLD_SCALE_TYPE", static_cast<int>(m_scaleMode));
+ ss->set("NEW_SCALE_TYPE", static_cast<int>(scaleMode));
+ if (scaleMode != ImageScaleMode::free)
{
//if switching from free scaling to frame size
//in undo must be offset and scale saved
@@ -4251,13 +4271,13 @@ void PageItem::setImageScalingMode(bool freeScale, bool keepRatio)
ss->set("ASPECT_RATIO", keepRatio);
undoManager->action(this, ss);
}
- if (!freeScale)
+ if (scaleMode != ImageScaleMode::free)
{
m_imageXOffset = 0.0;
m_imageYOffset = 0.0;
m_imageRotation = 0;
}
- ScaleType = freeScale;
+ m_scaleMode = scaleMode;
AspectRatio = keepRatio;
adjustPictScale();
update();
@@ -7099,16 +7119,16 @@ void PageItem::restoreTextFlowing(SimpleState *state, bool isUndo)
void PageItem::restoreImageScaleMode(SimpleState *state, bool isUndo)
{
- bool type=ScaleType;
- if (state->contains("SCALE_TYPE"))
+ auto scaleMode = m_scaleMode;
+ if (state->contains("SCALE_MODE"))
{
if (isUndo)
- type = !state->getBool("SCALE_TYPE");
+ scaleMode = static_cast<ImageScaleMode>(state->getInt("OLD_SCALE_TYPE"));
else
- type = state->getBool("SCALE_TYPE");
+ scaleMode = static_cast<ImageScaleMode>(state->getInt("NEW_SCALE_TYPE"));
//if restoring free scaling
//old offset and scale ratio must be restored
- if (type)
+ if (scaleMode == ImageScaleMode::free)
{
double oscx = state->getDouble("OLD_IMAGEXSCALE");
double oscy = state->getDouble("OLD_IMAGEYSCALE");
@@ -7121,7 +7141,7 @@ void PageItem::restoreImageScaleMode(SimpleState *state, bool isUndo)
m_Doc->itemSelection_SetImageOffset(ox, oy, &tempSelection);
m_Doc->itemSelection_SetImageRotation(orot, &tempSelection);
}
- else
+ else if (m_scaleMode == ImageScaleMode::free)
{
state->set("OLD_IMAGEXOFFSET", m_imageXOffset);
state->set("OLD_IMAGEYOFFSET", m_imageYOffset);
@@ -7140,7 +7160,7 @@ void PageItem::restoreImageScaleMode(SimpleState *state, bool isUndo)
ratio = state->getBool("ASPECT_RATIO");
}
- setImageScalingMode(type, ratio);
+ setImageScalingMode(scaleMode, ratio);
}
void PageItem::restoreImageScaleChange(SimpleState *state, bool isUndo)
@@ -7185,7 +7205,7 @@ void PageItem::restoreClearImage(UndoState *state, bool isUndo)
effectsInUse = is->getItem();
setImageFlippedH(is->getBool("CI_FLIPPH"));
setImageFlippedV(is->getBool("CI_FLIPPV"));
- setImageScalingMode(is->getBool("CI_SCALING"),is->getBool("CI_ASPECT"));
+ setImageScalingMode(static_cast<ImageScaleMode>(is->getInt("CI_SCALING")),is->getBool("CI_ASPECT"));
setImageXOffset(is->getDouble("CI_XOFF"));
setImageXScale(is->getDouble("CI_XSCALE"));
setImageYOffset(is->getDouble("CI_YOFF"));
@@ -7521,7 +7541,7 @@ void PageItem::restoreGetImage(UndoState *state, bool isUndo)
{
setImageFlippedH(is->getBool("FLIPPH"));
setImageFlippedV(is->getBool("FLIPPV"));
- setImageScalingMode(is->getBool("SCALING"), is->getBool("ASPECT"));
+ setImageScalingMode(static_cast<ImageScaleMode>(is->getInt("SCALING")), is->getBool("ASPECT"));
}
}
else
@@ -7533,7 +7553,7 @@ void PageItem::restoreGetImage(UndoState *state, bool isUndo)
effectsInUse = is->getItem();
setImageFlippedH(is->getBool("FLIPPH"));
setImageFlippedV(is->getBool("FLIPPV"));
- setImageScalingMode(is->getBool("SCALING"), is->getBool("ASPECT"));
+ setImageScalingMode(static_cast<ImageScaleMode>(is->getInt("SCALING")), is->getBool("ASPECT"));
setImageXOffset(is->getDouble("XOFF"));
setImageXScale(is->getDouble("XSCALE"));
setImageYOffset(is->getDouble("YOFF"));
@@ -9349,7 +9369,7 @@ bool PageItem::loadImage(const QString& filename, const bool reload, const int g
is->set("NEW_IMAGE_PATH", filename);
is->set("FLIPPH",imageFlippedH());
is->set("FLIPPV",imageFlippedV());
- is->set("SCALING",ScaleType);
+ is->set("SCALING",static_cast<int>(m_scaleMode));
is->set("ASPECT",AspectRatio);
is->set("XOFF",imageXOffset());
is->set("XSCALE",imageXScale());
@@ -9733,50 +9753,29 @@ void PageItem::adjustPictScale()
{
if (itemType() != PageItem::ImageFrame)
return;
- if (ScaleType)
+ if (m_scaleMode == ImageScaleMode::free)
return;
if (OrigW == 0 || OrigH == 0)
return;
double xs = m_width / static_cast<double>(OrigW);
double ys = m_height / static_cast<double>(OrigH);
- double imgXOffs = m_imageXOffset;
- double imgYOffs = m_imageYOffset;
- double imageRot = fmod(m_imageRotation, 360);
- if (imageRot != 0.0)
- {
- QRectF br = QRectF(0, 0, OrigW, OrigH);
- QTransform m;
- m.rotate(m_imageRotation);
- br = m.mapRect(br);
- xs = m_width / br.width();
- ys = m_height / br.height();
- QLineF wL = QLineF(0, 0, OrigW, 0);
- wL.setAngle(-m_imageRotation);
- QLineF hL = QLineF(0, 0, 0, OrigH);
- hL.setAngle(-m_imageRotation-90);
- QTransform mm;
- mm.scale(xs, ys);
- hL = mm.map(hL);
- wL = mm.map(wL);
- xs = wL.length() / static_cast<double>(OrigW);
- ys = hL.length() / static_cast<double>(OrigH);
- m_imageXOffset = -br.x();
- m_imageYOffset = -br.y();
- }
- if (AspectRatio)
+ if (m_scaleMode == ImageScaleMode::fit)
{
- m_imageXScale = qMin(xs, ys);
- m_imageYScale = qMin(xs, ys);
- }
- else
- {
- m_imageXScale = xs;
- m_imageYScale = ys;
+ if (AspectRatio)
+ {
+ m_imageXScale = qMin(xs, ys);
+ m_imageYScale = qMin(xs, ys);
+ }
+ else
+ {
+ m_imageXScale = xs;
+ m_imageYScale = ys;
+ }
}
- if (m_Doc && m_Doc->isLoading())
+ else if (m_scaleMode == ImageScaleMode::fill)
{
- m_imageXOffset = imgXOffs;
- m_imageYOffset = imgYOffs;
+ m_imageXScale = qMax(xs, ys);
+ m_imageYScale = qMax(xs, ys);
}
if (!imageClip.empty())
{
@@ -10137,6 +10136,8 @@ void PageItem::updateConstants()
* Apply the mouse movements for moving an image in the frame.
* If the image fits the frame, constraint the movements
* and make sure that the image does not overflow the frame.
+ * If the image fills the frame, constraint the movements
+ * and make sure that the image fills the frame.
*/
void PageItem::moveImageInFrame(double dX, double dY)
{
@@ -10150,18 +10151,44 @@ void PageItem::moveImageInFrame(double dX, double dY)
if (imageFlippedV())
dY = -dY;
- if (!ScaleType)
+ auto overflowX = OrigW - m_width / m_imageXScale;
+ auto overflowY = OrigH - m_height / m_imageYScale;
+
+ if (m_scaleMode == PageItem::ImageScaleMode::fit)
{
if (!AspectRatio)
return;
if (isImageFittingHorizontal())
dX = 0;
+ else
+ {
+ dX = qMax(dX, -m_imageXOffset);
+ dX = qMin(dX, - (overflowX + m_imageXOffset));
+ }
if (isImageFittingVertical())
dY = 0;
- dX = qMax(dX, -m_imageXOffset);
- dY = qMax(dY, -m_imageYOffset);
- dX = qMin(dX, m_width / m_imageXScale - OrigW - m_imageXOffset);
- dY = qMin(dY, m_height / m_imageYScale - OrigH - m_imageYOffset);
+ else
+ {
+ dY = qMax(dY, -m_imageYOffset);
+ dY = qMin(dY, - (overflowY + m_imageYOffset));
+ }
+ }
+ else if (m_scaleMode == PageItem::ImageScaleMode::fill)
+ {
+ if (isImageFittingHorizontal())
+ dY = 0;
+ else
+ {
+ dY = qMin(dY, -m_imageYOffset);
+ dY = qMax(dY, -(overflowY + m_imageYOffset));
+ }
+ if (isImageFittingVertical())
+ dX = 0;
+ else
+ {
+ dX = qMin(dX, -m_imageXOffset);
+ dX = qMax(dX, - (overflowX + m_imageXOffset));
+ }
}
moveImageXYOffsetBy(dX, dY);
diff --git a/scribus/pageitem.h b/scribus/pageitem.h
index 3351bc77a..9fc353a5b 100644
--- a/scribus/pageitem.h
+++ b/scribus/pageitem.h
@@ -216,6 +216,12 @@ public: // Start enumerator definitions
Round = 2,
Other = 3
};
+
+ enum class ImageScaleMode {
+ free,
+ fit,
+ fill
+ };
//End enumerator definitions
// This property may not hang around for too long, but should be useful
@@ -724,8 +730,12 @@ public: // Start public functions
bool keepAspectRatio() const { return AspectRatio; }
void setKeepAspectRatio(bool val) { AspectRatio = val; }
//
- bool fitImageToFrame() const { return !ScaleType; }
- void setFitImageToFrame(bool val) { ScaleType = !val; }
+ void setImageScaleFree() { m_scaleMode = ImageScaleMode::free; }
+ void setImageScaleFit() { m_scaleMode = ImageScaleMode::fit; }
+ void setImageScaleFill() { m_scaleMode = ImageScaleMode::fill; }
+ bool isImageScaleFree() { return m_scaleMode == ImageScaleMode::free; }
+ bool isImageScaleFit() { return m_scaleMode == ImageScaleMode::fit; }
+ bool isImageScaleFill() { return m_scaleMode == ImageScaleMode::fill; }
bool isImageInline() const { return isInlineImage; }
void setImageInline(bool val) { isInlineImage = val; }
void setInlineExt(const QString& val) { inlineExt = val; }
@@ -1028,10 +1038,10 @@ public: // Start public functions
/**
* @brief Set the image scaling mode.
- * @param freeScale is the scaling free (not forced to frame size)
+ * @param scaleMode free, fit, or fill
* @param keepRatio should the image's aspect ratio be respected
*/
- void setImageScalingMode(bool freeScale, bool keepRatio);
+ void setImageScalingMode(ImageScaleMode scaleMode, bool keepRatio);
/** @brief Lock or unlock this pageitem. */
void toggleLock();
@@ -1346,7 +1356,7 @@ public: // Start public variables
double OldH2;
bool Sizing;
int m_layerID;
- bool ScaleType;
+ ImageScaleMode m_scaleMode{ImageScaleMode::free};
bool AspectRatio;
QVector<double> DashValues;
double DashOffset;
diff --git a/scribus/pageitem_imageframe.cpp b/scribus/pageitem_imageframe.cpp
index 19fe5b913..978165626 100644
--- a/scribus/pageitem_imageframe.cpp
+++ b/scribus/pageitem_imageframe.cpp
@@ -220,7 +220,7 @@ void PageItem_ImageFrame::clearContents()
is->set("CI_PFILE", Pfile);
is->set("CI_FLIPPH",imageFlippedH());
is->set("CI_FLIPPV",imageFlippedV());
- is->set("CI_SCALING",ScaleType);
+ is->set("CI_SCALING",static_cast<int>(m_scaleMode));
is->set("CI_ASPECT",AspectRatio);
is->set("CI_XOFF",imageXOffset());
is->set("CI_XSCALE",imageXScale());
@@ -245,7 +245,7 @@ void PageItem_ImageFrame::clearContents()
setImageFlippedH(false);
setImageFlippedV(false);
EmProfile = "";
- ScaleType = m_Doc->prefsData().itemToolPrefs.imageScaleType;;
+ m_scaleMode = m_Doc->prefsData().itemToolPrefs.imageScaleType;
AspectRatio = m_Doc->prefsData().itemToolPrefs.imageAspectRatio;
setFillTransparency(0.0);
setLineTransparency(0.0);
@@ -330,13 +330,13 @@ void PageItem_ImageFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
UndoTransaction transaction;
if (UndoManager::undoEnabled())
{
- if ((fitImageToFrame() || !controlDown) && (dX != 0.0 || dY != 0.0))
+ if ((isImageScaleFit() || !controlDown) && (dX != 0.0 || dY != 0.0))
transaction = undoManager->beginTransaction(getUName(), getUPixmap(), Um::ImageScale, "", Um::IMove);
}
if (dX != 0.0)
{
double newXScale = dX / 100.0 * m_imageXScale;
- setImageScalingMode(true, AspectRatio);
+ setImageScalingMode(ImageScaleMode::free, AspectRatio);
setImageXScale(newXScale);
if (!controlDown)
{
@@ -347,7 +347,7 @@ void PageItem_ImageFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
else if (dY != 0.0)
{
double newYScale = dY / 100.0 * m_imageYScale;
- setImageScalingMode(true, AspectRatio);
+ setImageScalingMode(ImageScaleMode::free, AspectRatio);
setImageYScale(newYScale);
if (!controlDown)
{
diff --git a/scribus/pageitem_osgframe.cpp b/scribus/pageitem_osgframe.cpp
index b2f63547e..9f6dff8b6 100644
--- a/scribus/pageitem_osgframe.cpp
+++ b/scribus/pageitem_osgframe.cpp
@@ -118,7 +118,7 @@ void PageItem_OSGFrame::setImage(QImage &image)
delete tempFile;
isTempFile = true;
}
- setImageScalingMode(false, true);
+ setImageScalingMode(ImageScaleMode::fit, true);
}
void PageItem_OSGFrame::clearContents()
diff --git a/scribus/plugins/fileloader/scribus12format/scribus12format.cpp b/scribus/plugins/fileloader/scribus12format/scribus12format.cpp
index 21ea7fd1b..28bb8bc6e 100644
--- a/scribus/plugins/fileloader/scribus12format/scribus12format.cpp
+++ b/scribus/plugins/fileloader/scribus12format/scribus12format.cpp
@@ -222,7 +222,10 @@ void Scribus12Format::PasteItem(struct CopyPasteBuffer *Buffer, bool drag, bool
m_Doc->loadPict(currItem->Pfile, currItem);
currItem->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY);
currItem->setImageVisible(Buffer->PicArt);
- currItem->ScaleType = Buffer->ScaleType;
+ if (Buffer->ScaleType)
+ currItem->setImageScaleFree();
+ else
+ currItem->setImageScaleFit();
currItem->AspectRatio = Buffer->AspectRatio;
currItem->setLineWidth(Buffer->Pwidth);
// undoManager->setUndoEnabled(true);
@@ -405,7 +408,10 @@ void Scribus12Format::PasteItem(struct CopyPasteBuffer *Buffer, bool drag, bool
m_Doc->loadPict(currItem->Pfile, currItem);
currItem->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY);
currItem->setImageVisible(Buffer->PicArt);
- currItem->ScaleType = Buffer->ScaleType;
+ if (Buffer->ScaleType)
+ currItem->setImageScaleFree();
+ else
+ currItem->setImageScaleFit();
currItem->AspectRatio = Buffer->AspectRatio;
currItem->setLineWidth(Buffer->Pwidth);
PageItem_LatexFrame *latexframe = currItem->asLatexFrame();
@@ -430,7 +436,10 @@ void Scribus12Format::PasteItem(struct CopyPasteBuffer *Buffer, bool drag, bool
m_Doc->loadPict(currItem->Pfile, currItem);
currItem->setImageXYScale(Buffer->LocalScX, Buffer->LocalScY);
currItem->setImageVisible(Buffer->PicArt);
- currItem->ScaleType = Buffer->ScaleType;
+ if (Buffer->ScaleType)
+ currItem->setImageScaleFree();
+ else
+ currItem->setImageScaleFit();
currItem->AspectRatio = Buffer->AspectRatio;
currItem->setLineWidth(Buffer->Pwidth);
// undoManager->setUndoEnabled(true);
diff --git a/scribus/plugins/fileloader/scribus134format/scribus134format.cpp b/scribus/plugins/fileloader/scribus134format/scribus134format.cpp
index a8634f3d8..804892f69 100644
--- a/scribus/plugins/fileloader/scribus134format/scribus134format.cpp
+++ b/scribus/plugins/fileloader/scribus134format/scribus134format.cpp
@@ -14,6 +14,7 @@ for which a new license (GPL+exception) is in place.
#include "langmgr.h"
#include "ui/missing.h"
#include "hyphenator.h"
+#include "pageitem.h"
#include "pageitem_latexframe.h"
#include "pageitem_table.h"
#include "prefsmanager.h"
@@ -1026,7 +1027,7 @@ void Scribus134Format::readToolSettings(ScribusDoc* doc, ScXmlStreamAttributes&
doc->itemToolPrefs().lineEndArrow = attrs.valueAsInt("EndArrow", 0);
doc->itemToolPrefs().imageScaleX = attrs.valueAsDouble("PICTSCX", 1.0);
doc->itemToolPrefs().imageScaleY = attrs.valueAsDouble("PICTSCY", 1.0);
- doc->itemToolPrefs().imageScaleType = attrs.valueAsBool("PSCALE", true);
+ doc->itemToolPrefs().imageScaleType = static_cast<PageItem::ImageScaleMode>(attrs.valueAsInt("PSCALE", 0));
doc->itemToolPrefs().imageAspectRatio = attrs.valueAsBool("PASPECT", false);
doc->itemToolPrefs().imageLowResType = attrs.valueAsInt("HalfRes", 1);
doc->itemToolPrefs().imageUseEmbeddedPath = attrs.valueAsBool("EmbeddedPath", false);
@@ -2555,7 +2556,7 @@ PageItem* Scribus134Format::pasteItem(ScribusDoc *doc, ScXmlStreamAttributes& at
if (pagenr > -2)
currItem->OwnPage = pagenr;
UndoManager::instance()->setUndoEnabled(false);
- currItem->ScaleType = attrs.valueAsInt("SCALETYPE", 1);
+ currItem->m_scaleMode = static_cast<PageItem::ImageScaleMode>(attrs.valueAsInt("SCALETYPE", 0));
currItem->AspectRatio = attrs.valueAsInt("RATIO", 0);
currItem->setImageXYScale(scx, scy);
currItem->setImageXYOffset(attrs.valueAsDouble("LOCALX"), attrs.valueAsDouble("LOCALY"));
@@ -2851,7 +2852,7 @@ PageItem* Scribus134Format::pasteItem(ScribusDoc *doc, ScXmlStreamAttributes& at
UndoManager::instance()->setUndoEnabled(false);
if (currItem->isAnnotation() && currItem->annotation().UseIcons())
{
- currItem->ScaleType = attrs.valueAsInt("SCALETYPE", 1);
+ currItem->m_scaleMode = static_cast<PageItem::ImageScaleMode>(attrs.valueAsInt("SCALETYPE", 0));
currItem->AspectRatio = attrs.valueAsInt("RATIO", 0);
currItem->setImageXYScale(scx, scy);
currItem->setImageXYOffset(attrs.valueAsDouble("LOCALX"), attrs.valueAsDouble("LOCALY"));
diff --git a/scribus/plugins/fileloader/scribus13format/scribus13format.cpp b/scribus/plugins/fileloader/scribus13format/scribus13format.cpp
index 952b3992f..4fdd46eb2 100644
--- a/scribus/plugins/fileloader/scribus13format/scribus13format.cpp
+++ b/scribus/plugins/fileloader/scribus13format/scribus13format.cpp
@@ -11,6 +11,7 @@ for which a new license (GPL+exception) is in place.
#include "commonstrings.h"
#include "langmgr.h"
#include "ui/missing.h"
+#include "pageitem.h"
#include "pageitem_group.h"
#include "prefsmanager.h"
#include "qtiocompressor.h"
@@ -391,7 +392,7 @@ bool Scribus13Format::loadFile(const QString & fileName, const FileFormat & /* f
m_Doc->itemToolPrefs().lineEndArrow = dc.attribute("EndArrow", "0").toInt();
m_Doc->itemToolPrefs().imageScaleX = ScCLocale::toDoubleC(dc.attribute("PICTSCX"), 1.0);
m_Doc->itemToolPrefs().imageScaleY = ScCLocale::toDoubleC(dc.attribute("PICTSCY"), 1.0);
- m_Doc->itemToolPrefs().imageScaleType = static_cast<bool>(dc.attribute("PSCALE", "1").toInt());
+ m_Doc->itemToolPrefs().imageScaleType = static_cast<PageItem::ImageScaleMode>(dc.attribute("PSCALE", "0").toInt());
m_Doc->itemToolPrefs().imageAspectRatio = static_cast<bool>(dc.attribute("PASPECT", "0").toInt());
m_Doc->itemToolPrefs().imageLowResType = dc.attribute("HalfRes", "1").toInt();
m_Doc->itemToolPrefs().imageUseEmbeddedPath = static_cast<bool>(dc.attribute("EmbeddedPath", "0").toInt());
@@ -1521,7 +1522,7 @@ PageItem* Scribus13Format::PasteItem(QDomElement *obj, ScribusDoc *doc, const QS
if (pagenr > -2)
currItem->setOwnerPage(pagenr);
UndoManager::instance()->setUndoEnabled(false);
- currItem->ScaleType = obj->attribute("SCALETYPE", "1").toInt();
+ currItem->m_scaleMode = static_cast<PageItem::ImageScaleMode>(obj->attribute("SCALETYPE", "0").toInt());
currItem->AspectRatio = obj->attribute("RATIO", "0").toInt();
currItem->setImageXYScale(scx, scy);
currItem->setImageXYOffset(offsX, offsY);
@@ -1814,7 +1815,7 @@ PageItem* Scribus13Format::PasteItem(QDomElement *obj, ScribusDoc *doc, const QS
UndoManager::instance()->setUndoEnabled(false);
if (currItem->isAnnotation() && currItem->annotation().UseIcons())
{
- currItem->ScaleType = obj->attribute("SCALETYPE", "1").toInt();
+ currItem->m_scaleMode = static_cast<PageItem::ImageScaleMode>(obj->attribute("SCALETYPE", "0").toInt());
currItem->AspectRatio = obj->attribute("RATIO", "0").toInt();
currItem->setImageXYScale(scx, scy);
currItem->setImageXYOffset(offsX, offsY);
diff --git a/scribus/plugins/fileloader/scribus150format/scribus150format.cpp b/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
index 973403680..53ba1e913 100644
--- a/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
+++ b/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
@@ -15,6 +15,7 @@ for which a new license (GPL+exception) is in place.
#include "hyphenator.h"
#include "langmgr.h"
#include "notesstyles.h"
+#include "pageitem.h"
#include "pageitem_latexframe.h"
#include "pageitem_noteframe.h"
#include "pagesize.h"
@@ -2238,7 +2239,7 @@ void Scribus150Format::readToolSettings(ScribusDoc* doc, ScXmlStreamAttributes&
doc->itemToolPrefs().lineEndArrow = attrs.valueAsInt("EndArrow", 0);
doc->itemToolPrefs().imageScaleX = attrs.valueAsDouble("PICTSCX", 1.0);
doc->itemToolPrefs().imageScaleY = attrs.valueAsDouble("PICTSCY", 1.0);
- doc->itemToolPrefs().imageScaleType = attrs.valueAsBool("PSCALE", true);
+ doc->itemToolPrefs().imageScaleType = static_cast<PageItem::ImageScaleMode>(attrs.valueAsInt("PSCALE", 0));
doc->itemToolPrefs().imageAspectRatio = attrs.valueAsBool("PASPECT", false);
doc->itemToolPrefs().imageLowResType = attrs.valueAsInt("HalfRes", 1);
doc->itemToolPrefs().imageUseEmbeddedPath = attrs.valueAsBool("EmbeddedPath", false);
@@ -4835,7 +4836,7 @@ PageItem* Scribus150Format::pasteItem(ScribusDoc *doc, ScXmlStreamAttributes& at
if (pagenr > -2)
currItem->setOwnerPage(pagenr);
UndoManager::instance()->setUndoEnabled(false);
- currItem->ScaleType = attrs.valueAsInt("SCALETYPE", 1);
+ currItem->m_scaleMode = static_cast<PageItem::ImageScaleMode>(attrs.valueAsInt("SCALETYPE", 0));
currItem->AspectRatio = attrs.valueAsInt("RATIO", 0);
currItem->setImageXYScale(scx, scy);
currItem->setImageXYOffset(attrs.valueAsDouble("LOCALX"), attrs.valueAsDouble("LOCALY"));
@@ -5228,7 +5229,7 @@ PageItem* Scribus150Format::pasteItem(ScribusDoc *doc, ScXmlStreamAttributes& at
currItem->setImageVisible( attrs.valueAsInt("PICART"));
/* currItem->BBoxX = ScCLocale::toDoubleC( obj->attribute("BBOXX"));
currItem->BBoxH = ScCLocale::toDoubleC( obj->attribute("BBOXH")); */
- currItem->ScaleType = attrs.valueAsInt("SCALETYPE", 1);
+ currItem->m_scaleMode = static_cast<PageItem::ImageScaleMode>(attrs.valueAsInt("SCALETYPE", 0));
currItem->AspectRatio = attrs.valueAsInt("RATIO", 0);
}
UndoManager::instance()->setUndoEnabled(true);
diff --git a/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp b/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
index 9dc03aeab..fab543678 100644
--- a/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
+++ b/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
@@ -2608,7 +2608,7 @@ void Scribus150Format::SetItemProps(ScXmlStreamWriter& docu, PageItem* item, con
docu.writeAttribute("LOCALY",item->imageYOffset());
docu.writeAttribute("LOCALROT" ,item->imageRotation());
docu.writeAttribute("PICART", item->imageVisible() ? 1 : 0);
- docu.writeAttribute("SCALETYPE", item->ScaleType ? 1 : 0);
+ docu.writeAttribute("SCALETYPE", static_cast<int>(item->m_scaleMode));
docu.writeAttribute("RATIO", item->AspectRatio ? 1 : 0);
}
if (item->asTextFrame() || item->asPathText())
diff --git a/scribus/plugins/import/cgm/importcgm.cpp b/scribus/plugins/import/cgm/importcgm.cpp
index 739c16cdb..71237bb98 100644
--- a/scribus/plugins/import/cgm/importcgm.cpp
+++ b/scribus/plugins/import/cgm/importcgm.cpp
@@ -1578,7 +1578,7 @@ void CgmPlug::decodeClass4(QDataStream &ts, quint16 elemID, quint16 paramLen)
delete tempFile;
ite->setImageFlippedH(flipX);
ite->setImageFlippedV(flipY);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
ite->adjustPictScale();
colorPrecision = t_colorPrecision;
colorIndexPrecision = t_colorIndexPrecision;
@@ -2409,7 +2409,7 @@ void CgmPlug::decodeClass5(QDataStream &ts, quint16 elemID, quint16 paramLen)
ite->isTempFile = true;
tmpImg.save(fileName, "PNG");
m_Doc->loadPict(fileName, ite);
- ite->setImageScalingMode(false, true);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, true);
ScPattern pat = ScPattern();
pat.setDoc(m_Doc);
pat.pattern = tmpImg;
diff --git a/scribus/plugins/import/drw/importdrw.cpp b/scribus/plugins/import/drw/importdrw.cpp
index 6437db27b..b736fbdff 100644
--- a/scribus/plugins/import/drw/importdrw.cpp
+++ b/scribus/plugins/import/drw/importdrw.cpp
@@ -28,6 +28,7 @@ for which a new license (GPL+exception) is in place.
#include "commonstrings.h"
#include "loadsaveplugin.h"
+#include "pageitem.h"
#include "pageitem_imageframe.h"
#include "pagesize.h"
#include "prefscontext.h"
@@ -907,7 +908,7 @@ void DrwPlug::decodeCmd(quint8 cmd, int pos)
tmpImage.save(fileName, "PNG");
m_Doc->loadPict(fileName, currentItem);
delete tempFile;
- currentItem->setImageScalingMode(false, false);
+ currentItem->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
}
imageValid = false;
tmpImage = QImage();
diff --git a/scribus/plugins/import/emf/importemf.cpp b/scribus/plugins/import/emf/importemf.cpp
index a88425cb7..c4c428042 100644
--- a/scribus/plugins/import/emf/importemf.cpp
+++ b/scribus/plugins/import/emf/importemf.cpp
@@ -31,6 +31,7 @@ for which a new license (GPL+exception) is in place.
#include "fileloader.h"
#include "ui/missing.h"
#include "ui/multiprogressdialog.h"
+#include "pageitem.h"
#include "pageitem_imageframe.h"
#include "pagesize.h"
#include "prefscontext.h"
@@ -2959,7 +2960,7 @@ void EmfPlug::handleImage(qint32 dstX, qint32 dstY, qint32 dstW, qint32 dstH, co
ite->isInlineImage = true;
ite->isTempFile = true;
ite->AspectRatio = false;
- ite->ScaleType = false;
+ ite->setImageScaleFit();
if (currentDC.clipValid)
{
FPointArray cp = currentDC.clipPath.copy();
@@ -5720,7 +5721,7 @@ void EmfPlug::handleEMFPDrawImageData(QPointF p1, QPointF p2, QPointF p3, quint8
m_Effects.clear();
}
m_Doc->loadPict(fileName, ite);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
ite->updateClip();
if (currentDC.clipValid)
{
diff --git a/scribus/plugins/import/idml/importidml.cpp b/scribus/plugins/import/idml/importidml.cpp
index a00e724a3..3630c030f 100644
--- a/scribus/plugins/import/idml/importidml.cpp
+++ b/scribus/plugins/import/idml/importidml.cpp
@@ -2602,12 +2602,12 @@ QList<PageItem*> IdmlPlug::parseItemXML(const QDomElement& itElem, const QTransf
item->isTempFile = true;
item->AspectRatio = true;
if (imageFit == "None")
- item->ScaleType = true;
+ item->setImageScaleFree();
else if (imageFit == "ContentToFrame")
- item->ScaleType = false;
+ item->setImageScaleFit();
else if (imageFit == "Proportionally")
{
- item->ScaleType = false;
+ item->setImageScaleFit();
item->AspectRatio = false;
}
m_Doc->loadPict(fileName, item);
@@ -2637,12 +2637,12 @@ QList<PageItem*> IdmlPlug::parseItemXML(const QDomElement& itElem, const QTransf
}
item->AspectRatio = true;
if (imageFit == "None")
- item->ScaleType = true;
+ item->setImageScaleFree();
else if (imageFit == "ContentToFrame")
- item->ScaleType = false;
+ item->setImageScaleFit();
else if (imageFit == "Proportionally")
{
- item->ScaleType = false;
+ item->setImageScaleFit();
item->AspectRatio = false;
}
m_Doc->loadPict(QUrl::fromPercentEncoding(fileName), item);
diff --git a/scribus/plugins/import/odg/importodg.cpp b/scribus/plugins/import/odg/importodg.cpp
index 2f63eb028..31617addb 100644
--- a/scribus/plugins/import/odg/importodg.cpp
+++ b/scribus/plugins/import/odg/importodg.cpp
@@ -1566,7 +1566,7 @@ PageItem* OdgPlug::parseFrame(QDomElement &e)
retObj->isInlineImage = true;
retObj->isTempFile = true;
retObj->AspectRatio = false;
- retObj->ScaleType = false;
+ retObj->setImageScaleFit();
m_Doc->loadPict(fileName, retObj);
retObj->adjustPictScale();
}
@@ -1656,7 +1656,7 @@ PageItem* OdgPlug::parseFrame(QDomElement &e)
retObj->isInlineImage = true;
retObj->isTempFile = true;
retObj->AspectRatio = false;
- retObj->ScaleType = false;
+ retObj->setImageScaleFit();
m_Doc->loadPict(fileName, retObj);
retObj->adjustPictScale();
}
diff --git a/scribus/plugins/import/pages/importpages.cpp b/scribus/plugins/import/pages/importpages.cpp
index 272ae3908..4368f2525 100644
--- a/scribus/plugins/import/pages/importpages.cpp
+++ b/scribus/plugins/import/pages/importpages.cpp
@@ -1887,7 +1887,7 @@ PageItem* PagesPlug::parseObjReference(QDomElement &draw)
retObj->isInlineImage = true;
retObj->isTempFile = true;
retObj->AspectRatio = false;
- retObj->ScaleType = false;
+ retObj->setImageScaleFit();
m_Doc->loadPict(fileName, retObj);
retObj->adjustPictScale();
}
diff --git a/scribus/plugins/import/pct/importpct.cpp b/scribus/plugins/import/pct/importpct.cpp
index 8feca4fe3..0f531a2a3 100644
--- a/scribus/plugins/import/pct/importpct.cpp
+++ b/scribus/plugins/import/pct/importpct.cpp
@@ -1016,7 +1016,7 @@ void PctPlug::parsePict(QDataStream &ts)
ite->moveBy(offsetX, offsetY);
finishItem(ite);
m_Doc->loadPict(fileName, ite);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
delete tempFile;
}
// qDebug() << "End of Pict";
@@ -1852,7 +1852,7 @@ void PctPlug::handlePixmap(QDataStream &ts, quint16 opCode)
ite->moveBy(offsetX, offsetY);
finishItem(ite);
m_Doc->loadPict(fileName, ite);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
skipOpcode = false;
}
alignStreamToWord(ts, 0);
diff --git a/scribus/plugins/import/pdf/slaoutput.cpp b/scribus/plugins/import/pdf/slaoutput.cpp
index cfc438b3c..9c11a6bdf 100644
--- a/scribus/plugins/import/pdf/slaoutput.cpp
+++ b/scribus/plugins/import/pdf/slaoutput.cpp
@@ -2429,7 +2429,7 @@ void SlaOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int
ite->isTempFile = true;
res.save(fileName, "PNG");
m_doc->loadPict(fileName, ite);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
m_Elements->append(ite);
if (m_groupStack.count() != 0)
{
@@ -2445,7 +2445,7 @@ void SlaOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int
FPoint wh = getMaxClipF(&ite->PoLine);
ite->setWidthHeight(wh.x(),wh.y());
ite->setTextFlowMode(PageItem::TextFlowDisabled);
- ite->ScaleType = true;
+ ite->setImageScaleFree();
m_doc->adjustItemSize(ite);
ite->OldB2 = ite->width();
ite->OldH2 = ite->height();
@@ -2568,10 +2568,9 @@ void SlaOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str
ite->isInlineImage = true;
ite->isTempFile = true;
ite->AspectRatio = false;
- ite->ScaleType = false;
+ ite->setImageScaleFit();
res.save(fileName, "PNG");
m_doc->loadPict(fileName, ite);
- // ite->setImageScalingMode(false, false);
m_Elements->append(ite);
if (m_groupStack.count() != 0)
{
@@ -2587,7 +2586,7 @@ void SlaOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str
FPoint wh = getMaxClipF(&ite->PoLine);
ite->setWidthHeight(wh.x(),wh.y());
ite->setTextFlowMode(PageItem::TextFlowDisabled);
- ite->ScaleType = true;
+ ite->setImageScaleFree();
m_doc->adjustItemSize(ite);
ite->OldB2 = ite->width();
ite->OldH2 = ite->height();
@@ -2717,10 +2716,9 @@ void SlaOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, i
ite->isInlineImage = true;
ite->isTempFile = true;
ite->AspectRatio = false;
- ite->ScaleType = false;
+ ite->setImageScaleFit();
res.save(fileName, "PNG");
m_doc->loadPict(fileName, ite);
- // ite->setImageScalingMode(false, false);
m_Elements->append(ite);
if (m_groupStack.count() != 0)
{
@@ -2736,7 +2734,7 @@ void SlaOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, i
FPoint wh = getMaxClipF(&ite->PoLine);
ite->setWidthHeight(wh.x(),wh.y());
ite->setTextFlowMode(PageItem::TextFlowDisabled);
- ite->ScaleType = true;
+ ite->setImageScaleFree();
m_doc->adjustItemSize(ite);
ite->OldB2 = ite->width();
ite->OldH2 = ite->height();
@@ -2889,7 +2887,7 @@ void SlaOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int widt
ite->isInlineImage = true;
ite->isTempFile = true;
ite->AspectRatio = false;
- ite->ScaleType = false;
+ ite->setImageScaleFit();
TIFF* tif = TIFFOpen(fileName.toLocal8Bit().data(), "w");
if (tif)
{
@@ -2932,7 +2930,7 @@ void SlaOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int widt
ite->isInlineImage = true;
ite->isTempFile = true;
ite->AspectRatio = false;
- ite->ScaleType = false;
+ ite->setImageScaleFit();
img.save(fileName, "PNG");
m_doc->loadPict(fileName, ite);
m_Elements->append(ite);
@@ -2956,7 +2954,7 @@ void SlaOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int widt
FPoint wh = getMaxClipF(&ite->PoLine);
ite->setWidthHeight(wh.x(),wh.y());
ite->setTextFlowMode(PageItem::TextFlowDisabled);
- ite->ScaleType = true;
+ ite->setImageScaleFree();
m_doc->adjustItemSize(ite);
ite->OldB2 = ite->width();
ite->OldH2 = ite->height();
diff --git a/scribus/plugins/import/ps/importps.cpp b/scribus/plugins/import/ps/importps.cpp
index b90934661..35a5a6675 100644
--- a/scribus/plugins/import/ps/importps.cpp
+++ b/scribus/plugins/import/ps/importps.cpp
@@ -866,7 +866,7 @@ bool EPSPlug::Image(QString vals)
*/
m_Doc->loadPict(filename, ite, -1);
ite->setRotation(angle);
- ite->setImageScalingMode(false, true); // fit to frame, keep ratio
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, true); // fit to frame, keep ratio
// m_Doc->view()->adjustItemSize(ite);
Elements.append(ite);
return ret == 0;
diff --git a/scribus/plugins/import/svg/svgplugin.cpp b/scribus/plugins/import/svg/svgplugin.cpp
index c720d1067..100a9d7a6 100644
--- a/scribus/plugins/import/svg/svgplugin.cpp
+++ b/scribus/plugins/import/svg/svgplugin.cpp
@@ -625,7 +625,7 @@ PageItem *SVGPlug::finishNode(const QDomNode &e, PageItem* item)
item->setImageXYOffset(0.0, 0.0);
item->setImageXYScale(item->width() / (item->pixm.width() * (item->pixm.imgInfo.xres / 72.0)),
item->height() / (item->pixm.height() * (item->pixm.imgInfo.yres / 72.0)));
- item->setImageScalingMode(false, false); // fit to frame
+ item->setImageScalingMode(PageItem::ImageScaleMode::fit, false); // fit to frame
}
break;
}
diff --git a/scribus/plugins/import/svm/importsvm.cpp b/scribus/plugins/import/svm/importsvm.cpp
index 6b91b4b43..ca53c0265 100644
--- a/scribus/plugins/import/svm/importsvm.cpp
+++ b/scribus/plugins/import/svm/importsvm.cpp
@@ -2055,7 +2055,7 @@ void SvmPlug::handleImage(QDataStream &ds, qint64 posi, quint32 totalSize)
ite->isInlineImage = true;
ite->isTempFile = true;
ite->AspectRatio = false;
- ite->ScaleType = false;
+ ite->setImageScaleFit();
m_Doc->loadPict(fileName, ite);
ite->adjustPictScale();
}
@@ -2111,7 +2111,7 @@ void SvmPlug::handleImageEX(QDataStream &ds, qint64 posi, quint32 totalSize)
ite->isInlineImage = true;
ite->isTempFile = true;
ite->AspectRatio = false;
- ite->ScaleType = false;
+ ite->setImageScaleFit();
m_Doc->loadPict(fileName, ite);
ite->adjustPictScale();
}
@@ -4591,7 +4591,7 @@ void SvmPlug::handleEMFPDrawImageData(QPointF p1, QPointF p2, QPointF p3, quint8
m_Effects.clear();
}
m_Doc->loadPict(fileName, ite);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
ite->updateClip();
if (currentDC.clipPath.count() != 0)
{
diff --git a/scribus/plugins/import/viva/importviva.cpp b/scribus/plugins/import/viva/importviva.cpp
index fe1621933..06f9a7a11 100644
--- a/scribus/plugins/import/viva/importviva.cpp
+++ b/scribus/plugins/import/viva/importviva.cpp
@@ -1644,7 +1644,7 @@ PageItem* VivaPlug::parseObjectDetailsXML(const QDomElement& obNode, int baseTyp
if (baseType == 1)
{
item->AspectRatio = true;
- item->ScaleType = false;
+ item->setImageScaleFit();
bool erf = m_Doc->loadPict(imageFile, item);
if (!erf)
{
@@ -1662,7 +1662,7 @@ PageItem* VivaPlug::parseObjectDetailsXML(const QDomElement& obNode, int baseTyp
item->isInlineImage = true;
item->isTempFile = true;
item->AspectRatio = true;
- item->ScaleType = false;
+ item->setImageScaleFit();
m_Doc->loadPict(fileName, item);
}
}
diff --git a/scribus/plugins/import/wpg/importwpg.cpp b/scribus/plugins/import/wpg/importwpg.cpp
index 4ea64c3b4..e7ddbf088 100644
--- a/scribus/plugins/import/wpg/importwpg.cpp
+++ b/scribus/plugins/import/wpg/importwpg.cpp
@@ -406,7 +406,7 @@ void ScrPainter::drawBitmap(const libwpg::WPGBitmap& bitmap, double hres, double
image.setDotsPerMeterY ((int) (vres / 0.0254));
image.save(fileName, "PNG");
m_Doc->loadPict(fileName, ite);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
ite->moveBy(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
finishItem(ite);
// qDebug() << "drawBitmap";
diff --git a/scribus/plugins/import/xar/importxar.cpp b/scribus/plugins/import/xar/importxar.cpp
index ef9a0684a..a0013963d 100644
--- a/scribus/plugins/import/xar/importxar.cpp
+++ b/scribus/plugins/import/xar/importxar.cpp
@@ -681,7 +681,7 @@ void XarPlug::handleTags(quint32 tag, quint32 dataLen, QDataStream &ts)
image.save(fileName, "PNG");
ite->moveBy(m_Doc->currentPage()->xOffset(), m_Doc->currentPage()->yOffset());
m_Doc->LoadPict(fileName, z);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
ite->ClipEdited = true;
ite->FrameType = 3;
ite->setFillShade(CurrFillShade);
@@ -2816,7 +2816,7 @@ void XarPlug::handleBitmap(QDataStream &ts)
ite->isInlineImage = true;
image.save(fileName, "PNG");
m_Doc->loadPict(fileName, ite);
- ite->setImageScalingMode(false, false);
+ ite->setImageScalingMode(PageItem::ImageScaleMode::fit, false);
}
}
diff --git a/scribus/plugins/import/xps/importxps.cpp b/scribus/plugins/import/xps/importxps.cpp
index 37cb18412..46b6133ab 100644
--- a/scribus/plugins/import/xps/importxps.cpp
+++ b/scribus/plugins/import/xps/importxps.cpp
@@ -1716,7 +1716,7 @@ PageItem* XpsPlug::createItem(QDomElement &dpg, ObjState &obState)
retObj->isInlineImage = true;
retObj->isTempFile = true;
retObj->AspectRatio = false;
- retObj->ScaleType = false;
+ retObj->setImageScaleFit();
m_Doc->loadPict(fileName, retObj);
retObj->adjustPictScale();
}
diff --git a/scribus/plugins/scripter/api_imageitem.cpp b/scribus/plugins/scripter/api_imageitem.cpp
index 8d5be1a65..f2d753dcf 100644
--- a/scribus/plugins/scripter/api_imageitem.cpp
+++ b/scribus/plugins/scripter/api_imageitem.cpp
@@ -196,9 +196,12 @@ void ImageAPI::scaleToFrame(bool scaleToFrame, bool proportional)
RAISE("Specified item not an image frame.");
return;
}
- // Set the item to scale if appropriate. ScaleType 1 is free
- // scale, 0 is scale to frame.
- item->ScaleType = !scaleToFrame;
+ // TODO: modify the API to give access to ImageScaleMode::fill
+ // (probably by creating scaleFree, scaleToFrame, scaleToFill
+ if (scaleToFrame)
+ item->setImageScaleFit()
+ else
+ item->setImageScaleFree()
// Now, if the user has chosen to set the proportional mode,
// set it. 1 is proportional, 0 is free aspect.
item->AspectRatio = proportional;
diff --git a/scribus/plugins/scriptplugin/cmdmani.cpp b/scribus/plugins/scriptplugin/cmdmani.cpp
index 03b7b3e0f..baf890ad5 100644
--- a/scribus/plugins/scriptplugin/cmdmani.cpp
+++ b/scribus/plugins/scriptplugin/cmdmani.cpp
@@ -570,9 +570,10 @@ PyObject *scribus_setscaleimagetoframe(PyObject* /* self */, PyObject* args, PyO
PyErr_SetString(ScribusException, QObject::tr("Specified item not an image frame.","python error").toLocal8Bit().constData());
return nullptr;
}
- // Set the item to scale if appropriate. ScaleType 1 is free
- // scale, 0 is scale to frame.
- item->ScaleType = scaleToFrame == 0;
+ // Set the item to scale if appropriate. ScaleType 0 is free
+ // scale, 1 is scale to frame, 2 is fill frame.
+ scaleToFrame == 0;
+ item->setImageScaleFree();
// Now, if the user has chosen to set the proportional mode,
// set it. 1 is proportional, 0 is free aspect.
if (proportional != -1)
diff --git a/scribus/plugins/scriptplugin/scripter2/scripter2_scribus_pageitem.cpp b/scribus/plugins/scriptplugin/scripter2/scripter2_scribus_pageitem.cpp
index d283d257b..ad9046d70 100644
--- a/scribus/plugins/scriptplugin/scripter2/scripter2_scribus_pageitem.cpp
+++ b/scribus/plugins/scriptplugin/scripter2/scripter2_scribus_pageitem.cpp
@@ -99,7 +99,7 @@ void export_PageItem()
.def_readwrite("PoShow", &PageItem::PoShow)
.def_readwrite("Redrawn", &PageItem::Redrawn)
.def_readwrite("RightLine", &PageItem::RightLine)
- .def_readwrite("ScaleType", &PageItem::ScaleType)
+ .def_readwrite("ScaleType", &PageItem::m_scaleMode)
.def_readwrite("Sizing", &PageItem::Sizing)
.def_readwrite("Tinput", &PageItem::Tinput)
.def_readwrite("toPixmap", &PageItem::toPixmap)
diff --git a/scribus/prefsmanager.cpp b/scribus/prefsmanager.cpp
index a9defa046..2ab52832e 100644
--- a/scribus/prefsmanager.cpp
+++ b/scribus/prefsmanager.cpp
@@ -307,7 +307,7 @@ void PrefsManager::initDefaults()
appPrefs.itemToolPrefs.imageStrokeColorShade = 100;
appPrefs.itemToolPrefs.imageScaleX = 1;
appPrefs.itemToolPrefs.imageScaleY = 1;
- appPrefs.itemToolPrefs.imageScaleType = true;
+ appPrefs.itemToolPrefs.imageScaleType = PageItem::ImageScaleMode::free;
appPrefs.itemToolPrefs.imageAspectRatio = true;
appPrefs.itemToolPrefs.imageLowResType = 1;
appPrefs.itemToolPrefs.imageUseEmbeddedPath = false;
@@ -2206,7 +2206,7 @@ bool PrefsManager::ReadPref(const QString& ho)
appPrefs.itemToolPrefs.imageStrokeColorShade = dc.attribute("ImageStrokeColorShade", "100").toInt();
appPrefs.itemToolPrefs.imageScaleX = ScCLocale::toDoubleC(dc.attribute("ImageScaleX"), 1.0);
appPrefs.itemToolPrefs.imageScaleY = ScCLocale::toDoubleC(dc.attribute("ImageScaleY"), 1.0);
- appPrefs.itemToolPrefs.imageScaleType = static_cast<bool>(dc.attribute("ImageScaleType", "1").toInt());
+ appPrefs.itemToolPrefs.imageScaleType = static_cast<PageItem::ImageScaleMode>(dc.attribute("ImageScaleType", "0").toInt());
appPrefs.itemToolPrefs.imageAspectRatio = static_cast<bool>(dc.attribute("ImageAspectRatio", "1").toInt());
appPrefs.itemToolPrefs.imageUseEmbeddedPath = static_cast<bool>(dc.attribute("ImageUseEmbeddedPath", "0").toInt());
appPrefs.itemToolPrefs.imageLowResType = dc.attribute("ImageLowResType", "1").toInt();
diff --git a/scribus/prefsstructs.h b/scribus/prefsstructs.h
index fa1c5d66f..95de9935b 100644
--- a/scribus/prefsstructs.h
+++ b/scribus/prefsstructs.h
@@ -25,6 +25,7 @@ for which a new license (GPL+exception) is in place.
#include "scfonts.h"
#include "scpattern.h"
#include "vgradient.h"
+#include "pageitem.h"
struct CheckerPrefs
{
@@ -277,7 +278,7 @@ struct ItemToolPrefs
int imageStrokeColorShade; //! Default shade of stroke color of an image grame
double imageScaleX; //! X scale of an image within an image frame
double imageScaleY; //! Y scale of an image within an image frame
- bool imageScaleType; //! Scale type of image
+ PageItem::ImageScaleMode imageScaleType; //! Scale type of image
bool imageAspectRatio; //! Use stored aspect ratio for the image
int imageLowResType; //! Preview type for an image frame
bool imageUseEmbeddedPath; //! Use embedded path, eg from an EPS etc.
diff --git a/scribus/relaxng/schema/pageitems.rnc b/scribus/relaxng/schema/pageitems.rnc
index 78b30c2f7..a5b7d9147 100644
--- a/scribus/relaxng/schema/pageitems.rnc
+++ b/scribus/relaxng/schema/pageitems.rnc
@@ -109,7 +109,7 @@ grammar {
[impl:name="PicArt" impl:getter="imageShown" impl:setter="setImageShown"]
attribute PICART { xsd:boolean },
[impl:name="ScaleType"]
- attribute SCALETYPE { xsd:boolean },
+ attribute SCALETYPE { xsd:int },
[impl:name="AspectRatio"]
attribute RATIO { xsd:boolean },
#[ impl:name="LocalRot" ]
diff --git a/scribus/scribusdoc.cpp b/scribus/scribusdoc.cpp
index a27577c78..8ac162ba7 100644
--- a/scribus/scribusdoc.cpp
+++ b/scribus/scribusdoc.cpp
@@ -5602,7 +5602,7 @@ void ScribusDoc::itemAddDetails(const PageItem::ItemType itemType, const PageIte
{
case PageItem::ImageFrame:
newItem->setImageXYScale(m_docPrefsData.itemToolPrefs.imageScaleX, m_docPrefsData.itemToolPrefs.imageScaleY);
- newItem->ScaleType = m_docPrefsData.itemToolPrefs.imageScaleType;
+ newItem->m_scaleMode = m_docPrefsData.itemToolPrefs.imageScaleType;
newItem->AspectRatio = m_docPrefsData.itemToolPrefs.imageAspectRatio;
newItem->IProfile = m_docPrefsData.colorPrefs.DCMSset.DefaultImageRGBProfile;
newItem->IRender = m_docPrefsData.colorPrefs.DCMSset.DefaultIntentImages;
@@ -15236,7 +15236,7 @@ void ScribusDoc::removeFromGroup(PageItem* item)
item->setXYPos(nX, nY, true);
item->rotateBy(-gRot);
item->setLineWidth(item->lineWidth() * qMax(grScXi, grScYi));
- if (!item->ScaleType)
+ if (!item->isImageScaleFree())
item->adjustPictScale();
else
{
@@ -15742,7 +15742,7 @@ void ScribusDoc::itemSelection_AdjustImagetoFrameSize( Selection *customSelectio
if (currItem!=nullptr)
{
if (currItem->asImageFrame() && currItem->imageIsAvailable)
- currItem->setImageScalingMode(false, true);
+ currItem->setImageScalingMode(PageItem::ImageScaleMode::fit, true);
}
}
regionsChanged()->update(QRectF());
diff --git a/scribus/third_party/rtf-qt/sladocumentrtfoutput.cpp b/scribus/third_party/rtf-qt/sladocumentrtfoutput.cpp
index 01e0a5885..a316490ab 100644
--- a/scribus/third_party/rtf-qt/sladocumentrtfoutput.cpp
+++ b/scribus/third_party/rtf-qt/sladocumentrtfoutput.cpp
@@ -652,7 +652,7 @@ namespace RtfReader
item->isInlineImage = true;
item->isTempFile = true;
item->AspectRatio = true;
- item->ScaleType = false;
+ item->setImageScaleFit();
m_Doc->loadPict(fileName, item);
m_Doc->Items->takeAt(z);
item->isEmbedded = true;
diff --git a/scribus/ui/prefs_itemtools.cpp b/scribus/ui/prefs_itemtools.cpp
index fed3f14d0..f71fe9083 100644
--- a/scribus/ui/prefs_itemtools.cpp
+++ b/scribus/ui/prefs_itemtools.cpp
@@ -15,6 +15,7 @@ for which a new license (GPL+exception) is in place.
#include "commonstrings.h"
#include "prefsmanager.h"
#include "sampleitem.h"
+#include "pageitem.h"
Prefs_ItemTools::Prefs_ItemTools(QWidget* parent, ScribusDoc* doc)
@@ -135,8 +136,9 @@ void Prefs_ItemTools::restoreDefaults(struct ApplicationPrefs *prefsData)
rightTextDistanceSpinBox->setValue(prefsData->itemToolPrefs.textDistances.right() * unitRatio);
//Image Tool
- imageFreeScalingRadioButton->setChecked( prefsData->itemToolPrefs.imageScaleType );
- imageFrameScalingRadioButton->setChecked( !prefsData->itemToolPrefs.imageScaleType );
+ imageFreeScalingRadioButton->setChecked(prefsData->itemToolPrefs.imageScaleType == PageItem::ImageScaleMode::free);
+ imageFrameScalingRadioButton->setChecked(prefsData->itemToolPrefs.imageScaleType == PageItem::ImageScaleMode::fit);
+ imageFillScalingRadioButton->setChecked(prefsData->itemToolPrefs.imageScaleType == PageItem::ImageScaleMode::fill);
imageHorizontalScalingSpinBox->setValue(qRound(prefsData->itemToolPrefs.imageScaleX * 100));
imageVerticalScalingSpinBox->setValue(qRound(prefsData->itemToolPrefs.imageScaleY * 100));
imageKeepAspectRatioCheckBox->setChecked(prefsData->itemToolPrefs.imageAspectRatio);
@@ -267,7 +269,12 @@ void Prefs_ItemTools::saveGuiToPrefs(struct ApplicationPrefs *prefsData) const
prefsData->itemToolPrefs.imageStrokeColorShade = imageFrameFillShadingSpinBox->value();
prefsData->itemToolPrefs.imageScaleX = static_cast<double>(imageHorizontalScalingSpinBox->value()) / 100.0;
prefsData->itemToolPrefs.imageScaleY = static_cast<double>(imageVerticalScalingSpinBox->value()) / 100.0;
- prefsData->itemToolPrefs.imageScaleType = imageFreeScalingRadioButton->isChecked();
+ if (imageFreeScalingRadioButton->isChecked())
+ prefsData->itemToolPrefs.imageScaleType = PageItem::ImageScaleMode::free;
+ else if (imageFrameScalingRadioButton->isChecked())
+ prefsData->itemToolPrefs.imageScaleType = PageItem::ImageScaleMode::fit;
+ else if (imageFillScalingRadioButton->isChecked())
+ prefsData->itemToolPrefs.imageScaleType = PageItem::ImageScaleMode::fill;
prefsData->itemToolPrefs.imageAspectRatio = imageKeepAspectRatioCheckBox->isChecked();
prefsData->itemToolPrefs.imageUseEmbeddedPath = imageUseEmbeddedClippingPathCheckBox->isChecked();
int haRes = 0;
@@ -342,6 +349,7 @@ void Prefs_ItemTools::enableSignals(bool on)
connect(imageVerticalScalingSpinBox, SIGNAL(valueChanged(int)), this, SLOT(imageVerticalScalingChange()));
connect(imageFreeScalingRadioButton, SIGNAL(clicked(bool)), this, SLOT(imageScalingTypeChange()));
connect(imageFrameScalingRadioButton, SIGNAL(clicked(bool)), this, SLOT(imageScalingTypeChange()));
+ connect(imageFillScalingRadioButton, SIGNAL(clicked(bool)), this, SLOT(imageScalingTypeChange()));
}
else
{
diff --git a/scribus/ui/prefs_itemtoolsbase.ui b/scribus/ui/prefs_itemtoolsbase.ui
index db4d78eff..bd167ce7e 100644
--- a/scribus/ui/prefs_itemtoolsbase.ui
+++ b/scribus/ui/prefs_itemtoolsbase.ui
@@ -781,6 +781,16 @@
</widget>
</item>
<item row="9" column="0">
+ <widget class="QRadioButton" name="imageFillScalingRadioButton">
+ <property name="text">
+ <string>Scale Image to Fill Frame</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string notr="true">scalingButtonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item row="10" column="0">
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -796,7 +806,7 @@
</property>
</spacer>
</item>
- <item row="10" column="0">
+ <item row="11" column="0">
<widget class="QLabel" name="OnScreenPreviewLabel">
<property name="font">
<font>
@@ -809,14 +819,14 @@
</property>
</widget>
</item>
- <item row="11" column="0" colspan="2">
+ <item row="12" column="0" colspan="2">
<widget class="Line" name="line_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
- <item row="12" column="0">
+ <item row="13" column="0">
<widget class="QRadioButton" name="onscreenResolutionFullRadioButton">
<property name="text">
<string>Full Resolution</string>
@@ -826,7 +836,7 @@
</attribute>
</widget>
</item>
- <item row="13" column="0">
+ <item row="14" column="0">
<widget class="QRadioButton" name="onscreenResolutionNormalRadioButton">
<property name="text">
<string>Normal Resolution</string>
@@ -836,7 +846,7 @@
</attribute>
</widget>
</item>
- <item row="14" column="0">
+ <item row="15" column="0">
<widget class="QRadioButton" name="onscreenResolutionLowRadioButton">
<property name="text">
<string>Low Resolution</string>
@@ -846,7 +856,7 @@
</attribute>
</widget>
</item>
- <item row="15" column="0">
+ <item row="16" column="0">
<spacer name="verticalSpacer_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -1584,6 +1594,7 @@
<tabstop>imageVerticalScalingSpinBox</tabstop>
<tabstop>imageFrameScalingRadioButton</tabstop>
<tabstop>imageKeepAspectRatioCheckBox</tabstop>
+ <tabstop>imageFillScalingRadioButton</tabstop>
<tabstop>onscreenResolutionFullRadioButton</tabstop>
<tabstop>onscreenResolutionNormalRadioButton</tabstop>
<tabstop>onscreenResolutionLowRadioButton</tabstop>
diff --git a/scribus/ui/propertiespalette_image.cpp b/scribus/ui/propertiespalette_image.cpp
index a2b7580df..1c5333dea 100644
--- a/scribus/ui/propertiespalette_image.cpp
+++ b/scribus/ui/propertiespalette_image.cpp
@@ -87,6 +87,7 @@ PropertiesPalette_Image::PropertiesPalette_Image( QWidget* parent) : QWidget(par
keepImageDPIRatioButton->setAutoRaise( true );
frameScale->setText( tr("&To Frame Size"));
+ fillScale->setText( tr("F&ill Frame"));
cbProportional->setEnabled( false );
cbProportional->setText( "P&roportional" );
@@ -106,6 +107,7 @@ PropertiesPalette_Image::PropertiesPalette_Image( QWidget* parent) : QWidget(par
connect(keepImageDPIRatioButton, SIGNAL(clicked()) , this, SLOT(handleImageDPIRatio()));
connect(freeScale , SIGNAL(clicked()) , this, SLOT(handleScaling()));
connect(frameScale , SIGNAL(clicked()) , this, SLOT(handleScaling()));
+ connect(fillScale, &QRadioButton::clicked, this, &PropertiesPalette_Image::handleScaling);
connect(cbProportional , SIGNAL(stateChanged(int)) , this, SLOT(handleScaling()));
connect(imgEffectsButton , SIGNAL(clicked()) , this, SLOT(handleImageEffects()));
connect(imgExtProperties , SIGNAL(clicked()) , this, SLOT(handleExtImgProperties()));
@@ -477,13 +479,19 @@ void PropertiesPalette_Image::setCurrentItem(PageItem *item)
imgEffectsButton->setVisible(m_item->imageIsAvailable && m_item->isRaster);
imgExtProperties->setVisible(m_item->imageIsAvailable && m_item->pixm.imgInfo.valid);
- bool setter = m_item->ScaleType;
- freeScale->setChecked(setter);
- frameScale->setChecked(!setter);
+
+ if (m_item->isImageScaleFree())
+ freeScale->setChecked(true);
+ else if (m_item->isImageScaleFit())
+ frameScale->setChecked(true);
+ else if (m_item->isImageScaleFill())
+ fillScale->setChecked(true);
+
if ((m_item->asLatexFrame()) || (m_item->asOSGFrame()))
{
freeScale->setEnabled(false);
frameScale->setEnabled(false);
+ fillScale->setEnabled(false);
cbProportional->setEnabled(false);
imageXScaleSpinBox->setEnabled(false);
imageYScaleSpinBox->setEnabled(false);
@@ -492,28 +500,32 @@ void PropertiesPalette_Image::setCurrentItem(PageItem *item)
}
else
{
- imageXScaleSpinBox->setEnabled(setter);
- imageYScaleSpinBox->setEnabled(setter);
- imgDpiX->setEnabled(setter);
- imgDpiY->setEnabled(setter);
- cbProportional->setEnabled(!setter);
+
+ bool isFree = m_item->isImageScaleFree();
+ imageXScaleSpinBox->setEnabled(isFree);
+ imageYScaleSpinBox->setEnabled(isFree);
+ imgDpiX->setEnabled(isFree);
+ imgDpiY->setEnabled(isFree);
+ cbProportional->setEnabled(m_item->isImageScaleFit());
cbProportional->setChecked(m_item->AspectRatio);
freeScale->setEnabled(true);
frameScale->setEnabled(true);
+ fillScale->setEnabled(true);
//Necessary for undo action
- keepImageWHRatioButton->setEnabled(setter);
- keepImageDPIRatioButton->setEnabled(setter);
+ keepImageWHRatioButton->setEnabled(isFree);
+ keepImageDPIRatioButton->setEnabled(isFree);
keepImageWHRatioButton->setChecked(m_item->AspectRatio);
keepImageDPIRatioButton->setChecked(m_item->AspectRatio);
}
bool xEnabled{true};
bool yEnabled{true};
- bool rotationEnabled{true};
- double rangeMin{-16777215};
+ double rangeMinX{-16777215};
+ double rangeMinY{-16777215};
double rangeMaxX{16777215 * m_unitRatio};
double rangeMaxY{16777215 * m_unitRatio};
- if (!setter)
+
+ if (m_item->isImageScaleFit())
{
if (m_item->AspectRatio)
{
@@ -525,18 +537,26 @@ void PropertiesPalette_Image::setCurrentItem(PageItem *item)
xEnabled = false;
yEnabled = false;
}
- rotationEnabled = false;
- rangeMin = 0.0;
+ rangeMinX = rangeMinY = 0.0;
rangeMaxX = (m_item->width() - m_item->OrigW * m_item->imageXScale()) * m_unitRatio;
rangeMaxY = (m_item->height() - m_item->OrigH * m_item->imageYScale()) * m_unitRatio;
}
+ else if (m_item->isImageScaleFill())
+ {
+ xEnabled = m_item->isImageFittingHorizontal();
+ yEnabled = m_item->isImageFittingVertical();
+ rangeMinX = (m_item->width() - m_item->OrigW * m_item->imageXScale()) * m_unitRatio;
+ rangeMinY = (m_item->height() - m_item->OrigH * m_item->imageYScale()) * m_unitRatio;
+ rangeMaxX = rangeMaxY = 0.0;
+ }
imageXOffsetSpinBox->setEnabled(xEnabled);
if (xEnabled)
- imageXOffsetSpinBox->setValues(rangeMin, rangeMaxX, unitGetPrecisionFromIndex(m_unitIndex), 0);
+ imageXOffsetSpinBox->setValues(rangeMinX, rangeMaxX, unitGetPrecisionFromIndex(m_unitIndex), 0);
imageYOffsetSpinBox->setEnabled(yEnabled);
if (yEnabled)
- imageYOffsetSpinBox->setValues(rangeMin, rangeMaxY, unitGetPrecisionFromIndex(m_unitIndex), 0);
- imageRotation->setEnabled(rotationEnabled);
+ imageYOffsetSpinBox->setValues(rangeMinY, rangeMaxY, unitGetPrecisionFromIndex(m_unitIndex), 0);
+
+ imageRotation->setEnabled(m_item->isImageScaleFree());
imageXScaleSpinBox->blockSignals(false);
imageYScaleSpinBox->blockSignals(false);
@@ -620,12 +640,19 @@ void PropertiesPalette_Image::handleScaling()
// here there was code setting which widgets are enabled
// when the scaling type changes. but, finally,
- // handleSelectionChanged() and setCurItem() get called
+ // handleSelectionChanged() and setCurrentItem() get called
// and overwrite what has been done here.
if ((m_haveDoc) && (m_haveItem))
{
- m_item->setImageScalingMode(freeScale->isChecked(), cbProportional->isChecked());
+ PageItem::ImageScaleMode scaleMode;
+ if (freeScale->isChecked())
+ scaleMode = PageItem::ImageScaleMode::free;
+ else if (frameScale->isChecked())
+ scaleMode = PageItem::ImageScaleMode::fit;
+ else if (fillScale->isChecked())
+ scaleMode = PageItem::ImageScaleMode::fill;
+ m_item->setImageScalingMode(scaleMode, cbProportional->isChecked());
m_doc->changed();
emit UpdtGui(PageItem::ImageFrame);
}
diff --git a/scribus/ui/propertiespalette_imagebase.ui b/scribus/ui/propertiespalette_imagebase.ui
index c284516b9..37e001678 100644
--- a/scribus/ui/propertiespalette_imagebase.ui
+++ b/scribus/ui/propertiespalette_imagebase.ui
@@ -255,6 +255,16 @@
</property>
</widget>
</item>
+ <item row="8" column="0">
+ <widget class="QRadioButton" name="fillScale">
+ <property name="toolTip">
+ <string>Make the image fill the frame</string>
+ </property>
+ <property name="text">
+ <string>F&ill Frame</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
@@ -420,6 +430,7 @@
<tabstop>keepImageWHRatioButton</tabstop>
<tabstop>keepImageDPIRatioButton</tabstop>
<tabstop>frameScale</tabstop>
+ <tabstop>fillScale</tabstop>
<tabstop>cbProportional</tabstop>
<tabstop>inputProfiles</tabstop>
<tabstop>renderIntent</tabstop>
diff --git a/scribus/undomanager.cpp b/scribus/undomanager.cpp
index f030abb2f..1ad0ff390 100644
--- a/scribus/undomanager.cpp
+++ b/scribus/undomanager.cpp
@@ -704,6 +704,7 @@ void UndoManager::languageChange()
UndoManager::ChangeMeshGradient = tr("Change mesh gradient");
UndoManager::Mode = tr("Change Mode");
UndoManager::FreeScaling = tr("Free scaling");
+ UndoManager::FrameFill = tr("Fill frame");
UndoManager::KeepRatio = tr("Keep aspect ratio");
UndoManager::BreakRatio = tr("Break aspect ratio");
UndoManager::EditContourLine = tr("Edit contour line");
@@ -989,6 +990,7 @@ QString UndoManager::PageNmbr = "";
QString UndoManager::ImageScaling = "";
QString UndoManager::FrameSize = "";
QString UndoManager::FreeScaling = "";
+QString UndoManager::FrameFill = "";
QString UndoManager::KeepRatio = "";
QString UndoManager::BreakRatio = "";
QString UndoManager::EditContourLine = "";
diff --git a/scribus/undomanager.h b/scribus/undomanager.h
index fd30ff3db..dc5a64153 100644
--- a/scribus/undomanager.h
+++ b/scribus/undomanager.h
@@ -480,6 +480,7 @@ public:
static QString ImageScaling;
static QString FrameSize;
static QString FreeScaling;
+ static QString FrameFill;
static QString KeepRatio;
static QString BreakRatio;
static QString EditContourLine;
| ||||
| Patch | Yes | ||||
|
|
the current steps are: - scale to frame size - non proportional - link the x and y scale to make it again proportional - move the image inside of the frames - set x-pos or y-pos so that there cannot be any padding bands. |
|
|
i've attached a patch. it does work but it has a big "error": since the 0 value has changed (from false to the first item in the enum) existing .sla files will be read incorrectly. i see a few ways for fixing this, but i first want to have other people opinion on what could be a good solution. p.s.: the same is also valid for the preferences, but that's less of an issue in my eyes... p.p.s: this patch is based on the "fit to frame" patch |
|
|
so, is this feature just as useless as the lack of comments let me think? ... personally, i could have used it yesterday. i don't recall the details, but from the comments i've left a few years ago, the big question is what's the best way to keep the compatibility with old documents and introducing at the same time a better interface... |
|
|
i would like to have a 'fill frame' setting. i think it would often be my standard setting when placing images (as a good starting point…) as i am not a programmer, i don't really see, how the problems with existing files can be fixed. one more question is: should the (overlapping) image be centered or not? in most use cases (at least for me) it wouldn't really matter, as i would edit the exact placing anyway. but i can imagine some 'quick and dirty' use cases where 'centered' might be handy. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2019-01-28 09:02 | ale | New Issue | |
| 2019-01-28 09:02 | ale | File Added: image-fill-demo.gif | |
| 2019-01-28 09:06 | ale | Description Updated | |
| 2019-01-28 09:11 | ale | Note Added: 0045867 | |
| 2019-01-28 09:11 | ale | Description Updated | |
| 2019-01-28 09:19 | ale | Assigned To | => ale |
| 2019-01-28 09:19 | ale | Status | new => assigned |
| 2019-01-28 09:20 | ale | Summary | fill a frame with the imaged => fill a frame with the image |
| 2019-03-06 14:39 | ale | Summary | fill a frame with the image => [PATCH (needs review)] fill a frame with the image |
| 2019-03-06 14:39 | ale | Patch | No => Yes |
| 2019-03-06 14:39 | ale | Tag Attached: patch | |
| 2019-03-06 14:42 | ale | Note Added: 0045971 | |
| 2019-03-06 14:42 | ale | Note Edited: 0045971 | |
| 2019-03-06 14:43 | ale | File Added: image-fill-mode.diff | |
| 2019-03-06 16:29 | ale | Note Edited: 0045971 | |
| 2019-03-06 16:30 | ale | Relationship added | related to 0015448 |
| 2019-06-14 17:56 | JLuc | Relationship added | related to 0015713 |
| 2020-06-19 08:14 | JLuc | Relationship added | has duplicate 0016137 |
| 2020-11-10 07:10 | ale | Relationship added | related to 0011142 |
| 2024-01-07 13:07 | ale | Note Added: 0050843 | |
| 2024-01-08 03:59 | utnik | Note Added: 0050847 |