Ejemplo n.º 1
0
static void split_icons(raw_data_t *rd, icon_group_t *icog, int *nico)
{
    int cnt;
    int i;
    icon_t *ico;
    icon_t *list = NULL;
    icon_header_t *ih = (icon_header_t *)rd->data;
    int swap = 0;

    if(ih->type == 1)
        swap = 0;
    else if(BYTESWAP_WORD(ih->type) == 1)
        swap = 1;
    else
        yyerror("Icon resource data has invalid type id %d", ih->type);

    cnt = swap ? BYTESWAP_WORD(ih->count) : ih->count;
    for(i = 0; i < cnt; i++)
    {
        icon_dir_entry_t ide;
        BITMAPINFOHEADER info;
        memcpy(&ide, rd->data + sizeof(icon_header_t)
               + i*sizeof(icon_dir_entry_t), sizeof(ide));

        ico = new_icon();
        ico->id = alloc_icon_id(icog->lvc.language);
        ico->lvc = icog->lvc;
        if(swap)
        {
            ide.offset = BYTESWAP_DWORD(ide.offset);
            ide.ressize= BYTESWAP_DWORD(ide.ressize);
        }
        if(ide.offset > rd->size
                || ide.offset + ide.ressize > rd->size)
            yyerror("Icon resource data corrupt");
        ico->width = ide.width;
        ico->height = ide.height;
        ico->nclr = ide.nclr;
        ico->planes = swap ? BYTESWAP_WORD(ide.planes) : ide.planes;
        ico->bits = swap ? BYTESWAP_WORD(ide.bits) : ide.bits;
        memcpy(&info, rd->data + ide.offset, sizeof(info));
        convert_bitmap((char *) &info, 0);
        memcpy(rd->data + ide.offset, &info, sizeof(info));

        if(!ico->planes)
        {
            /* Argh! They did not fill out the resdir structure */
            /* The bitmap is in destination byteorder. We want native for our structures */
            switch(byteorder)
            {
#ifdef WORDS_BIGENDIAN
            case WRC_BO_LITTLE:
#else
            case WRC_BO_BIG:
#endif
                ico->planes = BYTESWAP_WORD(info.biPlanes);
                break;
            default:
                ico->planes = info.biPlanes;
            }
        }
        if(!ico->bits)
        {
            /* Argh! They did not fill out the resdir structure */
            /* The bitmap is in destination byteorder. We want native for our structures */
            switch(byteorder)
            {
#ifdef WORDS_BIGENDIAN
            case WRC_BO_LITTLE:
#else
            case WRC_BO_BIG:
#endif
                ico->bits = BYTESWAP_WORD(info.biBitCount);
                break;
            default:
                ico->bits = info.biBitCount;
            }
        }
        ico->data = new_raw_data();
        copy_raw_data(ico->data, rd, ide.offset, ide.ressize);
        if(!list)
        {
            list = ico;
        }
        else
        {
            ico->next = list;
            list->prev = ico;
            list = ico;
        }
    }
    icog->iconlist = list;
    *nico = cnt;
}
Ejemplo n.º 2
0
void
ObjectGroup::add_icon(const std::string& object, const std::string& icon_path) {
  ObjectIcon new_icon(object, icon_path);
  icons.push_back(new_icon);
}