| 00:40.00 | Notify | 03BRL-CAD:starseeker * 57409 NIL: Branch for experimenting with the popt option handling library. |
| 01:03.46 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 01:09.48 | Notify | 03BRL-CAD:starseeker * 57410 (brlcad/branches/popt/INSTALL brlcad/branches/popt/configure and 2 others): Integrate popt option handling library version 1.16 from http://rpm5.org/files/popt/ |
| 02:10.26 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 03:20.21 | brlcad | starseeker: depends on the walker, but I highly doubt it |
| 03:20.39 | brlcad | should be able to get a dp on the fly, lots of code does exactly that |
| 03:21.56 | brlcad | dp = DB_FULL_PATH_CUR_DIR(pathp); |
| 04:09.55 | Notify | 03BRL-CAD:phoenixyjll * 57411 brlcad/trunk/src/librt/comb/comb_brep.cpp: Check the db_i pointer. |
| 04:46.07 | Notify | 03BRL-CAD:phoenixyjll * 57412 (brlcad/trunk/src/librt/comb/comb_brep.cpp brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp): Some renaming - ip => dbip; brep_conversion => single_conversion |
| 05:02.26 | Notify | 03BRL-CAD:phoenixyjll * 57413 (brlcad/trunk/src/libged/brep.c brlcad/trunk/src/librt/comb/comb_brep.cpp brlcad/trunk/src/librt/primitives/brep/brep_debug.cpp): db => dbip, and mark const for some variables. |
| 05:54.03 | Notify | 03BRL-CAD:phoenixyjll * 57414 brlcad/trunk/src/libbrep/boolean.cpp: Check 3D distance (not included in ON_Brep::IsValid()) when looking for seam trims. |
| 06:26.33 | *** join/#brlcad d_rossberg (~rossberg@66-118-151-70.static.sagonet.net) | |
| 06:32.07 | *** join/#brlcad vladbogo (~vlad@188.25.239.225) | |
| 06:33.09 | Notify | 03BRL-CAD:phoenixyjll * 57415 brlcad/trunk/src/librt/comb/comb_brep.cpp: Perform Xform for the leaf. |
| 06:38.21 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 06:46.56 | *** join/#brlcad PrezKennedy (~DarkCalf@173.231.40.99) | |
| 07:54.12 | *** join/#brlcad Ch3ck_ (~Ch3ck@195.24.220.16) | |
| 08:12.59 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 08:13.22 | Ch3ck_ | brlcad: corrected the bn_poly_sub() uploaded patch. I've also finished with the interface. Submitted patch already awaiting review ;) |
| 08:59.20 | *** join/#brlcad caen23 (~caen23@92.83.184.3) | |
| 09:08.16 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 09:45.59 | Notify | 03BRL-CAD:phoenixyjll * 57416 brlcad/trunk/src/libbrep/boolean.cpp: Generate the connectivity graph for the new solid (after evaluation) |
| 09:48.35 | Notify | 03BRL-CAD Wiki:Phoenix * 6088 /wiki/User:Phoenix/GSoc2013/Reports: /* Week 12 */ |
| 10:02.50 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 10:40.22 | *** join/#brlcad Ch3ck_ (~Ch3ck@195.24.220.16) | |
| 10:40.54 | *** join/#brlcad witness__ (uid10044@gateway/web/irccloud.com/x-otrloazsutjbgdui) | |
| 11:27.26 | Notify | 03BRL-CAD:tbrowder2 * 57417 brlcad/trunk/doc/docbook/system/man3/en/CMakeLists.txt: remove 3rd party doc from our doc tree |
| 11:40.58 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 13:26.01 | *** join/#brlcad witness__ (uid10044@gateway/web/irccloud.com/x-aospgmtgctafjpdc) | |
| 14:15.12 | Notify | 03BRL-CAD:starseeker * 57418 NIL: Looks like we won't need this branch after all. |
| 14:29.29 | Notify | 03BRL-CAD:starseeker * 57419 brlcad/trunk/src/other/CMakeLists.txt: Add minimal file set from tclap 1.2.1 to support experiments in improvements to option parsing. There is a config.h file, so we may need to add CMake logic for a few system tests if long long and/or strstream detection prove necessary. |
| 15:21.56 | Notify | 03BRL-CAD:tbrowder2 * 57420 brlcad/trunk/src/util/dsp_add.c: add info; remove unneeded semicolon |
| 15:41.53 | Notify | 03BRL-CAD:tbrowder2 * 57421 brlcad/trunk/src/util/CMakeLists.txt: add copy of dsp_add.c for conversion to C++ and using tclap arg processing |
| 15:49.52 | Notify | 03BRL-CAD:tbrowder2 * 57422 brlcad/trunk/src/util/dsp_add_t.cpp: add casts to avoid invalid conversion errors |
| 15:54.35 | Notify | 03BRL-CAD:tbrowder2 * 57423 brlcad/trunk/src/util/dsp_add_t.cpp: add casts to avoid errors: deprecated conversion from string constant to 'char*'; last of C++ fixes for good build |
| 16:11.07 | Notify | 03BRL-CAD:tbrowder2 * 57424 brlcad/trunk/src/util/dsp_add_t.cpp: comment out tclap header due to problems with tclap config--needs work |
| 16:32.38 | brlcad | awesome: http://www.youtube.com/watch?v=CUx2ypHQJO0 |
| 16:35.46 | Ch3ck_ | brlcad: i've corrected the bn_poly_sub() patch |
| 16:39.03 | Notify | 03BRL-CAD:n_reed * 57425 brlcad/trunk/src/util/dsp_add_t.cpp: const param type should remove need to cast string literal arguments. Can skip printing both NULL and empty string args. Make exit behavior more consistent, using bu_exit where convienent. |
| 16:39.04 | brlcad | Ch3ck_: I know |
| 16:39.11 | brlcad | Ch3ck_: will be checking it later today |
| 16:39.24 | brlcad | what was the problem? |
| 16:44.59 | Ch3ck_ | well i gave wrong args |
| 16:45.03 | Ch3ck_ | like test values |
| 16:45.14 | Ch3ck_ | brlcad: i've also finished with the pull interface |
| 16:45.29 | brlcad | wrong args to what? |
| 16:45.38 | Ch3ck_ | i've created the documentation integrated the pull correctly; but pulls only combinations for now |
| 16:45.56 | Ch3ck_ | well I the values from octave were wrongly input |
| 16:46.19 | Ch3ck_ | so thats why the test kept coming up wrong |
| 16:46.24 | Ch3ck_ | it was my mistake there |
| 16:46.28 | brlcad | you mean the reference values? |
| 16:46.31 | Ch3ck_ | yes |
| 16:46.38 | Ch3ck_ | I mixed them up |
| 16:46.55 | brlcad | ok |
| 16:47.20 | Ch3ck_ | well finished with the documentation and apropos, synopsis of the pulll |
| 16:47.25 | Ch3ck_ | integrated patch already |
| 16:47.34 | Ch3ck_ | the patch is on sf |
| 16:47.59 | Ch3ck_ | Well concerning the my implementation of the pull_leaf routine since i'll have to support all primitives |
| 16:48.11 | Ch3ck_ | what approach will i need to implement all of them |
| 16:48.29 | Ch3ck_ | well posted a question on mailing list for the primitives i'll need some assistance with ;) |
| 16:49.05 | brlcad | okay sounds good, one step at a time |
| 16:49.31 | brlcad | the approach will probably be nearly identical for all of the primitives that have a V parameter |
| 16:49.49 | Ch3ck_ | yeah but there are some which do not have that i think |
| 16:49.58 | brlcad | it'll obviously be more tricky for the ones that don't |
| 16:50.06 | Ch3ck_ | yeah |
| 16:50.08 | brlcad | about a 1/3rd iirc |
| 16:50.26 | Ch3ck_ | well concerning my use of the switch is a bad design choice |
| 16:50.46 | brlcad | one possibility |
| 16:50.52 | Ch3ck_ | what's the best approach for implementing the pull leaf for each primitive |
| 16:51.08 | Ch3ck_ | should i implement functions corresponding to each routine |
| 16:51.09 | Ch3ck_ | ? |
| 16:51.14 | brlcad | the approach is going to involve defining a new callback interface |
| 16:51.20 | Ch3ck_ | ok |
| 16:51.24 | brlcad | a function that will apply to all primitives |
| 16:51.38 | Ch3ck_ | so how will it look like? |
| 16:51.52 | brlcad | it'll look however you make it look :) |
| 16:52.00 | brlcad | but it should look like the existing functions |
| 16:52.09 | brlcad | they all have a similar patter |
| 16:52.11 | brlcad | pattern |
| 16:52.25 | brlcad | stepping back though, there may be another way at least for traslation |
| 16:52.43 | Ch3ck_ | yeah |
| 16:52.58 | Ch3ck_ | thats mostly V param in almost all primitives |
| 16:53.19 | brlcad | no, you misunderstand |
| 16:53.24 | Ch3ck_ | what about building the 4x4 matrix transform like scale and rotation from the other aspects of the primitive |
| 16:54.08 | brlcad | every primitive already defines a bounding box function |
| 16:54.13 | Ch3ck_ | ok |
| 16:54.27 | brlcad | you could use that information to extract a translation, putting the center of the bounding box at the origin |
| 16:55.23 | Ch3ck_ | so how'll that look like? |
| 16:55.41 | brlcad | if starseeker got OOBB's working, you could even use that for rotation and scaling |
| 16:55.59 | Ch3ck_ | OOBB's? |
| 16:56.12 | Ch3ck_ | what's that? |
| 16:58.08 | brlcad | http://en.wikipedia.org/wiki/Bounding_volume |
| 16:58.16 | brlcad | object bounding boxes |
| 16:58.22 | brlcad | object-oriented |
| 16:58.25 | zero_level | waves to brlcad. |
| 16:58.39 | brlcad | hi zero_level, avail to resume |
| 16:59.35 | brlcad | Ch3ck_: the question is whether we want to unroll a translation based on a primitives "data origin" or it's "natural origin" |
| 16:59.41 | brlcad | they are two distinctly separate concepts |
| 16:59.52 | brlcad | take a simple box, for example, an RPP |
| 17:00.08 | brlcad | it's data origin is the first corner. that's "V". |
| 17:00.19 | zero_level | brlcad : do you have the link ? |
| 17:00.21 | brlcad | it's natural origin, however, is the boxes centerpoint |
| 17:00.54 | brlcad | that centerpoint is (length/2,width/2,height/2) |
| 17:00.59 | zero_level | http://paste.kde.org/p60667585/http://paste.kde.org/p60667585/ |
| 17:01.05 | zero_level | nevermind |
| 17:01.06 | zero_level | http://paste.kde.org/p60667585/ |
| 17:01.30 | brlcad | the bounding box method will find the natural centerpoint, what you were working on using V will find the data origin |
| 17:01.41 | brlcad | both are valid, but it's an interesting question |
| 17:01.53 | brlcad | zero_level: yep, I've had that window open for days |
| 17:02.15 | Ch3ck_ | is listening |
| 17:02.34 | brlcad | Ch3ck_: i'm done :) |
| 17:02.47 | Ch3ck_ | ok |
| 17:02.48 | brlcad | Ch3ck_: that's the point, that there are two possible "origins" |
| 17:03.02 | brlcad | implementing either will be a set of challenges |
| 17:03.10 | Ch3ck_ | ok |
| 17:03.42 | Ch3ck_ | so based on the OOBB I could get all the information about the primitive right? |
| 17:03.44 | brlcad | you can implement the "natural origin" using the existing bbox callback function now, and only need to do so once for all primitives (i.e., no need for per-primitive functions) |
| 17:04.04 | brlcad | our current bbox() function gives you an AABB, which is only useful for translation |
| 17:04.31 | brlcad | at this point, I think translation is probably all we need to try and encompass |
| 17:04.40 | Ch3ck_ | ok |
| 17:04.41 | brlcad | so you can just use the existing bbox() function |
| 17:04.43 | Ch3ck_ | will look into it |
| 17:04.48 | Ch3ck_ | ok |
| 17:04.51 | zero_level | alright. So the first point is simple discussion about log messages. |
| 17:05.10 | brlcad | Ch3ck_: I suggest writing a little test.c program that opens a .g, gets some geometry and calculates the bbox center |
| 17:05.36 | brlcad | zero_level: yep, do you have an example you can point me towards? |
| 17:05.57 | Ch3ck_ | will do |
| 17:05.58 | brlcad | that question as stated is unanswerable without more context |
| 17:06.25 | zero_level | brlcad : I revisited this issue and there are two types of log messages(large charecterization) |
| 17:06.34 | brlcad | what should be returned depends entirely on where you are in the code |
| 17:07.18 | zero_level | the examples are lying all in the code. |
| 17:07.25 | zero_level | but lets see specific |
| 17:07.31 | zero_level | libicv/crop.c |
| 17:07.32 | brlcad | ~dict lying |
| 17:08.12 | brlcad | okay, good example |
| 17:08.34 | brlcad | so our context is that we're in libicv |
| 17:08.37 | zero_level | l:52 |
| 17:08.38 | brlcad | which is a LIBRARY |
| 17:08.43 | zero_level | yes |
| 17:08.51 | brlcad | a library should never shut down an application |
| 17:09.20 | zero_level | do you recommend, it even when wrong arguments are passed. |
| 17:09.45 | brlcad | uhm, YES! |
| 17:09.48 | brlcad | think about it |
| 17:09.54 | zero_level | ok, |
| 17:09.55 | brlcad | you're using this library |
| 17:10.04 | brlcad | somehow a 0 is specified for a size |
| 17:10.11 | brlcad | and the APP terminates! |
| 17:10.21 | brlcad | i mean for our src/util programs, who cares |
| 17:10.49 | brlcad | but imagine if libicv were integrated into a different program, say Firefox or X11 |
| 17:11.04 | brlcad | would terminating the application make any sense?? |
| 17:11.09 | zero_level | ok. |
| 17:11.13 | zero_level | Got your point |
| 17:11.14 | brlcad | have to think bigger picture |
| 17:11.46 | zero_level | for eg. in libicv/filter.c |
| 17:11.53 | brlcad | now the only exception is when you have a check that is almost certainly an indication of corruption |
| 17:12.28 | brlcad | if you detect that something is horribly horribly wrong, something that should NEVER happen, then terminating can be the safest course of action |
| 17:12.40 | brlcad | but even for that, you wouldn't call bu_exit(), you'd call bu_bomb() |
| 17:13.06 | zero_level | ok. filter.c, l:250 I have returned NULL in case of error after bu_log. |
| 17:13.08 | zero_level | ok. |
| 17:13.15 | brlcad | also for logging, lets leave the function names out of the logging messages, nobody except the devs care ;) |
| 17:13.31 | zero_level | everywhere ? |
| 17:13.35 | zero_level | ok. |
| 17:13.42 | brlcad | I know you're probably just following the pattern elsewhere in our code, but it's something we're trying to get away from |
| 17:13.55 | brlcad | make the message something that makes sense to a user |
| 17:14.11 | brlcad | if it's a critical failure, start the message with "ERROR: " |
| 17:14.41 | zero_level | ok. With my experience I will classify the logging and errors as following. |
| 17:14.54 | zero_level | critical error : bu_bomb. |
| 17:15.34 | brlcad | there's a difference though |
| 17:15.35 | zero_level | marginal error return (-1) forint based and (NULL) for icv_image_t* based. |
| 17:15.39 | zero_level | and |
| 17:15.43 | brlcad | again bu_bomb() only if you detect CORRUPTION |
| 17:15.54 | brlcad | I don't think you have any corruption detection measures in place |
| 17:16.11 | brlcad | getting passed a NULL pointer or negative size is not a corruption |
| 17:16.12 | zero_level | for library based : with function name and error message. |
| 17:16.14 | brlcad | it's a bad application |
| 17:16.55 | zero_level | ok. |
| 17:17.41 | zero_level | so what do we conclude in issue 1 ? |
| 17:18.10 | brlcad | I don't think "marginal" is well defined |
| 17:18.22 | brlcad | it's a matter of inputs and outputs |
| 17:18.39 | brlcad | you need to make sure inputs are always what you expect them to be |
| 17:19.06 | brlcad | for example, icv_get_kernel() in filter.c doesn't check if kern or offset are NULL |
| 17:19.10 | zero_level | and if they are not? Do i bomb ? or pass a log message ? |
| 17:19.13 | brlcad | so it can (and eventually will) crash |
| 17:19.46 | brlcad | so what to do depends on expectation |
| 17:20.00 | brlcad | you marked it HIDDEN, so you control all the callers |
| 17:20.44 | brlcad | for that, any NULL parameter is a library bug because only the library can access that function |
| 17:21.14 | brlcad | if it were NOT hidden, you'd just print an ERROR and return a failure/null/empty/nothing |
| 17:21.18 | zero_level | yes because I call it only twice in the same file. and also the code structure maintains that the parameters are intact ? |
| 17:21.32 | zero_level | sure. |
| 17:21.34 | brlcad | since it is HIDDEN, you can decide but it should still check |
| 17:21.58 | zero_level | Then Let me write the conclusion of this discussion. |
| 17:22.47 | brlcad | long term, HIDDEN functions sometimes become non-HIDDEN, which is why *every* function should still always check the inputs are what are expected |
| 17:23.09 | brlcad | if you detect a NULL pointer and can make the callers behave reasonably, you should |
| 17:23.14 | brlcad | if you cannot, you can bomb |
| 17:23.19 | zero_level | 1) the parameters check should be done correctly. If this is a bad parameter (unexpected) use some default with error or pass error with bomb or error with null (-1) |
| 17:23.45 | zero_level | your point taken as 2) |
| 17:24.37 | zero_level | 3) Dont use function name for error messages. If it is strong error just write ERROR |
| 17:24.42 | zero_level | is anything left ? |
| 17:25.47 | zero_level | Moving to issue#2 |
| 17:25.51 | brlcad | check all parameters |
| 17:26.08 | brlcad | zero_level: hold on |
| 17:26.12 | zero_level | ok. |
| 17:26.41 | brlcad | so you also need some way to *detect* a bad parameter (beyond a NULL pointer) |
| 17:26.58 | brlcad | your icv_get_kernel() function is a prime example |
| 17:27.16 | zero_level | do you mean based on heights and sizes (as in icv_filter3(..) ) |
| 17:27.28 | zero_level | or based on size as in icv_crop in crop.c |
| 17:29.01 | brlcad | I don't understand, arent' those the same? |
| 17:29.35 | brlcad | icv_crop() has ton's of validation issues |
| 17:29.42 | brlcad | (because it has no validation) |
| 17:30.43 | brlcad | I can crash the program just by passing a NULL pointer or a negative value |
| 17:31.14 | zero_level | ok. So adding validation is the key here. |
| 17:31.27 | zero_level | because I understand it will make the library stable. |
| 17:31.45 | brlcad | all PUBLIC should validate ALL parameters before doing any work |
| 17:32.26 | zero_level | I think icv_crop is a best exammple to understand. |
| 17:32.27 | brlcad | you should also validate any combinations that are used that might result in a bad result, such as dividing by zero |
| 17:32.32 | zero_level | a) where to bomb. |
| 17:32.42 | zero_level | b) where to use default |
| 17:32.44 | brlcad | it's public API so it should not bomb |
| 17:32.55 | zero_level | c) where to use default value. |
| 17:33.02 | zero_level | ok. |
| 17:33.09 | zero_level | so a us out of question. |
| 17:33.16 | zero_level | c/us/is |
| 17:33.34 | brlcad | it should certainly report an error |
| 17:33.48 | brlcad | just not .. terminate the application |
| 17:33.49 | Notify | 03BRL-CAD:starseeker * 57426 NIL: Will probably be better to structure this with a subdirectory... |
| 17:33.55 | brlcad | let the app decide that |
| 17:34.31 | brlcad | the question is more interesting/harder for HIDDEN functions |
| 17:34.39 | brlcad | since you have more expections |
| 17:34.48 | brlcad | my point earlier is that you need to be able to detect when something is wrong |
| 17:35.02 | brlcad | so look at icv_get_kernel() |
| 17:35.20 | brlcad | just looking at that now, there's almost certainly a memory corruption (a segfault) |
| 17:35.40 | brlcad | and just checking if kern or offset are NULL would not detect it |
| 17:35.43 | Notify | 03BRL-CAD:starseeker * 57427 (brlcad/trunk/src/other/tclap/Arg.h =================================================================== and 695 others): Move the headers into the subdirectory |
| 17:36.12 | Notify | 03BRL-CAD:mohitdaga * 57428 brlcad/trunk/src/libicv/TODO: Add a TODO item for validation of input arguments. |
| 17:37.36 | brlcad | zero_level: so best starting point for now is probably baby steps .. go over EVERY function and make sure you test whether all your pointers are non-NULL and sizes are >0 where it makes sense, along with any other argument checks that make sense |
| 17:38.12 | brlcad | still before we move on, since I think I see a segfault ... you should see it too |
| 17:42.20 | zero_level | in ? |
| 17:56.05 | brlcad | icv_get_kernel |
| 17:56.49 | brlcad | this is exactly why it's good to always do data validation, even on hidden functions |
| 17:57.05 | brlcad | because bugs can be anywhere, will be everywhere, given enough time |
| 17:58.11 | brlcad | you have three arguments to icv_get_kernel(), you should be able to narrow it down to just one that has a bug (or prove me wrong) |
| 18:05.08 | zero_level | brlcad : I dont see any bug. |
| 18:05.16 | zero_level | Also bwfilter works fine. |
| 18:05.20 | zero_level | which uses icv_filter. |
| 18:05.50 | zero_level | the get_kernel is primarly made to service both icv_filter and icv_filter3 |
| 18:06.17 | zero_level | and kern has variable size. |
| 18:06.35 | zero_level | in both these functions. |
| 18:06.39 | brlcad | zero_level: you effectively already check filter_type with the switch statement |
| 18:06.44 | brlcad | and you have a default handler |
| 18:07.15 | brlcad | a program working is NEVER an indication of whether there is a bug or not, especially for segment violations |
| 18:07.23 | zero_level | ok. |
| 18:07.43 | zero_level | alright i see your point. |
| 18:07.45 | brlcad | rather a WORKING program is never an indication :) |
| 18:08.13 | brlcad | plenty of bugs can go masked indefinitely (for decades), but they're still real bugs |
| 18:08.21 | brlcad | so not filter_type |
| 18:08.59 | brlcad | offset is a pointer, you obviously don't check the value, but it's clearly only used as a pointer to a double (a single double value) |
| 18:09.21 | brlcad | looking at the two callers, you pass the address of a local variable |
| 18:09.37 | zero_level | yes. |
| 18:09.43 | zero_level | Is that a bad practice ? |
| 18:09.47 | brlcad | so if that's ever NULL, it would be an indication of stack corruption (something worthy of a bu_bomb) |
| 18:10.08 | brlcad | no, it's fine |
| 18:10.49 | brlcad | that leave us with good old 'kern' |
| 18:11.16 | brlcad | looking at icv_get_kernel(), it's being indexed as an array |
| 18:11.32 | brlcad | how big is it? |
| 18:15.22 | Notify | 03BRL-CAD:mohitdaga * 57429 brlcad/trunk/src/libicv/filter.c: If the filter specified is not present in the library, we should not consider filtering the image. Instead return with an error. |
| 18:17.31 | zero_level | it can be of two sizes for different function |
| 18:17.40 | zero_level | icv_filter (9) |
| 18:17.52 | zero_level | icv_filter3 (27) |
| 18:18.27 | zero_level | but although get kernel is designed as a temporary function which holds the library of filters. |
| 18:19.06 | Notify | 03BRL-CAD:starseeker * 57430 (brlcad/trunk/src/other/CMakeLists.txt brlcad/trunk/src/other/tclap/config.h.in and 5 others): Get dsp_add_t working for testing purposes - the util inclusions of tclap header directories will go away once libbu wraps it. |
| 18:19.11 | zero_level | In the later stages I plan to make a advanced get_kernel function which gives filters of a specified size. |
| 18:19.20 | zero_level | and type. |
| 18:19.35 | zero_level | will have to review his signal processing concepts here. |
| 18:20.03 | zero_level | and the fact we are dealing with double data. we could probably have some nice filtering reasults. |
| 18:20.35 | brlcad | slow down horsie |
| 18:20.46 | brlcad | it can be two sizes |
| 18:20.57 | brlcad | but those sizes are triggered by a type, not the function |
| 18:21.03 | zero_level | Indeed the icv_filter and icv_filter3 are designed such that they accept variable length filters. |
| 18:21.14 | zero_level | at present the size is fixed to default size. |
| 18:21.15 | brlcad | rather, the indexinging is triggered by a type, not the function |
| 18:21.36 | zero_level | brlcad : yes. |
| 18:21.58 | brlcad | and that type is passed through from public API |
| 18:22.10 | zero_level | right. |
| 18:22.19 | zero_level | is there an issue ? |
| 18:22.33 | brlcad | icv_filter(7, kern, &offset); |
| 18:23.07 | zero_level | ~dict horsie |
| 18:23.19 | brlcad | slow your horse down |
| 18:23.36 | zero_level | ;) |
| 18:23.44 | brlcad | means you're not paying attention closely enough, going to fast to see the problem |
| 18:24.25 | brlcad | if a user is specifying the type, and that type is unchecked, you have a potential segfault |
| 18:24.40 | brlcad | they might even be misusing the API |
| 18:24.49 | brlcad | icv_filter(ICV_FILTER_3_NULL, kern, &offset); |
| 18:25.25 | zero_level | brlcad : I see the point. |
| 18:25.40 | zero_level | But icv_filter just has two arguments. |
| 18:25.58 | brlcad | you obviously can add some stuff in icv_filter() and/or icv_filter3(), but ideally you ALSO add some sort of check/protection inside icv_get_kernel() |
| 18:26.15 | brlcad | and to do that, you need to know the size of kern since it's an array |
| 18:26.23 | zero_level | You are suggesting that some naughty guy can mix the two types of filters. |
| 18:26.32 | zero_level | we need to check that. |
| 18:26.40 | zero_level | you have a point here. |
| 18:26.44 | brlcad | not even necessarily naughty |
| 18:26.47 | brlcad | code changes over time |
| 18:27.03 | brlcad | but this is exactly where bugs evolve, how they usually begin |
| 18:27.04 | zero_level | brlcad++ |
| 18:27.43 | brlcad | another item ... a function should not start with icv_ unless it's public API documented in include/icv.h |
| 18:27.57 | brlcad | and public api should always have the prefix |
| 18:28.06 | brlcad | that way, it's very clear what it public API and what is not |
| 18:28.20 | Notify | 03BRL-CAD:mohitdaga * 57431 brlcad/trunk/src/libicv/filter.c: Remove debug flag. |
| 18:29.03 | zero_level | ok. |
| 18:30.00 | Notify | 03BRL-CAD:mohitdaga * 57432 brlcad/trunk/src/libicv/TODO: Add a TODO item to check for the mixup of two types of filters in filter.c |
| 18:30.40 | zero_level | brlcad : do we move to issue#2 ? |
| 18:30.49 | brlcad | bullet #2: you have have non-public, private API, that is not HIDDEN |
| 18:31.20 | brlcad | create a private header in src/libicv, #include "./yourheader.h", and use the functions |
| 18:32.42 | zero_level | I think i couldnt convey what i wanted to. |
| 18:32.55 | zero_level | did you see encoding.c ? |
| 18:33.07 | brlcad | yes? |
| 18:33.17 | zero_level | also bw.c ? |
| 18:33.38 | zero_level | ok, I see your point. |
| 18:33.56 | brlcad | yeah, technically what you did in bw.c is wrong |
| 18:34.09 | brlcad | invalid ... a little surprised the compiler didn't complain |
| 18:34.21 | zero_level | no! it works. |
| 18:34.30 | zero_level | but that is not the proof. |
| 18:34.33 | brlcad | it shouldn't .. what is an "extern static" ? |
| 18:34.43 | brlcad | the compiler is just defaulting to extern |
| 18:35.03 | brlcad | more than likely, you're getting lucky because gcc doesn't care |
| 18:36.11 | brlcad | the extern declaration says there will be a uchar2double() symbol later ... and the function is compiled static but it's symbol is getting included because nothing in encoding.c uses it (i.e., got lucky) |
| 18:36.30 | brlcad | the compiler has the option to not include a symbol marked as static |
| 18:36.56 | zero_level | ok. So other way as suggested by you is to keep them in encoding.h |
| 18:37.02 | brlcad | no |
| 18:37.04 | zero_level | and include encoding.h . |
| 18:37.20 | zero_level | I mean declare them in encoding.h . |
| 18:37.32 | brlcad | you DECLARE them in encoding.h, you'd remove HIDDEN from their definition in encoding.c |
| 18:37.46 | ``Erik | zero_level: filter.c:259 "return -1;" in a function returning a pointer? |
| 18:37.59 | Notify | 03BRL-CAD:mohitdaga * 57433 brlcad/trunk/src/libicv/filter.c: Change the name of icv_get_kernel -> get_kernel (private function) |
| 18:38.08 | brlcad | zero_level: BUT ... more to say on that |
| 18:38.14 | brlcad | these conversion functions seem wonky to me |
| 18:38.40 | brlcad | if you think of every function as being a plugin type, these are currently outliers |
| 18:38.44 | brlcad | ~dict outlier |
| 18:38.53 | Notify | 03BRL-CAD:mohitdaga * 57434 brlcad/trunk/src/libicv/filter.c: icv_filter3 returns a NULL. |
| 18:39.16 | zero_level | ``Erik r57434 solves that. |
| 18:39.24 | zero_level | thanks. |
| 18:40.21 | zero_level | brlcad : please suggest imporvements. |
| 18:41.08 | zero_level | I must confess, I am novice. |
| 18:42.12 | brlcad | well if we ignore the names for a second and look at what they're doing, the first is basically taking char data and scaling it into the "native library representation" |
| 18:42.48 | brlcad | the second is basically taking the "native library representation" and scaling it into char data |
| 18:43.00 | zero_level | ok. |
| 18:43.23 | brlcad | that gives me two thoughts |
| 18:43.54 | brlcad | 1) this either should be public API so format writers can use it, OR ... |
| 18:44.37 | brlcad | 2) it should live with (one or more) formats specific to their needs (e.g., bw_to_double) |
| 18:45.24 | brlcad | I have a new image file format, .awesome, and I'm writing a libicv plug-in extension |
| 18:46.12 | brlcad | I need to convert my image.awesome into libicv representation, so I will need to define a function that does exactly that |
| 18:47.51 | zero_level | Alright : Will make them public. |
| 18:48.24 | brlcad | are you understanding or just taking the easy route? |
| 18:48.46 | zero_level | In case you have such awesome thing in place. Consider telling to zero_level. He will include in icv |
| 18:48.50 | zero_level | ;) |
| 18:49.04 | zero_level | yes. got your point. |
| 18:49.23 | Notify | 03BRL-CAD:starseeker * 57435 brlcad/trunk/src/conv/step/g-step/ON_Brep.cpp: Testing with simple planar breps seems to suggest that this flag needs to be reversed... |
| 18:49.51 | zero_level | But my thought was because we plan to put the formats in icv. in GSOC and after that. So I thought we might not need them. |
| 18:50.08 | brlcad | it's not as simple as putting icv_ on them though |
| 18:50.15 | brlcad | they are out of place as they are currently defined |
| 18:50.35 | zero_level | Never thought that some other might create "xyz" format and want to use our lib. |
| 18:50.46 | brlcad | e.g., why uchar2double and DATA2uchar? shouldn't that be either uchar2data or double2uchar? |
| 18:51.07 | zero_level | but now want to consider that point. |
| 18:51.32 | brlcad | and if you're going to have uchar, what about char, short, ushort, long, unlong, long long, ulong long, ... |
| 18:51.43 | brlcad | raises questions as API |
| 18:52.53 | zero_level | actually never thought of making them public.And wanted to make as the need arises in png. |
| 18:52.59 | zero_level | or any other formats. |
| 18:53.11 | brlcad | but my point is are they really limited to just one type (e.g., bw) |
| 18:53.44 | zero_level | Which indeed brings us to the other point. Do we need to make them public ? |
| 18:54.15 | brlcad | exactly, it depends |
| 18:54.45 | brlcad | datawise pix is bw*3, but just because it happens to work with the same function doesn't mean that it needs to be public API |
| 18:54.54 | brlcad | it's still an encoding/decoding operation for bw and pix respectively |
| 18:55.06 | brlcad | zero_level: so here's my biggest concern |
| 18:55.12 | brlcad | modularity |
| 18:55.47 | brlcad | I think whatever we end up with, a file format should be defined by one or more files in a directory that are independent |
| 18:56.15 | brlcad | and as an author, it becomes *very* easy to see how the library is extended for a different format |
| 18:56.29 | brlcad | whether that author is you or me or someone external |
| 18:56.48 | brlcad | given enough time, all code becomes code someone else wrote :) |
| 18:59.27 | zero_level | I think i agree. |
| 18:59.54 | zero_level | lets make those notations in doxygen commants in encoding.c |
| 19:00.09 | zero_level | about which functions will work in which fileformat. |
| 19:00.35 | brlcad | zero_level: grep -E '(if|while|for|switch|return)\(' * |
| 19:00.52 | brlcad | style errors |
| 19:01.42 | zero_level | thanks for pointing that out. |
| 19:02.12 | zero_level | adding that to TODO. |
| 19:02.22 | zero_level | I will finish all the work in TODO. |
| 19:02.24 | zero_level | :) |
| 19:03.58 | brlcad | it might turn out that encoding.c can go away |
| 19:04.15 | brlcad | that it'd become just an encoding function in bw |
| 19:04.26 | brlcad | or part of bw_read()/bu_write() |
| 19:04.42 | brlcad | OR |
| 19:05.00 | brlcad | that it becomes part of ICV private API |
| 19:05.28 | brlcad | where functions are defined for converting from each of the intrinsic C types to libicv's native format |
| 19:05.50 | zero_level | alright. |
| 19:05.55 | brlcad | zero_level: another way to think of this ... lets say we want to change LIBICV to not use 0.0-1.0 doubles as the internal format |
| 19:06.10 | brlcad | consider what all would need to change |
| 19:06.26 | brlcad | we want to get that list of things that would need to change down to a bare minimum |
| 19:06.58 | brlcad | if you put bw into a subdir, I wouldn't want anything to change in that subdir if the internal format changed |
| 19:07.01 | Notify | 03BRL-CAD:mohitdaga * 57436 brlcad/trunk/src/libicv/TODO: Add TODO item for stylistic measures |
| 19:07.09 | brlcad | i.e., each type is not aware of the internal format |
| 19:07.19 | brlcad | should not be |
| 19:08.42 | zero_level | brlcad : I get your point. |
| 19:08.46 | brlcad | zero_level: while you're working on TODO items, icv.h could use some attention.. |
| 19:09.08 | brlcad | unclear why icv_rot() is the first thing we're introduced to :) |
| 19:09.53 | brlcad | towards modularity, need to think about how ICV_IMAGE_FORMAT can go away |
| 19:10.44 | brlcad | (if I need to add a new format, I should be able to define everything in one directory like src/libicv/ppm ... without needing to edit a header (i.e., could even be a runtime extension) |
| 19:12.05 | brlcad | zero_level: shall we move on to bullet #3? |
| 19:12.15 | zero_level | Support dynamically loading formats (e.g., define a plug-in API). ? |
| 19:12.24 | brlcad | absolutely |
| 19:12.26 | zero_level | brlcad : just a moment. |
| 19:12.33 | zero_level | ok . |
| 19:12.44 | brlcad | if that's what is required to think about modularity correctly |
| 19:12.54 | brlcad | whether it's actually dynamically loaded is irrelevant |
| 19:13.02 | brlcad | if it cannot be, it's not modular enough |
| 19:13.14 | zero_level | bullet#2 is easy now. |
| 19:13.34 | zero_level | c/2/3 |
| 19:13.48 | zero_level | Just a commen and y/n |
| 19:14.00 | zero_level | s/commen/comment |
| 19:15.25 | brlcad | well I question that function's existence as public API :) |
| 19:15.43 | brlcad | the naming convention is separate from the ICV_IMAGE_FORMAT names |
| 19:16.01 | brlcad | conceptually, it sounds like an icv_pix2bw() function |
| 19:16.16 | brlcad | with a scaling factor |
| 19:16.24 | zero_level | brlcad : do you mean icv_rgb2gray ? |
| 19:16.30 | brlcad | yes |
| 19:16.36 | zero_level | hahah :D |
| 19:16.57 | zero_level | your question is harsh. ;) |
| 19:17.06 | brlcad | I didn't ask a question yet ;) |
| 19:17.24 | brlcad | rather, I guess I did there at the beginning |
| 19:17.30 | zero_level | brlcad : This is needed because it can convert any rgb image into grayscale image. |
| 19:18.31 | brlcad | I think this is part of the disconnect, though |
| 19:18.33 | zero_level | Later color_space might contain icv_rgb2hsv or icv_rgb2ycbcr and.. |
| 19:18.54 | zero_level | any implied image loaded to icv container. |
| 19:19.07 | zero_level | s/question/questioning |
| 19:19.26 | brlcad | except that gray is not really a color space, is it? |
| 19:19.44 | zero_level | well it can be considered as pne. |
| 19:19.44 | brlcad | at least, how's it different from bw_write() |
| 19:19.55 | zero_level | it is. |
| 19:20.21 | zero_level | bw_write takes an icv_container and writes a file in bw format. |
| 19:21.02 | zero_level | icv_rgb2gray takes an icv container with color_channels 3 and converts that to gray scale image. |
| 19:21.27 | zero_level | that is gray scale icv cotnainer with color channel 1 |
| 19:21.51 | zero_level | so if you have an image with 3 container and you want to write bw format output. |
| 19:21.52 | brlcad | so they both take an icv_container |
| 19:21.58 | brlcad | and both write out 1 color channel |
| 19:22.00 | brlcad | what am I missing? |
| 19:22.10 | zero_level | icv_rgb2gray doesnt write. |
| 19:22.18 | zero_level | it converts and returns the container. |
| 19:22.45 | brlcad | besides the file operation is there a difference? |
| 19:22.56 | zero_level | yes. |
| 19:24.23 | zero_level | also, if you take a icv_container with rgb data and want to write a bw image. It will call icv_rgb2gray_ntsc(...) |
| 19:25.22 | zero_level | brlcad : I am able to explain ? |
| 19:30.18 | *** join/#brlcad caen23 (~caen23@92.81.191.54) | |
| 19:30.59 | brlcad | yes, but then does that need to be public API or is it private? |
| 19:31.20 | zero_level | PUBLIC. |
| 19:31.24 | brlcad | sounds like it might be private to me, just like the encoding |
| 19:31.56 | brlcad | something I'd use to implement a new format (like .jpeg) but not necessarily a new app (jpeg2pix) |
| 19:32.41 | zero_level | let me give you an example. |
| 19:33.00 | zero_level | Let suppose I built a tank in our cad-tool. |
| 19:33.20 | zero_level | But then my boss wanted me to get the resul in gray scale image. |
| 19:34.17 | zero_level | I have an option in future to make a specific flag which will convert the resultant image to gray scale. |
| 19:34.40 | zero_level | which can be written to any format. jpeg, bw,bmp, png. |
| 19:39.47 | brlcad | okay, that's convincing |
| 19:40.07 | brlcad | but then rgb2gray sounds like it may be too specific |
| 19:40.18 | brlcad | there are NxM possible conversions |
| 19:40.34 | brlcad | that specific one is more of a channel scaling function |
| 19:40.43 | brlcad | so perhaps it could be generalized as such |
| 19:40.45 | zero_level | but the point is what all we need. |
| 19:41.11 | zero_level | Implementation wise is not an issue. |
| 19:41.12 | brlcad | icv_channels(image, num_channels) |
| 19:41.50 | zero_level | No. |
| 19:42.11 | zero_level | because we are looking at color space changes. |
| 19:42.20 | brlcad | that sounds like a completely separate issue |
| 19:42.40 | zero_level | suppose tommorow I have something for an alpha channel . |
| 19:42.47 | brlcad | which is I think why rgb2gray seems overly confusing to me right now |
| 19:43.15 | zero_level | I cannot use icv_channels to magically change to 4 channel image. |
| 19:43.23 | brlcad | why not? |
| 19:43.32 | zero_level | brlcad : I can help you remove confusions. |
| 19:43.33 | brlcad | obviously not with those two simple arguments |
| 19:43.50 | zero_level | ok. |
| 19:44.03 | zero_level | where are u stuck ? |
| 19:44.12 | brlcad | I'm not stuck |
| 19:44.17 | zero_level | :D |
| 19:44.21 | brlcad | i'm saying that the name and scope is misleading |
| 19:45.08 | zero_level | scope I gave an example which you agreed to. |
| 19:45.16 | zero_level | name i am open to change. |
| 19:45.30 | brlcad | the name with that *scope* |
| 19:45.32 | zero_level | Because I am not good at naming things. :) |
| 19:45.34 | brlcad | mixing the notion of channels and color space information just sounds wrong |
| 19:45.42 | zero_level | ok. |
| 19:45.56 | brlcad | I agree that having a user tool want to output, say, a b&w png file would be useful |
| 19:46.06 | zero_level | are they mixed ? |
| 19:46.13 | brlcad | that in code would be a n-channel to 1-channel reduction |
| 19:46.21 | brlcad | well you're saying they are |
| 19:46.26 | brlcad | rgb2hsv |
| 19:46.34 | zero_level | ok. |
| 19:46.40 | zero_level | So that bothers you. |
| 19:46.57 | zero_level | Do you take gray scale as a color space ? |
| 19:47.07 | brlcad | from an API design, yeah it seems mixing two concepts in an inconsistent way |
| 19:47.30 | zero_level | If yes than forget channels. and lets use color spaces. |
| 19:47.40 | brlcad | I could have gray scale as one channel or three or N |
| 19:47.57 | brlcad | that's more a question of data replication |
| 19:48.00 | zero_level | ok. |
| 19:48.19 | zero_level | I see your point. |
| 19:48.35 | zero_level | I think I communicate very poorly. |
| 19:48.45 | zero_level | sorry for that. :) |
| 19:48.53 | brlcad | no, it's fine |
| 19:48.58 | brlcad | we're making progress |
| 19:49.09 | brlcad | only three of eight bullets, but progress ;) |
| 19:49.22 | brlcad | if you need to go, we can pick this up later |
| 19:50.29 | zero_level | brlcad : lets finish this point. |
| 19:50.38 | zero_level | I need to sleep. But can wait. |
| 19:50.51 | brlcad | there's plenty of time to sleep when you're dead ;) |
| 19:50.52 | zero_level | just ensuring that we dont need to start over. |
| 19:50.56 | brlcad | sure |
| 19:51.15 | zero_level | so yes. |
| 19:51.25 | brlcad | so datawise, there are two things happening as I understand it |
| 19:51.36 | zero_level | Let me explain regarding the two public funtions in color_space.c |
| 19:51.38 | brlcad | the icv representation has N channels representing an image, yes? |
| 19:51.43 | zero_level | yes. |
| 19:52.59 | zero_level | icv_gray2rgb : just copies the pixel 3 times and outputs a rgb image (supposedly we cannot convert gray image to rgb) |
| 19:53.49 | zero_level | icv_rgb2gray : combines the three channel image as per the weights specified and produces a gray space (1 channel image) |
| 19:53.55 | zero_level | is this fine ? |
| 19:53.59 | brlcad | sure |
| 19:54.08 | zero_level | now as per the question goes. |
| 19:54.45 | brlcad | data-wise, I think this gets at low-level ICV operations |
| 19:55.14 | zero_level | earlier icv_rgb2gray used another field which marked the presence of method. |
| 19:55.17 | brlcad | there are certain fundamental operations going on that I think can be fully generalized |
| 19:55.23 | zero_level | but later I made that a macro. |
| 19:56.22 | brlcad | sure |
| 19:56.44 | zero_level | generalized ? |
| 19:56.49 | brlcad | right |
| 19:56.57 | zero_level | where ? |
| 19:56.58 | brlcad | so it gets at the heart of what icv_rgb2gray() is doing |
| 19:57.02 | zero_level | can you point an example |
| 19:57.04 | brlcad | to the ICV data |
| 19:57.18 | brlcad | say I have an ICV image |
| 19:57.29 | zero_level | is listening |
| 19:57.33 | brlcad | lets fully ignore alpha channels for the sake of discussion |
| 19:58.15 | brlcad | that ICV data has some number of channels, say N |
| 19:58.29 | brlcad | data-wise and generalized, several operations come to mind |
| 19:58.40 | brlcad | want to delete a channel, for example, easy |
| 19:59.24 | brlcad | want to add a channel .. and when you add, a decision will need to follow -- is the added zero, 1's, a copy of an existing channel (perhaps scaled), an average (perhaps scaled) of multiple channels |
| 19:59.34 | brlcad | want to replicate data across channels |
| 20:00.00 | brlcad | icv_gray2rgb() is easily described in that context |
| 20:00.45 | zero_level | brlcad : you have a point about that. |
| 20:00.49 | brlcad | I think as an API, it would make perfect sense for ICV to define low-level operations like that |
| 20:01.06 | brlcad | upon which we can build higher level constructs (like awareness of ntsc) |
| 20:01.13 | zero_level | is lowlevel == hidden ? |
| 20:01.41 | brlcad | it's hidden in the sense that it's all contained within the icv struct |
| 20:01.55 | zero_level | hmm ? |
| 20:02.05 | brlcad | but you'd tell ICV to do those operation on a given image |
| 20:02.23 | brlcad | img = icv_create() or icv_open() right? |
| 20:02.33 | zero_level | yes |
| 20:03.29 | brlcad | say I have an application that creates a 1-channel image, then need to convert it to "rgb" 3-channel |
| 20:03.48 | brlcad | so I use the API to create two more channels, replicating the data from the first/initial channel |
| 20:04.33 | zero_level | brlcad : api wise we could do n number of things. |
| 20:04.56 | Notify | 03BRL-CAD:indianlarry * 57437 brlcad/branches/nurbs/src/librt/primitives/brep/brep.cpp: breakout UV interval min/max distance checks, add bailout when first order walk vector less than tol, misc debugging code still WIP |
| 20:05.04 | zero_level | but If i were me. I would ask does itmake sense to have a 2-channel image ? |
| 20:05.11 | zero_level | no! |
| 20:05.22 | zero_level | It makes sense for a 3 channel image. |
| 20:05.28 | brlcad | but it does generalize the notion of 3-channel, 4-channel, and 1-channel images |
| 20:05.44 | brlcad | who is to say that 3 channels are rgb data? |
| 20:05.59 | zero_level | see it will hardly take 20 mins implementing such an api. |
| 20:06.03 | brlcad | datawise, there's a scaling function that might indicate that, might not |
| 20:06.08 | zero_level | but do we really want thatn ? |
| 20:06.48 | brlcad | you're already implementing that, it's just whether you spend time to implement a subset of the NxM possibilities (of which you already have a half dozen?) |
| 20:07.06 | brlcad | or you implement the four needed to generalize it |
| 20:07.25 | zero_level | lets hold it for the moment. |
| 20:07.45 | zero_level | I think developing a full fledged icv is a long process. |
| 20:07.58 | brlcad | to me, that's more important than getting N formats integrated |
| 20:08.03 | zero_level | at least 10 weeks more after GSOC. |
| 20:08.19 | brlcad | I don't think it's anywhere near that much work -- you already have most of it done |
| 20:08.41 | zero_level | no. we can do a lot. |
| 20:08.43 | brlcad | the logic for averaging N channels is already there |
| 20:08.49 | zero_level | for instance the image formats. |
| 20:08.56 | zero_level | OpenXR integration. |
| 20:09.26 | zero_level | Then We are yet to modify rt to send double datat. |
| 20:10.03 | brlcad | that's all nice, but doesn't buy me anything |
| 20:10.23 | brlcad | getting a handle on what we already do in a more maintainable fashion buys me a LOT |
| 20:10.26 | brlcad | if i'm going to have to completely rewrite every format because the base representation changed, I've got a big problem |
| 20:11.39 | brlcad | having to unwire a hundred or 400 or 20 tools that were made to call icv_rgb2uchar() instead of icv_average()+icv_reduce() (just an example) |
| 20:12.00 | brlcad | especially once there are several other functions that are in exactly the same position |
| 20:12.41 | zero_level | well. lets do it case by case. |
| 20:14.20 | zero_level | can you point to any other usage of icv_reduce. |
| 20:14.41 | zero_level | because it just not make sense to generalize for the sake of using it once. |
| 20:14.50 | zero_level | or twice. |
| 20:15.12 | zero_level | ^does |
| 20:15.37 | brlcad | I think we already have a case with rgb2gray as it 1) assumes a three-channel image represents red green and blue pixel data, 2) assumes I want a 1-channel result, 3) introduces colorspaces names that overlap somewhat with file format names |
| 20:16.46 | zero_level | ? |
| 20:16.50 | zero_level | so ? |
| 20:16.52 | brlcad | I think icv_rgb2gray_ntsc() and icv_rgb2gray_crt() belong up in application land, so you'd have N callers right there |
| 20:16.55 | zero_level | :) |
| 20:17.26 | zero_level | lets bring in more people. |
| 20:17.37 | zero_level | ``Erik : Are you available ? |
| 20:17.44 | brlcad | it took us how many hours just to get this far in understanding |
| 20:18.12 | zero_level | I think we are complicating a simple issue. |
| 20:18.24 | zero_level | And I am sorry for being reluctant |
| 20:18.28 | brlcad | I think you are making this sound a whole lot more complicated than it really is :) |
| 20:18.47 | brlcad | so lets put it on a back burner for later, there are other issues to address still |
| 20:18.50 | zero_level | ok. |
| 20:18.58 | zero_level | So what do we conclude ? |
| 20:19.01 | zero_level | :) |
| 20:19.19 | brlcad | put a note in TODO to review/evaluate how the API needs to accommodate channel and color space changes |
| 20:19.45 | zero_level | because I think on part of maintainability. |
| 20:20.10 | zero_level | the current structures gives us an edge. |
| 20:20.18 | zero_level | an the issue of generalization. |
| 20:20.19 | brlcad | I'm squarely concerned with maintainability |
| 20:20.42 | brlcad | that's why I'm for more generalization, not less, so that this will get used and not have longer term costs |
| 20:21.07 | zero_level | I dont think someonw will be interested to produce a 2 channel image ? :) |
| 20:21.11 | brlcad | don't care if there's a short term cost to make it slightly more general, even if it's only used in a couple places in our code if it means the concepts are trivial to understand |
| 20:21.41 | brlcad | like I said, the problem already exists with 1/3/4 channel images |
| 20:21.53 | brlcad | so 3 times however many conversion functions |
| 20:21.57 | brlcad | vs 4 functions |
| 20:22.03 | zero_level | and the problem is ? |
| 20:22.23 | brlcad | it only takes two conversion functions for it to be worthwhile to implement a generalization |
| 20:22.32 | brlcad | hsv+rgb, there ya go |
| 20:22.45 | brlcad | or hsv+gray |
| 20:23.33 | brlcad | zero_level: so part of the distinction here is a different perspective |
| 20:23.40 | brlcad | the tools in src/util are not just for image processing |
| 20:23.46 | brlcad | they're for *data* processing |
| 20:23.49 | brlcad | signals |
| 20:23.52 | brlcad | wavelengths |
| 20:24.06 | brlcad | that's why so many of them don't even care how many channels, they just take streams of bytes |
| 20:25.47 | brlcad | we have a multispectral library that lets us render images in practically any "color space segmentation", where it literally keeps track of an unlimited number of color "channels" for accurate spectral simulation |
| 20:25.49 | zero_level | is glad we are having this discussion |
| 20:26.18 | zero_level | ok. |
| 20:26.41 | brlcad | if you think of "red" and "green" and "blue" as being a range of wavelengths, it becomes clear that there are an infinite range of other possibilities that we could attach equipment and process |
| 20:27.19 | brlcad | image conversion is the simplest way to explain things, but it's all ultimately data drive by some (unknown) application |
| 20:27.45 | brlcad | I'd argue that ICV shouldn't be aware of "red" or "grayscale" |
| 20:28.07 | brlcad | it's merely aware of file formats and getting channel(s) of data into those formats |
| 20:28.48 | brlcad | that makes this an incredibly powerful library |
| 20:29.26 | brlcad | one that affects more than 100+ tools in BRL-CAD, some very well-suited for scientific computing |
| 20:29.40 | brlcad | is done :) |
| 20:31.31 | zero_level | brlcad : I see your point. |
| 20:31.47 | zero_level | thanks for your time. |
| 20:31.52 | brlcad | I lied saying I'm done -- one more point is just to say that I don't think this changes the SCOPE of ICV at all.. just the terminology used and how functions are grouped |
| 20:32.11 | zero_level | ok. |
| 20:32.18 | brlcad | still to the immediate timeframe, lets put bullet #3 on hold :) |
| 20:32.24 | brlcad | just a TODO to revisit |
| 20:32.26 | zero_level | ok. |
| 20:32.34 | zero_level | ok. |
| 20:32.49 | zero_level | wanders. |
| 20:33.57 | brlcad | zero_level: for your log when you return, icv_crop() looks just fine to me -- the docs are very clear on all those parameters. Might consider dropping the last two since that's really what icv_rect() does. |
| 20:34.35 | brlcad | zero_level: we can continue friday, but hopefully make some progress before then, no? |
| 20:34.42 | brlcad | or are you not working tomorrow? |
| 20:35.27 | zero_level | I am wrtting an exam tommorow (thursday). |
| 20:35.31 | brlcad | ah, okay |
| 20:35.35 | brlcad | have fun :) |
| 20:35.57 | brlcad | well, lets continue this discussion asynchronously |
| 20:35.57 | zero_level | yeah its related to organizational behaviour. |
| 20:36.11 | zero_level | so have learnt some lesson today. |
| 20:36.14 | brlcad | I'll reply to a few more and you can reply whenever you can -- I read the entire log |
| 20:36.32 | brlcad | and if we both happen to be on at the same time, we can get into detail |
| 20:36.39 | zero_level | alright. |
| 20:36.46 | zero_level | that is fine. |
| 20:36.51 | brlcad | i'll just prefix with zero_level: ;) |
| 20:38.41 | zero_level | also i have created a new paste forever. http://paste.kde.org/p38e0decb/ :) |
| 20:38.52 | brlcad | zero_level: #5 is more complicated than your understanding I think and gets at the heart of ICV's internal representation being double [0,1]. dpix is an arbitrary range of values (basically [-MAX_DOUBLE,MAX_DOUBLE] possibilities, some range therein) |
| 20:40.17 | brlcad | zero_level: for #5, ICV's internal representation will either need to change or become "lossy" when dealing with our own dpix format (and possibly openexr's format) -- if it's fully encapsulated, it shouldn't matter if it changes ;) |
| 20:41.07 | brlcad | zero_level: #6 uhm, YES, heh.. |
| 20:44.48 | brlcad | zero_level: #7: not loving the flags. implies I will have icv images that are potentially invalid, which would be fragile API. I think the data should always be "sanitized", and that function (icv_sanitize) should be hidden as it's not an "operation" per se but backend cleanup if it's going to remain |
| 20:48.05 | brlcad | zero_level: #8 rot.c is a mess as just a copy of pixrot.c, but an API call to "rotate" data certainly sounds important/useful; data-wise that's right up there with scaling data, translating data, truncating, replicating, and interpolating |
| 21:12.39 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 21:12.47 | *** join/#brlcad mpictor (~mark@2601:d:b280:3d4:d63d:7eff:fe2d:2505) | |
| 22:10.43 | *** join/#brlcad FLOSSrookie (~brian@107-200-34-111.lightspeed.tulsok.sbcglobal.net) | |
| 22:24.19 | Notify | 03BRL-CAD:starseeker * 57438 brlcad/trunk/src/conv/step/g-step/ON_Brep.cpp: Take a stab at arc curve conversion. |
| 23:56.58 | mpictor | n_reed: mind taking a look at a parser problem in stepcode? |
| 23:57.41 | mpictor | If I run https://github.com/stepcode/stepcode/blob/mp/bound_spec_reorder/src/exppp/test/exppp_prob_func.exp through exppp, line 10 becomes "res := [lis[1],5];" |
| 23:59.36 | mpictor | I need the bound_spec parser rule to be chosen over the aggregate_initializer rule |