skia | complete 2D graphic library for drawing Text | Graphics library
kandi X-RAY | skia Summary
kandi X-RAY | skia Summary
Skia is a complete 2D graphic library for drawing Text, Geometries, and Images. See full details, and build instructions, at
Support
Quality
Security
License
Reuse
Top functions reviewed by kandi - BETA
Currently covering the most popular Java, JavaScript and Python libraries. See a Sample of skia
skia Key Features
skia Examples and Code Snippets
Community Discussions
Trending Discussions on skia
QUESTION
I'm writing an application in the form of instagram (I study lessons from YouTube, they create it on Android 8, I'm trying to do the same on Android 10), I've only known Kotlin for a couple of weeks. Already implemented a lot. But it is with firebase that problems arise. Two questions:
- Register a user in the application and save his text data in firebase - I can do it from any device. Through the emulator on Android 8 - I can take a picture and everything works as it should, even the link to change the profile photo is displayed correctly. There is also a
ShareActivity
file where the user can share a photo on the "wall" and the problem is that photos appear in storage in google firebase, and in the realtime database the link to this photo is written as"com.google.firebase.storage.UploadTask $TaskSnapshot@46529a6"
, but should be written as a link"https://firebasestorage.googleapis.com/v0/b/instapirate...
", while the profile photo is displayed correctly, namely posts - no, photos are simply not visible . How to fix this bug? I attach a photo from the emulator and the database: - And one more problem, which is that on Android 8 in the Instagram emulator I was asked for permission to the camera, I allowed it and the camera works, takes pictures and everything happens fine. And in android 10, permission to the camera is not requested and, therefore, the camera opens, takes pictures, but cannot save the photos (reopens when I click on the "save" button). A few times if I poke the buttons quickly - sometimes it helps to save the photo, but this happens in one case in a million. Not the fact that this is due to the resolution of the camera.
I attach the code below:
AndroidManifest
ANSWER
Answered 2022-Mar-21 at 10:59Just added into FirebaseHelper
this code:
QUESTION
I'm new to Uno Platform and I created a new project to make some tests.
I would like to add a new control that allows horizontal panning, similar to stories in Instagram or the CollectionView in Net MAUI.
Till now I've tried with an horizontal ListView, but it only works in UWP, neither the Droid project nor Wasm or Skia project.
My actual XAML code is:
...ANSWER
Answered 2022-Mar-11 at 21:11You are absolutely right! It seems it's a bug in Uno: I just reproduced it in the Uno Playground
New issue has been created in the Uno backlog. Thanks for reporting!
QUESTION
I'm trying to draw a set of images with SkiaSharp, convert them to byte array, and send to HttpContext
stream. For some reason, every image is being displayed in the browser only when the next image has been rendered and sent to the HTTP stream.
- After rendering the 1st image, browser shows empty white area, no image
- After rendering the 2nd image, browser shows 1st image
- After rendering the 3rd image, browser shows 2nd image, and so on
Here is the Web API controller. Uncommenting second drawShapes
call will make it work, but I would like to understand why image rendering is delayed. Maybe I just don't call some important method, like Flush
or something similar?
Also, this is not an ASP issue, because I tried rendering images with System.Drawing.Common and images were rendered in real time without delay.
Does anybody know what is missing in this method?
...ANSWER
Answered 2022-Mar-13 at 21:46This was answered in SkiaSharp discussions. https://github.com/mono/SkiaSharp/discussions/1975
Possible solutions are to make sure to Encode
image only after all drawings are done or to call Encode
on bitmap instead of image.
The simplest one is to replace this line.
QUESTION
I need to know the number of the last row in my Table to work on it. So, I wrote this function in Python:
...ANSWER
Answered 2022-Feb-16 at 13:27Global variables in programming are usually a bad idea, and this is no exception. From the comment:
If it's global then it will not get the changed value. Initialize those values at the beginning of
calcula()
instead... The initial part of the code only gets run once, when the python file gets modified, as you have already discovered. It's a good place to declare constants but not variables.
QUESTION
I save images relative to the workingdirectory and then want to display them in a uno Skia.WPF app.
However they never appear. This is how I create the ImageSource:
...ANSWER
Answered 2022-Feb-13 at 15:24file:
URIs are currently not supported in Uno, however, you can still show local images by copying to the appropriate folder using ms-appdata
scheme. If you copy the file into ApplicationData.Current.TemporaryFolder
, you will the be able to reference that path by ms-appdata:///temp/{imageName}
URI.
QUESTION
I am trying to embed skia-python
's surface inside a window rather than output to a image file. I am using pysdl2
to create the window using the following code from the documentation:
ANSWER
Answered 2022-Jan-23 at 05:42I gave up on creating it without ctypes
as all we need from it is ctypes.byref
and I am now importing sdl2
instead of sdl2.ext
which was more pythonic, but also restricted a bit of functionality that is required here.
Now to answer the question, I followed this guide here (if you are not building a browser it might go a little off topic for you)
So I have also implemented a general enough version from the above guide, you can draw to Window.skia_surface
and then call Window.update
to copy skia surface to the window screen:
QUESTION
I am creating a window with pysdl2 and using SDL_Blit_Surface for embedding a skia-python surface inside this window with the following code:
...ANSWER
Answered 2022-Jan-15 at 16:56As SDL_CreateRGBSurfaceFrom documentation says, it doesn't allocate memory for pixels data but takes external memory buffer passed to it. While there's a benefit in having no copy operation at all, it have lifetime implications - note "you must free the surface before you free the pixel data".
Python tracks references for its objects and automatically destroys objects once their reference count reaches 0 (i.e. no references to that object possible - delete it immediately). But nither SDL nor skia are python libraries, and whatever references they keep in their native code is not exposed to python. So, python automatic memory management doesn't help you here.
What's happening is you get pixels data from skia as bytes array (python object, automatically freed when no longer referenced), then pass it to SDL_CreateRGBSurfaceFrom
(native code, python don't know that it'd keep internal reference), and then your pixels
goes out of scope and python deletes them. You have surface but SDL says the way you created it pixels must not be destroyed (there are other ways, like SDL_CreateRGBSurface
, that actually allocate their own memory). Then you try to blit it and surface still points to location where pixels were, but that array is no longer there.
[Everything that follows is explaination of why exactly it didn't crash with smaller surface size, and that turned out to require much more words than i thought. Sorry. If you're not interested in that stuff, don't read any further]
What happens next purely depends on memory allocator used by python. First, segmentation fault is a critical signal sent by operating system to your program, and it happens when you access memory pages in a way that you're not supposed to - e.g. reading memory that have no mapped pages or writing to pages that are mapped as read-only. All that, and the way to map/unmap pages, is provided by your operating system kernel (e.g. in linux it is handled by mmap
/munmap
calls), but OS kernel only operates on page level; you can't request half-of-page, but you can have large block backed by N pages. For most current operating systems, minimal page size is 4kb; some OS supports 2Mb or even larger 'huge' pages.
So, you get segmentation fault when you have larger surface, but don't get it when surface is smaller. Meaning for larger surface your BlitSurface
hits memory that is already unmapped and OS sends your program polite "sorry can't allow that, correct yourself immediately or you're going down". But when surface is smaller memory that pixels
were kept in still mapped; it doesn't necessarily mean it still contains the same data (e.g. python could have placed some other object there), but as far as OS concerned this memory region is still 'yours' to read. And the difference in that behaviour is indeed caused by size of allocated buffer (but of course you can't rely for that behaviour to be kept on other OS, other python versions, or even other with different set of environment variables).
As i've said before, you only mmap
entire pages, but python (that's just an example, as you'll see later) have a lot of smaller objects (integers, floats, smaller strings, short arrays, ...) that are much smaller than a page. Allocating entire page for each of that would be a massive waste of memory (also other problems like reduced performance because of bad caching). To handle that what we do ('we' being every single program that needs smaller allocations, i.e. 99% of programs you use everyday) is allocate a larger block of memory and track which parts of that block is allocated/freed in userspace (as oppoosed to pages that are being tracked by OS kernel - in kernelspace) entirely. That way you could have very tight packing of small allocations without too much of an overhead, but the downside is that this allocations are not distinguishable on OS level. When you 'free' some small allocation that is placed in that kind of pre-allocated block, you just internally mark this region as unused and next time some other part of your program request some memory you start searching for a place where you can put it. It also means you usually don't return (unmap) memory to OS as you can't give back the block if at least one byte of it is still in use.
Python internally manages small objects (<512b) itself, by allocating 256kb blocks and placing objects in that blocks. If larger allocation is required - it passes it to libc malloc (python itself is written in C and uses libc; the most popular libc for linux is glibc
). And malloc documentation for glibc says following:
When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by default, but is adjustable using mallopt(3)
So, allocations for larger objects should go to mmap
/munmap
, and freeing that pages should make them unaccessible (causing segfault if you try to access it, instead of silently reading potentially garbage data; bonus point if you try to write into it - so-called memory stomping, overwriting something else, probably even internal libc markers that it uses to track which memory is used; anything could happen after that). While there is still a chance that next mmap
will randomly place next page on the same address, i'm going to neglect that. Unfortunately this is very old documentation that, while explains basic intent, no longer reclects how glibc behaves nowadays. Take a look at comment in glibc source (emphasis is mine):
M_MMAP_THRESHOLD is the request size threshold for using mmap()
to service a request. Requests of at least this size that cannot be allocated using already-existing space will be serviced via mmap.
(If enough normal freed space already exists it is used instead.)...
The implementation works with a sliding threshold, which is by default limited to go between 128Kb and 32Mb (64Mb for 64 bitmachines) and starts out at 128Kb as per the 2001 default.
...
The threshold goes up in value when the application frees memory that was allocated with the mmap allocator. The idea is that once the application starts freeing memory of a certain size, it's highly probable that this is a size the application uses for transient allocations.
So, it tries to adapt to your allocation behaviour to balance performance with releasing memory back to OS.
But, different OSes will behave differently, and even with just linux we have multiple libc implementations (e.g. musl) that will implement malloc differently, and a lot of different memory allocators (jemalloc, tcmalloc, dlmalloc, you name it) that could be injected via LD_PRELOAD
and your program (e.g. python itself in that case) will use different allocator with different rules on mmap
usage. There are even debug allocators that injects "guard" pages around every allocation, that don't have any access rights at all (can't read, write or execute), to catch common memory-related programming mistakes, at a cost of massively larger memory usage.
To sum it up - you had a lifetime management bug in your code, and unfortunately it didn't crash immediately due to internals of libc memory allocation scheme, but it did crash when surface size got larger and libc decided to allocate exclusive pages for that buffer. That is unfortunate turn of events that languages without automatic memory managerment are exposed to, and by virtue of using python C bindings your python program is, to some extent, exposed as well.
QUESTION
**When I click a widget the screen not changing until I save file again.
this is the log when I click a widget: D/skia ( 5395): Errors: D/skia ( 5395): link failed but did not provide an info log D/skia ( 5395): Shader compilation error D/skia ( 5395): ------------------------ D/skia ( 5395): Errors: D/skia ( 5395): link failed but did not provide an info log**
this is the code
...ANSWER
Answered 2021-Dec-26 at 07:50you are not calling setState. so change onTap to below code:
QUESTION
I'm building static C++ libs off of github. Specifically, the Skia-for-Aseprite libs (link is to the github page). I'm following the windows compilation instructions written up in the git repo's readme. The instructions have you compile the libs using LLVM/CLANG and the Ninja build system. Afterwards they work just fine when linked to a project in Visual Studio 2020 (my main IDE).
The problem is that the instructions only say how to compile RELEASE-build libs, whereas I need to compile DEBUG-build libs so that I can use the debugger in VS2020. So I changed the final commands to try and compile a DEBUG-build. I changed them from:
...ANSWER
Answered 2021-Dec-11 at 20:12I've found a solution! Apparently this solution is applicable to any LLVM DEBUG-built library to be used in Visual studio.
The line in my question that triggered the compile (which started with "gn gen") ends with:
extra_cflags=[""-MT""]"
To get the compiled library recognizable as DEBUG-mode in visual studio, the "-MT" needs to be changed to "-MTd".
The other changes listed in the question are most likely necessary too. Most notably:
- "is_debug=false" to "is_debug=true"
- "is_official_build=true" to "is_official_build=false"
QUESTION
How can I open a window and draw to it with SkiaSharp (without using winforms, wpf or anything like that)? I've tried using SFML.Net instead of SKIA but it lacks a lot of features (rounded rectangle, shadow, gradient).
...ANSWER
Answered 2021-Nov-27 at 09:50I have solved the problem by using Silk.NET SFML bindings to create a GL context for Skia.
This pull request was very helpful.
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
Vulnerabilities
No vulnerabilities reported
Install skia
Support
Reuse Trending Solutions
Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items
Find more librariesStay Updated
Subscribe to our newsletter for trending solutions and developer bootcamps
Share this Page