return TRUE;
}
-static
-void
-SURFACE_vSetDefaultPalette(
- PSURFACE psurfBmp)
-{
- ULONG cBitsPixel = BitsPerFormat(psurfBmp->SurfObj.iBitmapFormat);
-
- /* Find a suitable palette for this bitmap
- * Increment internal objects share count
- * so we can call PALETTE_ShareUnlockPalette
- * or GDIOBJ_IncrementShareCount safely */
- switch(cBitsPixel)
- {
- case 1:
- psurfBmp->ppal = &gpalMono;
- GDIOBJ_IncrementShareCount(&gpalMono.BaseObject);
- break;
- case 4:
- case 8:
- psurfBmp->ppal = PALETTE_ShareLockPalette(StockObjects[DEFAULT_PALETTE]);
- break;
- case 15:
- psurfBmp->ppal = &gpalRGB555;
- GDIOBJ_IncrementShareCount(&gpalRGB555.BaseObject);
- break;
- case 16:
- psurfBmp->ppal = &gpalRGB565;
- GDIOBJ_IncrementShareCount(&gpalRGB565.BaseObject);
- break;
- case 24:
- case 32:
- psurfBmp->ppal = &gpalBGR;
- GDIOBJ_IncrementShareCount(&gpalBGR.BaseObject);
- break;
- default:
- DPRINT1("Could not determine palette for bit depth %u.\n", cBitsPixel);
- break;
- }
-}
PSURFACE
NTAPI
{
PSURFACE psurf;
SURFOBJ *pso;
-
+
+ /* Verify format */
+ if (iFormat < BMF_1BPP || iFormat > BMF_PNG)
+ {
+ DPRINT1("Invalid bitmap format: %ld\n", iFormat);
+ return NULL;
+ }
+
/* Allocate a SURFACE object */
psurf = (PSURFACE)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP);
pso->iType = iType;
pso->iUniq = InterlockedIncrement((PLONG)&giUniqueSurface);
- SURFACE_vSetDefaultPalette(psurf);
+ /* Assign a default palette amd increment its reference count */
+ psurf->ppal = appalSurfaceDefault[iFormat];
+ GDIOBJ_IncrementShareCount(&psurf->ppal->BaseObject);
}
return psurf;
cBitsPixel = gajBitsPerFormat[pso->iBitmapFormat];
/* Is a width in bytes given? */
- if (ulWidth)
- {
- /* Align the width (Windows compatibility) */
- ulWidth = ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 31) & ~31) >> 3;
- }
- else
+ if (!ulWidth)
{
/* Calculate width from the bitmap width in pixels */
- ulWidth = ((pso->sizlBitmap.cx * cBitsPixel + 31) & ~31) >> 3;
+ ulWidth = DIB_GetDIBWidthBytes(psurf->SurfObj.sizlBitmap.cx, cBitsPixel);
}
+ else
+ {
+ /* Align the width (windows compatibility, drivers expect that) */
+ ((((ulWidth << 3) / cBitsPixel) * cBitsPixel + 31) & ~31) >> 3;
+ }
+
/* Calculate the bitmap size in bytes */
pso->cjBits = ulWidth * pso->sizlBitmap.cy;
(fjBitmap & BMF_NOZEROINIT) ?
0 : FL_ZERO_MEMORY,
pso->cjBits, TAG_DIB);
-
+
/* Free the section already, but keep the mapping */
if (pvBits) EngFreeSectionMem(pvSection, NULL);
}