PeachScans: Bump ImageDecoder and fix for new signature (#2078)
* Bump ImageDecoder and fix for new signature * fix for empty svg files
This commit is contained in:
		
							parent
							
								
									78f2c9c650
								
							
						
					
					
						commit
						8fd440d838
					
				| @ -2,8 +2,8 @@ plugins { | |||||||
|     id("lib-multisrc") |     id("lib-multisrc") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| baseVersionCode = 3 | baseVersionCode = 4 | ||||||
| 
 | 
 | ||||||
| dependencies { | dependencies { | ||||||
|     compileOnly("com.github.tachiyomiorg:image-decoder:398d3c074f") |     compileOnly("com.github.tachiyomiorg:image-decoder:e08e9be535") | ||||||
| } | } | ||||||
|  | |||||||
| @ -32,7 +32,6 @@ import uy.kohesive.injekt.Injekt | |||||||
| import uy.kohesive.injekt.api.get | import uy.kohesive.injekt.api.get | ||||||
| import uy.kohesive.injekt.injectLazy | import uy.kohesive.injekt.injectLazy | ||||||
| import java.io.ByteArrayOutputStream | import java.io.ByteArrayOutputStream | ||||||
| import java.io.IOException |  | ||||||
| import java.text.SimpleDateFormat | import java.text.SimpleDateFormat | ||||||
| import java.util.Locale | import java.util.Locale | ||||||
| import java.util.TimeZone | import java.util.TimeZone | ||||||
| @ -183,7 +182,7 @@ abstract class PeachScan( | |||||||
|         val zis = ZipInputStream(response.body.byteStream()) |         val zis = ZipInputStream(response.body.byteStream()) | ||||||
| 
 | 
 | ||||||
|         val images = generateSequence { zis.nextEntry } |         val images = generateSequence { zis.nextEntry } | ||||||
|             .map { |             .mapNotNull { | ||||||
|                 val entryName = it.name |                 val entryName = it.name | ||||||
|                 val splitEntryName = entryName.split('.') |                 val splitEntryName = entryName.split('.') | ||||||
|                 val entryIndex = splitEntryName.first().toInt() |                 val entryIndex = splitEntryName.first().toInt() | ||||||
| @ -195,7 +194,7 @@ abstract class PeachScan( | |||||||
|                     val svgBytes = zis.readBytes() |                     val svgBytes = zis.readBytes() | ||||||
|                     val svgContent = svgBytes.toString(Charsets.UTF_8) |                     val svgContent = svgBytes.toString(Charsets.UTF_8) | ||||||
|                     val b64 = dataUriRegex.find(svgContent)?.groupValues?.get(1) |                     val b64 = dataUriRegex.find(svgContent)?.groupValues?.get(1) | ||||||
|                         ?: throw IOException("Não foi possível corresponder a imagem no conteúdo SVG") |                         ?: return@mapNotNull null | ||||||
| 
 | 
 | ||||||
|                     Base64.decode(b64, Base64.DEFAULT) |                     Base64.decode(b64, Base64.DEFAULT) | ||||||
|                 } |                 } | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ import android.graphics.Rect | |||||||
| import tachiyomi.decoder.ImageDecoder | import tachiyomi.decoder.ImageDecoder | ||||||
| import java.io.ByteArrayInputStream | import java.io.ByteArrayInputStream | ||||||
| import java.io.IOException | import java.io.IOException | ||||||
|  | import java.io.InputStream | ||||||
| import java.lang.reflect.Method | import java.lang.reflect.Method | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -18,40 +19,98 @@ import java.lang.reflect.Method | |||||||
|  */ |  */ | ||||||
| object PeachScanUtils { | object PeachScanUtils { | ||||||
|     private var decodeMethod: Method |     private var decodeMethod: Method | ||||||
|  |     private var newInstanceMethod: Method | ||||||
| 
 | 
 | ||||||
|     private var isNewDecodeMethod = false |     private var classSignature = ClassSignature.Newest | ||||||
|  | 
 | ||||||
|  |     private enum class ClassSignature { | ||||||
|  |         Old, New, Newest | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     init { |     init { | ||||||
|         val rectClass = Rect::class.java |         val rectClass = Rect::class.java | ||||||
|         val booleanClass = Boolean::class.java |         val booleanClass = Boolean::class.java | ||||||
|         val intClass = Int::class.java |         val intClass = Int::class.java | ||||||
|         val byteArrayClass = ByteArray::class.java |         val byteArrayClass = ByteArray::class.java | ||||||
|  |         val inputStreamClass = InputStream::class.java | ||||||
| 
 | 
 | ||||||
|         decodeMethod = try { |         try { | ||||||
|             isNewDecodeMethod = true |             // Mihon Preview r6595+ | ||||||
|  |             classSignature = ClassSignature.Newest | ||||||
|  | 
 | ||||||
|  |             // decode(region, sampleSize) | ||||||
|  |             decodeMethod = ImageDecoder::class.java.getMethod( | ||||||
|  |                 "decode", | ||||||
|  |                 rectClass, | ||||||
|  |                 intClass, | ||||||
|  |             ) | ||||||
|  | 
 | ||||||
|  |             // newInstance(stream, cropBorders, displayProfile) | ||||||
|  |             newInstanceMethod = ImageDecoder.Companion::class.java.getMethod( | ||||||
|  |                 "newInstance", | ||||||
|  |                 inputStreamClass, | ||||||
|  |                 booleanClass, | ||||||
|  |                 byteArrayClass, | ||||||
|  |             ) | ||||||
|  |         } catch (_: NoSuchMethodException) { | ||||||
|  |             try { | ||||||
|  |                 // Mihon Stable & forks | ||||||
|  |                 classSignature = ClassSignature.New | ||||||
| 
 | 
 | ||||||
|                 // decode(region, rgb565, sampleSize, applyColorManagement, displayProfile) |                 // decode(region, rgb565, sampleSize, applyColorManagement, displayProfile) | ||||||
|             ImageDecoder::class.java.getMethod("decode", rectClass, booleanClass, intClass, booleanClass, byteArrayClass) |                 decodeMethod = ImageDecoder::class.java.getMethod( | ||||||
|         } catch (e: NoSuchMethodException) { |                     "decode", | ||||||
|             isNewDecodeMethod = false |                     rectClass, | ||||||
|  |                     booleanClass, | ||||||
|  |                     intClass, | ||||||
|  |                     booleanClass, | ||||||
|  |                     byteArrayClass, | ||||||
|  |                 ) | ||||||
|  | 
 | ||||||
|  |                 // newInstance(stream, cropBorders) | ||||||
|  |                 newInstanceMethod = ImageDecoder.Companion::class.java.getMethod( | ||||||
|  |                     "newInstance", | ||||||
|  |                     inputStreamClass, | ||||||
|  |                     booleanClass, | ||||||
|  |                 ) | ||||||
|  |             } catch (_: NoSuchMethodException) { | ||||||
|  |                 // Tachiyomi J2k | ||||||
|  |                 classSignature = ClassSignature.Old | ||||||
| 
 | 
 | ||||||
|                 // decode(region, rgb565, sampleSize) |                 // decode(region, rgb565, sampleSize) | ||||||
|             ImageDecoder::class.java.getMethod("decode", rectClass, booleanClass, intClass) |                 decodeMethod = | ||||||
|  |                     ImageDecoder::class.java.getMethod( | ||||||
|  |                         "decode", | ||||||
|  |                         rectClass, | ||||||
|  |                         booleanClass, | ||||||
|  |                         intClass, | ||||||
|  |                     ) | ||||||
|  | 
 | ||||||
|  |                 // newInstance(stream, cropBorders) | ||||||
|  |                 newInstanceMethod = ImageDecoder.Companion::class.java.getMethod( | ||||||
|  |                     "newInstance", | ||||||
|  |                     inputStreamClass, | ||||||
|  |                     booleanClass, | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun decodeImage(data: ByteArray, rgb565: Boolean, filename: String, entryName: String): Bitmap { |     fun decodeImage(data: ByteArray, rgb565: Boolean, filename: String, entryName: String): Bitmap { | ||||||
|         val decoder = ImageDecoder.newInstance(ByteArrayInputStream(data)) |         val decoder = when (classSignature) { | ||||||
|  |             ClassSignature.Newest -> newInstanceMethod.invoke(ImageDecoder.Companion, ByteArrayInputStream(data), false, null) | ||||||
|  |             else -> newInstanceMethod.invoke(ImageDecoder.Companion, ByteArrayInputStream(data), false) | ||||||
|  |         } as ImageDecoder? | ||||||
| 
 | 
 | ||||||
|         if (decoder == null || decoder.width <= 0 || decoder.height <= 0) { |         if (decoder == null || decoder.width <= 0 || decoder.height <= 0) { | ||||||
|             throw IOException("Falha ao inicializar o decodificador de imagem") |             throw IOException("Falha ao inicializar o decodificador de imagem") | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         val rect = Rect(0, 0, decoder.width, decoder.height) |         val rect = Rect(0, 0, decoder.width, decoder.height) | ||||||
|         val bitmap = if (isNewDecodeMethod) { |         val bitmap = when (classSignature) { | ||||||
|             decodeMethod.invoke(decoder, rect, rgb565, 1, false, null) |             ClassSignature.Newest -> decodeMethod.invoke(decoder, rect, 1) | ||||||
|         } else { |             ClassSignature.New -> decodeMethod.invoke(decoder, rect, rgb565, 1, false, null) | ||||||
|             decodeMethod.invoke(decoder, rect, rgb565, 1) |             else -> decodeMethod.invoke(decoder, rect, rgb565, 1) | ||||||
|         } as Bitmap? |         } as Bitmap? | ||||||
| 
 | 
 | ||||||
|         decoder.recycle() |         decoder.recycle() | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 AwkwardPeak7
						AwkwardPeak7