Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 120194 Details for
Bug 242280
GDI+ pen shifting for odd pen widths should be calculated using unscaled pen width
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Patch with API to toggle compatibility mode
gdiplus_patch.txt (text/plain), 11.72 KB, created by
Randy Hudson
on 2008-12-11 09:39:28 EST
(
hide
)
Description:
Patch with API to toggle compatibility mode
Filename:
MIME Type:
Creator:
Randy Hudson
Created:
2008-12-11 09:39:28 EST
Size:
11.72 KB
patch
obsolete
>Index: Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java,v >retrieving revision 1.247 >diff -u -r1.247 GC.java >--- Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java 20 Nov 2008 16:18:21 -0000 1.247 >+++ Eclipse SWT/win32/org/eclipse/swt/graphics/GC.java 11 Dec 2008 14:38:12 -0000 >@@ -83,7 +83,7 @@ > static final int DRAW_OFFSET = 1 << 14; > > static final int DRAW = FOREGROUND | LINE_STYLE | LINE_WIDTH | LINE_CAP | LINE_JOIN | LINE_MITERLIMIT | PEN | NULL_BRUSH | DRAW_OFFSET; >- static final int FILL = BACKGROUND | BRUSH | NULL_PEN; >+ static final int FILL = BACKGROUND | BRUSH | NULL_PEN | DRAW_OFFSET; > > static final float[] LINE_DOT_ZERO = new float[]{3, 3}; > static final float[] LINE_DASH_ZERO = new float[]{18, 6}; >@@ -227,7 +227,12 @@ > case SWT.LINE_DASHDOTDOT: dashStyle = Gdip.DashStyleDashDotDot; if (width == 0) dashes = LINE_DASHDOTDOT_ZERO; break; > case SWT.LINE_CUSTOM: { > if (data.lineDashes != null) { >- dashOffset = data.lineDashesOffset / Math.max (1, width); >+ dashOffset = data.lineDashesOffset; >+ if (data.pixelOffsetMode == SWT.PIXEL_OFFSET_COMPATIBILITY) { >+ if ((data.lineWidth % 2) == 1) >+ dashOffset += 0.5; >+ } >+ dashOffset = dashOffset / Math.max (1, width); > dashes = new float[data.lineDashes.length * 2]; > for (int i = 0; i < data.lineDashes.length; i++) { > float dash = data.lineDashes[i] / Math.max (1, width); >@@ -306,24 +311,12 @@ > data.gdipFont = gdipFont; > } > if ((state & DRAW_OFFSET) != 0) { >- data.gdipXOffset = data.gdipYOffset = 0; >- int /*long*/ matrix = Gdip.Matrix_new(1, 0, 0, 1, 0, 0); >- PointF point = new PointF(); >- point.X = point.Y = 1; >- Gdip.Graphics_GetTransform(gdipGraphics, matrix); >- Gdip.Matrix_TransformVectors(matrix, point, 1); >- Gdip.Matrix_delete(matrix); >- float scaling = point.X; >- if (scaling < 0) scaling = -scaling; >- float penWidth = data.lineWidth * scaling; >- if (penWidth == 0 || ((int)penWidth % 2) == 1) { >- data.gdipXOffset = 0.5f / scaling; >- } >- scaling = point.Y; >- if (scaling < 0) scaling = -scaling; >- penWidth = data.lineWidth * scaling; >- if (penWidth == 0 || ((int)penWidth % 2) == 1) { >- data.gdipYOffset = 0.5f / scaling; >+ int lineWidth = (int) data.lineWidth; >+ data.gdipFillOffset = data.gdipOffset = 0; >+ if (data.pixelOffsetMode == SWT.PIXEL_OFFSET_COMPATIBILITY) { >+ data.gdipFillOffset = 0.5f; >+ if(lineWidth == 0 || (lineWidth % 2) == 1) >+ data.gdipOffset = 0.5f; > } > } > return; >@@ -706,7 +699,7 @@ > if (width == 0 || height == 0 || arcAngle == 0) return; > int /*long*/ gdipGraphics = data.gdipGraphics; > if (gdipGraphics != 0) { >- Gdip.Graphics_TranslateTransform(gdipGraphics, data.gdipXOffset, data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, data.gdipOffset); > if (width == height) { > Gdip.Graphics_DrawArc(gdipGraphics, data.gdipPen, x, y, width, height, -startAngle, -arcAngle); > } else { >@@ -720,7 +713,7 @@ > Gdip.Matrix_delete(matrix); > Gdip.GraphicsPath_delete(path); > } >- Gdip.Graphics_TranslateTransform(gdipGraphics, -data.gdipXOffset, -data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, -data.gdipOffset); > return; > } > if ((data.style & SWT.MIRRORED) != 0) { >@@ -1629,9 +1622,9 @@ > checkGC(DRAW); > int /*long*/ gdipGraphics = data.gdipGraphics; > if (gdipGraphics != 0) { >- Gdip.Graphics_TranslateTransform(gdipGraphics, data.gdipXOffset, data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, data.gdipOffset); > Gdip.Graphics_DrawLine(gdipGraphics, data.gdipPen, x1, y1, x2, y2); >- Gdip.Graphics_TranslateTransform(gdipGraphics, -data.gdipXOffset, -data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, -data.gdipOffset); > return; > } > if ((data.style & SWT.MIRRORED) != 0) { >@@ -1678,9 +1671,9 @@ > checkGC(DRAW); > int /*long*/ gdipGraphics = data.gdipGraphics; > if (gdipGraphics != 0) { >- Gdip.Graphics_TranslateTransform(gdipGraphics, data.gdipXOffset, data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, data.gdipOffset); > Gdip.Graphics_DrawEllipse(gdipGraphics, data.gdipPen, x, y, width, height); >- Gdip.Graphics_TranslateTransform(gdipGraphics, -data.gdipXOffset, -data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, -data.gdipOffset); > return; > } > if ((data.style & SWT.MIRRORED) != 0) { >@@ -1718,10 +1711,7 @@ > if (path.handle == 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); > initGdip(); > checkGC(DRAW); >- int /*long*/ gdipGraphics = data.gdipGraphics; >- Gdip.Graphics_TranslateTransform(gdipGraphics, data.gdipXOffset, data.gdipYOffset, Gdip.MatrixOrderPrepend); >- Gdip.Graphics_DrawPath(gdipGraphics, data.gdipPen, path.handle); >- Gdip.Graphics_TranslateTransform(gdipGraphics, -data.gdipXOffset, -data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ Gdip.Graphics_DrawPath(data.gdipGraphics, data.gdipPen, path.handle); > } > > /** >@@ -1774,9 +1764,9 @@ > checkGC(DRAW); > int /*long*/ gdipGraphics = data.gdipGraphics; > if (gdipGraphics != 0) { >- Gdip.Graphics_TranslateTransform(gdipGraphics, data.gdipXOffset, data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, data.gdipOffset); > Gdip.Graphics_DrawPolygon(gdipGraphics, data.gdipPen, pointArray, pointArray.length / 2); >- Gdip.Graphics_TranslateTransform(gdipGraphics, -data.gdipXOffset, -data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, -data.gdipOffset); > return; > } > if ((data.style & SWT.MIRRORED) != 0) { >@@ -1819,9 +1809,9 @@ > checkGC(DRAW); > int /*long*/ gdipGraphics = data.gdipGraphics; > if (gdipGraphics != 0) { >- Gdip.Graphics_TranslateTransform(gdipGraphics, data.gdipXOffset, data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, data.gdipOffset); > Gdip.Graphics_DrawLines(gdipGraphics, data.gdipPen, pointArray, pointArray.length / 2); >- Gdip.Graphics_TranslateTransform(gdipGraphics, -data.gdipXOffset, -data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, -data.gdipOffset); > return; > } > if ((data.style & SWT.MIRRORED) != 0) { >@@ -1875,9 +1865,9 @@ > y = y + height; > height = -height; > } >- Gdip.Graphics_TranslateTransform(gdipGraphics, data.gdipXOffset, data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, data.gdipOffset); > Gdip.Graphics_DrawRectangle(gdipGraphics, data.gdipPen, x, y, width, height); >- Gdip.Graphics_TranslateTransform(gdipGraphics, -data.gdipXOffset, -data.gdipYOffset, Gdip.MatrixOrderPrepend); >+ gdipShift(FOREGROUND, -data.gdipOffset); > return; > } > if ((data.style & SWT.MIRRORED) != 0) { >@@ -1992,8 +1982,8 @@ > } > > void drawRoundRectangleGdip (int /*long*/ gdipGraphics, int /*long*/ pen, int x, int y, int width, int height, int arcWidth, int arcHeight) { >- int nx = x; >- int ny = y; >+ float nx = x; >+ float ny = y; > int nw = width; > int nh = height; > int naw = arcWidth; >@@ -2012,10 +2002,13 @@ > if (nah < 0) > nah = 0 - nah; > >- Gdip.Graphics_TranslateTransform(gdipGraphics, data.gdipXOffset, data.gdipYOffset, Gdip.MatrixOrderPrepend); > if (naw == 0 || nah == 0) { >+ gdipShift(FOREGROUND, data.gdipOffset); > Gdip.Graphics_DrawRectangle(gdipGraphics, data.gdipPen, x, y, width, height); >+ gdipShift(FOREGROUND, -data.gdipOffset); > } else { >+ nx += data.gdipOffset; >+ ny += data.gdipOffset; > int /*long*/ path = Gdip.GraphicsPath_new(Gdip.FillModeAlternate); > if (path == 0) SWT.error(SWT.ERROR_NO_HANDLES); > if (nw > naw) { >@@ -2040,7 +2033,6 @@ > Gdip.Graphics_DrawPath(gdipGraphics, pen, path); > Gdip.GraphicsPath_delete(path); > } >- Gdip.Graphics_TranslateTransform(gdipGraphics, -data.gdipXOffset, -data.gdipYOffset, Gdip.MatrixOrderPrepend); > } > > /** >@@ -2773,7 +2765,9 @@ > checkGC(FILL); > if (data.gdipGraphics != 0) { > int mode = OS.GetPolyFillMode(handle) == OS.WINDING ? Gdip.FillModeWinding : Gdip.FillModeAlternate; >+ gdipShift(BACKGROUND, data.gdipFillOffset); > Gdip.Graphics_FillPolygon(data.gdipGraphics, data.gdipBrush, pointArray, pointArray.length / 2, mode); >+ gdipShift(BACKGROUND, -data.gdipFillOffset); > return; > } > if ((data.style & SWT.MIRRORED) != 0) { >@@ -2933,7 +2927,7 @@ > Gdip.Graphics_Flush(data.gdipGraphics, 0); > /* > * Note Flush() does not flush the output to the >- * underline HDC. This is done by calling GetHDC() >+ * underlying HDC. This is done by calling GetHDC() > * followed by ReleaseHDC(). > */ > int /*long*/ hdc = Gdip.Graphics_GetHDC(data.gdipGraphics); >@@ -2941,6 +2935,28 @@ > } > } > >+void gdipShift(int flags, float amount) { >+ if (amount == 0) >+ return; >+ Gdip.Graphics_TranslateTransform(data.gdipGraphics, amount, amount, Gdip.MatrixOrderPrepend); >+ if ((flags & FOREGROUND) != 0 && data.foregroundPattern != null) >+ gdipShiftBrush(data.gdipFgBrush, -amount); >+ if ((flags & BACKGROUND) != 0 && data.backgroundPattern != null) >+ gdipShiftBrush(data.gdipBgBrush, -amount); >+} >+ >+void gdipShiftBrush(int brush, float amount) { >+ switch (Gdip.Brush_GetType(brush)) { >+ case Gdip.BrushTypeTextureFill: >+ Gdip.TextureBrush_TranslateTransform(brush, amount, amount, Gdip.MatrixOrderPrepend); >+ Gdip.Pen_SetBrush(data.gdipPen, brush); >+ break; >+ case Gdip.BrushTypeLinearGradient: >+ Gdip.LinearGradientBrush_TranslateTransform(brush, amount, amount, Gdip.MatrixOrderPrepend); >+ break; >+ } >+} >+ > /** > * Returns the <em>advance width</em> of the specified character in > * the font which is currently selected into the receiver. >@@ -3586,7 +3602,6 @@ > if (transform.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); > int /*long*/ gdipGraphics = data.gdipGraphics; > if (gdipGraphics != 0) { >- Gdip.Graphics_GetTransform(gdipGraphics, transform.handle); > int /*long*/ identity = identity(); > Gdip.Matrix_Invert(identity); > Gdip.Matrix_Multiply(transform.handle, identity, Gdip.MatrixOrderAppend); >@@ -4583,6 +4598,12 @@ > data.state &= ~(LINE_WIDTH | DRAW_OFFSET); > } > >+public void setPixelOffsetMode(int offsetMode) { >+ if (data.pixelOffsetMode == offsetMode) >+ return; >+ data.state &= ~DRAW_OFFSET; >+} >+ > /** > * If the argument is <code>true</code>, puts the receiver > * in a drawing mode where the resulting color in the destination >@@ -4697,11 +4718,10 @@ > initGdip(); > int /*long*/ identity = identity(); > if (transform != null) { >- Gdip.Matrix_Multiply(identity, transform.handle, Gdip.MatrixOrderPrepend); >+ Gdip.Matrix_Multiply(identity, transform.handle, Gdip.MatrixOrderPrepend); > } > Gdip.Graphics_SetTransform(data.gdipGraphics, identity); > Gdip.Matrix_delete(identity); >- data.state &= ~DRAW_OFFSET; > } > > /** >Index: Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java,v >retrieving revision 1.27 >diff -u -r1.27 GCData.java >--- Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java 9 Oct 2008 21:57:11 -0000 1.27 >+++ Eclipse SWT/win32/org/eclipse/swt/graphics/GCData.java 11 Dec 2008 14:38:13 -0000 >@@ -42,6 +42,9 @@ > public float[] lineDashes; > public float lineMiterLimit = 10; > public int alpha = 0xFF; >+ public int pixelOffsetMode = SWT.PIXEL_OFFSET_COMPATIBILITY; >+ public float gdipOffset; >+ public float gdipFillOffset; > > public Image image; > public int /*long*/ hPen, hOldPen; >@@ -57,7 +60,6 @@ > public int /*long*/ gdipBgBrush; > public int /*long*/ gdipFont; > public int /*long*/ hGDIFont; >- public float gdipXOffset, gdipYOffset; > public int uiState = 0; > public boolean focusDrawn; > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 242280
:
111079
|
111105
|
111110
|
118697
|
118703
|
118706
|
118710
|
118731
|
118733
|
118808
|
118813
|
118818
| 120194