tumic0 / qtpbfimageplugin Goto Github PK
View Code? Open in Web Editor NEWQt image plugin for displaying Mapbox vector tiles
License: GNU Lesser General Public License v3.0
Qt image plugin for displaying Mapbox vector tiles
License: GNU Lesser General Public License v3.0
Summary
The PFBImage plugin can cause an abort to happen in Qt if an application is used that creates a QCoreApplication at startup rather than a QGuiApplication or QApplication and the application calls some Qt functions that cause this plugin to be created for example QImage::save().
This is the specific abort
QFontDatabase: Must construct a QGuiApplication before accessing QFontDatabase
Details
This came to light when we received reports that some Fedora 31 users were seeing a crash of one of our utils (mythpreviewgen) that creates a thumbnail image from a video file. It is a command line utility so as per the Qt guidelines it uses QCoreApplication at startup which then goes on to crash with the abort when your plugin is created when we go to save the thumb image with QImage::save().
It looks like all Fedora 31 and possibly 32 get your plugin installed when they blanket install everything whether they need it or not using dnf -y install qt5*
To be clear our util doesn't use or require the PBFImage plugin it gets created automatically by Qt when it loads the list of available QImageReaders.
The affected users can prevent the crash by uninstalling the plugin with
dnf -y remove qt5-qtpbfimageformat
Possible Fix
It would be nice if when asked to create an instance of the plugin it looked to see if the application is using a QCoreApplication and either refuse to be created or changes it's behaviour to avoid the abort.
Upstream Forum Post
For reference the forum post where this problem was first reported is here
Mythpreviewgen Not Happy
Very interesting application! You should definitely have a look at our Vector Tiles Reader plugin for QGIS
https://github.com/geometalab/Vector-Tiles-Reader-QGIS-Plugin/ . I think there are some nice opportunities to exchange ideas. /cc @mnboos
==32762== Memcheck, a memory error detector
==32762== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==32762== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==32762== Command: ./pbf2png ../IN/ 6 -O ../OUT/
==32762== Parent PID: 4451
==32762==
==32762==
==32762== HEAP SUMMARY:
==32762== in use at exit: 418,228,472 bytes in 8,382,975 blocks
==32762== total heap usage: 32,701,691 allocs, 24,318,716 frees, 7,042,567,427 bytes allocated
==32762==
==32762== 16 bytes in 1 blocks are possibly lost in loss record 619 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x61D9918: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E0DF6: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E4038: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C304E: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9A7: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762== by 0x6180255: dlopen_doit (dlopen.c:66)
==32762==
==32762== 16 bytes in 1 blocks are possibly lost in loss record 620 of 3,842
==32762== at 0x48356AF: malloc (vg_replace_malloc.c:298)
==32762== by 0x4837DE7: realloc (vg_replace_malloc.c:826)
==32762== by 0x61D996B: g_realloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E0CE8: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E4038: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C304E: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9A7: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762==
==32762== 16 bytes in 1 blocks are possibly lost in loss record 621 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x61D9918: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E0DF6: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E4038: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C7E1B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9B6: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762== by 0x6180255: dlopen_doit (dlopen.c:66)
==32762==
==32762== 16 bytes in 1 blocks are possibly lost in loss record 622 of 3,842
==32762== at 0x48356AF: malloc (vg_replace_malloc.c:298)
==32762== by 0x4837DE7: realloc (vg_replace_malloc.c:826)
==32762== by 0x61D996B: g_realloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E0CE8: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E4038: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C7E1B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9B6: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762==
==32762== 32 bytes in 1 blocks are possibly lost in loss record 1,661 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x61D9918: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E335A: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E337F: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4D1C77: g_param_spec_enum (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xBB0EDF9: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.3)
==32762== by 0xB4E31DA: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xBB112A8: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.3)
==32762== by 0xBB121B6: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.3)
==32762== by 0xBB10312: g_dbus_proxy_new_for_bus (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.3)
==32762== by 0xB403180: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.2404.1)
==32762== by 0xB3FCB2D: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.2404.1)
==32762==
==32762== 32 bytes in 2 blocks are possibly lost in loss record 1,662 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x61D9918: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E0DF6: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E4038: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C30B1: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9A7: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762== by 0x6180255: dlopen_doit (dlopen.c:66)
==32762==
==32762== 32 bytes in 2 blocks are possibly lost in loss record 1,663 of 3,842
==32762== at 0x48356AF: malloc (vg_replace_malloc.c:298)
==32762== by 0x4837DE7: realloc (vg_replace_malloc.c:826)
==32762== by 0x61D996B: g_realloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E0CE8: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E4038: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C30B1: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9A7: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762==
==32762== 104 bytes in 2 blocks are possibly lost in loss record 3,061 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x61D9918: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E335A: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E337F: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E4EEF: g_type_create_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4CD56A: g_param_spec_internal (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4D2351: g_param_spec_object (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB3A15C6: ??? (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.2404.1)
==32762== by 0xB4E31DA: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C8CE7: g_object_new_with_properties (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C9730: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB3A16A4: gdk_display_manager_get (in /usr/lib/x86_64-linux-gnu/libgdk-3.so.0.2404.1)
==32762==
==32762== 264 bytes in 2 blocks are possibly lost in loss record 3,456 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x61D9918: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E1754: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E40B9: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4C304E: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9A7: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762== by 0x6180255: dlopen_doit (dlopen.c:66)
==32762==
==32762== 288 (256 direct, 32 indirect) bytes in 1 blocks are definitely lost in loss record 3,477 of 3,842
==32762== at 0x483577F: malloc (vg_replace_malloc.c:299)
==32762== by 0x8F4C6D4: ??? (in /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.12.0)
==32762== by 0x8F4CD75: ??? (in /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.12.0)
==32762== by 0x8F4E2C7: ??? (in /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.12.0)
==32762== by 0x8F5528B: ??? (in /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.12.0)
==32762== by 0x9CF9A15: ??? (in /usr/lib/x86_64-linux-gnu/libexpat.so.1.6.8)
==32762== by 0x9CFA4BB: ??? (in /usr/lib/x86_64-linux-gnu/libexpat.so.1.6.8)
==32762== by 0x9CF7F8A: ??? (in /usr/lib/x86_64-linux-gnu/libexpat.so.1.6.8)
==32762== by 0x9CF8E7A: ??? (in /usr/lib/x86_64-linux-gnu/libexpat.so.1.6.8)
==32762== by 0x9CFCA37: XML_ParseBuffer (in /usr/lib/x86_64-linux-gnu/libexpat.so.1.6.8)
==32762== by 0x8F530FA: ??? (in /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.12.0)
==32762== by 0x8F53519: ??? (in /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.12.0)
==32762==
==32762== 296 bytes in 2 blocks are possibly lost in loss record 3,484 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x61D9918: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E1568: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E40B9: g_type_register_fundamental (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4CCF9B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9B1: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762== by 0x6180255: dlopen_doit (dlopen.c:66)
==32762==
==32762== 480 bytes in 5 blocks are possibly lost in loss record 3,575 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x61D9918: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E0151: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E02EA: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC8CA: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762== by 0x6180255: dlopen_doit (dlopen.c:66)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762==
==32762== 768 bytes in 24 blocks are possibly lost in loss record 3,654 of 3,842
==32762== at 0x4835DEF: operator new(unsigned long) (vg_replace_malloc.c:334)
==32762== by 0x155218D3: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762== by 0x10FB6A: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIteration(QList<QPair<int, int> >::iterator, int, void*) (qtconcurrentmapkernel.h:68)
==32762== by 0x10FBFA: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIterations(QList<QPair<int, int> >::iterator, int, int, void*) (qtconcurrentmapkernel.h:77)
==32762== by 0x11003A: QtConcurrent::IterateKernel<QList<QPair<int, int> >::iterator, void>::forThreadFunction() (qtconcurrentiteratekernel.h:255)
==32762== by 0x10FD77: QtConcurrent::IterateKernel<QList<QPair<int, int> >::iterator, void>::threadFunction() (qtconcurrentiteratekernel.h:217)
==32762== by 0x4E00A4C: QtConcurrent::ThreadEngineBase::run() (in /usr/lib/x86_64-linux-gnu/libQt5Concurrent.so.5.11.3)
==32762==
==32762== 960 bytes in 24 blocks are possibly lost in loss record 3,679 of 3,842
==32762== at 0x483577F: malloc (vg_replace_malloc.c:299)
==32762== by 0x4EC9511: QArrayData::allocate(unsigned long, unsigned long, unsigned long, QFlagsQArrayData::AllocationOption) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x15524C7E: QTypedArrayDataPBF::Feature::allocate(unsigned long, QFlagsQArrayData::AllocationOption) (qarraydata.h:222)
==32762== by 0x155247B7: QVectorPBF::Feature::reallocData(int, int, QFlagsQArrayData::AllocationOption) (qvector.h:562)
==32762== by 0x155221B0: QVectorPBF::Feature::reserve(int) (qvector.h:398)
==32762== by 0x15521548: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:100)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762==
==32762== 1,152 bytes in 4 blocks are possibly lost in loss record 3,715 of 3,842
==32762== at 0x4837D7B: realloc (vg_replace_malloc.c:826)
==32762== by 0x61D996B: g_realloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xB4E00CC: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4E429C: g_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4CEC80: g_param_type_register_static (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4D167A: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0xB4BC9BB: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5800.3)
==32762== by 0x400F379: call_init.part.0 (dl-init.c:72)
==32762== by 0x400F475: call_init (dl-init.c:118)
==32762== by 0x400F475: _dl_init (dl-init.c:119)
==32762== by 0x40132D2: dl_open_worker (dl-open.c:517)
==32762== by 0x5862B2E: _dl_catch_exception (dl-error-skeleton.c:196)
==32762== by 0x4012BB9: _dl_open (dl-open.c:599)
==32762==
==32762== 1,248 bytes in 3 blocks are possibly lost in loss record 3,723 of 3,842
==32762== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==32762== by 0x40116D1: allocate_dtv (dl-tls.c:286)
==32762== by 0x401203D: _dl_allocate_tls (dl-tls.c:532)
==32762== by 0x539DB95: allocate_stack (allocatestack.c:621)
==32762== by 0x539DB95: pthread_create@@GLIBC_2.2.5 (pthread_create.c:669)
==32762== by 0x621DC3F: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0x61FC71E: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0x61FC7C7: g_thread_new (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0x61D5043: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==32762== by 0xBAAC5C6: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.3)
==32762== by 0xBAAC984: g_task_get_type (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.3)
==32762== by 0xBB12160: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.3)
==32762== by 0xBB10312: g_dbus_proxy_new_for_bus (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.5800.3)
==32762==
==32762== 1,520 bytes in 38 blocks are possibly lost in loss record 3,733 of 3,842
==32762== at 0x483577F: malloc (vg_replace_malloc.c:299)
==32762== by 0x4EC9511: QArrayData::allocate(unsigned long, unsigned long, unsigned long, QFlagsQArrayData::AllocationOption) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x1552460E: QTypedArrayData::allocate(unsigned long, QFlagsQArrayData::AllocationOption) (qarraydata.h:222)
==32762== by 0x15523FB7: QVector::reallocData(int, int, QFlagsQArrayData::AllocationOption) (qvector.h:562)
==32762== by 0x15521F90: QVector::reserve(int) (qvector.h:398)
==32762== by 0x15521457: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:96)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762==
==32762== 3,040 bytes in 95 blocks are possibly lost in loss record 3,771 of 3,842
==32762== at 0x483577F: malloc (vg_replace_malloc.c:299)
==32762== by 0x4F125B4: QHashData::allocateNode(int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x15523EC9: QHash<QString, unsigned int>::createNode(unsigned int, QString const&, unsigned int const&, QHashNode<QString, unsigned int>) (qhash.h:560)
==32762== by 0x15521E71: QHash<QString, unsigned int>::insert(QString const&, unsigned int const&) (qhash.h:776)
==32762== by 0x155213CF: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:95)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762== by 0x10FB6A: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIteration(QList<QPair<int, int> >::iterator, int, void*) (qtconcurrentmapkernel.h:68)
==32762==
==32762== 4,560 bytes in 95 blocks are possibly lost in loss record 3,790 of 3,842
==32762== at 0x4835DEF: operator new(unsigned long) (vg_replace_malloc.c:334)
==32762== by 0x4F127CF: QHashData::detach_helper(void ()(QHashData::Node, void*), void ()(QHashData::Node), int, int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x15523CCE: QHash<QString, unsigned int>::detach_helper() (qhash.h:597)
==32762== by 0x15523BF8: QHash<QString, unsigned int>::detach() (qhash.h:275)
==32762== by 0x15521D7B: QHash<QString, unsigned int>::reserve(int) (qhash.h:880)
==32762== by 0x1552133C: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:93)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762==
==32762== 5,448 bytes in 154 blocks are possibly lost in loss record 3,798 of 3,842
==32762== at 0x483577F: malloc (vg_replace_malloc.c:299)
==32762== by 0x4EC9511: QArrayData::allocate(unsigned long, unsigned long, unsigned long, QFlagsQArrayData::AllocationOption) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x4F396E2: QString::QString(int, Qt::Initialization) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x50C50FC: ??? (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x4F3DAA1: QString::fromUtf8_helper(char const*, int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x15520331: QString::fromUtf8(char const*, int) (qstring.h:569)
==32762== by 0x15521EF0: QString::fromStdString(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&) (qstring.h:1370)
==32762== by 0x155213B0: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:95)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762==
==32762== 12,920 bytes in 95 blocks are possibly lost in loss record 3,814 of 3,842
==32762== at 0x483650F: operator new[](unsigned long) (vg_replace_malloc.c:423)
==32762== by 0x4F12A9B: QHashData::rehash(int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x15521DAC: QHash<QString, unsigned int>::reserve(int) (qhash.h:881)
==32762== by 0x1552133C: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:93)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762== by 0x10FB6A: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIteration(QList<QPair<int, int> >::iterator, int, void*) (qtconcurrentmapkernel.h:68)
==32762== by 0x10FBFA: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIterations(QList<QPair<int, int> >::iterator, int, int, void*) (qtconcurrentmapkernel.h:77)
==32762==
==32762== 1,280,376 (163,616 direct, 1,116,760 indirect) bytes in 5,113 blocks are definitely lost in loss record 3,831 of 3,842
==32762== at 0x483577F: malloc (vg_replace_malloc.c:299)
==32762== by 0x4F125B4: QHashData::allocateNode(int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x15523EC9: QHash<QString, unsigned int>::createNode(unsigned int, QString const&, unsigned int const&, QHashNode<QString, unsigned int>) (qhash.h:560)
==32762== by 0x15521E71: QHash<QString, unsigned int>::insert(QString const&, unsigned int const&) (qhash.h:776)
==32762== by 0x155213CF: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:95)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762== by 0x10FB6A: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIteration(QList<QPair<int, int> >::iterator, int, void*) (qtconcurrentmapkernel.h:68)
==32762==
==32762== 6,431,652 (3,476,024 direct, 2,955,628 indirect) bytes in 25,559 blocks are definitely lost in loss record 3,833 of 3,842
==32762== at 0x483650F: operator new[](unsigned long) (vg_replace_malloc.c:423)
==32762== by 0x4F12A9B: QHashData::rehash(int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x15521DAC: QHash<QString, unsigned int>::reserve(int) (qhash.h:881)
==32762== by 0x1552133C: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:93)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762== by 0x10FB6A: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIteration(QList<QPair<int, int> >::iterator, int, void*) (qtconcurrentmapkernel.h:68)
==32762== by 0x10FBFA: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIterations(QList<QPair<int, int> >::iterator, int, int, void*) (qtconcurrentmapkernel.h:77)
==32762==
==32762== 38,125,058 (3,826,712 direct, 34,298,346 indirect) bytes in 94,639 blocks are definitely lost in loss record 3,837 of 3,842
==32762== at 0x483577F: malloc (vg_replace_malloc.c:299)
==32762== by 0x4EC9511: QArrayData::allocate(unsigned long, unsigned long, unsigned long, QFlagsQArrayData::AllocationOption) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.11.3)
==32762== by 0x15524C7E: QTypedArrayDataPBF::Feature::allocate(unsigned long, QFlagsQArrayData::AllocationOption) (qarraydata.h:222)
==32762== by 0x155247B7: QVectorPBF::Feature::reallocData(int, int, QFlagsQArrayData::AllocationOption) (qvector.h:562)
==32762== by 0x155221B0: QVectorPBF::Feature::reserve(int) (qvector.h:398)
==32762== by 0x15521548: PBF::Layer::Layer(vector_tile::Tile_Layer const*) (pbf.cpp:100)
==32762== by 0x155218F1: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762==
==32762== 370,672,640 (27,837,952 direct, 342,834,688 indirect) bytes in 869,936 blocks are definitely lost in loss record 3,842 of 3,842
==32762== at 0x4835DEF: operator new(unsigned long) (vg_replace_malloc.c:334)
==32762== by 0x155218D3: PBF::PBF(vector_tile::Tile const&) (pbf.cpp:110)
==32762== by 0x1551F9D1: PBFHandler::read(QImage*) (pbfhandler.cpp:92)
==32762== by 0x49F2F95: QImageReader::read(QImage*) (in /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.11.3)
==32762== by 0x10C958: App::image(QImage&, int, int, int, int) (pbf2png.cpp:50)
==32762== by 0x10CC00: App::render(QPair<int, int>&) (pbf2png.cpp:72)
==32762== by 0x10FE07: QtConcurrent::FunctionWrapper1<void, QPair<int, int>&>::operator()(QPair<int, int>&) (qtconcurrentfunctionwrappers.h:80)
==32762== by 0x10FB6A: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIteration(QList<QPair<int, int> >::iterator, int, void*) (qtconcurrentmapkernel.h:68)
==32762== by 0x10FBFA: QtConcurrent::MapKernel<QList<QPair<int, int> >::iterator, QtConcurrent::FunctionWrapper1<void, QPair<int, int>&> >::runIterations(QList<QPair<int, int> >::iterator, int, int, void*) (qtconcurrentmapkernel.h:77)
==32762== by 0x11003A: QtConcurrent::IterateKernel<QList<QPair<int, int> >::iterator, void>::forThreadFunction() (qtconcurrentiteratekernel.h:255)
==32762== by 0x10FD77: QtConcurrent::IterateKernel<QList<QPair<int, int> >::iterator, void>::threadFunction() (qtconcurrentiteratekernel.h:217)
==32762== by 0x4E00A4C: QtConcurrent::ThreadEngineBase::run() (in /usr/lib/x86_64-linux-gnu/libQt5Concurrent.so.5.11.3)
==32762==
==32762== LEAK SUMMARY:
==32762== definitely lost: 35,304,560 bytes in 995,248 blocks
==32762== indirectly lost: 381,205,454 bytes in 7,366,806 blocks
==32762== possibly lost: 32,920 bytes in 552 blocks
==32762== still reachable: 1,616,858 bytes in 19,806 blocks
==32762== of which reachable via heuristic:
==32762== length64 : 3,296 bytes in 59 blocks
==32762== newarray : 2,048 bytes in 48 blocks
==32762== suppressed: 0 bytes in 0 blocks
==32762== Reachable blocks (those to which a pointer was found) are not shown.
==32762== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==32762==
==32762== For counts of detected and suppressed errors, rerun with: -v
==32762== ERROR SUMMARY: 25 errors from 25 contexts (suppressed: 0 from 0)
I use this code to convert vector tiles to png image:
QImage *_image = new QImage();
QString _file("C:\\z0_x0_y0.pbf");
QImageReader _reader(_file, QString("0").toLatin1());
//_reader.setScaledSize(QSize(256, 256));
if (_reader.read(_image))
{
_image->save(_file+".png","PNG");
}
delete _image;
The received image does not contain water layer.
The visibility Layout property is not parsed?
style.zip
While debugging an unrelated application which crashed only if this library was installed, a very helpful person pinpointed me at this bug:
You need to actually decompress the first 4 bytes of the GZIP and compare those with the PBF magic before claiming that it supports the file.
Otherwise, it will end up claiming, say, SVGZ images (which are also GZIP files).
Actually, you really need to decompress only the first byte, because the PBF magic is actually only 1 byte (see PBF_MAGIC_MASK).
That, though, also means that this is not a very reliable check and can claim files falsely.
Also, as far as I can tell, a PBF file is just any Google protobuf file and not necessarily a MapBox tile. There is no check anywhere that the protobuf blob is really a MapBox tile.
The check for supported files is way too broad and results in Qt automatically choosing this plugin for images that it it cannot possibly work with.
I use this code to convert vector tiles to png image:
9-12-453.zip
9-12-453.zip
` QImage *_image = new QImage();
foreach (QString filename, listFiles)
{
QImageReader _reader(filename, QString("0").toLatin1());
_reader.setScaledSize(QSize(256, 256));
if (_reader.read(_image))
{
_image->save(filename+".png","PNG");
}
}
delete _image;`
the memory occupied by the application is growing...
When I build the project in the windows environment, the following error appears. I don’t know if I downloaded the wrong Zlib or used the wrong problem. The website where I downloaded zlib is http://www.winimage.com/zLibDll
$ cat << EOF > test.gpx
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="" version="1.1">
<wpt lat="49.797098" lon="86.567346">
<name>4436 m</name>
</wpt>
</gpx>
EOF
$ crudini --set ~/.config/gpxsee/gpxsee.conf Map map MapTiler
$ curl -o ~/.local/share/gpxsee/style/style.json https://raw.githubusercontent.com/openmaptiles/klokantech-terrain-gl-style/master/style.json
$ gpxsee test.gpx
1 - actual summit location
2 - displayed summit location
$ sed -i 's#{name:latin}\\\n##g' ~/.local/share/gpxsee/style/style.json
The marker's position coincides with actual location:
GPXSee: 7.15
QtPBFImagePlugin: 2.0
README says:
Due to a major design flaw in the Mapbox vector tiles specification - the zoom is not part of the PBF data - the plugin can not be used "as is", but passing the zoom level is necessary.
But I've tried to use .pbf tiles within other applications (not GPXSee) without any modifications (for passing the zoom level) and everything works as expected. I've also tried to build GPXSee without passing the zoom level to QImageReader and it works as well. Do I miss something?
I try to use Klokantech Terrain style with GPXSee and here is the result:
And compare with openmaptiles.github.io/klokantech-terrain-gl-style:
All layers that use hillshading
or contours
sources are not rendered.
style.json:
"sources": {
"openmaptiles": {
"type": "vector",
"url": "https://free.tilehosting.com/data/v3.json?key={key}"
},
"hillshading": {
"type": "raster",
"url": "https://klokantech.tilehosting.com/data/hillshades.json?key=tXme5cuqgrCqdPoZHqyn",
"tileSize": 256
},
"contours": {
"type": "vector",
"url": "https://klokantech.tilehosting.com/data/contours.json?key=tXme5cuqgrCqdPoZHqyn"
}
},
I guess there is some known QtPBFImagePlugin limitation.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.