Changeset 609 for trunk/src


Ignore:
Timestamp:
Aug 21, 1999, 9:10:59 PM (26 years ago)
Author:
sandervl
Message:

LoadBitmap changes

Location:
trunk/src/user32/new
Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/new/loadres.cpp

    r601 r609  
    1 /* $Id: loadres.cpp,v 1.7 1999-08-20 20:09:50 sandervl Exp $ */
     1/* $Id: loadres.cpp,v 1.8 1999-08-21 19:10:59 sandervl Exp $ */
    22
    33/*
     
    66 * Copyright 1998 Sander van Leeuwen
    77 *
     8 * Parts based on Wine code (objects\bitmap.c):
     9 *
     10 * Copyright 1993 Alexandre Julliard
     11 *           1998 Huw D M Davies
    812 *
    913 * Project Odin Software License can be found in LICENSE.TXT
     
    1519#include <heapstring.h>
    1620#include <oslibres.h>
     21#include <winconst.h>
     22#include <win\virtual.h>
     23#include "dib.h"
    1724
    1825//******************************************************************************
     
    159166//******************************************************************************
    160167//******************************************************************************
     168BOOL IsSystemBitmap(ULONG *id)
     169{
     170   switch(*id)
     171   {
     172        case OBM_UPARROW_W:
     173        case OBM_DNARROW_W:
     174        case OBM_RGARROW_W:
     175        case OBM_LFARROW_W:
     176        case OBM_RESTORE_W:
     177        case OBM_RESTORED_W:
     178        case OBM_UPARROWD_W:
     179        case OBM_DNARROWD_W:
     180        case OBM_RGARROWD_W:
     181        case OBM_LFARROWD_W:
     182        case OBM_OLD_UPARROW_W:
     183        case OBM_OLD_DNARROW_W:
     184        case OBM_OLD_RGARROW_W:
     185        case OBM_OLD_LFARROW_W:
     186        case OBM_CHECK_W:
     187        case OBM_CHECKBOXES_W:
     188        case OBM_BTNCORNERS_W:
     189        case OBM_COMBO_W:
     190        case OBM_REDUCE_W:
     191        case OBM_REDUCED_W:
     192        case OBM_ZOOM_W:
     193        case OBM_ZOOMD_W:
     194        case OBM_SIZE_W:
     195        case OBM_CLOSE_W:
     196        case OBM_MNARROW_W:
     197        case OBM_UPARROWI_W:
     198        case OBM_DNARROWI_W:
     199        case OBM_RGARROWI_W:
     200        case OBM_LFARROWI_W:
     201                return TRUE;
     202
     203        //TODO: Not supported by Open32. Replacement may not be accurate
     204        case OBM_OLD_CLOSE_W:
     205                *id = OBM_CLOSE_W;
     206                return TRUE;
     207
     208        case OBM_BTSIZE_W:
     209                *id = OBM_SIZE_W;
     210                return TRUE;
     211
     212        case OBM_OLD_REDUCE_W:
     213                *id = OBM_REDUCE_W;
     214                return TRUE;
     215
     216        case OBM_OLD_ZOOM_W:
     217                *id = OBM_ZOOM_W;
     218                return TRUE;
     219
     220        case OBM_OLD_RESTORE_W:
     221                *id = OBM_RESTORE_W;
     222                return TRUE;
     223
     224        default:
     225                return FALSE;
     226   }
     227}
     228//******************************************************************************
     229//******************************************************************************
     230HANDLE LoadBitmapA(HINSTANCE hinst, LPCSTR lpszName, int cxDesired, int cyDesired,
     231                   UINT fuLoad)
     232{
     233    HBITMAP hbitmap = 0;
     234    HDC hdc;
     235    HRSRC hRsrc;
     236    HGLOBAL handle;
     237    char *ptr = NULL;
     238    BITMAPINFO *info, *fix_info=NULL;
     239    HGLOBAL hFix;
     240    int size;
     241
     242    if (!(fuLoad & LR_LOADFROMFILE)) {
     243      if (!(hRsrc = FindResourceA( hinst, lpszName, RT_BITMAPA ))) return 0;
     244      if (!(handle = LoadResource( hinst, hRsrc ))) return 0;
     245
     246      if ((info = (BITMAPINFO *)LockResource( handle )) == NULL) return 0;
     247    }
     248    else
     249    {
     250        if (!(ptr = (char *)VIRTUAL_MapFileA( lpszName ))) return 0;
     251        info = (BITMAPINFO *)(ptr + sizeof(BITMAPFILEHEADER));
     252    }
     253
     254    //TODO: This has to be removed once pe2lx stores win32 resources!!!
     255    if (info->bmiHeader.biSize != sizeof(BITMAPCOREHEADER) &&
     256        info->bmiHeader.biSize != sizeof(BITMAPINFOHEADER))
     257    {//assume it contains a file header first
     258        info = (BITMAPINFO *)((char *)info + sizeof(BITMAPFILEHEADER));
     259    }
     260
     261    size = DIB_BitmapInfoSize(info, DIB_RGB_COLORS);
     262    if ((hFix = GlobalAlloc(0, size))) fix_info = (BITMAPINFO *)GlobalLock(hFix);
     263    if (fix_info) {
     264      BYTE pix;
     265
     266      memcpy(fix_info, info, size);
     267      pix = *((LPBYTE)info+DIB_BitmapInfoSize(info, DIB_RGB_COLORS));
     268      DIB_FixColorsToLoadflags(fix_info, fuLoad, pix);
     269      if ((hdc = GetDC(0)) != 0) {
     270        char *bits = (char *)info + size;
     271        if (fuLoad & LR_CREATEDIBSECTION) {
     272          DIBSECTION dib;
     273          hbitmap = CreateDIBSection(hdc, fix_info, DIB_RGB_COLORS, NULL, 0, 0);
     274          GetObjectA(hbitmap, sizeof(DIBSECTION), &dib);
     275          SetDIBits(hdc, hbitmap, 0, dib.dsBm.bmHeight, bits, info,
     276                    DIB_RGB_COLORS);
     277        }
     278        else {
     279          hbitmap = CreateDIBitmap( hdc, &fix_info->bmiHeader, CBM_INIT,
     280                                      bits, fix_info, DIB_RGB_COLORS );
     281        }
     282        ReleaseDC( 0, hdc );
     283      }
     284      GlobalUnlock(hFix);
     285      GlobalFree(hFix);
     286    }
     287    if (fuLoad & LR_LOADFROMFILE) UnmapViewOfFile( ptr );
     288    return hbitmap;
     289}
     290//******************************************************************************
     291//TODO: No support for RT_NEWBITMAP
     292//******************************************************************************
    161293HBITMAP WIN32API LoadBitmapA(HINSTANCE hinst, LPCSTR lpszBitmap)
    162294{
    163  HBITMAP rc;
    164 
    165   if(HIWORD(lpszBitmap) != 0)
    166   {     //convert string name identifier to numeric id
    167         dprintf(("lpszBitmap [%s]\n", lpszBitmap));
    168    
    169         lpszBitmap = (LPCSTR)ConvertNameId(hinst, (char *)lpszBitmap);
    170   }
    171   else  dprintf(("lpszBitmap %08xh\n", (int)lpszBitmap));
    172 
    173   rc = O32_LoadBitmap(hinst, lpszBitmap);
    174 
    175   dprintf(("LoadBitmapA returned %08xh\n", rc));
     295 HBITMAP hBitmap = 0;
     296
     297  if(IsSystemBitmap((ULONG *)&lpszBitmap)) {
     298        hBitmap = O32_LoadBitmap(hinst, lpszBitmap);
     299  }
     300  else {
     301        hBitmap = LoadBitmapA(hinst, lpszBitmap, 0, 0, 0);
     302  }
     303  dprintf(("LoadBitmapA returned %08xh\n", hBitmap));
    176304 
    177   return(rc);
    178 }
    179 //******************************************************************************
     305  return(hBitmap);
     306}
     307//******************************************************************************
     308//TODO: No support for RT_NEWBITMAP
    180309//******************************************************************************
    181310HBITMAP WIN32API LoadBitmapW(HINSTANCE hinst, LPCWSTR lpszBitmap)
    182311{
    183  char   *astring = NULL;
    184  HBITMAP rc;
    185 
    186     if(HIWORD(lpszBitmap) != 0) {//convert string name identifier to numeric id
    187          astring = UnicodeToAsciiString((LPWSTR)lpszBitmap);
    188          dprintf(("lpszBitmap %s\n", astring));
    189 
    190          lpszBitmap = (LPWSTR)ConvertNameId(hinst, (char *)astring);
    191     }
    192     else dprintf(("lpszBitmap %d\n", (int)lpszBitmap));
    193 
    194     rc = O32_LoadBitmap(hinst, (char *)lpszBitmap);
    195     if(astring)
    196         FreeAsciiString(astring);
    197 
    198     dprintf(("LoadBitmapW returned %d\n", rc));
    199     return(rc);
     312 HBITMAP hBitmap;
     313
     314  if(IsSystemBitmap((ULONG *)&lpszBitmap)) {
     315        hBitmap = O32_LoadBitmap(hinst, (LPCSTR)lpszBitmap);
     316  }
     317  else {
     318        if(HIWORD(lpszBitmap) != 0) {
     319                 lpszBitmap = (LPWSTR)UnicodeToAsciiString((LPWSTR)lpszBitmap);
     320        }
     321        hBitmap = LoadBitmapA(hinst, (LPSTR)lpszBitmap, 0, 0, 0);
     322  }
     323
     324  if(HIWORD(lpszBitmap) != 0)
     325        FreeAsciiString((LPSTR)lpszBitmap);
     326
     327  dprintf(("LoadBitmapW returned %08xh\n", hBitmap));
     328 
     329  return(hBitmap);
    200330}
    201331//******************************************************************************
     
    210340  dprintf(("LoadImageA NOT COMPLETE (%d,%d)\n", cxDesired, cyDesired));
    211341
     342  if (fuLoad & LR_DEFAULTSIZE) {
     343        if (uType == IMAGE_ICON) {
     344            if (!cxDesired) cxDesired = GetSystemMetrics(SM_CXICON);
     345            if (!cyDesired) cyDesired = GetSystemMetrics(SM_CYICON);
     346        }
     347        else if (uType == IMAGE_CURSOR) {
     348            if (!cxDesired) cxDesired = GetSystemMetrics(SM_CXCURSOR);
     349            if (!cyDesired) cyDesired = GetSystemMetrics(SM_CYCURSOR);
     350        }
     351  }
     352  if (fuLoad & LR_LOADFROMFILE) fuLoad &= ~LR_SHARED;
     353
    212354  switch(uType) {
    213355        case IMAGE_BITMAP:
    214                 hRet = (HANDLE)LoadBitmapA(hinst, lpszName);
     356                hRet = (HANDLE)LoadBitmapA(hinst, lpszName, cxDesired, cyDesired, fuLoad);
    215357                break;
    216358        case IMAGE_CURSOR:
     
    237379  dprintf(("LoadImageW NOT COMPLETE (%d,%d)\n", cxDesired, cyDesired));
    238380
     381  if (fuLoad & LR_DEFAULTSIZE) {
     382        if (uType == IMAGE_ICON) {
     383            if (!cxDesired) cxDesired = GetSystemMetrics(SM_CXICON);
     384            if (!cyDesired) cyDesired = GetSystemMetrics(SM_CYICON);
     385        }
     386        else if (uType == IMAGE_CURSOR) {
     387            if (!cxDesired) cxDesired = GetSystemMetrics(SM_CXCURSOR);
     388            if (!cyDesired) cyDesired = GetSystemMetrics(SM_CYCURSOR);
     389        }
     390  }
     391  if (fuLoad & LR_LOADFROMFILE) fuLoad &= ~LR_SHARED;
     392
    239393  switch(uType) {
    240394        case IMAGE_BITMAP:
  • trunk/src/user32/new/makefile

    r604 r609  
    1 # $Id: makefile,v 1.28 1999-08-21 12:29:31 sandervl Exp $
     1# $Id: makefile,v 1.29 1999-08-21 19:10:59 sandervl Exp $
    22
    33#
     
    3131        controls.obj button.obj static.obj scroll.obj listbox.obj \
    3232        combo.obj edit.obj clipboard.obj winicon.obj \
    33         oslibutil.obj oslibmsg.obj windlg.obj \
     33        oslibutil.obj oslibmsg.obj windlg.obj dib.obj \
    3434        winprop.obj wingdi.obj oslibgdi.obj winaccel.obj winscrollbar.obj \
    3535        nativerc.obj oslibres.obj
     
    5757            $(PDWIN32_INCLUDE)\winicon.h syscolor.h
    5858char.obj: char.cpp user32.h
    59 loadres.obj: loadres.cpp user32.h
     59loadres.obj: loadres.cpp user32.h dib.h
    6060icon.obj: icon.cpp $(PDWIN32_INCLUDE)\winicon.h
    6161winmenu.obj: winmenu.cpp user32.h $(PDWIN32_INCLUDE)\winres.h
     
    110110
    111111clipboard.obj:  clipboard.cpp
     112dib.obj:        dib.cpp dib.h
    112113
    113114clean:
Note: See TracChangeset for help on using the changeset viewer.