1212
1313namespace WinDynamicDesktop . Skia
1414{
15- sealed class BitmapCache
15+ sealed class ImageCache
1616 {
1717 readonly int maxWidth ;
1818 readonly int maxHeight ;
1919 readonly object cacheLock = new object ( ) ;
20- readonly Dictionary < Uri , SKBitmap > images = new Dictionary < Uri , SKBitmap > ( ) ;
20+ readonly Dictionary < Uri , SKImage > images = new Dictionary < Uri , SKImage > ( ) ;
2121
22- public SKBitmap this [ Uri uri ]
22+ public SKImage this [ Uri uri ]
2323 {
2424 get
2525 {
@@ -46,16 +46,16 @@ public void Clear()
4646 {
4747 lock ( cacheLock )
4848 {
49- foreach ( var bitmap in images . Values )
49+ foreach ( var image in images . Values )
5050 {
51- bitmap ? . Dispose ( ) ;
51+ image ? . Dispose ( ) ;
5252 }
5353 images . Clear ( ) ;
5454 }
5555 GC . Collect ( ) ;
5656 }
5757
58- public BitmapCache ( bool limitDecodeSize = true )
58+ public ImageCache ( bool limitDecodeSize = true )
5959 {
6060 if ( limitDecodeSize )
6161 {
@@ -78,7 +78,7 @@ public BitmapCache(bool limitDecodeSize = true)
7878 }
7979 }
8080
81- private SKBitmap CreateImage ( Uri uri )
81+ private SKImage CreateImage ( Uri uri )
8282 {
8383 try
8484 {
@@ -114,7 +114,7 @@ private SKBitmap CreateImage(Uri uri)
114114
115115 var info = codec . Info ;
116116
117- // Calculate scaled dimensions
117+ // Calculate target dimensions
118118 int targetWidth = info . Width ;
119119 int targetHeight = info . Height ;
120120
@@ -125,24 +125,31 @@ private SKBitmap CreateImage(Uri uri)
125125 targetHeight = ( int ) ( info . Height * scale ) ;
126126 }
127127
128- var bitmap = new SKBitmap ( targetWidth , targetHeight , info . ColorType , info . AlphaType ) ;
129-
130- if ( targetWidth == info . Width && targetHeight == info . Height )
131- {
132- // No scaling needed
133- codec . GetPixels ( bitmap . Info , bitmap . GetPixels ( ) ) ;
134- }
135- else
128+ // Decode at native size
129+ using ( var sourceBitmap = new SKBitmap ( info ) )
136130 {
137- // Decode at full size then scale down with high quality
138- using ( var fullBitmap = new SKBitmap ( info ) )
131+ if ( codec . GetPixels ( sourceBitmap . Info , sourceBitmap . GetPixels ( ) ) != SKCodecResult . Success )
139132 {
140- codec . GetPixels ( fullBitmap . Info , fullBitmap . GetPixels ( ) ) ;
141- fullBitmap . ScalePixels ( bitmap , new SKSamplingOptions ( SKCubicResampler . Mitchell ) ) ;
133+ return null ;
134+ }
135+
136+ // If scaling is needed, create scaled version with high quality
137+ if ( targetWidth != sourceBitmap . Width || targetHeight != sourceBitmap . Height )
138+ {
139+ using ( var scaledBitmap = new SKBitmap ( targetWidth , targetHeight , info . ColorType , info . AlphaType ) )
140+ {
141+ sourceBitmap . ScalePixels ( scaledBitmap , new SKSamplingOptions ( SKCubicResampler . Mitchell ) ) ;
142+ var image = SKImage . FromBitmap ( scaledBitmap ) ;
143+ return image ;
144+ }
145+ }
146+ else
147+ {
148+ // No scaling needed
149+ var image = SKImage . FromBitmap ( sourceBitmap ) ;
150+ return image ;
142151 }
143152 }
144-
145- return bitmap ;
146153 }
147154 }
148155 }
0 commit comments