GTKD Cairo get pixel color

TheDGuy via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jan 5 07:04:57 PST 2016


On Monday, 4 January 2016 at 23:47:05 UTC, Basile B. wrote:
> On Friday, 1 January 2016 at 22:00:04 UTC, TheDGuy wrote:
>> On Friday, 1 January 2016 at 19:32:40 UTC, Basile B. wrote:
>>> On Wednesday, 30 December 2015 at 23:20:23 UTC, Basile B. 
>>> wrote:
>>>> On Wednesday, 30 December 2015 at 20:44:44 UTC, TheDGuy 
>>>> wrote:
>>>>> Hello,
>>>>>
>>>>> is there any way to get the pixel color of a single pixel 
>>>>> by x and y coordinates of a context?
>>>>
>>>> render to a png back buffer.
>>>>
>>>> see cairo_image_surface_create_for_data
>>>>
>>>> then you'll be able to access the data and, at the same 
>>>> time, to blit your buffer to screen.
>>>
>>>
>>> Actually I was thinking to a user defined buffer type:
>>>
>>> struct SurfaceBuffer
>>> {
>>>     void* data; // used as param to create the surface
>>>     Rgba[] opIndex(size_t index);
>>>     Rgba[][] scanline();
>>> }
>>>
>>> that you would pass as data in 
>>> cairo_image_surface_create_for_data().
>>>
>>> But gtk certainly has pitcure classes with the typical 
>>> scanline method and that you could use in 
>>> cairo_image_surface_create_for_data.
>>
>> Ahm, i am not quite sure if you and [Mike Wey] talk about the 
>> same thing. And i posted the error message in my last post 
>> when i try to call "cairo_image_surface_create_for_data". I 
>> still don't know where i am able to call the function?
>
> I've not followed the conversation since last time, but you can 
> have a look at this:
>
> https://github.com/BBasile/kheops/blob/master/src/kheops/bitmap.d#L143
>
> this is how I do with Cairo only (even x11 is not implied since 
> it's just a bitmap).
> Then I can access pixels (for example to make shadows or blurs 
> etc.) and do vectorial drawings as well with a context for the 
> bitmap surface.

I tried it like in this C++ example:

http://stackoverflow.com/questions/16785886/get-pixel-value-on-gdkpixbuf-set-pixel-value-with-gdkcairo

surface = 
getFromSurface(cr.getTarget(),0,0,size.width,size.height);
int offset = 12*surface.getRowstride() + 
12*surface.getNChannels();
auto px = surface.getPixels();
px[offset][0] = 0;

But i get "only one index allowed to index char". So it looks 
like there is no 2D array but just a char.
If i try like this:

auto px = surface.getPixels()[offset];

the value of 'px' looks like this in the debugger:

http://www.pic-upload.de/view-29334489/d_value.png.html




More information about the Digitalmars-d-learn mailing list