Ticket #8916: SDLsetupIcon.patch

File SDLsetupIcon.patch, 1.8 KB (added by SF/canavan, 16 years ago)

patch

  • sdl.cpp

    old new  
    276276}
    277277
    278278void OSystem_SDL::setupIcon() {
    279         int w, h, ncols, nbytes, i;
    280         unsigned int rgba[256], icon[32 * 32];
    281         unsigned char mask[32][4];
     279        int x, y, w, h, ncols, nbytes, i;
     280        unsigned int rgba[256];
     281        unsigned int *icon;
    282282
    283283        sscanf(scummvm_icon[0], "%d %d %d %d", &w, &h, &ncols, &nbytes);
    284         if ((w != 32) || (h != 32) || (ncols > 255) || (nbytes > 1)) {
     284        if ((w > 512) || (h > 512) || (ncols > 255) || (nbytes > 1)) {
    285285                warning("Could not load the icon (%d %d %d %d)", w, h, ncols, nbytes);
    286286                return;
    287287        }
     288        icon=(unsigned int*)malloc(w*h*sizeof(unsigned int));
     289        if (icon==NULL) {
     290                warning("Could not allocate the icon");
     291                return;
     292        }
     293
    288294        for (i = 0; i < ncols; i++) {
    289295                unsigned char code;
    290296                char color[32];
     
    304310
    305311                rgba[code] = col;
    306312        }
    307         memset(mask, 0, sizeof(mask));
    308         for (h = 0; h < 32; h++) {
    309                 const char *line = scummvm_icon[1 + ncols + h];
    310                 for (w = 0; w < 32; w++) {
    311                         icon[w + 32 * h] = rgba[(int)line[w]];
    312                         if (rgba[(int)line[w]] & 0xFF000000) {
    313                                 mask[h][w >> 3] |= 1 << (7 - (w & 0x07));
    314                         }
     313        for (y = 0; y < h; y++) {
     314                const char *line = scummvm_icon[1 + ncols + y];
     315                for (x = 0; x < w; x++) {
     316                        icon[x + w * y] = rgba[(int)line[x]];
    315317                }
    316318        }
    317319
    318         SDL_Surface *sdl_surf = SDL_CreateRGBSurfaceFrom(icon, 32, 32, 32, 32 * 4, 0xFF0000, 0x00FF00, 0x0000FF, 0xFF000000);
    319         SDL_WM_SetIcon(sdl_surf, (unsigned char *) mask);
     320        SDL_Surface *sdl_surf = SDL_CreateRGBSurfaceFrom(icon, w, h, 32, w * 4, 0xFF0000, 0x00FF00, 0x0000FF, 0xFF000000);
     321        if (NULL==(sdl_surf)) {
     322                warning("SDL_CreateRGBSurfaceFrom(icon) failed");
     323        }
     324        SDL_WM_SetIcon(sdl_surf, NULL);
    320325        SDL_FreeSurface(sdl_surf);
     326        free(icon);
    321327}
    322328
    323329OSystem::MutexRef OSystem_SDL::createMutex(void) {