https://foro.gambas-es.org/viewtopic.php?f=4&t=8050
-----------------------------------
tercoIDE
Sabado, 16 May 2020, 13:03

Acceso Mixto A Librerias EXTERNAS En C
-----------------------------------
La pregunta va dirigida a todos, pero mas al querido Vuott quien habra picado con la carnada que le puse en el titulo  :mrgreen: 

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:
[code linenumbers=false syntax=gambas]
Lib "libGL"

Extern GLfunNotAvailable(x as float, y as Float)as Boolean


' esto si esta implementado de forma nativa
GL.Viewport(300,400)


Print funNotAvailable(4 , 8)
 
[/code]


-----------------------------------
vuott
Sabado, 16 May 2020, 17:29

Re: Acceso Mixto A Librerias EXTERNAS En C
-----------------------------------
En términos generales, sí.

Un [u]enorme[/u] problema, pero, surge si se tiene que [u]compartir[/u] un [i]handle[/i].

Por ejemplo en tu simple caso en efecto [u]no[/u] hay [i]handle[/i] que compartir en común.


-----------------------------------
tercoIDE
Sabado, 16 May 2020, 18:54

Re: Acceso Mixto A Librerias EXTERNAS En C
-----------------------------------
[quote user="vuott" post="48503"]En términos generales, sí.

Un [u]enorme[/u] problema, pero, surge si se tiene que [u]compartir[/u] un [i]handle[/i].

Por ejemplo en tu simple caso en efecto [u]no[/u] hay [i]handle[/i] que compartir en común.[/quote]

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
Sabado, 16 May 2020, 21:35

Re: Acceso Mixto A Librerias EXTERNAS En C
-----------------------------------
[quote user="tercoIDE" post="48506"]Un [u]enorme[/u] problema, pero, surge si se tiene que [u]compartir[/u] un [i]handle[/i].[/quote]
[i]Exemplum clarissimum[/i] (hace falta activar el Componente [i]gb.cairo[/i]):

[code linenumbers=false syntax=gambas]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[/code]


-----------------------------------
tercoIDE
Sabado, 16 May 2020, 22:02

Re: Acceso Mixto A Librerias EXTERNAS En C
-----------------------------------
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


-----------------------------------
vuott
Domingo, 17 May 2020, 00:26

Re: Acceso Mixto A Librerias EXTERNAS En C
-----------------------------------
[quote user="tercoIDE" post="48508"]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[/quote]
En general, para leer o escribir en un flujo de memoria hace falta utilizar los recursos de [i][color=#A50000]Memory Stream[/color][/i].
En tu caso tienes que usar la Propiedad "[i].Data[/i]" del Objeto "Image" y el recurso [i]Memory Stream[/i] para escribir nuevos datos en el flujo de la memoria que contiene los datos de la imagen.

[i]Exemplum maximum[/i] (para este ejemplo hace falta activar los Componentes [i]gb.image[/i], [i]gb.image.io[/i], [i]gb.net[/i] y [i]gb.net.curl[/i]):

[code linenumbers=false syntax=gambas]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[/code]


https://www.gambas-it.org/wiki/index.php?title=Modificare_i_colori_dei_pixel_di_un%27immagine_con_la_propriet%C3%A0_.Data_della_Classe_Image_ed_i_Memory_Stream


-----------------------------------
tercoIDE
Domingo, 17 May 2020, 04:05

Re: Acceso Mixto A Librerias EXTERNAS En C
-----------------------------------
hice una pequeña app con tu codice
 :mrgreen: 

[img]https://foro.gambas-es.org/files/images/2399/captura_de_pantalla_de_2020_05_17_00_04_33.png[/img]


-----------------------------------
vuott
Lunes, 18 May 2020, 01:10

Re: Acceso Mixto A Librerias EXTERNAS En C
-----------------------------------
[quote user="vuott" post="48503"]En términos generales, sí.

Un [u]enorme[/u] problema, pero, surge si se tiene que [u]compartir[/u] un [i]handle[/i].[/quote]

Por ejemplo podemos pasar a funciones externas de C variables, que no sean Objetos "[i]stricto sensu[/i]" de Clases de Gambas, como las [i]no estructuradas[/i] de tipos numérico; y podemos tambien Array, Estructuras, Punteros.

Imposible gestionar [i]handle[/i] de librerias especificas, desde Gambas a C y viceversa.   :(


