- add zoom field, which is the same across different screen/window sizes
- scale is not the base state now, it is derived from the current zoom and the current screen/window size. it now represents the end scale of the image
- drag amount is still independent of scale/zoom (if we drag by 5 pixels, the image moves by 5 pixels)
- offset is still limited by the area and the current scale
* ImageViewer - limit zoom by the window/screen size
- add zoom field, which is the same across different screen/window sizes
- scale is not the base state now, it is derived from the current zoom and the current screen/window size. it now represents the end scale of the image
- drag amount is still independent of scale/zoom (if we drag by 5 pixels, the image moves by 5 pixels)
- offset is still limited by the area and the current scale
The code of `ScalableImage` is exactly the same as [here](https://github.com/JetBrains/compose-multiplatform-core/pull/459/files#diff-2df227d37a7fcdb885f4fd1a715c0efd94b8e206d446d553d69a456f83e284f6R19):
1. The initial size of an image is chosen by the area size (phone/windows size)
2. We can zoom using pinch-to-zoom (with taking centroid of touches into account)
3. We can zoom using mouse scroll (also, taking the mouse position into account). On touchpad/macOS it also works great.
4. The code of the old `ScalableState` and `ScalableImage` was complete rewritten.
5. The zoom is not limited by phone/window dimensions, we can zoom out
* Avoid scaling code duplication
* Move AndroidImageStorage into separate package
* Implement storing metadata on Android
* Move file extensions to separate class
* Fix selection in codeviewer example
* Limit line count on view layer
* Fix last line ending
* Fix missing last empty line in file
* Refactor reading file
* Add extra endPosition condition
* Polish removing line endings