Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1250,20 +1250,24 @@ private Rectangle computeSourceRectangle(ImageHandle imageHandle, Rectangle full
* computed to pixels depending on the factor of the full image bounds to the
* actual OS handle size that will be used.
*/
float scaleFactor = Math.min(1f * imageHandle.width() / fullImageBounds.width, 1f * imageHandle.height() / fullImageBounds.height);
int closestZoomOfHandle = Math.round(scaleFactor * 100);
Rectangle srcPixels = Win32DPIUtils.pointToPixel(drawable, src, closestZoomOfHandle);

if (closestZoomOfHandle != 100) {
float scaleFactorX = 1f * imageHandle.width() / fullImageBounds.width;
float scaleFactorY = 1f * imageHandle.height() / fullImageBounds.height;
int srcXPixels = Math.round(scaleFactorX * src.x);
int srcWidthPixels = Math.round(scaleFactorX * (src.x + src.width)) - srcXPixels;
int srcYPixels = Math.round(scaleFactorY * src.y);
int srcHeightPixels = Math.round(scaleFactorY * (src.y + src.height)) - srcYPixels;
Rectangle srcPixels = new Rectangle(srcXPixels, srcYPixels, srcWidthPixels, srcHeightPixels);

if (Float.compare(scaleFactorX, 100) >= 0.01 && Float.compare(scaleFactorY, 100) >= 0.01) {
/*
* This is a HACK! Due to rounding errors at fractional scale factors,
* the coordinates may be slightly off. The workaround is to restrict
* coordinates to the allowed bounds.
*/
int errX = srcPixels.x + srcPixels.width - imageHandle.width();
int errY = srcPixels.y + srcPixels.height - imageHandle.height();
int errY = srcPixels.y + srcPixels.height- imageHandle.height();
if (errX != 0 || errY != 0) {
if (errX <= closestZoomOfHandle / 100 && errY <= closestZoomOfHandle / 100) {
if (errX <= Math.ceil(scaleFactorX) && errY <= Math.ceil(scaleFactorY)) {
srcPixels.intersect(new Rectangle(0, 0, imageHandle.width(), imageHandle.height()));
} else {
SWT.error (SWT.ERROR_INVALID_ARGUMENT);
Expand Down
Loading