[haiku-development] Re: Vector Icons help...?

  • From: Stephan Assmus <superstippi@xxxxxx>
  • To: haiku-development@xxxxxxxxxxxxx
  • Date: Thu, 26 Nov 2009 09:48:41 +0100

On 2009-11-26 at 02:47:38 [+0100], pete.goodeve@xxxxxxxxxxxx wrote:
> On Wed, Nov 25, 2009 at 09:25:33AM +0100, Stephan Assmus wrote:
> > 
> > On 2009-11-25 at 08:22:01 [+0100], pete.goodeve@xxxxxxxxxxxx wrote:
> > > On Tue, Nov 24, 2009 at 04:40:30PM -0800, I wrote:
> > > > OK, I'm lost again... (:-/)
> > > >  [.....]
> > > 
> > > And now I'm even more baffled...  I just looked at Philippe's new 
> > > mods to midi_server, and he does almost *exactly* what I tried, 
> > > except that he is using GetVectorIcon locally (on the same rdef 
> > > data), and apparently it works just as I thought it would!
> > > 
> > > I suppose I did something stupid, but I checked that what I was 
> > > receiving in the message appeared to be correct.  I'll reinvestigate 
> > > tomorrow.
> 
> Well, as far as I can tell, I'm not being stupid... [just going slowly 
> crazy... (:-/]  I grabbed Philippe's vector-icon_modified midi_server 
> changeset and installed it.  It fails in (apparently) exactly the same 
> way!  It is unable to handle its own rdef data.  (I haven't yet added any 
> debug printout, but it doesn't supply *any* icon to PatchBay, presumably 
> because it can't convert the vector data to CMAP8 form.)
> 
> [The OS is alpha-1, and the source code I have installed should be about 
> equivalent.  (I can't be more specific, because I downloaded the complete 
> archive version, and no-one can tell me where to find the revision number 
> in the hierarchy! (:-)  I searched for any possibly relevant changeset, 
> but didn't see one.]
> 
> > 
> > Hm. There is a Icon-O-Matic "native" document format, which is stored 
> > as flattened BMessage. However, this is not what the BIconUtils want. 
> > They want the "flat" HVIF icon data. Icon-O-Matic supports exporting 
> > that in various forms, but it's always the same data. I.e. "Source 
> > Code" writes the same data as "RDef" does, just with different syntax. 
> > So I am not sure what you did exactly, but if you exported RDef, I 
> > presume you put this in the application resources and load it like 
> > Philippe did in his recent commit. If you used the export Source Code 
> > method, then you just pass the C array to BIconUtils. If in doubt, just 
> > post your code snippet here. :-)
> 
> So I gather from what you're saying that the rdef data from I-O-M *is* a 
> flattened icon. And I am doing what I should.
> 
> Here's something of what I'm seeing:
> 
> // These are the PatchBay constants (with additions) const char* 
> LARGE_ICON_NAME = "be:large_icon";
> const char* MINI_ICON_NAME = "be:mini_icon";
> const char* VECTOR_ICON_NAME = "be:vector_icon";    // for now... const 
> uint32 LARGE_ICON_TYPE = 'ICON';
> const uint32 MINI_ICON_TYPE = 'MICN';
> const uint32 VECTOR_ICON_TYPE = 'VICN';
> extern const uint8 LARGE_ICON_SIZE = 32;
> extern const uint8 MINI_ICON_SIZE = 16;
> extern const icon_size DISPLAY_ICON_SIZE = B_LARGE_ICON; extern const 
> color_space ICON_COLOR_SPACE = B_CMAP8; const color_space 
> VECTOR_ICON_COLOR_SPACE = B_RGBA32;
> 
> ..........
> 
> // Here's the code that's failing -- gets the msg from the endpoint. 
> static BBitmap* CreateIcon(const BMessage* msg, icon_size which) {
>     float iconSize;
>     uint32 iconType;
>     const char* iconName;
> 
>     const void* data;
>     ssize_t size;
>     BBitmap* bitmap = NULL;
>     printf("CreateIcon entered\n");
>     msg->PrintToStream();
> 
> #ifdef __HAIKU__
>     iconSize = LARGE_ICON_SIZE;
>     if (msg->FindData(VECTOR_ICON_NAME, VECTOR_ICON_TYPE, &data, &size) 
>     == B_OK) {
>         printf("Got vector data size %ld\n", size);
>         for (int ix=0; ix < 10; ix++) printf("%x ", ((const 
>         uint8*)data)[ix]); printf("\n");
>         BRect r(0, 0, iconSize-1, iconSize-1);
>         bitmap = new BBitmap(r, VECTOR_ICON_COLOR_SPACE);
>         if (BIconUtils::GetVectorIcon((const uint8*)data, size, bitmap) 
>         == B_OK) {
>             printf("Created bitmap\n");
>             return bitmap;
>         }
>         else delete bitmap;
>     }
> #endif
>     
> .....
> }
> 
> ====================================
> 
> Output from PatchBay in Terminal:
> 
> CreateIcon entered
> BMessage(0x0) {
>         be:large_icon = (type = 'ICON')(size = 1024)
>         be:mini_icon = (type = 'MICN')(size = 256)
>         be:vector_icon = (type = 'VICN')(size = 663)
> }
> Got vector data size 663
> 6e 63 69 66 9 5 1 2 0 16 
> FlatIconImporter::_ParseSections() - error parsing styles: Out of memory 
> MessageImporter::Import() - error unflattening icon archive: Data is not 
> a message
> 
> In that printout, the values printed out for the rdef data are correct, 
> as is the size.  The "Out of memory" error doesn't appear if I use a 
> slightly different original icon, but "...not a message" always does.  (I 
> assume the Oom is bogus -- I looked at _ParseStyles, and it seems to 
> return that code when anything fails...)
> 
> Any ideas?

The FlatIconImporter is the one that should be used. MessageImporter should 
not be used, and the error is correct, the data is not a message (it's HVIF 
data). Apparently, the MessageImporter is used when the FlatIconImporter 
returns an error, but why that is, I cannot say at the moment. I thought 
the MessageImporter isn't even part of libicon.a, but part of I-O-M. Maybe 
I can have a look tonight.

Best regards,
-Stephan

Other related posts: