6
6
using System ;
7
7
using System . Collections . Generic ;
8
8
using System . Threading . Tasks ;
9
+ using Avalonia . Collections . Pooled ;
9
10
using Avalonia . Controls . Metadata ;
10
11
using Avalonia . Controls . Shapes ;
11
12
using Avalonia . Input ;
@@ -64,19 +65,19 @@ public partial class ColorSpectrum : TemplatedControl
64
65
private Panel ? _selectionEllipsePanel ;
65
66
66
67
// Put the spectrum images in a bitmap, which is then given to an ImageBrush.
67
- private WriteableBitmap ? _hueRedBitmap ;
68
- private WriteableBitmap ? _hueYellowBitmap ;
69
- private WriteableBitmap ? _hueGreenBitmap ;
70
- private WriteableBitmap ? _hueCyanBitmap ;
71
- private WriteableBitmap ? _hueBlueBitmap ;
72
- private WriteableBitmap ? _huePurpleBitmap ;
68
+ private Bitmap ? _hueRedBitmap ;
69
+ private Bitmap ? _hueYellowBitmap ;
70
+ private Bitmap ? _hueGreenBitmap ;
71
+ private Bitmap ? _hueCyanBitmap ;
72
+ private Bitmap ? _hueBlueBitmap ;
73
+ private Bitmap ? _huePurpleBitmap ;
73
74
74
- private WriteableBitmap ? _saturationMinimumBitmap ;
75
- private WriteableBitmap ? _saturationMaximumBitmap ;
75
+ private Bitmap ? _saturationMinimumBitmap ;
76
+ private Bitmap ? _saturationMaximumBitmap ;
76
77
77
- private WriteableBitmap ? _valueBitmap ;
78
- private WriteableBitmap ? _minBitmap ;
79
- private WriteableBitmap ? _maxBitmap ;
78
+ private Bitmap ? _valueBitmap ;
79
+ private Bitmap ? _minBitmap ;
80
+ private Bitmap ? _maxBitmap ;
80
81
81
82
// Fields used by UpdateEllipse() to ensure that it's using the data
82
83
// associated with the last call to CreateBitmapsAndColorMap(),
@@ -1101,17 +1102,7 @@ private async void CreateBitmapsAndColorMap()
1101
1102
}
1102
1103
1103
1104
Hsv hsv = new Hsv ( hsvColor ) ;
1104
-
1105
- // The middle 4 are only needed and used in the case of hue as the third dimension.
1106
- // Saturation and luminosity need only a min and max.
1107
- ArrayList < byte > bgraMinPixelData ;
1108
- ArrayList < byte > bgraMiddle1PixelData ;
1109
- ArrayList < byte > bgraMiddle2PixelData ;
1110
- ArrayList < byte > bgraMiddle3PixelData ;
1111
- ArrayList < byte > bgraMiddle4PixelData ;
1112
- ArrayList < byte > bgraMaxPixelData ;
1113
- List < Hsv > newHsvValues ;
1114
-
1105
+
1115
1106
// In Avalonia, Bounds returns the actual device-independent pixel size of a control.
1116
1107
// However, this is not necessarily the size of the control rendered on a display.
1117
1108
// A desktop or application scaling factor may be applied which must be accounted for here.
@@ -1121,27 +1112,20 @@ private async void CreateBitmapsAndColorMap()
1121
1112
int pixelDimension = ( int ) Math . Round ( minDimension * scale ) ;
1122
1113
var pixelCount = pixelDimension * pixelDimension ;
1123
1114
var pixelDataSize = pixelCount * 4 ;
1124
-
1125
- bgraMinPixelData = new ArrayList < byte > ( pixelDataSize ) ;
1126
- bgraMaxPixelData = new ArrayList < byte > ( pixelDataSize ) ;
1127
- newHsvValues = new List < Hsv > ( pixelCount ) ;
1128
-
1129
1115
// We'll only save pixel data for the middle bitmaps if our third dimension is hue.
1130
- if ( components == ColorSpectrumComponents . ValueSaturation ||
1131
- components == ColorSpectrumComponents . SaturationValue )
1132
- {
1133
- bgraMiddle1PixelData = new ArrayList < byte > ( pixelDataSize ) ;
1134
- bgraMiddle2PixelData = new ArrayList < byte > ( pixelDataSize ) ;
1135
- bgraMiddle3PixelData = new ArrayList < byte > ( pixelDataSize ) ;
1136
- bgraMiddle4PixelData = new ArrayList < byte > ( pixelDataSize ) ;
1137
- }
1138
- else
1139
- {
1140
- bgraMiddle1PixelData = new ArrayList < byte > ( 0 ) ;
1141
- bgraMiddle2PixelData = new ArrayList < byte > ( 0 ) ;
1142
- bgraMiddle3PixelData = new ArrayList < byte > ( 0 ) ;
1143
- bgraMiddle4PixelData = new ArrayList < byte > ( 0 ) ;
1144
- }
1116
+ var middleBitmapsSize =
1117
+ components is ColorSpectrumComponents . ValueSaturation or ColorSpectrumComponents . SaturationValue
1118
+ ? pixelDataSize : 0 ;
1119
+
1120
+ var newHsvValues = new List < Hsv > ( pixelCount ) ;
1121
+ using var bgraMinPixelData = new PooledList < byte > ( pixelDataSize , ClearMode . Never ) ;
1122
+ using var bgraMaxPixelData = new PooledList < byte > ( pixelDataSize , ClearMode . Never ) ;
1123
+ // The middle 4 are only needed and used in the case of hue as the third dimension.
1124
+ // Saturation and luminosity need only a min and max.
1125
+ using var bgraMiddle1PixelData = new PooledList < byte > ( middleBitmapsSize , ClearMode . Never ) ;
1126
+ using var bgraMiddle2PixelData = new PooledList < byte > ( middleBitmapsSize , ClearMode . Never ) ;
1127
+ using var bgraMiddle3PixelData = new PooledList < byte > ( middleBitmapsSize , ClearMode . Never ) ;
1128
+ using var bgraMiddle4PixelData = new PooledList < byte > ( middleBitmapsSize , ClearMode . Never ) ;
1145
1129
1146
1130
await Task . Run ( ( ) =>
1147
1131
{
@@ -1187,7 +1171,7 @@ await Task.Run(() =>
1187
1171
}
1188
1172
} ) ;
1189
1173
1190
- Dispatcher . UIThread . Post ( ( ) =>
1174
+ await Dispatcher . UIThread . InvokeAsync ( ( ) =>
1191
1175
{
1192
1176
int pixelWidth = pixelDimension ;
1193
1177
int pixelHeight = pixelDimension ;
@@ -1201,20 +1185,29 @@ await Task.Run(() =>
1201
1185
{
1202
1186
case ColorSpectrumComponents . HueValue :
1203
1187
case ColorSpectrumComponents . ValueHue :
1188
+ _saturationMinimumBitmap ? . Dispose ( ) ;
1204
1189
_saturationMinimumBitmap = _minBitmap ;
1190
+ _saturationMaximumBitmap ? . Dispose ( ) ;
1205
1191
_saturationMaximumBitmap = _maxBitmap ;
1206
1192
break ;
1207
1193
case ColorSpectrumComponents . HueSaturation :
1208
1194
case ColorSpectrumComponents . SaturationHue :
1195
+ _valueBitmap ? . Dispose ( ) ;
1209
1196
_valueBitmap = _maxBitmap ;
1210
1197
break ;
1211
1198
case ColorSpectrumComponents . ValueSaturation :
1212
1199
case ColorSpectrumComponents . SaturationValue :
1200
+ _hueRedBitmap ? . Dispose ( ) ;
1213
1201
_hueRedBitmap = _minBitmap ;
1202
+ _hueYellowBitmap ? . Dispose ( ) ;
1214
1203
_hueYellowBitmap = ColorPickerHelpers . CreateBitmapFromPixelData ( bgraMiddle1PixelData , pixelWidth , pixelHeight ) ;
1204
+ _hueGreenBitmap ? . Dispose ( ) ;
1215
1205
_hueGreenBitmap = ColorPickerHelpers . CreateBitmapFromPixelData ( bgraMiddle2PixelData , pixelWidth , pixelHeight ) ;
1206
+ _hueCyanBitmap ? . Dispose ( ) ;
1216
1207
_hueCyanBitmap = ColorPickerHelpers . CreateBitmapFromPixelData ( bgraMiddle3PixelData , pixelWidth , pixelHeight ) ;
1208
+ _hueBlueBitmap ? . Dispose ( ) ;
1217
1209
_hueBlueBitmap = ColorPickerHelpers . CreateBitmapFromPixelData ( bgraMiddle4PixelData , pixelWidth , pixelHeight ) ;
1210
+ _huePurpleBitmap ? . Dispose ( ) ;
1218
1211
_huePurpleBitmap = _maxBitmap ;
1219
1212
break ;
1220
1213
}
@@ -1249,12 +1242,12 @@ private static void FillPixelForBox(
1249
1242
double maxSaturation ,
1250
1243
double minValue ,
1251
1244
double maxValue ,
1252
- ArrayList < byte > bgraMinPixelData ,
1253
- ArrayList < byte > bgraMiddle1PixelData ,
1254
- ArrayList < byte > bgraMiddle2PixelData ,
1255
- ArrayList < byte > bgraMiddle3PixelData ,
1256
- ArrayList < byte > bgraMiddle4PixelData ,
1257
- ArrayList < byte > bgraMaxPixelData ,
1245
+ PooledList < byte > bgraMinPixelData ,
1246
+ PooledList < byte > bgraMiddle1PixelData ,
1247
+ PooledList < byte > bgraMiddle2PixelData ,
1248
+ PooledList < byte > bgraMiddle3PixelData ,
1249
+ PooledList < byte > bgraMiddle4PixelData ,
1250
+ PooledList < byte > bgraMaxPixelData ,
1258
1251
List < Hsv > newHsvValues )
1259
1252
{
1260
1253
double hMin = minHue ;
@@ -1409,12 +1402,12 @@ private void FillPixelForRing(
1409
1402
double maxSaturation ,
1410
1403
double minValue ,
1411
1404
double maxValue ,
1412
- ArrayList < byte > bgraMinPixelData ,
1413
- ArrayList < byte > bgraMiddle1PixelData ,
1414
- ArrayList < byte > bgraMiddle2PixelData ,
1415
- ArrayList < byte > bgraMiddle3PixelData ,
1416
- ArrayList < byte > bgraMiddle4PixelData ,
1417
- ArrayList < byte > bgraMaxPixelData ,
1405
+ PooledList < byte > bgraMinPixelData ,
1406
+ PooledList < byte > bgraMiddle1PixelData ,
1407
+ PooledList < byte > bgraMiddle2PixelData ,
1408
+ PooledList < byte > bgraMiddle3PixelData ,
1409
+ PooledList < byte > bgraMiddle4PixelData ,
1410
+ PooledList < byte > bgraMaxPixelData ,
1418
1411
List < Hsv > newHsvValues )
1419
1412
{
1420
1413
double hMin = minHue ;
0 commit comments