Created attachment 151150 [details] Erase some content. SUMMARY 5.2.0-prealpha (git 9901f95) The layer thumbnail shows the erased section. I think only the paint content (the opaque part) should be shown. This saves space, and the parts that have been erased should not still take up the space of the layer thumbnail. STEPS TO REPRODUCE 1. Draw an area. 2. Erase most of this area. OBSERVED RESULT The layer thumbnail contains the portion that has been erased. EXPECTED RESULT Layer thumbnails only show what's left over. SOFTWARE/OS VERSIONS Krita Version: 5.2.0-prealpha (git 9901f95) Installation type: installer / portable package Hidpi: true Qt Version (compiled): 5.12.12 Version (loaded): 5.12.12 OS Information Build ABI: x86_64-little_endian-llp64 Build CPU: x86_64 CPU: x86_64 Kernel Type: winnt Kernel Version: 10.0.19042 Pretty Productname: Windows 10 (10.0) Product Type: windows Product Version: 10 Locale Languages: zh_CN, en_US C locale: C QLocale current: zh QLocale system: zh QTextCodec for locale: UTF-8 Process ACP: 65001 (UTF-8) System locale default ACP: 936 (ANSI/OEM - 简体中文 GBK) OpenGL Info Vendor: "Google Inc. (NVIDIA)" Renderer: "ANGLE (NVIDIA, NVIDIA GeForce GTX 970 Direct3D11 vs_5_0 ps_5_0, D3D11-30.0.15.1179)" Version: "OpenGL ES 3.0.0 (ANGLE 2.1.0 git hash: f2280c0c5f93+krita_qt5.12.12)" Shading language: "OpenGL ES GLSL ES 3.00 (ANGLE 2.1.0 git hash: f2280c0c5f93+krita_qt5.12.12)" Requested format: QSurfaceFormat(version 3.0, options QFlags<QSurfaceFormat::FormatOption>(DeprecatedFunctions), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 0, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::CompatibilityProfile) Current format: QSurfaceFormat(version 3.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples 0, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 0, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::NoProfile) Version: 3.0 Supports deprecated functions false is OpenGL ES: true supportsBufferMapping: true supportsBufferInvalidation: false forceDisableTextureBuffers: true Extensions: "GL_CHROMIUM_copy_compressed_texture" "GL_ANGLE_framebuffer_blit" "GL_EXT_blend_minmax" "GL_EXT_draw_elements_base_vertex" "GL_NV_fence" "GL_EXT_disjoint_timer_query" "GL_NV_pack_subimage" "GL_OES_texture_stencil8" "GL_OES_compressed_EAC_R11_signed_texture" "GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture" "GL_EXT_clip_control" "GL_EXT_texture_compression_bptc" "GL_OES_surfaceless_context" "GL_ANGLE_get_tex_level_parameter" "GL_EXT_texture_storage" "GL_EXT_texture_type_2_10_10_10_REV" "GL_OES_depth32" "GL_OES_element_index_uint" "GL_WEBGL_video_texture" "GL_EXT_occlusion_query_boolean" "GL_ANGLE_translated_shader_source" "GL_OES_compressed_EAC_RG11_signed_texture" "GL_OES_compressed_ETC2_RGBA8_texture" "GL_ANGLE_instanced_arrays" "GL_ANGLE_lossy_etc_decode" "GL_ANGLE_framebuffer_multisample" "GL_OES_get_program_binary" "GL_ANGLE_texture_compression_dxt3" "GL_ANGLE_multiview_multisample" "GL_OES_draw_elements_base_vertex" "GL_OES_compressed_ETC2_sRGB8_alpha8_texture" "GL_CHROMIUM_bind_uniform_location" "GL_OES_EGL_image" "GL_OES_vertex_array_object" "GL_CHROMIUM_copy_texture" "GL_EXT_texture_norm16" "GL_OES_compressed_EAC_RG11_unsigned_texture" "GL_OES_draw_buffers_indexed" "GL_EXT_draw_buffers" "GL_NV_pixel_buffer_object" "GL_OVR_multiview" "GL_EXT_debug_label" "GL_EXT_unpack_subimage" "GL_KHR_parallel_shader_compile" "GL_ANGLE_memory_size" "GL_ANGLE_texture_multisample" "GL_OES_EGL_image_external_essl3" "GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture" "GL_OES_packed_depth_stencil" "GL_OES_texture_float" "GL_KHR_debug" "GL_CHROMIUM_lose_context" "GL_EXT_debug_marker" "GL_ANGLE_pack_reverse_row_order" "GL_ANGLE_texture_usage" "GL_CHROMIUM_sync_query" "GL_ANGLE_copy_texture_3d" "GL_OES_fbo_render_mipmap" "GL_OES_texture_npot" "GL_EXT_robustness" "GL_EXT_draw_buffers_indexed" "GL_EXT_texture_filter_anisotropic" "GL_NV_EGL_stream_consumer_external" "GL_NV_framebuffer_blit" "GL_ANGLE_program_cache_control" "GL_ANGLE_base_vertex_base_instance_shader_builtin" "GL_EXT_map_buffer_range" "GL_OES_compressed_EAC_R11_unsigned_texture" "GL_OES_compressed_ETC2_RGB8_texture" "GL_OVR_multiview2" "GL_OES_rgb8_rgba8" "GL_ANGLE_client_arrays" "GL_EXT_texture_rg" "GL_EXT_discard_framebuffer" "GL_OES_depth24" "" "GL_EXT_texture_format_BGRA8888" "GL_ANGLE_robust_client_memory" "GL_OES_compressed_ETC2_sRGB8_texture" "GL_AMD_performance_monitor" "GL_EXT_blend_func_extended" "GL_EXT_multi_draw_indirect" "GL_EXT_multisampled_render_to_texture" "GL_EXT_texture_compression_dxt1" "GL_OES_texture_float_linear" "GL_OES_texture_half_float_linear" "GL_EXT_texture_compression_s3tc_srgb" "GL_EXT_color_buffer_half_float" "GL_OES_standard_derivatives" "GL_ANGLE_request_extension" "GL_EXT_frag_depth" "GL_EXT_instanced_arrays" "GL_EXT_EGL_image_external_wrap_modes" "GL_ANGLE_texture_compression_dxt5" "GL_EXT_float_blend" "GL_OES_texture_half_float" "GL_CHROMIUM_bind_generates_resource" "GL_EXT_texture_compression_rgtc" "GL_OES_EGL_image_external" "GL_EXT_sRGB" "GL_EXT_color_buffer_float" "GL_EXT_shader_texture_lod" "GL_OES_mapbuffer" "GL_EXT_read_format_bgra" "GL_OES_texture_border_clamp" "GL_ANGLE_get_serialized_context_string" "GL_ANGLE_depth_texture" "GL_ANGLE_multi_draw" "GL_ANGLE_base_vertex_base_instance" "GL_ANGLE_provoking_vertex" QPA OpenGL Detection Info supportsDesktopGL: true supportsAngleD3D11: true isQtPreferAngle: true useBufferInvalidation (config option): false Hardware Information GPU Acceleration: auto Memory: 32693 Mb Number of Cores: 16 Swap Location: C:/Users/xi/AppData/Local/Temp Built for: sse2 Base instruction set: sse2 Supported instruction sets: fma3+avx2 avx2 fma3+avx avx fma4 fma3+sse4.2 sse4.2 sse4.1 ssse3 sse3 sse2 Current Settings Current Swap Location: C:/Users/xi/AppData/Local/Temp Current Swap Location writable: true Undo Enabled: true Undo Stack Limit: 200 Use OpenGL: true Use OpenGL Texture Buffer: true Disable Vector Optimizations: false Disable AVX Optimizations: false Canvas State: OPENGL_SUCCESS Autosave Interval: 420 Use Backup Files: true Number of Backups Kept: 1 Backup File Suffix: ~ Backup Location: Same Folder as the File Backup Location writable: false Use Win8 Pointer Input: false Use RightMiddleTabletButton Workaround: false Levels of Detail Enabled: false Use Zip64: false Display Information Number of screens: 2 Screen: 0 Name: \\.\DISPLAY1 Depth: 32 Scale: 1 Physical DPI117.596 Logical DPI96 Physical Size: 553, 311 Position: 0, 0 Resolution in pixels: 2560x1440 Manufacturer: Model: Refresh Rate: 59 Screen: 1 Name: \\.\DISPLAY2 Depth: 32 Scale: 1 Physical DPI141.951 Logical DPI96 Physical Size: 344, 193 Position: 638, 1440 Resolution in pixels: 1920x1080 Manufacturer: Model: Refresh Rate: 60 --------------------- ================================================================================ SESSION: 07 Aug 2022 02:57:22 +0800. Executing D:\P F\krita-nightly-x64-5.2.0-prealpha-9901f954f3\bin\krita.exe Krita Version: 5.2.0-prealpha (git 9901f95), Qt version compiled: 5.12.12, loaded: 5.12.12. Process ID: 9600 -- -- -- -- -- -- -- -- 07 Aug 2022 02:57:22 +0800: Style: fusion. Available styles: windowsvista, Windows, Fusion 07 Aug 2022 02:57:23 +0800: Creating database from scratch (database didn't exist, new schema version: 0.0.17). 07 Aug 2022 02:57:36 +0800: Non-store package - creating updater 07 Aug 2022 02:59:12 +0800: CLOSING SESSION ================================================================================ SESSION: 07 Aug 2022 02:59:17 +0800. Executing D:\P F\krita-nightly-x64-5.2.0-prealpha-9901f954f3\bin\krita.exe Krita Version: 5.2.0-prealpha (git 9901f95), Qt version compiled: 5.12.12, loaded: 5.12.12. Process ID: 5568 -- -- -- -- -- -- -- -- 07 Aug 2022 02:59:17 +0800: Style: fusion. Available styles: windowsvista, Windows, Fusion 07 Aug 2022 02:59:18 +0800: Database is up to date. Version: 0.0.17, created by Krita 5.2.0-prealpha, at 周日 8月 7 02:57:23 2022 07 Aug 2022 02:59:20 +0800: Non-store package - creating updater 07 Aug 2022 02:59:37 +0800: Created image "未命名", 2480 * 3508 pixels, 300 dpi. Color model: 8 位整数/通道 RGB/透明度 (sRGB-elle-V2-srgbtrc.icc). Layers: 2 ---------------------
Created attachment 151151 [details] Use the eraser directly. Erasing directly on an empty layer will also change the layer thumbnail.
Created attachment 151158 [details] bug I recorded a video. It seems that "transparent pixels" not only affect the layer thumbnails, but also occupy a certain amount of memory. If I accidentally click outside the canvas with an eraser, it will also make the file larger and make it impossible for people to know.
Yes -- erased pixels are not deleted, but black 100% transparent pixels. They take space. If you erase you are actually painting using the Erase blending mode. The only solution here is to manually trim the layer using the crop tool. Calculating the boundaries of only the visible pixels is pretty expensive, so that's not done automatically. I'm not sure whether we should actually spend more time on this: we already tried to make a background process that would delete tiles with only transparent pixels on them but that led to race conditions and crashes. Is this important enough to spend seveal weeks on?
(In reply to Halla Rempt from comment #3) > Yes -- erased pixels are not deleted, but black 100% transparent pixels. > They take space. If you erase you are actually painting using the Erase > blending mode. > > The only solution here is to manually trim the layer using the crop tool. > Calculating the boundaries of only the visible pixels is pretty expensive, > so that's not done automatically. > > I'm not sure whether we should actually spend more time on this: we already > tried to make a background process that would delete tiles with only > transparent pixels on them but that led to race conditions and crashes. Is > this important enough to spend seveal weeks on? Sorry, I don't know about that. Aside from looking weird and taking up a little space on the thumbnail display, the actual impact isn't that big. I don't think it's time to spend a developer's precious few weeks on this. So please ignore this little problem. Please deal with more important things. XD
Thanks for the reply :-)
Just a few notes about the technical size of the feature: 1) We update thumbnail preview every 500ms, including during the stroke. 2) Exact bounds calculation might be slow (slower than thumbnail calculation), so, in theory it can interfere with the stroke responsiveness 3) Exact bounds has a cache which is reset only at the end of the stroke. Therefore no thumbnail updates will be issued by then. So idea solution would be to refactor the thumbnail generation code not to request thumbnail updates during the stroke, but do that only at the end of every stroke. That way it would be safe to update thumbs with exact bounds only.
*** This bug has been marked as a duplicate of bug 459273 ***
*** Bug 428259 has been marked as a duplicate of this bug. ***