@@ -1958,14 +1958,20 @@ private class DrawPathOperation extends Operation {
1958
1958
@ Override
1959
1959
void apply () {
1960
1960
Path path = new Path (device , pathData );
1961
- long pathHandle = path .getHandle (getZoom ());
1962
- if (pathHandle == 0 ) SWT .error (SWT .ERROR_INVALID_ARGUMENT );
1963
- initGdip ();
1964
- checkGC (DRAW );
1965
- long gdipGraphics = data .gdipGraphics ;
1966
- Gdip .Graphics_TranslateTransform (gdipGraphics , data .gdipXOffset , data .gdipYOffset , Gdip .MatrixOrderPrepend );
1967
- Gdip .Graphics_DrawPath (gdipGraphics , data .gdipPen , pathHandle );
1968
- Gdip .Graphics_TranslateTransform (gdipGraphics , -data .gdipXOffset , -data .gdipYOffset , Gdip .MatrixOrderPrepend );
1961
+ try {
1962
+ long pathHandle = path .getHandle (getZoom ());
1963
+ if (pathHandle == 0 )
1964
+ SWT .error (SWT .ERROR_INVALID_ARGUMENT );
1965
+ initGdip ();
1966
+ checkGC (DRAW );
1967
+ long gdipGraphics = data .gdipGraphics ;
1968
+ Gdip .Graphics_TranslateTransform (gdipGraphics , data .gdipXOffset , data .gdipYOffset , Gdip .MatrixOrderPrepend );
1969
+ Gdip .Graphics_DrawPath (gdipGraphics , data .gdipPen , pathHandle );
1970
+ Gdip .Graphics_TranslateTransform (gdipGraphics , -data .gdipXOffset , -data .gdipYOffset ,
1971
+ Gdip .MatrixOrderPrepend );
1972
+ } finally {
1973
+ path .dispose ();
1974
+ }
1969
1975
}
1970
1976
}
1971
1977
@@ -3272,13 +3278,18 @@ private class FillPathOperation extends Operation {
3272
3278
@ Override
3273
3279
void apply () {
3274
3280
Path path = new Path (device , pathData );
3275
- long pathHandle = path .getHandle (getZoom ());
3276
- if (pathHandle == 0 ) SWT .error (SWT .ERROR_INVALID_ARGUMENT );
3277
- initGdip ();
3278
- checkGC (FILL );
3279
- int mode = OS .GetPolyFillMode (handle ) == OS .WINDING ? Gdip .FillModeWinding : Gdip .FillModeAlternate ;
3280
- Gdip .GraphicsPath_SetFillMode (pathHandle , mode );
3281
- Gdip .Graphics_FillPath (data .gdipGraphics , data .gdipBrush , pathHandle );
3281
+ try {
3282
+ long pathHandle = path .getHandle (getZoom ());
3283
+ if (pathHandle == 0 )
3284
+ SWT .error (SWT .ERROR_INVALID_ARGUMENT );
3285
+ initGdip ();
3286
+ checkGC (FILL );
3287
+ int mode = OS .GetPolyFillMode (handle ) == OS .WINDING ? Gdip .FillModeWinding : Gdip .FillModeAlternate ;
3288
+ Gdip .GraphicsPath_SetFillMode (pathHandle , mode );
3289
+ Gdip .Graphics_FillPath (data .gdipGraphics , data .gdipBrush , pathHandle );
3290
+ } finally {
3291
+ path .dispose ();
3292
+ }
3282
3293
}
3283
3294
}
3284
3295
@@ -4629,7 +4640,9 @@ private class SetBackgroundOperation extends Operation {
4629
4640
private final Color color ;
4630
4641
4631
4642
SetBackgroundOperation (Color color ) {
4632
- this .color = color ;
4643
+ RGB rgb = color .getRGB ();
4644
+ this .color = new Color (color .getDevice (), rgb );
4645
+ registerForDisposal (this .color );
4633
4646
}
4634
4647
4635
4648
@ Override
@@ -4676,6 +4689,7 @@ private class SetBackgroundPatternOperation extends Operation {
4676
4689
4677
4690
SetBackgroundPatternOperation (Pattern pattern ) {
4678
4691
this .pattern = pattern == null ? null : pattern .copy ();
4692
+ registerForDisposal (this .pattern );
4679
4693
}
4680
4694
4681
4695
@ Override
@@ -4938,7 +4952,8 @@ private class SetFontOperation extends Operation {
4938
4952
private final Font font ;
4939
4953
4940
4954
SetFontOperation (Font font ) {
4941
- this .font = font ;
4955
+ this .font = new Font (font .getDevice (), font .getFontData ());
4956
+ registerForDisposal (this .font );
4942
4957
}
4943
4958
4944
4959
@ Override
@@ -4973,7 +4988,9 @@ private class SetForegroundOperation extends Operation {
4973
4988
private final Color color ;
4974
4989
4975
4990
SetForegroundOperation (Color color ) {
4976
- this .color = color ;
4991
+ RGB rgb = color .getRGB ();
4992
+ this .color = new Color (color .getDevice (), rgb );
4993
+ registerForDisposal (this .color );
4977
4994
}
4978
4995
4979
4996
@ Override
@@ -5019,6 +5036,7 @@ private class SetForegroundPatternOperation extends Operation {
5019
5036
5020
5037
SetForegroundPatternOperation (Pattern pattern ) {
5021
5038
this .pattern = pattern == null ? null : pattern .copy ();
5039
+ registerForDisposal (this .pattern );
5022
5040
}
5023
5041
5024
5042
@ Override
@@ -5604,6 +5622,7 @@ private class SetTransformOperation extends Operation {
5604
5622
float [] elements = new float [6 ];
5605
5623
transform .getElements (elements );
5606
5624
this .transform = new Transform (device , elements [0 ], elements [1 ], elements [2 ], elements [3 ], elements [4 ], elements [5 ]);
5625
+ registerForDisposal (this .transform );
5607
5626
} else {
5608
5627
this .transform = null ;
5609
5628
}
@@ -5876,8 +5895,36 @@ private void createGcHandle(Drawable drawable, GCData newData, int nativeZoom) {
5876
5895
}
5877
5896
}
5878
5897
5898
+
5899
+ @ Override
5900
+ public void dispose () {
5901
+ super .dispose ();
5902
+ disposeOperations ();
5903
+ }
5904
+
5905
+ private void disposeOperations () {
5906
+ for (Operation op : operations ) {
5907
+ op .disposeAll ();
5908
+ }
5909
+ operations .clear ();
5910
+ }
5911
+
5879
5912
private abstract class Operation {
5913
+ private final List <Resource > disposables = new ArrayList <>();
5880
5914
abstract void apply ();
5915
+
5916
+ protected void registerForDisposal (Resource resource ) {
5917
+ if (resource != null ) {
5918
+ disposables .add (resource );
5919
+ }
5920
+ }
5921
+
5922
+ void disposeAll () {
5923
+ for (Resource r : disposables ) {
5924
+ r .dispose ();
5925
+ }
5926
+ disposables .clear ();
5927
+ }
5881
5928
}
5882
5929
}
5883
5930
0 commit comments