OSDN Git Service

全てのアイコンを一時ファイルへキャッシュしていたのをメモリから退避した分だけ一時ファイルへキャッシュするように変更
authoranis774 <anis774@users.sourceforge.jp>
Mon, 6 Sep 2010 20:59:20 +0000 (20:59 +0000)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 18 Feb 2012 14:15:13 +0000 (23:15 +0900)
git-svn-id: http://svn.sourceforge.jp/svnroot/tween/trunk@813 e39ad16e-3079-482e-bb30-4b4d378143b6

Tween/ImageCacheDictionary.vb

index 06cd8a2..4a0839a 100644 (file)
@@ -5,102 +5,86 @@ Public Class ImageCacheDictionary
     Implements IDictionary(Of String, Image), IDisposable
 
     Dim memoryCacheCount As Integer
-    Private dictionary As Dictionary(Of String, Image)
+    Private innerDictionary As Dictionary(Of String, CachedImage)
     Private sortedKeyList As List(Of String)
-    Private keyTmpFileDictionary As New Dictionary(Of String, String)()
 
     Public Sub New(ByVal memoryCacheCount As Integer)
-        Me.dictionary = New Dictionary(Of String, Image)(memoryCacheCount)
-        Me.sortedKeyList = New List(Of String)(memoryCacheCount)
+        Me.innerDictionary = New Dictionary(Of String, CachedImage)(memoryCacheCount + 1)
+        Me.sortedKeyList = New List(Of String)(memoryCacheCount + 1)
         Me.memoryCacheCount = memoryCacheCount
     End Sub
 
     Public Sub Add(ByVal item As System.Collections.Generic.KeyValuePair(Of String, Image)) Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Add
-        Me.Add1(item.Key, item.Value)
+        Me.Add(item.Key, item.Value)
     End Sub
 
-    Public Sub Add1(ByVal key As String, ByVal value As Image) Implements System.Collections.Generic.IDictionary(Of String, Image).Add
-        Me.dictionary.Add(key, value)
+    Public Sub Add(ByVal key As String, ByVal value As Image) Implements System.Collections.Generic.IDictionary(Of String, Image).Add
+        Me.innerDictionary.Add(key, New CachedImage(value))
         Me.sortedKeyList.Add(key)
 
-        Dim path_ As String = Path.GetTempFileName()
-        Me.keyTmpFileDictionary.Add(key, path_)
-        value.Save(path_)
-
-        While Me.dictionary.Count > memoryCacheCount
-            Me.dictionary.Remove(Me.sortedKeyList(0))
-            Me.sortedKeyList.RemoveAt(0)
-        End While
+        If Me.innerDictionary.Count > Me.memoryCacheCount Then
+            Me.innerDictionary(Me.sortedKeyList(Me.sortedKeyList.Count - Me.memoryCacheCount - 1)).Chache()
+        End If
     End Sub
 
     Public Function Remove(ByVal item As System.Collections.Generic.KeyValuePair(Of String, Image)) As Boolean Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Remove
-        Return Me.Remove1(item.Key)
+        Return Me.Remove(item.Key)
     End Function
 
-    Public Function Remove1(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Image).Remove
+    Public Function Remove(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Image).Remove
         Me.sortedKeyList.Remove(key)
-        File.Delete(Me.keyTmpFileDictionary(key))
-        Me.keyTmpFileDictionary.Remove(key)
-        Return Me.dictionary.Remove(key)
+        Me.innerDictionary(key).Dispose()
+        Return Me.innerDictionary.Remove(key)
     End Function
 
     Default Public Property Item(ByVal key As String) As Image Implements System.Collections.Generic.IDictionary(Of String, Image).Item
         Get
-            If (Not Me.dictionary.ContainsKey(key)) AndAlso Me.keyTmpFileDictionary.ContainsKey(key) Then
-                Me.dictionary.Add(key, Image.FromFile(Me.keyTmpFileDictionary(key)))
-            End If
-
-            While Me.dictionary.Count > memoryCacheCount
-                Me.dictionary.Remove(Me.sortedKeyList(0))
-                Me.sortedKeyList.RemoveAt(0)
-            End While
-
             Me.sortedKeyList.Remove(key)
             Me.sortedKeyList.Add(key)
-            Return Me.dictionary(key)
+            If Me.sortedKeyList.Count > Me.memoryCacheCount Then
+                Me.innerDictionary(Me.sortedKeyList(Me.sortedKeyList.Count - Me.memoryCacheCount - 1)).Chache()
+            End If
+            Return Me.innerDictionary(key).Image
         End Get
         Set(ByVal value As Image)
-            If (Not Me.dictionary.ContainsKey(key)) AndAlso Me.keyTmpFileDictionary.ContainsKey(key) Then
-                Me.dictionary.Add(key, Nothing)
-            End If
-
             Me.sortedKeyList.Remove(key)
             Me.sortedKeyList.Add(key)
-            Me.dictionary(key) = value
-
-            value.Save(Me.keyTmpFileDictionary(key))
+            If Me.sortedKeyList.Count > Me.memoryCacheCount Then
+                Me.innerDictionary(Me.sortedKeyList(Me.sortedKeyList.Count - Me.memoryCacheCount - 1)).Chache()
+            End If
+            Me.innerDictionary(key).Dispose()
+            Me.innerDictionary(key) = New CachedImage(value)
         End Set
     End Property
 
     Public Sub Clear() Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Clear
-        Me.dictionary.Clear()
-        Me.sortedKeyList.Clear()
-
-        For Each path As String In Me.keyTmpFileDictionary.Values
-            File.Delete(path)
+        For Each value As CachedImage In Me.innerDictionary.Values
+            value.Dispose()
         Next
-        Me.keyTmpFileDictionary.Clear()
+
+        Me.innerDictionary.Clear()
+        Me.sortedKeyList.Clear()
     End Sub
 
     Public Function Contains(ByVal item As System.Collections.Generic.KeyValuePair(Of String, Image)) As Boolean Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Contains
-        Return Me.keyTmpFileDictionary.ContainsKey(item.Key) AndAlso Me.keyTmpFileDictionary(item.Key) Is item.Value
+        Return Me.innerDictionary.ContainsKey(item.Key) AndAlso Me.innerDictionary(item.Key) Is item.Value
     End Function
 
     Public Sub CopyTo(ByVal array() As System.Collections.Generic.KeyValuePair(Of String, Image), ByVal arrayIndex As Integer) Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).CopyTo
         Dim index As Integer = arrayIndex
-        For Each Item As KeyValuePair(Of String, Image) In Me.dictionary
+        For Each Item As KeyValuePair(Of String, CachedImage) In Me.innerDictionary
             If array.Length - 1 < index Then
                 Exit For
             End If
 
-            array(index) = Item
+            array(index) = New KeyValuePair(Of String, Image)(Item.Key, Item.Value.Image)
             index += 1
         Next
     End Sub
 
     Public ReadOnly Property Count As Integer Implements System.Collections.Generic.ICollection(Of System.Collections.Generic.KeyValuePair(Of String, Image)).Count
         Get
-            Return Me.keyTmpFileDictionary.Count
+            Return Me.innerDictionary.Count
         End Get
     End Property
 
@@ -111,18 +95,18 @@ Public Class ImageCacheDictionary
     End Property
 
     Public Function ContainsKey(ByVal key As String) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Image).ContainsKey
-        Return Me.keyTmpFileDictionary.ContainsKey(key)
+        Return Me.innerDictionary.ContainsKey(key)
     End Function
 
     Public ReadOnly Property Keys As System.Collections.Generic.ICollection(Of String) Implements System.Collections.Generic.IDictionary(Of String, Image).Keys
         Get
-            Return Me.keyTmpFileDictionary.Keys
+            Return Me.innerDictionary.Keys
         End Get
     End Property
 
     Public Function TryGetValue(ByVal key As String, ByRef value As Image) As Boolean Implements System.Collections.Generic.IDictionary(Of String, Image).TryGetValue
-        If Me.keyTmpFileDictionary.ContainsKey(key) Then
-            value = Me.Item(key)
+        If Me.innerDictionary.ContainsKey(key) Then
+            value = Me.innerDictionary(key).Image
             Return True
         Else
             Return False
@@ -131,31 +115,72 @@ Public Class ImageCacheDictionary
 
     Public ReadOnly Property Values As System.Collections.Generic.ICollection(Of Image) Implements System.Collections.Generic.IDictionary(Of String, Image).Values
         Get
-            Dim imageList As New List(Of Image)(Me.keyTmpFileDictionary.Count)
-            imageList.AddRange(Me.dictionary.Values)
-            For Each key As String In Me.keyTmpFileDictionary.Keys
-                If Not Me.dictionary.ContainsKey(key) Then
-                    imageList.Add(Image.FromFile(Me.keyTmpFileDictionary(key)))
-                End If
+            Dim imgList As New List(Of Image)(Me.memoryCacheCount)
+            For Each value As CachedImage In Me.innerDictionary.Values
+                imgList.Add(value.Image)
             Next
-
-            Return imageList
+            Return imgList
         End Get
     End Property
 
     Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of System.Collections.Generic.KeyValuePair(Of String, Image)) Implements System.Collections.Generic.IEnumerable(Of System.Collections.Generic.KeyValuePair(Of String, Image)).GetEnumerator
         Throw New NotImplementedException()
-        Return Me.dictionary.GetEnumerator()
+        Return Nothing
     End Function
 
     Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
         Throw New NotImplementedException()
-        Return Me.dictionary.GetEnumerator()
+        Return Nothing
     End Function
 
     Public Sub Dispose() Implements IDisposable.Dispose
-        For Each tmpFilePath As String In Me.keyTmpFileDictionary.Values
-            File.Delete(tmpFilePath)
+        For Each item As CachedImage In Me.innerDictionary.Values
+            item.Dispose()
         Next
     End Sub
+
+    Private Class CachedImage
+        Implements IDisposable
+
+        Private img As Image = Nothing
+        Private tmpFilePath As String = Nothing
+
+        Public Sub New(ByVal img As Image)
+            Me.img = img
+        End Sub
+
+        Public Property Image As Image
+            Get
+                If Me.img Is Nothing Then
+                    Me.img = Image.FromFile(Me.tmpFilePath)
+                End If
+
+                Return Me.img
+            End Get
+            Set(ByVal value As Image)
+
+            End Set
+        End Property
+
+        Public Sub Chache()
+            If Me.tmpFilePath Is Nothing Then
+                Me.tmpFilePath = Path.GetTempFileName()
+                Me.img.Save(Me.tmpFilePath)
+            End If
+            If Me.img IsNot Nothing Then
+                Me.img.Dispose()
+                Me.img = Nothing
+            End If
+        End Sub
+
+        Public Sub Dispose() Implements IDisposable.Dispose
+            If Me.img IsNot Nothing Then
+                Me.img.Dispose()
+            End If
+
+            If Me.tmpFilePath IsNot Nothing Then
+                File.Delete(Me.tmpFilePath)
+            End If
+        End Sub
+    End Class
 End Class
\ No newline at end of file