/* * DIB driver initialization and DC functions. * * Copyright 2011 Huw Davies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include #include "gdi_private.h" #include "dibdrv.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(dib); /*********************************************************************** * dibdrv_DeleteDC */ static BOOL CDECL dibdrv_DeleteDC( PHYSDEV dev ) { TRACE("(%p)\n", dev); return 0; } static void calc_shift_and_len(DWORD mask, int *shift, int *len) { int s, l; if(!mask) { *shift = *len = 0; return; } s = 0; while ((mask & 1) == 0) { mask >>= 1; s++; } l = 0; while ((mask & 1) == 1) { mask >>= 1; l++; } *shift = s; *len = l; } static void init_bit_fields(dib_info *dib, const DWORD *bit_fields) { dib->red_mask = bit_fields[0]; dib->green_mask = bit_fields[1]; dib->blue_mask = bit_fields[2]; calc_shift_and_len(dib->red_mask, &dib->red_shift, &dib->red_len); calc_shift_and_len(dib->green_mask, &dib->green_shift, &dib->green_len); calc_shift_and_len(dib->blue_mask, &dib->blue_shift, &dib->blue_len); } static BOOL init_dib(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit_fields, void *bits) { dib->bit_count = bi->biBitCount; dib->width = bi->biWidth; dib->height = bi->biHeight; dib->stride = ((dib->width * dib->bit_count + 31) >> 3) & ~3; dib->bits = bits; if(dib->height < 0) /* top-down */ { dib->height = -dib->height; } else /* bottom-up */ { /* bits always points to the top-left corner and the stride is -ve */ dib->bits = (BYTE*)dib->bits + (dib->height - 1) * dib->stride; dib->stride = -dib->stride; } dib->funcs = &funcs_null; switch(dib->bit_count) { case 32: if(bi->biCompression == BI_RGB) dib->funcs = &funcs_8888; else { init_bit_fields(dib, bit_fields); if(dib->red_mask == 0xff0000 && dib->green_mask == 0x00ff00 && dib->blue_mask == 0x0000ff) dib->funcs = &funcs_8888; else dib->funcs = &funcs_32; } break; default: TRACE("bpp %d not supported, will forward to graphics driver.\n", dib->bit_count); return FALSE; } return TRUE; } /*********************************************************************** * dibdrv_SelectBitmap */ static HBITMAP CDECL dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectBitmap ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); BITMAPOBJ *bmp = GDI_GetObjPtr( bitmap, OBJ_BITMAP ); TRACE("(%p, %p)\n", dev, bitmap); if (!bmp) return 0; assert(bmp->dib); pdev->defer = 0; if(!init_dib(&pdev->dib, &bmp->dib->dsBmih, bmp->dib->dsBitfields, bmp->dib->dsBm.bmBits)) pdev->defer |= DEFER_FORMAT; GDI_ReleaseObj( bitmap ); return next->funcs->pSelectBitmap( next, bitmap ); } /*********************************************************************** * dibdrv_SetROP2 */ static INT CDECL dibdrv_SetROP2( PHYSDEV dev, INT rop ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetROP2 ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); calc_and_xor_masks(rop, pdev->pen_color, &pdev->pen_and, &pdev->pen_xor); update_brush_rop(pdev, rop); return next->funcs->pSetROP2( next, rop ); } const DC_FUNCTIONS dib_driver = { NULL, /* pAbortDoc */ NULL, /* pAbortPath */ NULL, /* pAlphaBlend */ NULL, /* pAngleArc */ NULL, /* pArc */ NULL, /* pArcTo */ NULL, /* pBeginPath */ NULL, /* pChoosePixelFormat */ NULL, /* pChord */ NULL, /* pCloseFigure */ NULL, /* pCreateBitmap */ NULL, /* pCreateDC */ NULL, /* pCreateDIBSection */ NULL, /* pDeleteBitmap */ dibdrv_DeleteDC, /* pDeleteDC */ NULL, /* pDeleteObject */ NULL, /* pDescribePixelFormat */ NULL, /* pDeviceCapabilities */ NULL, /* pEllipse */ NULL, /* pEndDoc */ NULL, /* pEndPage */ NULL, /* pEndPath */ NULL, /* pEnumDeviceFonts */ NULL, /* pEnumICMProfiles */ NULL, /* pExcludeClipRect */ NULL, /* pExtDeviceMode */ NULL, /* pExtEscape */ NULL, /* pExtFloodFill */ NULL, /* pExtSelectClipRgn */ NULL, /* pExtTextOut */ NULL, /* pFillPath */ NULL, /* pFillRgn */ NULL, /* pFlattenPath */ NULL, /* pFrameRgn */ NULL, /* pGdiComment */ NULL, /* pGetBitmapBits */ NULL, /* pGetCharWidth */ NULL, /* pGetDIBits */ NULL, /* pGetDeviceCaps */ NULL, /* pGetDeviceGammaRamp */ NULL, /* pGetICMProfile */ NULL, /* pGetNearestColor */ NULL, /* pGetPixel */ NULL, /* pGetPixelFormat */ NULL, /* pGetSystemPaletteEntries */ NULL, /* pGetTextExtentExPoint */ NULL, /* pGetTextMetrics */ NULL, /* pIntersectClipRect */ NULL, /* pInvertRgn */ dibdrv_LineTo, /* pLineTo */ NULL, /* pModifyWorldTransform */ NULL, /* pMoveTo */ NULL, /* pOffsetClipRgn */ NULL, /* pOffsetViewportOrg */ NULL, /* pOffsetWindowOrg */ NULL, /* pPaintRgn */ dibdrv_PatBlt, /* pPatBlt */ NULL, /* pPie */ NULL, /* pPolyBezier */ NULL, /* pPolyBezierTo */ NULL, /* pPolyDraw */ NULL, /* pPolyPolygon */ NULL, /* pPolyPolyline */ NULL, /* pPolygon */ NULL, /* pPolyline */ NULL, /* pPolylineTo */ NULL, /* pRealizeDefaultPalette */ NULL, /* pRealizePalette */ NULL, /* pRectangle */ NULL, /* pResetDC */ NULL, /* pRestoreDC */ NULL, /* pRoundRect */ NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ dibdrv_SelectBitmap, /* pSelectBitmap */ dibdrv_SelectBrush, /* pSelectBrush */ NULL, /* pSelectClipPath */ NULL, /* pSelectFont */ NULL, /* pSelectPalette */ dibdrv_SelectPen, /* pSelectPen */ NULL, /* pSetArcDirection */ NULL, /* pSetBitmapBits */ NULL, /* pSetBkColor */ NULL, /* pSetBkMode */ dibdrv_SetDCBrushColor, /* pSetDCBrushColor */ dibdrv_SetDCPenColor, /* pSetDCPenColor */ NULL, /* pSetDIBColorTable */ NULL, /* pSetDIBits */ NULL, /* pSetDIBitsToDevice */ NULL, /* pSetDeviceClipping */ NULL, /* pSetDeviceGammaRamp */ NULL, /* pSetLayout */ NULL, /* pSetMapMode */ NULL, /* pSetMapperFlags */ NULL, /* pSetPixel */ NULL, /* pSetPixelFormat */ NULL, /* pSetPolyFillMode */ dibdrv_SetROP2, /* pSetROP2 */ NULL, /* pSetRelAbs */ NULL, /* pSetStretchBltMode */ NULL, /* pSetTextAlign */ NULL, /* pSetTextCharacterExtra */ NULL, /* pSetTextColor */ NULL, /* pSetTextJustification */ NULL, /* pSetViewportExt */ NULL, /* pSetViewportOrg */ NULL, /* pSetWindowExt */ NULL, /* pSetWindowOrg */ NULL, /* pSetWorldTransform */ NULL, /* pStartDoc */ NULL, /* pStartPage */ NULL, /* pStretchBlt */ NULL, /* pStretchDIBits */ NULL, /* pStrokeAndFillPath */ NULL, /* pStrokePath */ NULL, /* pSwapBuffers */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ NULL, /* pwglCopyContext */ NULL, /* pwglCreateContext */ NULL, /* pwglCreateContextAttribsARB */ NULL, /* pwglDeleteContext */ NULL, /* pwglGetProcAddress */ NULL, /* pwglGetPbufferDCARB */ NULL, /* pwglMakeCurrent */ NULL, /* pwglMakeContextCurrentARB */ NULL, /* pwglSetPixelFormatWINE */ NULL, /* pwglShareLists */ NULL, /* pwglUseFontBitmapsA */ NULL /* pwglUseFontBitmapsW */ };