On 15 November 2017 at 20:47, Esteban Lorenzano <esteba...@gmail.com> wrote:
> > > On 15 Nov 2017, at 09:36, Ben Coman <b...@openinworld.com> wrote: > > > > > On 15 November 2017 at 17:27, Esteban Lorenzano <esteba...@gmail.com> > wrote: > >> >> >> > On 15 Nov 2017, at 02:05, Ben Coman <b...@openinworld.com> wrote: >> > >> > What is the recommended way for a C basic type to be >> passed-by-reference to function wanting to use it for output. >> > For example 'width' & 'height' here in this library unction... >> > >> > int FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, >> > int page_index, >> > double* width, >> > double* height); >> > >> > void mytestGetPageSizeByIndex(doc) { >> > double width, height; >> > FPDF_GetPageSizeByIndex(doc, 0, &width, &height); >> > printf("width=%f, height=%f\n", width, height); >> > } >> > >> > gives... >> > width=200.000000, height=200.000000 >> > >> > >> > >> > In Pharo I'm trying... >> > >> > FFIOpaqueObject subclass: #FPDF_DOCUMENT >> > >> > FPDF_GetPageSizeByIndex__document: document >> > page_index: page_index >> > width: width >> > height: height >> > ^self ffiCall: #(int FPDF_GetPageSizeByIndex( >> > FPDF_DOCUMENT *document, >> > int page_index, >> > FFIFloat64 * width, >> > FFIFloat64 * height)) >> > >> > >> > testGetPageSizeByIndex >> > | document page_index width height result| >> > PDFium FPDF_InitLibrary. >> > document := PDFium FPDF_LoadDocument__file_path: helloPdf >> password: ''. >> > width := 0.0. >> > height := 0.0. >> > page_index := 0. "Its zero based" >> > result := PDFium FPDF_GetPageSizeByIndex__document: document >> > page_index: 0 >> > width: width >> > height: height. >> > PDFium FPDF_CloseDocument__document: document. >> > PDFium FPDF_DestroyLibrary. >> > self assert: document isNull not. "Document opened okay, and btw >> this works for a different pageCount test" >> > self assert: result > 0. "Non-zero for success. 0 for error >> (document or page not found)" >> > self halt. >> > >> > >> > and at the halt the Inspector shows... >> > result = 1 >> > width = 0.0 >> > height = 0.0 >> >> no, that will not work :) >> what you need to do here is to pass a “buffer” to contain the width and >> height: >> >> testGetPageSizeByIndex >> | document page_index widthBuffer heightBuffer width height >> result| >> PDFium FPDF_InitLibrary. >> document := PDFium FPDF_LoadDocument__file_path: helloPdf >> password: ''. >> widthBuffer := ByteArray new: (FFIFloat64 typeSize). >> heightBuffer := ByteArray new: (FFIFloat64 typeSize). >> > > Thanks Esteban. That worked. However I needed a minor tweak... > widthBuffer := ByteArray new: (FFIFloat64 new typeSize). > or... > widthBuffer := ByteArray new: (FFIFloat64 externalTypeSize). > > > Now it would be nice to do... > widthBuffer := FFIFloat64 newBuffer. > > > you know, I thought the same :) > but since I’m officially on holiday I didn’t do it (yet). > > If you want to add an issue and send a PR, it would be perfect :) > > > which could be implemented... > FFIExternalType class >> newBuffer. > ^ByteArray new: (self externalTypeSize) > > testGetPageSizeByIndex > | document page_index widthBuffer heightBuffer width height result| > PDFium FPDF_InitLibrary. > document := PDFium FPDF_LoadDocument__file_path: helloPdf > password: ''. > widthBuffer := FFIFloat64 buffer. > heightBuffer := FFIFloat64 buffer. > page_index := 0. "Its zero based" > result := PDFium FPDF_GetPageSizeByIndex__document: document > page_index: 0 > width: widthBuffer > height: heightBuffer. > width := widthBuffer doubleAt: 1. > height := heightBuffer doubleAt: 1. > > > > btw, a broader curiousity even though this is likely set in stone and not > even your personal choice - why "FFIFloat64" and not "FFIDouble" ? > widthBuffer := FFIDouble newBuffer. > would be a nice match to the callout declaration. > > > because the ABI defines float64 as the right name, heh. > and yes, it was not my personal choice ;) > > > Would it be overkill to have in Pharo an empty FFIDouble subclassed from > FFIFloat64 ? > the superclass being explicit about the format, while the subclass > provides a nice identifier for users? > > > maybe it is overkilling. Because also… where do you put the limit? > (doubles, floats, longs, etc… ?) > > Well, there are not so many... ?? cheers -ben