La pregunta va dirigida a todos, pero mas al querido Vuott quien habra picado con la carnada que le puse en el titulo
Es posible acceder de manera mixta a una libreria que YA este implementada en gambas, pero de manera incompleta?
Por ejemplo tenemos Gb.OpenGL , pero hay funciones de OpenGL que no estan traducidas en gambas. Un ejemplo seria asi:
Acceso Mixto A Librerias EXTERNAS En C
Subject: Re: Acceso Mixto A Librerias EXTERNAS En C
Last edited by vuott on Saturday, 16 May 2020, 18:10; edited 2 times in total
En términos generales, sí.
Un enorme problema, pero, surge si se tiene que compartir un handle.
Por ejemplo en tu simple caso en efecto no hay handle que compartir en común.
Un enorme problema, pero, surge si se tiene que compartir un handle.
Por ejemplo en tu simple caso en efecto no hay handle que compartir en común.
Last edited by vuott on Saturday, 16 May 2020, 18:10; edited 2 times in total
Subject: Re: Acceso Mixto A Librerias EXTERNAS En C
supongamos que tenemos que compartir una imagen que esta en memoria o el Device Context donde esta operando GL de Gambas
en fin, habria que hacer alguna prueba.
vuott escribió:
supongamos que tenemos que compartir una imagen que esta en memoria o el Device Context donde esta operando GL de Gambas
en fin, habria que hacer alguna prueba.
Subject: Re: Acceso Mixto A Librerias EXTERNAS En C
Exemplum clarissimum (hace falta activar el Componente gb.cairo):
Last edited by vuott on Saturday, 16 May 2020, 21:39; edited 2 times in total
tercoIDE escribió:
Exemplum clarissimum (hace falta activar el Componente gb.cairo):
Library "libcairo:2"
' cairo_t* cairo_create(cairo_surface_t *target)
' Creates a new cairo_t with all graphics state parameters set to default values and with target as a target surface.
Private Extern cairo_create(target As Pointer) As Pointer
Public Sub Main()
Dim png As CairoSvgSurface
Dim cairo As Pointer
' Especifica la superficie gráfica (en mm) a crear para dibujar sobre ella:
png = New CairoSvgSurface(Null, 210, 297)
cairo = cairo_create(Object.Address(png))
End
' cairo_t* cairo_create(cairo_surface_t *target)
' Creates a new cairo_t with all graphics state parameters set to default values and with target as a target surface.
Private Extern cairo_create(target As Pointer) As Pointer
Public Sub Main()
Dim png As CairoSvgSurface
Dim cairo As Pointer
' Especifica la superficie gráfica (en mm) a crear para dibujar sobre ella:
png = New CairoSvgSurface(Null, 210, 297)
cairo = cairo_create(Object.Address(png))
End
Last edited by vuott on Saturday, 16 May 2020, 21:39; edited 2 times in total
Subject: Re: Acceso Mixto A Librerias EXTERNAS En C
Last edited by tercoIDE on Saturday, 16 May 2020, 22:03; edited 1 time in total
bien hecho, yo he intentado usar el mismo metodo con OpenGL y no lo logre
ahora se me ocurre otro desafio, dibujar una linea en una imagen en memoria, pero sin usar ninguna herramienta como cairo o paint, simplemente escribir en los bytes ARGB que representan la imagen
ahora se me ocurre otro desafio, dibujar una linea en una imagen en memoria, pero sin usar ninguna herramienta como cairo o paint, simplemente escribir en los bytes ARGB que representan la imagen
Last edited by tercoIDE on Saturday, 16 May 2020, 22:03; edited 1 time in total
Subject: Re: Acceso Mixto A Librerias EXTERNAS En C
En general, para leer o escribir en un flujo de memoria hace falta utilizar los recursos de Memory Stream.
En tu caso tienes que usar la Propiedad ".Data" del Objeto "Image" y el recurso Memory Stream para escribir nuevos datos en el flujo de la memoria que contiene los datos de la imagen.
Exemplum maximum (para este ejemplo hace falta activar los Componentes gb.image, gb.image.io, gb.net y gb.net.curl):
https://www.gambas-it.org/wiki/inde...i_Memory_Stream
Last edited by vuott on Sunday, 17 May 2020, 15:47; edited 9 times in total
tercoIDE escribió:
En general, para leer o escribir en un flujo de memoria hace falta utilizar los recursos de Memory Stream.
En tu caso tienes que usar la Propiedad ".Data" del Objeto "Image" y el recurso Memory Stream para escribir nuevos datos en el flujo de la memoria que contiene los datos de la imagen.
Exemplum maximum (para este ejemplo hace falta activar los Componentes gb.image, gb.image.io, gb.net y gb.net.curl):
Private ht As New HttpClient As "HTTP"
Private stringa As String
Public Sub Main()
With ht
' Envia una petición al Servidor para descargar los datos de la imagen :
.URL = "https://foro.gambas-es.org/images/avatars/1496952105564e53f13da18.png"
.Timeout = 15
' Descarga los datos de la imagen:
.Get(Null, Null)
End With
End
Public Sub HTTP_Read()
Dim sBuf As String
' Va a leer el flujo de datos de la imagen:
If Lof(ht) Then
Read #ht, sBuf, Lof(ht)
stringa &= sBuf
End If
End
Public Sub HTTP_Finished()
Dim im As New Image
Wait
ht.Close
ManuAgit(im.FromString(stringa))
End
Private Procedure ManuAgit(img As Image)
Dim st As Stream
Dim i As Integer
' Para escribir (o leer) en un flujo de datos en memoria, es necesario utilizar el tipo de datos "Stream":
st = Memory img.Data For Write
' Edita la imagen con líneas verticales rojas:
For i = img.W / 2 To (img.W * img.H * (img.Depth / 8)) - 1 Step img.W
Seek #st, i
Write #st, 255 As Byte '' R
Write #st, 0 As Byte '' G
Write #st, 0 As Byte '' B
Write #st, 255 As Byte '' A
Next
st.Close
img.Save("/tmp/nueva_imagen.png", 100)
End
Private stringa As String
Public Sub Main()
With ht
' Envia una petición al Servidor para descargar los datos de la imagen :
.URL = "https://foro.gambas-es.org/images/avatars/1496952105564e53f13da18.png"
.Timeout = 15
' Descarga los datos de la imagen:
.Get(Null, Null)
End With
End
Public Sub HTTP_Read()
Dim sBuf As String
' Va a leer el flujo de datos de la imagen:
If Lof(ht) Then
Read #ht, sBuf, Lof(ht)
stringa &= sBuf
End If
End
Public Sub HTTP_Finished()
Dim im As New Image
Wait
ht.Close
ManuAgit(im.FromString(stringa))
End
Private Procedure ManuAgit(img As Image)
Dim st As Stream
Dim i As Integer
' Para escribir (o leer) en un flujo de datos en memoria, es necesario utilizar el tipo de datos "Stream":
st = Memory img.Data For Write
' Edita la imagen con líneas verticales rojas:
For i = img.W / 2 To (img.W * img.H * (img.Depth / 8)) - 1 Step img.W
Seek #st, i
Write #st, 255 As Byte '' R
Write #st, 0 As Byte '' G
Write #st, 0 As Byte '' B
Write #st, 255 As Byte '' A
Next
st.Close
img.Save("/tmp/nueva_imagen.png", 100)
End
https://www.gambas-it.org/wiki/inde...i_Memory_Stream
Last edited by vuott on Sunday, 17 May 2020, 15:47; edited 9 times in total
Subject: Re: Acceso Mixto A Librerias EXTERNAS En C
Por ejemplo podemos pasar a funciones externas de C variables, que no sean Objetos "stricto sensu" de Clases de gambas, como las no estructuradas de tipos numérico; y podemos tambien Array, Estructuras, Punteros.
Imposible gestionar handle de librerias especificas, desde gambas a C y viceversa.
vuott escribió:
Por ejemplo podemos pasar a funciones externas de C variables, que no sean Objetos "stricto sensu" de Clases de gambas, como las no estructuradas de tipos numérico; y podemos tambien Array, Estructuras, Punteros.
Imposible gestionar handle de librerias especificas, desde gambas a C y viceversa.
Page 1 of 1
You cannot post new topicsYou cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events
This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo
Generation Time: 0.1873s (PHP: -44% SQL: 144%)
SQL queries: 26 - Debug Off - GZIP Enabled