World: r3wp
[!REBOL3 Extensions] REBOL 3 Extensions discussions
older newer | first last |
Andreas 8-Nov-2010 [1558x3] | Yes, a bit. There may be a simpler way. Or we could bundle a few such helper functions into a support library (as Max did in his OpenGL work). |
Also note that this is not really comparable to using dlls with the /Library stuff in R2. | |
This facility simply did not exist in R2. On the other hand, /Library does not yet exist for R3 (but only because no one has written it yet). | |
Oldes 8-Nov-2010 [1561] | I know. This is a good start for me:) btw. is it possible to create extzlib.dll which would contain the zlib1.dll? I don't need it, just asking. |
Andreas 8-Nov-2010 [1562x4] | Yes and no. |
Yes, you can create an extension which contains the zlib library. | |
No, you can't do that from zlib1.dll, you'd have to use the zdll.lib in lib/. | |
You'd use gcc -DTO_WIN32 -I ../src/include -I include -mdll -o zlib.dll zlib.c lib/zdll.lib to statically link zlib into your extension (still called zlib.dll in the above). | |
Oldes 8-Nov-2010 [1566] | are you sure? with this version the zlib1.dll is still required |
Andreas 8-Nov-2010 [1567] | Hmm, then zdll.lib probably is an import dll. Let me check. |
jocko 8-Nov-2010 [1568] | developing an extension to wrap MagickWand is a huge work, because of the large number of functions, and data formats. It's better, in this case, to develop a full dedicated application in c, or, at least a dll with higher level functions ... wihch is approximately the case of ImageMagickObject. In other words, I am not convinced of the interest to program in Rebol if you want to use the full set of low level image processing functions. |
Maxim 8-Nov-2010 [1569] | yes, its VERY usefull... one doesn't want to have to compile applications and stuff... AFAIK there are binding to other languages which use the full IM suite. but yes its a lot of work. |
Andreas 8-Nov-2010 [1570] | (Yes, lib/zdll.lib seems to be an import library. So no static linking against it. Sorry for the confusion.) |
Oldes 8-Nov-2010 [1571x3] | Jocko, I don't think it's so much work. For example in R2 I use this: http://box.lebeda.ws/~hmm/rebol/im-min.r |
Of course, better to use REBOL script to make the C code. Btw. your version is not working here. I get this result: Error (null) (0x80040154) Error (null) (0x80040154) Error (null) (0x80040154) Error (null) (0x80040154) Error (null) (0x80040154) Error (null) (0x80040154) | |
Also is it possible to use your version to for example load TIFF image into REBOL? | |
jocko 8-Nov-2010 [1574] | Have you installed ImageMagick , and ImageMagickObject ? |
Oldes 8-Nov-2010 [1575] | I have ImageMagick instaled. If installing ImageMagickObject means: regsvr32 /c /s ImageMagickObject.dll than I have it as well. |
jocko 8-Nov-2010 [1576] | With this version, all the inputs and outputs are files. I'm waiting for more specs before loading directly into memory. It's possible to convert many file formats (including tiff) into may others. |
Oldes 8-Nov-2010 [1577x2] | hm.. but I don't see ImageMagickObject.dll in my Imagick folder. |
btw.. what is difference between simple CALL with args and using the ImageMagickObject? | |
jocko 8-Nov-2010 [1579x2] | could you check again the installation of ImageMagickObject by doing regsvr32 ImageMagickObject.dll (without /c and /s, you will have the messages indicating that everything is ok) |
That's also a question for me ... Part of the answer is that using it in a cpp exe will allow to execute these functions without te burden of executing a c process while masking the dos window (which is a huge challenge here, and I do'nt know why). In the case of Rebol, yes, the interest is not so evident. | |
Oldes 8-Nov-2010 [1581x2] | not found. So I don't have it. |
Andreas, so I must copy all series to REBOL's one as you did in the zlib example? I guess I will need to put images into REBOL in pure binaries at this moment, right? | |
jocko 8-Nov-2010 [1583] | Maxim, yes, I have seen bindings to other languages, but I am still not convinced that its much simpler than coding directly in C or C++ Oldes, I did not know im-min.r. It's a nice work. I have not enough experience in Extensions to do such work, as the input-output methods of R3 extensions are a little tricky. |
Maxim 8-Nov-2010 [1584x3] | the images are pointers, so the data doesn't need to be copied if you are just manipulating it. though it seems there was some image bugs in the A107 (not sure where) which AFAIK are fixed but not yet released in current host-kit (cyphre knows for sure). |
the images are pointers .... more precisely: R3 image! datatypes are pointers in the extension, so you can access them as arrays directly. | |
though it does require usually thread safety and might require GC protection depending on what you are doing. | |
Oldes 8-Nov-2010 [1587] | How to free the extension? |
Maxim 8-Nov-2010 [1588] | AFAIK we can't currently unload extensions. The extension interface actually is designed to support it, but right now, I think its never called and there is no way to trigger it from the REBOL code AFAIK. |
Oldes 8-Nov-2010 [1589x4] | What I'm doing wrong here: |
//I want: char **MagickQueryConfigureOptions(const char *pattern, unsigned long *number_options) //I have: unsigned long *number_options; char *item; char **list = MagickQueryConfigureOptions("*",number_options); REBSER *b = RL_MAKE_BLOCK(*number_options); RXA_SERIES(frm, 1) = b; RXA_INDEX(frm, 1) = 0; RXA_TYPE(frm, 1) = RXT_BLOCK; int i,j; for(i=0; i<*number_options; ++i) { item = list[i]; REBSER *s = RL_MAKE_STRING(strlen(item), 0); for (j = 0; j < strlen(item); ++j) RL_SET_CHAR(s, j, item[i]); RL_SET_VALUE(b, i, s, RXT_STRING); } | |
but with error: wand.c:81: error: incompatible type for argument 3 of indirect function call | |
where line 81 is: RL_SET_VALUE(b, i, s, RXT_STRING); | |
Maxim 8-Nov-2010 [1593x2] | you should be using RL_SET_CHAR for starters... |
oh sorry... you are ;-) | |
Oldes 8-Nov-2010 [1595] | it requires RXIARG but how to get it from the REBSER? |
Maxim 8-Nov-2010 [1596x9] | hehe I was going to say it required RXIARG. |
REBSER is a type of RXIARG, you build the RXIARG like so: | |
RXIARG arg; arg.addr = s; in the next host-kit version, Carl will be adding macros for this exact situation... an oversight of his. | |
note that when you provide the arg, you must then give it directly using: RL_SET_VALUE(b, i, arg, RXT_STRING); | |
this is what carl will be adding to the next host-kit.... //------------------ //- #RXV_xxx // // REBOL EXTENSION GET Macros // // provide direct RXIARG access macros // with these macros, the single argument should be an RXIARG * // // this is usefull when the RXIARG is NOT being used from an argument frame // but as a single value, like when we use RL_Get_Field() or RL_Get_Value() // // if the argument is dynamically allocated, ex: // RXIARG arg = OS_MAKE(sizeof(RXIARG)); // then use the macros like so: // RXV_WORD(*(arg)); //------------------ #define RXV_INT64(a) (a.int64) #define RXV_INT32(a) (i32)(a.int64) #define RXV_INTEGER(a) (a.int64) // maps to RXT_INTEGER #define RXV_DEC64(a) (a.dec64) #define RXV_DECIMAL(a) (a.dec64) // maps to RXT_DECIMAL #define RXV_LOGIC(a) (a.int32a) #define RXV_CHAR(a) (a.int32a) #define RXV_TIME(a) (a.int64) #define RXV_DATE(a) (a.int32a) #define RXV_WORD(a) (a.int32a) #define RXV_PAIR(a) (a.pair) #define RXV_TUPLE(a) (a.bytes) #define RXV_SERIES(a) (a.series) #define RXV_BLOCK(a) (a.series) #define RXV_INDEX(a) (a.index) #define RXV_OBJECT(a) (a.addr) #define RXV_MODULE(a) (a.addr) #define RXV_HANDLE(a) (a.addr) #define RXV_IMAGE(a) (a.image) #define RXV_GOB(a) (a.addr) | |
oh... sorry... posting this I just saw that the series don't use .addr but .series so you exxample would be: | |
//I want: char **MagickQueryConfigureOptions(const char *pattern, unsigned long *number_options) //I have: unsigned long *number_options; char *item; char **list = MagickQueryConfigureOptions("*",number_options); REBSER *b = RL_MAKE_BLOCK(*number_options); RXA_SERIES(frm, 1) = b; RXA_INDEX(frm, 1) = 0; RXA_TYPE(frm, 1) = RXT_BLOCK; int i,j; for(i=0; i<*number_options; ++i) { RXIARG arg; item = list[i]; REBSER *s = RL_MAKE_STRING(strlen(item), 0); for (j = 0; j < strlen(item); ++j) RL_SET_CHAR(s, j, item[i]); RL_SET_VALUE(b, i, arg, RXT_STRING); } | |
arrrhhh... sorry... darn CTRL-S got switched... | |
ignore above... not finished editing. | |
Andreas 8-Nov-2010 [1605] | Oldes, your number_options usage is wrong. |
Oldes 8-Nov-2010 [1606x2] | it works:) |
how? | |
older newer | first last |