Sounds good, I'm going to patch it in now and test. I'll try to get you
results as soon as I can. busy week already and it's only Monday.

Cheers,

~Andrew

On Mon, Feb 22, 2016 at 2:38 PM, Larry Gritz <[email protected]> wrote:

> I think that PR is against master, though if you download it as a patch I
> would expect it to be applicable to the head of 1.6.
>
> You should also be able to pull it into your master and then cherry-pick
> it into your 1.6 if that's easier for you to test.
>
> In any case, if it's approved, I will certainly merge it (or the
> equivalent) into both branches.
>
>
> On Feb 22, 2016, at 2:32 PM, Andrew Gartner <[email protected]>
> wrote:
>
> Thanks much Larry, I'll give it a whirl. just out of curiousity, is that
> commit for the 1.6 branch(es) or just master (which I guess is 1.7 at this
> point)? I haven't been following the tags super close. I can certainly make
> it work either way just wondered.
>
> Cheers,
>
> ~Andrew
>
> On Fri, Feb 19, 2016 at 10:26 PM, Larry Gritz <[email protected]> wrote:
>
>> OK, here is the proposed implementation:
>> https://github.com/OpenImageIO/oiio/pull/1362
>>
>>
>> On Feb 19, 2016, at 6:40 PM, Andrew Gartner <[email protected]>
>> wrote:
>>
>> Hmm, good point, forgot about this. uint8 would be weird default on the
>> python side.
>>
>> I like the oiio.FLOAT default idea better than the others as it will
>> probably be more obvious what happened in their code should they happen to
>> be using the read without supplying the format.
>>
>> It may break things but it breaks them the "least" in my opinion.
>> Requiring the argument for every call is probably better long term but
>> we're already changing behavior with supplying oiio.UNKNOWN so we should
>> probably confine the real changes to those folks as best we can.
>>
>> Just my two cents.
>>
>> TL;DR: I'd go with oiio.FLOAT as a default
>>
>> ~Andrew
>>
>> On Fri, Feb 19, 2016 at 4:52 PM, Larry Gritz <[email protected]> wrote:
>>
>>> OK, just one more wrinkle.
>>>
>>> For a script that passes no format at all, the default is/was UNKNOWN,
>>> but that changes behavior. Before, it would return an array based on
>>> spec.format (the "widest" format of the channels). But now, it means to
>>> return a uint8 blob of packed native data, which is "advanced usage" for
>>> sure, and possibly not a good default.
>>>
>>> I propose changing the parameter default to oiio.FLOAT, which gives a
>>> sensible behavior for apps as well as making it very likely that old apps
>>> will continue to work in some kind of sensible way.
>>>
>>> Another way to go is to require the argument to be passed. That will
>>> break old Python scripts, but will force everything to be explicit moving
>>> forward.
>>>
>>>
>>>
>>> On Feb 19, 2016, at 11:49 AM, Haarm-Pieter Duiker <
>>> [email protected]> wrote:
>>>
>>> Two thumbs up! (packed into one float thumbs up)
>>>
>>> HP
>>>
>>>
>>>
>>>
>>> On Fri, Feb 19, 2016 at 10:21 AM, Andrew Gartner <
>>> [email protected]> wrote:
>>>
>>>> Yep, I'm good with that.
>>>>
>>>> Thanks again for teasing this apart Larry/HP
>>>>
>>>> ~Andrew
>>>>
>>>> On Fri, Feb 19, 2016 at 10:09 AM, Larry Gritz <[email protected]>
>>>> wrote:
>>>>
>>>>> OK, that sounds reasonable. So we have:
>>>>>
>>>>> * If you ask for a specific type, convert and return an array of that
>>>>> type. If you ask for HALF, the half bit pattern gets returned in a uint16
>>>>> array, since there is no true half type.
>>>>>
>>>>> * If you ask for UNKNOWN (explicitly "give me raw data"), it returns
>>>>> an array of unsigned chars containing the raw data.
>>>>>
>>>>> Everybody can live with that?
>>>>>
>>>>>
>>>>> On Feb 19, 2016, at 8:08 AM, Haarm-Pieter Duiker <
>>>>> [email protected]> wrote:
>>>>>
>>>>> Of the options "pass half values disguised as an unsigned short
>>>>> array" feels the cleanest to me. You keep the right number of components 
>>>>> in
>>>>> the array, if you have any checks for that, and the data to be convert to
>>>>> halfs is already grouped appropriately.
>>>>>
>>>>> Converting to halfs is also a one line call to numpy:
>>>>> np.frombuffer(np.getbuffer(np.uint16(uint16Value)), dtype=np.float16)
>>>>> Ex.
>>>>> https://github.com/hpd/CLF/blob/master/python/aces/clf/Common.py#L92
>>>>>
>>>>> HP
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Thu, Feb 18, 2016 at 4:06 PM, Larry Gritz <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> In C++, asking for UNKNOWN just copies the native format data and
>>>>>> leaves it for you to sort out. But to C++, a buffer is a buffer, you're
>>>>>> passing it a void* in any case.
>>>>>>
>>>>>> In Python, it's dynamic typing, so read_image RETURNS an array, and
>>>>>> it has to be an array of some type. Which type?
>>>>>>
>>>>>> I think we all are coming to agree that if you ask for UNKNOWN,
>>>>>> probably the most analogous thing (to C++) is to return an unsigned char
>>>>>> array, filled with the raw data, and leave you to sort it out. That's as
>>>>>> close to "untyped raw buffer" as we can get.
>>>>>>
>>>>>> If you *ask* for HALF, it's nonsensical, because you can't make an
>>>>>> actual half array in Python. You could promote and convert it to float. 
>>>>>> Or
>>>>>> you could return raw values in unsigned char array (like if you'd passed
>>>>>> UNKNOWN). Or, yeah, another possibility is to pass half values disguised 
>>>>>> as
>>>>>> an unsigned short array?
>>>>>>
>>>>>> I'm not super fond of the last choice.
>>>>>>
>>>>>> Right now, we do something stupider than any of those -- which is to
>>>>>> pack raw half values into a buffer, but the buffer advertises itself as
>>>>>> being a float array. That clearly needs to change. It was never
>>>>>> intentional; I just never thought carefully about that case because I 
>>>>>> never
>>>>>> imagined anybody asking for a type that didn't exist in Python.
>>>>>>
>>>>>> So, current proposal on the table:
>>>>>>
>>>>>> * If you ask for a type that can be a valid Python array type,
>>>>>> convert and return an array of that type.
>>>>>>
>>>>>> * If you ask for UNKNOWN (explicitly "give me raw data") or HALF
>>>>>> (implicitly so, because it doesn't exist in Python), it returns an array 
>>>>>> of
>>>>>> unsigned chars containing the raw data.
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Feb 18, 2016, at 3:36 PM, Haarm-Pieter Duiker <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>> Returning a series of unsigned 16 bit ints for a call with the type
>>>>>> half feels like a nice middle ground. The consumer will have to know that
>>>>>> halfs aren't natively supported in Python, and how to convert from 
>>>>>> unsigned
>>>>>> short to half, but that doesn't feel like a large burden.
>>>>>>
>>>>>> I can't speak to the expected behavior of the UNKNOWN in Python. I
>>>>>> haven't used that path in Python or C++.
>>>>>>
>>>>>> HP
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Thu, Feb 18, 2016 at 1:23 PM, Larry Gritz <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>> I don't have especially strong feelings about this one way or the
>>>>>>> other.
>>>>>>>
>>>>>>> Just returning a raw data byte array matches the C++ behavior more
>>>>>>> closely, no argument there.
>>>>>>>
>>>>>>> On the "con" side, perhaps I was thinking of compatibility? We're
>>>>>>> really talking about changing the meaning of oiio.UNKNOWN from "use
>>>>>>> spec.format" to "return raw data", which differ in the case of mixed
>>>>>>> channel types.
>>>>>>>
>>>>>>> Are there Python programs out there that pass UNKNOWN (or pass
>>>>>>> nothing, defaulting to UNKNOWN) and rely on getting the right kind of 
>>>>>>> array
>>>>>>> back that matches spec.format?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Feb 18, 2016, at 12:58 PM, Andrew Gartner <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>> "Second, I could collapse 2a and 2b, and just say that if you ask
>>>>>>> for UNKNOWN, you get an array of uint8 back with the native raw data"
>>>>>>>
>>>>>>> Just out of curiosity, what are the drawbacks to doing this? I admit
>>>>>>> I like having some way of getting at the raw data at any time (hence my
>>>>>>> original method of exposing the native calls). That allowed me to check 
>>>>>>> my
>>>>>>> imagespec and regardless of whether I had a mixed format image or all 
>>>>>>> half
>>>>>>> data I could get everything in one read call. Granted I'm used to 
>>>>>>> keeping
>>>>>>> track of and manipulating the strides of those arrays in bytes just out 
>>>>>>> of
>>>>>>> old habit (and C++ usage) so maybe I'm the minority opinion.
>>>>>>>
>>>>>>> Even so, your current thinking still works if that's where the
>>>>>>> consensus is I'm happy to use it as such.
>>>>>>>
>>>>>>> Thanks again
>>>>>>>
>>>>>>> ~Andrew
>>>>>>>
>>>>>>> On Thu, Feb 18, 2016 at 12:21 PM, Larry Gritz <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> I think that the only format that we can encounter as pixel data,
>>>>>>>> which does not exist in Python arrays, is 'half'.
>>>>>>>>
>>>>>>>> So let me rephrase my current thinking:
>>>>>>>>
>>>>>>>> 1. If you ask for a specific type (except HALF), you'll get a
>>>>>>>> Python array of that type holding the converted values.
>>>>>>>>
>>>>>>>> 2. Otherwise (i.e., you ask for UNKNOWN or HALF), you will get the
>>>>>>>> native (raw) data.
>>>>>>>> (a) If all channels are the same data type and it's anything but
>>>>>>>> half, you'll get the data as a Python array of that type.
>>>>>>>> (b) Otherwise (half, or mixed channel types), you'll get the data
>>>>>>>> as a Python array of unsigned bytes.
>>>>>>>>
>>>>>>>> Note that (1) is the easy case to deal with: ask for the type you
>>>>>>>> want, let it do the conversion. If you go for option (2) by asking for
>>>>>>>> native data, you get a blob and it's up to you to figure out what to do
>>>>>>>> with it.
>>>>>>>>
>>>>>>>> There are two other choices we could make. I'm not inclined to at
>>>>>>>> the moment, but would be happy to do so if people think it's helpful.
>>>>>>>> First, if you ask for HALF, I could have it return float. Second, I 
>>>>>>>> could
>>>>>>>> collapse 2a and 2b, and just say that if you ask for UNKNOWN, you get 
>>>>>>>> an
>>>>>>>> array of uint8 back with the native raw data, even if it happened to 
>>>>>>>> be all
>>>>>>>> channels of the same type, a type that you could have made into a 
>>>>>>>> Python
>>>>>>>> array of the right type.
>>>>>>>>
>>>>>>>>
>>>>>>>> On Feb 17, 2016, at 11:16 PM, Haarm-Pieter Duiker <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>> Picking this up a little later in the day. Sorry about that. Adding
>>>>>>>> quotes from earlier in the thread just so it's clear what I'm 
>>>>>>>> responding to.
>>>>>>>>
>>>>>>>> The current status:
>>>>>>>> "
>>>>>>>> If you read_image(oiio.FLOAT) of a half image (on disk), you get
>>>>>>>> floats back?
>>>>>>>> "
>>>>>>>> Yes.
>>>>>>>>
>>>>>>>> "
>>>>>>>> But if you read_image(oiio.HALF) of a half image, you get what
>>>>>>>> appears to be an array of floats, but they are actually packed half 
>>>>>>>> values?
>>>>>>>> "
>>>>>>>> Yes.
>>>>>>>>
>>>>>>>> The proposal:
>>>>>>>> "
>>>>>>>> 1. If you ask for a (non-UNKNOWN) format that exists in Python, it
>>>>>>>> converts to and returns an array of that format.
>>>>>>>> "
>>>>>>>> This is the current behavior, no?
>>>>>>>>
>>>>>>>> "
>>>>>>>> 2. If you ask for UNKNOWN, or a format that doesn't exist, it
>>>>>>>> returns the raw data in an unsigned char array.
>>>>>>>> "
>>>>>>>> It feels like this is two proposals (Trying not to clash with your
>>>>>>>> earlier 2a and 2b):
>>>>>>>> 2c. If you ask for UNKNOWN, return raw data in an unsigned char
>>>>>>>> array
>>>>>>>> 2d. If you ask for a format that doesn't exist, return raw data in
>>>>>>>> an unsigned char array
>>>>>>>>
>>>>>>>> 2c. feels right. It should work for the case of typical RGB or RGBA
>>>>>>>> images but also for multi-layer EXRs. The consumer can convert the 
>>>>>>>> channels
>>>>>>>> to their intended types using methods from the ImageSpec. I'd suggest 
>>>>>>>> that
>>>>>>>> asking for UNKNOWN lead unequivocally to a raw unsigned char array.
>>>>>>>> Supporting the special cases described in the 2a and 2b listed earlier
>>>>>>>> would require additional logic on the consuming code side to account 
>>>>>>>> for
>>>>>>>> those cases. Feels like a recipe for lots of brittle special case 
>>>>>>>> logic.
>>>>>>>>
>>>>>>>> 2d. is less clear. How is the change in behavior from returning
>>>>>>>> real values for known types to returning raw char array data for 
>>>>>>>> unknown
>>>>>>>> types signaled to the consumer? Is this still something that 
>>>>>>>> programmers
>>>>>>>> have to just know a priori? How is this different from the current 
>>>>>>>> behavior?
>>>>>>>>
>>>>>>>> I suppose the list of types known to OIIO but not Python is finite
>>>>>>>> and likely to shrink over time. Having special cases like we have in 
>>>>>>>> that
>>>>>>>> example code, isn't such a big deal in the mean time, but then that's 
>>>>>>>> just
>>>>>>>> saying the the current behavior is fine.
>>>>>>>>
>>>>>>>> Hope that's helpful in some way. Aside from agreeing that adding an
>>>>>>>> UNKNOWN option is a good idea, we're still left without a good way to
>>>>>>>> consume half data without accounting for it explicitly.
>>>>>>>>
>>>>>>>> HP
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Wed, Feb 17, 2016 at 4:35 PM, Andrew Gartner <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> That would certainly take care of things for me. Hopefully not too
>>>>>>>>> much of an impact on others as well.
>>>>>>>>>
>>>>>>>>> ~Andrew
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Wed, Feb 17, 2016 at 4:20 PM, Larry Gritz <[email protected]>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> So I'm proposing:
>>>>>>>>>>
>>>>>>>>>> 1. If you ask for a (non-UNKNOWN) format that exists in Python,
>>>>>>>>>> it converts to and returns an array of that format.
>>>>>>>>>>
>>>>>>>>>> 2. If you ask for UNKNOWN, or a format that doesn't exist, it
>>>>>>>>>> returns the raw data in an unsigned char array.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> There is a variation:
>>>>>>>>>>
>>>>>>>>>> 2a. If you ask for UNKNOWN, and all channels are the same format
>>>>>>>>>> and it's a type that exists in Python, return that type.
>>>>>>>>>> 2b. If you ask for UNKNOWN and it's a "mixed type" file, or a
>>>>>>>>>> single type but one that doesn't exist in Python, or the type you 
>>>>>>>>>> ask for
>>>>>>>>>> doesn't exist in Python, return raw data packed into an unsigned 
>>>>>>>>>> char array.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Feb 17, 2016, at 4:10 PM, Andrew Gartner <
>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>
>>>>>>>>>> Yea the C++ implementation works well with oiio.UNKNOWN, I kinda
>>>>>>>>>> miss that in the python side to be honest. Right now it looks like 
>>>>>>>>>> things
>>>>>>>>>> revert back to spec.format if oiio.UNKNOWN is supplied to 
>>>>>>>>>> read_scanlines,
>>>>>>>>>> that can be problematic if you have multiple formats in a single 
>>>>>>>>>> image so
>>>>>>>>>> I've avoided it.
>>>>>>>>>>
>>>>>>>>>> @Larry, to you question about returning an unsigned char array, I
>>>>>>>>>> like the idea on principle in that it preserves the decoupling as 
>>>>>>>>>> you said.
>>>>>>>>>> I'm wondering if there would be any weirdness if you had to grab 
>>>>>>>>>> multiple
>>>>>>>>>> channels of an image that had different data types one of which isn't
>>>>>>>>>> representable in python? Would it default to just unsigned char yet 
>>>>>>>>>> again
>>>>>>>>>> in that case?
>>>>>>>>>>
>>>>>>>>>> @Haarm: interesting, I didn't realize they were
>>>>>>>>>> concatenated/packed like that! I just saw the 'f' in the python 
>>>>>>>>>> array and
>>>>>>>>>> assumed I was seeing promoted values :) I'm still scratching my head 
>>>>>>>>>> over
>>>>>>>>>> the multiple format reads though, same as for Larry's idea.
>>>>>>>>>>
>>>>>>>>>> Thanks for the replies, Cheers,
>>>>>>>>>>
>>>>>>>>>> ~Andrew
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Wed, Feb 17, 2016 at 3:49 PM, Haarm-Pieter Duiker <
>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>
>>>>>>>>>>> If you're up for using numpy, this will get you the half float
>>>>>>>>>>> values without too much extra work:
>>>>>>>>>>> oiioFloats = inputImage.read_image(oiio.HALF)
>>>>>>>>>>> oiioHalfs = np.frombuffer(np.getbuffer(np.float32(oiioFloats)),
>>>>>>>>>>> dtype=np.float16)
>>>>>>>>>>>
>>>>>>>>>>> One note, the current OIIO Python implementation doesn't promote
>>>>>>>>>>> the halfs to float on read. The 'float' values in the returned 
>>>>>>>>>>> buffer are
>>>>>>>>>>> actually each two concatenated half values, and the float buffer 
>>>>>>>>>>> will have
>>>>>>>>>>> half as many entries as you would expect.
>>>>>>>>>>>
>>>>>>>>>>> Example usage for reading here:
>>>>>>>>>>>
>>>>>>>>>>> https://github.com/hpd/CLF/blob/master/python/aces/filterImageWithCLF.py#L126
>>>>>>>>>>> and the reverse for writing:
>>>>>>>>>>>
>>>>>>>>>>> https://github.com/hpd/CLF/blob/master/python/aces/filterImageWithCLF.py#L193
>>>>>>>>>>>
>>>>>>>>>>> HP
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Wed, Feb 17, 2016 at 3:25 PM, Larry Gritz <[email protected]>
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> In C++, you can just call read_scanlines and pass
>>>>>>>>>>>> format=UNKNOWN to get back the raw data in its original format.
>>>>>>>>>>>>
>>>>>>>>>>>> The problem is that in Python, there is no 'half' so it's not
>>>>>>>>>>>> quite sure what to return.
>>>>>>>>>>>>
>>>>>>>>>>>> I kinda like the decoupling of the raw reads (read_native_*)
>>>>>>>>>>>> which are the part overloaded by the individual format readers, 
>>>>>>>>>>>> from the
>>>>>>>>>>>> app-callable read_*. So perhaps rather than exposing 
>>>>>>>>>>>> read_native_*, we
>>>>>>>>>>>> should just modify the Python bindings for read_* to notice that 
>>>>>>>>>>>> if the
>>>>>>>>>>>> native raw data is not a type representable in Python, to return 
>>>>>>>>>>>> it as an
>>>>>>>>>>>> unsigned character array?
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> > On Feb 17, 2016, at 2:55 PM, Andrew Gartner <
>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>> >
>>>>>>>>>>>> > Hey all,
>>>>>>>>>>>> >
>>>>>>>>>>>> > Apologies if this has come up before, but I'm curious if
>>>>>>>>>>>> anyone had considered exposing ImageInput.read_native_scanlines() 
>>>>>>>>>>>> on the
>>>>>>>>>>>> python side before. The reason I ask is mainly because the half 
>>>>>>>>>>>> datatype
>>>>>>>>>>>> doesn't exist in the native python array class which OIIO uses for 
>>>>>>>>>>>> python
>>>>>>>>>>>> reads. Currently the python array will punt and for anything to 
>>>>>>>>>>>> float
>>>>>>>>>>>> (which I'd rather avoid).
>>>>>>>>>>>> >
>>>>>>>>>>>> > I had put together an implementation in OIIO 1.5 that simply
>>>>>>>>>>>> took the pixel size as a parameter and exposed 
>>>>>>>>>>>> read_native_scanlines that
>>>>>>>>>>>> way and that allowed me to get the right data properly into either 
>>>>>>>>>>>> numpy or
>>>>>>>>>>>> a raw char python array. However, I'd rather not be forked off 
>>>>>>>>>>>> like that as
>>>>>>>>>>>> it's a headache trying to remain current with the mainline, plus 
>>>>>>>>>>>> others may
>>>>>>>>>>>> find it useful.
>>>>>>>>>>>> >
>>>>>>>>>>>> > Does anyone think exposing the function in general makes
>>>>>>>>>>>> sense? I'm happy to send the implementation if anyone cares to see 
>>>>>>>>>>>> it as
>>>>>>>>>>>> well.
>>>>>>>>>>>> >
>>>>>>>>>>>> > Cheers,
>>>>>>>>>>>> >
>>>>>>>>>>>> > ~Andrew
>>>>>>>>>>>> >
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> Larry Gritz
>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> Oiio-dev mailing list
>>>>>>>>>>>> [email protected]
>>>>>>>>>>>>
>>>>>>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> Oiio-dev mailing list
>>>>>>>>>>> [email protected]
>>>>>>>>>>>
>>>>>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Oiio-dev mailing list
>>>>>>>>>> [email protected]
>>>>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Larry Gritz
>>>>>>>>>> [email protected]
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Oiio-dev mailing list
>>>>>>>>>> [email protected]
>>>>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Oiio-dev mailing list
>>>>>>>>> [email protected]
>>>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>>>
>>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Oiio-dev mailing list
>>>>>>>> [email protected]
>>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Larry Gritz
>>>>>>>> [email protected]
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Oiio-dev mailing list
>>>>>>>> [email protected]
>>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>>
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Oiio-dev mailing list
>>>>>>> [email protected]
>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Larry Gritz
>>>>>>> [email protected]
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Oiio-dev mailing list
>>>>>>> [email protected]
>>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>>
>>>>>>>
>>>>>> _______________________________________________
>>>>>> Oiio-dev mailing list
>>>>>> [email protected]
>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Larry Gritz
>>>>>> [email protected]
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Oiio-dev mailing list
>>>>>> [email protected]
>>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>>
>>>>>>
>>>>> _______________________________________________
>>>>> Oiio-dev mailing list
>>>>> [email protected]
>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>
>>>>>
>>>>> --
>>>>> Larry Gritz
>>>>> [email protected]
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Oiio-dev mailing list
>>>>> [email protected]
>>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> Oiio-dev mailing list
>>>> [email protected]
>>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>>
>>>>
>>> _______________________________________________
>>> Oiio-dev mailing list
>>> [email protected]
>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>
>>>
>>> --
>>> Larry Gritz
>>> [email protected]
>>>
>>>
>>>
>>> _______________________________________________
>>> Oiio-dev mailing list
>>> [email protected]
>>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>>
>>>
>> _______________________________________________
>> Oiio-dev mailing list
>> [email protected]
>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>
>>
>> --
>> Larry Gritz
>> [email protected]
>>
>>
>>
>> _______________________________________________
>> Oiio-dev mailing list
>> [email protected]
>> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>>
>>
> _______________________________________________
> Oiio-dev mailing list
> [email protected]
> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>
>
> --
> Larry Gritz
> [email protected]
>
>
>
> _______________________________________________
> Oiio-dev mailing list
> [email protected]
> http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org
>
>
_______________________________________________
Oiio-dev mailing list
[email protected]
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org

Reply via email to