2 * DIB driver initialization and DC functions.
4 * Copyright 2011 Huw Davies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "gdi_private.h"
26 #include "wine/exception.h"
27 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(dib
);
31 static const DWORD bit_fields_888
[3] = {0xff0000, 0x00ff00, 0x0000ff};
32 static const DWORD bit_fields_555
[3] = {0x7c00, 0x03e0, 0x001f};
34 static void calc_shift_and_len(DWORD mask
, int *shift
, int *len
)
45 while ((mask
& 1) == 0)
51 while ((mask
& 1) == 1)
60 static void init_bit_fields(dib_info
*dib
, const DWORD
*bit_fields
)
62 dib
->red_mask
= bit_fields
[0];
63 dib
->green_mask
= bit_fields
[1];
64 dib
->blue_mask
= bit_fields
[2];
65 calc_shift_and_len(dib
->red_mask
, &dib
->red_shift
, &dib
->red_len
);
66 calc_shift_and_len(dib
->green_mask
, &dib
->green_shift
, &dib
->green_len
);
67 calc_shift_and_len(dib
->blue_mask
, &dib
->blue_shift
, &dib
->blue_len
);
70 static void init_dib_info(dib_info
*dib
, const BITMAPINFOHEADER
*bi
, const DWORD
*bit_fields
,
71 const RGBQUAD
*color_table
, void *bits
, enum dib_info_flags flags
)
73 dib
->bit_count
= bi
->biBitCount
;
74 dib
->width
= bi
->biWidth
;
75 dib
->height
= bi
->biHeight
;
76 dib
->compression
= bi
->biCompression
;
77 dib
->stride
= get_dib_stride( dib
->width
, dib
->bit_count
);
79 dib
->bits
.is_copy
= FALSE
;
80 dib
->bits
.free
= NULL
;
81 dib
->bits
.param
= NULL
;
83 if(dib
->height
< 0) /* top-down */
85 dib
->height
= -dib
->height
;
89 /* bits always points to the top-left corner and the stride is -ve */
90 dib
->bits
.ptr
= (BYTE
*)dib
->bits
.ptr
+ (dib
->height
- 1) * dib
->stride
;
91 dib
->stride
= -dib
->stride
;
94 dib
->funcs
= &funcs_null
;
96 switch(dib
->bit_count
)
99 if(bi
->biCompression
== BI_RGB
)
100 bit_fields
= bit_fields_888
;
102 init_bit_fields(dib
, bit_fields
);
104 if(dib
->red_mask
== 0xff0000 && dib
->green_mask
== 0x00ff00 && dib
->blue_mask
== 0x0000ff)
105 dib
->funcs
= &funcs_8888
;
107 dib
->funcs
= &funcs_32
;
111 dib
->funcs
= &funcs_24
;
115 if(bi
->biCompression
== BI_RGB
)
116 bit_fields
= bit_fields_555
;
118 init_bit_fields(dib
, bit_fields
);
120 if(dib
->red_mask
== 0x7c00 && dib
->green_mask
== 0x03e0 && dib
->blue_mask
== 0x001f)
121 dib
->funcs
= &funcs_555
;
123 dib
->funcs
= &funcs_16
;
127 dib
->funcs
= &funcs_8
;
131 dib
->funcs
= &funcs_4
;
135 dib
->funcs
= &funcs_1
;
139 if (color_table
&& bi
->biClrUsed
)
141 dib
->color_table
= color_table
;
142 dib
->color_table_size
= bi
->biClrUsed
;
144 else if (flags
& default_color_table
)
146 dib
->color_table
= get_default_color_table( dib
->bit_count
);
147 dib
->color_table_size
= dib
->color_table
? (1 << dib
->bit_count
) : 0;
151 dib
->color_table
= NULL
;
152 dib
->color_table_size
= 0;
156 void init_dib_info_from_bitmapinfo(dib_info
*dib
, const BITMAPINFO
*info
, void *bits
, enum dib_info_flags flags
)
158 init_dib_info( dib
, &info
->bmiHeader
, (const DWORD
*)info
->bmiColors
, info
->bmiColors
, bits
, flags
);
161 BOOL
init_dib_info_from_bitmapobj(dib_info
*dib
, BITMAPOBJ
*bmp
, enum dib_info_flags flags
)
167 get_ddb_bitmapinfo( bmp
, &info
);
168 if (!bmp
->bitmap
.bmBits
)
170 int width_bytes
= get_dib_stride( bmp
->bitmap
.bmWidth
, bmp
->bitmap
.bmBitsPixel
);
171 bmp
->bitmap
.bmBits
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
,
172 bmp
->bitmap
.bmHeight
* width_bytes
);
173 if (!bmp
->bitmap
.bmBits
) return FALSE
;
175 init_dib_info_from_bitmapinfo( dib
, &info
, bmp
->bitmap
.bmBits
, flags
);
177 else init_dib_info( dib
, &bmp
->dib
->dsBmih
, bmp
->dib
->dsBitfields
,
178 bmp
->color_table
, bmp
->dib
->dsBm
.bmBits
, flags
);
182 static void clear_dib_info(dib_info
*dib
)
184 dib
->color_table
= NULL
;
185 dib
->bits
.ptr
= NULL
;
186 dib
->bits
.free
= NULL
;
187 dib
->bits
.param
= NULL
;
190 /**********************************************************************
193 * Free the resources associated with a dib and optionally the bits
195 void free_dib_info(dib_info
*dib
)
197 if (dib
->bits
.free
) dib
->bits
.free( &dib
->bits
);
198 clear_dib_info( dib
);
201 void copy_dib_color_info(dib_info
*dst
, const dib_info
*src
)
203 dst
->bit_count
= src
->bit_count
;
204 dst
->red_mask
= src
->red_mask
;
205 dst
->green_mask
= src
->green_mask
;
206 dst
->blue_mask
= src
->blue_mask
;
207 dst
->red_len
= src
->red_len
;
208 dst
->green_len
= src
->green_len
;
209 dst
->blue_len
= src
->blue_len
;
210 dst
->red_shift
= src
->red_shift
;
211 dst
->green_shift
= src
->green_shift
;
212 dst
->blue_shift
= src
->blue_shift
;
213 dst
->funcs
= src
->funcs
;
214 dst
->color_table_size
= src
->color_table_size
;
215 dst
->color_table
= src
->color_table
;
218 DWORD
convert_bitmapinfo( const BITMAPINFO
*src_info
, void *src_bits
, struct bitblt_coords
*src
,
219 const BITMAPINFO
*dst_info
, void *dst_bits
, BOOL add_alpha
)
221 dib_info src_dib
, dst_dib
;
224 init_dib_info_from_bitmapinfo( &src_dib
, src_info
, src_bits
, default_color_table
);
225 init_dib_info_from_bitmapinfo( &dst_dib
, dst_info
, dst_bits
, default_color_table
);
229 dst_dib
.funcs
->convert_to( &dst_dib
, &src_dib
, &src
->visrect
);
234 WARN( "invalid bits pointer %p\n", src_bits
);
239 /* We shared the color tables, so there's no need to free the dib_infos here */
240 if(!ret
) return ERROR_BAD_FORMAT
;
242 /* update coordinates, the destination rectangle is always stored at 0,0 */
243 src
->x
-= src
->visrect
.left
;
244 src
->y
-= src
->visrect
.top
;
245 offset_rect( &src
->visrect
, -src
->visrect
.left
, -src
->visrect
.top
);
247 if (add_alpha
&& dst_dib
.funcs
== &funcs_8888
&& src_dib
.funcs
!= &funcs_8888
)
249 DWORD
*pixel
= dst_dib
.bits
.ptr
;
252 for (y
= src
->visrect
.top
; y
< src
->visrect
.bottom
; y
++, pixel
+= dst_dib
.stride
/ 4)
253 for (x
= src
->visrect
.left
; x
< src
->visrect
.right
; x
++)
254 pixel
[x
] |= 0xff000000;
257 return ERROR_SUCCESS
;
260 int get_clipped_rects( const dib_info
*dib
, const RECT
*rc
, HRGN clip
, struct clipped_rects
*clip_rects
)
262 const WINEREGION
*region
;
263 RECT rect
, *out
= clip_rects
->buffer
;
266 init_clipped_rects( clip_rects
);
270 rect
.right
= dib
->width
;
271 rect
.bottom
= dib
->height
;
272 if (rc
&& !intersect_rect( &rect
, &rect
, rc
)) return 0;
277 clip_rects
->count
= 1;
281 if (!(region
= get_wine_region( clip
))) return 0;
283 for (i
= 0; i
< region
->numRects
; i
++)
285 if (region
->rects
[i
].top
>= rect
.bottom
) break;
286 if (!intersect_rect( out
, &rect
, ®ion
->rects
[i
] )) continue;
288 if (out
== &clip_rects
->buffer
[sizeof(clip_rects
->buffer
) / sizeof(RECT
)])
290 clip_rects
->rects
= HeapAlloc( GetProcessHeap(), 0, region
->numRects
* sizeof(RECT
) );
291 if (!clip_rects
->rects
) return 0;
292 memcpy( clip_rects
->rects
, clip_rects
->buffer
, (out
- clip_rects
->buffer
) * sizeof(RECT
) );
293 out
= clip_rects
->rects
+ (out
- clip_rects
->buffer
);
296 release_wine_region( clip
);
297 clip_rects
->count
= out
- clip_rects
->rects
;
298 return clip_rects
->count
;
301 /**********************************************************************
304 static BOOL
dibdrv_CreateDC( PHYSDEV
*dev
, LPCWSTR driver
, LPCWSTR device
,
305 LPCWSTR output
, const DEVMODEW
*data
)
307 dibdrv_physdev
*pdev
= HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*pdev
) );
309 if (!pdev
) return FALSE
;
310 clear_dib_info(&pdev
->dib
);
311 clear_dib_info(&pdev
->brush
.dib
);
312 clear_dib_info(&pdev
->pen_brush
.dib
);
313 push_dc_driver( dev
, &pdev
->dev
, &dib_driver
);
317 /***********************************************************************
320 static BOOL
dibdrv_DeleteDC( PHYSDEV dev
)
322 dibdrv_physdev
*pdev
= get_dibdrv_pdev(dev
);
323 TRACE("(%p)\n", dev
);
324 free_pattern_brush( &pdev
->brush
);
325 free_pattern_brush( &pdev
->pen_brush
);
326 HeapFree( GetProcessHeap(), 0, pdev
);
330 /***********************************************************************
333 static BOOL
dibdrv_CopyBitmap( HBITMAP src
, HBITMAP dst
)
335 return nulldrv_CopyBitmap( src
, dst
);
338 /***********************************************************************
339 * dibdrv_DeleteBitmap
341 static BOOL
dibdrv_DeleteBitmap( HBITMAP bitmap
)
346 /***********************************************************************
347 * dibdrv_SelectBitmap
349 static HBITMAP
dibdrv_SelectBitmap( PHYSDEV dev
, HBITMAP bitmap
)
351 PHYSDEV next
= GET_NEXT_PHYSDEV( dev
, pSelectBitmap
);
352 dibdrv_physdev
*pdev
= get_dibdrv_pdev(dev
);
353 BITMAPOBJ
*bmp
= GDI_GetObjPtr( bitmap
, OBJ_BITMAP
);
356 TRACE("(%p, %p)\n", dev
, bitmap
);
360 if(!init_dib_info_from_bitmapobj(&dib
, bmp
, default_color_table
))
362 GDI_ReleaseObj( bitmap
);
366 GDI_ReleaseObj( bitmap
);
368 return next
->funcs
->pSelectBitmap( next
, bitmap
);
371 /***********************************************************************
372 * dibdrv_SetDeviceClipping
374 static void dibdrv_SetDeviceClipping( PHYSDEV dev
, HRGN rgn
)
376 PHYSDEV next
= GET_NEXT_PHYSDEV( dev
, pSetDeviceClipping
);
377 dibdrv_physdev
*pdev
= get_dibdrv_pdev(dev
);
378 TRACE("(%p, %p)\n", dev
, rgn
);
381 return next
->funcs
->pSetDeviceClipping( next
, rgn
);
384 /***********************************************************************
385 * dibdrv_SetDIBColorTable
387 static UINT
dibdrv_SetDIBColorTable( PHYSDEV dev
, UINT pos
, UINT count
, const RGBQUAD
*colors
)
389 PHYSDEV next
= GET_NEXT_PHYSDEV( dev
, pSetDIBColorTable
);
390 dibdrv_physdev
*pdev
= get_dibdrv_pdev(dev
);
391 TRACE("(%p, %d, %d, %p)\n", dev
, pos
, count
, colors
);
393 if (pdev
->dib
.color_table
) /* force re-creating the brush bits */
395 pdev
->brush
.rop
= -1;
396 pdev
->pen_brush
.rop
= -1;
399 return next
->funcs
->pSetDIBColorTable( next
, pos
, count
, colors
);
402 /***********************************************************************
403 * dibdrv_ChoosePixelFormat
405 static INT
dibdrv_ChoosePixelFormat( PHYSDEV dev
, const PIXELFORMATDESCRIPTOR
*pfd
)
407 FIXME( "Not supported on DIB section\n" );
411 /***********************************************************************
412 * dibdrv_DescribePixelFormat
414 static INT
dibdrv_DescribePixelFormat( PHYSDEV dev
, INT fmt
, UINT size
, PIXELFORMATDESCRIPTOR
*pfd
)
416 FIXME( "Not supported on DIB section\n" );
420 /***********************************************************************
421 * dibdrv_GetDeviceGammaRamp
423 static BOOL
dibdrv_GetDeviceGammaRamp( PHYSDEV dev
, void *ramp
)
425 SetLastError( ERROR_INVALID_PARAMETER
);
429 /***********************************************************************
430 * dibdrv_GetPixelFormat
432 static INT
dibdrv_GetPixelFormat( PHYSDEV dev
)
434 FIXME( "Not supported on DIB section\n" );
438 /***********************************************************************
439 * dibdrv_SetDeviceGammaRamp
441 static BOOL
dibdrv_SetDeviceGammaRamp( PHYSDEV dev
, void *ramp
)
443 SetLastError( ERROR_INVALID_PARAMETER
);
447 /***********************************************************************
448 * dibdrv_SetPixelFormat
450 static BOOL
dibdrv_SetPixelFormat( PHYSDEV dev
, INT fmt
, const PIXELFORMATDESCRIPTOR
*pfd
)
452 FIXME( "Not supported on DIB section\n" );
456 /***********************************************************************
459 static BOOL
dibdrv_SwapBuffers( PHYSDEV dev
)
461 FIXME( "Not supported on DIB section\n" );
465 /***********************************************************************
466 * dibdrv_wglCopyContext
468 static BOOL
dibdrv_wglCopyContext( HGLRC src
, HGLRC dst
, UINT mask
)
470 FIXME( "Not supported on DIB section\n" );
474 /***********************************************************************
475 * dibdrv_wglCreateContext
477 static HGLRC
dibdrv_wglCreateContext( PHYSDEV dev
)
479 FIXME( "Not supported on DIB section\n" );
483 /***********************************************************************
484 * dibdrv_wglCreateContextAttribsARB
486 static HGLRC
dibdrv_wglCreateContextAttribsARB( PHYSDEV dev
, HGLRC ctx
, const int *attribs
)
488 FIXME( "Not supported on DIB section\n" );
492 /***********************************************************************
493 * dibdrv_wglDeleteContext
495 static BOOL
dibdrv_wglDeleteContext( HGLRC ctx
)
497 FIXME( "Not supported on DIB section\n" );
501 /***********************************************************************
502 * dibdrv_wglGetPbufferDCARB
504 static HDC
dibdrv_wglGetPbufferDCARB( PHYSDEV dev
, void *buffer
)
506 FIXME( "Not supported on DIB section\n" );
510 /***********************************************************************
511 * dibdrv_wglGetProcAddress
513 static PROC
dibdrv_wglGetProcAddress( LPCSTR name
)
515 FIXME( "Not supported on DIB section\n" );
519 /***********************************************************************
520 * dibdrv_wglMakeContextCurrentARB
522 static BOOL
dibdrv_wglMakeContextCurrentARB( PHYSDEV draw_dev
, PHYSDEV read_dev
, HGLRC ctx
)
524 FIXME( "Not supported on DIB section\n" );
528 /***********************************************************************
529 * dibdrv_wglMakeCurrent
531 static BOOL
dibdrv_wglMakeCurrent( PHYSDEV dev
, HGLRC ctx
)
533 FIXME( "Not supported on DIB section\n" );
537 /***********************************************************************
538 * dibdrv_wglSetPixelFormatWINE
540 static BOOL
dibdrv_wglSetPixelFormatWINE( PHYSDEV dev
, INT fmt
, const PIXELFORMATDESCRIPTOR
*pfd
)
542 FIXME( "Not supported on DIB section\n" );
546 /***********************************************************************
547 * dibdrv_wglShareLists
549 static BOOL
dibdrv_wglShareLists( HGLRC ctx1
, HGLRC ctx2
)
551 FIXME( "Not supported on DIB section\n" );
555 /***********************************************************************
556 * dibdrv_wglUseFontBitmapsA
558 static BOOL
dibdrv_wglUseFontBitmapsA( PHYSDEV dev
, DWORD first
, DWORD count
, DWORD base
)
560 FIXME( "Not supported on DIB section\n" );
564 /***********************************************************************
565 * dibdrv_wglUseFontBitmapsW
567 static BOOL
dibdrv_wglUseFontBitmapsW( PHYSDEV dev
, DWORD first
, DWORD count
, DWORD base
)
569 FIXME( "Not supported on DIB section\n" );
573 const struct gdi_dc_funcs dib_driver
=
575 NULL
, /* pAbortDoc */
576 NULL
, /* pAbortPath */
577 dibdrv_AlphaBlend
, /* pAlphaBlend */
578 NULL
, /* pAngleArc */
579 dibdrv_Arc
, /* pArc */
580 dibdrv_ArcTo
, /* pArcTo */
581 NULL
, /* pBeginPath */
582 dibdrv_BlendImage
, /* pBlendImage */
583 dibdrv_ChoosePixelFormat
, /* pChoosePixelFormat */
584 dibdrv_Chord
, /* pChord */
585 NULL
, /* pCloseFigure */
586 dibdrv_CopyBitmap
, /* pCopyBitmap */
587 NULL
, /* pCreateBitmap */
588 NULL
, /* pCreateCompatibleDC */
589 dibdrv_CreateDC
, /* pCreateDC */
590 NULL
, /* pCreateDIBSection */
591 dibdrv_DeleteBitmap
, /* pDeleteBitmap */
592 dibdrv_DeleteDC
, /* pDeleteDC */
593 NULL
, /* pDeleteObject */
594 dibdrv_DescribePixelFormat
, /* pDescribePixelFormat */
595 NULL
, /* pDeviceCapabilities */
596 dibdrv_Ellipse
, /* pEllipse */
600 NULL
, /* pEnumFonts */
601 NULL
, /* pEnumICMProfiles */
602 NULL
, /* pExcludeClipRect */
603 NULL
, /* pExtDeviceMode */
604 NULL
, /* pExtEscape */
605 dibdrv_ExtFloodFill
, /* pExtFloodFill */
606 NULL
, /* pExtSelectClipRgn */
607 dibdrv_ExtTextOut
, /* pExtTextOut */
608 NULL
, /* pFillPath */
610 NULL
, /* pFlattenPath */
611 NULL
, /* pFontIsLinked */
612 NULL
, /* pFrameRgn */
613 NULL
, /* pGdiComment */
614 NULL
, /* pGdiRealizationInfo */
615 NULL
, /* pGetCharABCWidths */
616 NULL
, /* pGetCharABCWidthsI */
617 NULL
, /* pGetCharWidth */
618 NULL
, /* pGetDeviceCaps */
619 dibdrv_GetDeviceGammaRamp
, /* pGetDeviceGammaRamp */
620 NULL
, /* pGetFontData */
621 NULL
, /* pGetFontUnicodeRanges */
622 NULL
, /* pGetGlyphIndices */
623 NULL
, /* pGetGlyphOutline */
624 NULL
, /* pGetICMProfile */
625 dibdrv_GetImage
, /* pGetImage */
626 NULL
, /* pGetKerningPairs */
627 dibdrv_GetNearestColor
, /* pGetNearestColor */
628 NULL
, /* pGetOutlineTextMetrics */
629 dibdrv_GetPixel
, /* pGetPixel */
630 dibdrv_GetPixelFormat
, /* pGetPixelFormat */
631 NULL
, /* pGetSystemPaletteEntries */
632 NULL
, /* pGetTextCharsetInfo */
633 NULL
, /* pGetTextExtentExPoint */
634 NULL
, /* pGetTextExtentExPointI */
635 NULL
, /* pGetTextFace */
636 NULL
, /* pGetTextMetrics */
637 dibdrv_GradientFill
, /* pGradientFill */
638 NULL
, /* pIntersectClipRect */
639 NULL
, /* pInvertRgn */
640 dibdrv_LineTo
, /* pLineTo */
641 NULL
, /* pModifyWorldTransform */
643 NULL
, /* pOffsetClipRgn */
644 NULL
, /* pOffsetViewportOrg */
645 NULL
, /* pOffsetWindowOrg */
646 dibdrv_PaintRgn
, /* pPaintRgn */
647 dibdrv_PatBlt
, /* pPatBlt */
648 dibdrv_Pie
, /* pPie */
649 NULL
, /* pPolyBezier */
650 NULL
, /* pPolyBezierTo */
651 NULL
, /* pPolyDraw */
652 dibdrv_PolyPolygon
, /* pPolyPolygon */
653 dibdrv_PolyPolyline
, /* pPolyPolyline */
654 dibdrv_Polygon
, /* pPolygon */
655 dibdrv_Polyline
, /* pPolyline */
656 NULL
, /* pPolylineTo */
657 dibdrv_PutImage
, /* pPutImage */
658 NULL
, /* pRealizeDefaultPalette */
659 NULL
, /* pRealizePalette */
660 dibdrv_Rectangle
, /* pRectangle */
662 NULL
, /* pRestoreDC */
663 dibdrv_RoundRect
, /* pRoundRect */
665 NULL
, /* pScaleViewportExt */
666 NULL
, /* pScaleWindowExt */
667 dibdrv_SelectBitmap
, /* pSelectBitmap */
668 dibdrv_SelectBrush
, /* pSelectBrush */
669 NULL
, /* pSelectClipPath */
670 NULL
, /* pSelectFont */
671 NULL
, /* pSelectPalette */
672 dibdrv_SelectPen
, /* pSelectPen */
673 NULL
, /* pSetArcDirection */
674 NULL
, /* pSetBkColor */
675 NULL
, /* pSetBkMode */
676 dibdrv_SetDCBrushColor
, /* pSetDCBrushColor */
677 dibdrv_SetDCPenColor
, /* pSetDCPenColor */
678 dibdrv_SetDIBColorTable
, /* pSetDIBColorTable */
679 NULL
, /* pSetDIBitsToDevice */
680 dibdrv_SetDeviceClipping
, /* pSetDeviceClipping */
681 dibdrv_SetDeviceGammaRamp
, /* pSetDeviceGammaRamp */
682 NULL
, /* pSetLayout */
683 NULL
, /* pSetMapMode */
684 NULL
, /* pSetMapperFlags */
685 dibdrv_SetPixel
, /* pSetPixel */
686 dibdrv_SetPixelFormat
, /* pSetPixelFormat */
687 NULL
, /* pSetPolyFillMode */
689 NULL
, /* pSetRelAbs */
690 NULL
, /* pSetStretchBltMode */
691 NULL
, /* pSetTextAlign */
692 NULL
, /* pSetTextCharacterExtra */
693 NULL
, /* pSetTextColor */
694 NULL
, /* pSetTextJustification */
695 NULL
, /* pSetViewportExt */
696 NULL
, /* pSetViewportOrg */
697 NULL
, /* pSetWindowExt */
698 NULL
, /* pSetWindowOrg */
699 NULL
, /* pSetWorldTransform */
700 NULL
, /* pStartDoc */
701 NULL
, /* pStartPage */
702 dibdrv_StretchBlt
, /* pStretchBlt */
703 NULL
, /* pStretchDIBits */
704 NULL
, /* pStrokeAndFillPath */
705 NULL
, /* pStrokePath */
706 dibdrv_SwapBuffers
, /* pSwapBuffers */
707 NULL
, /* pUnrealizePalette */
708 NULL
, /* pWidenPath */
709 dibdrv_wglCopyContext
, /* pwglCopyContext */
710 dibdrv_wglCreateContext
, /* pwglCreateContext */
711 dibdrv_wglCreateContextAttribsARB
, /* pwglCreateContextAttribsARB */
712 dibdrv_wglDeleteContext
, /* pwglDeleteContext */
713 dibdrv_wglGetPbufferDCARB
, /* pwglGetPbufferDCARB */
714 dibdrv_wglGetProcAddress
, /* pwglGetProcAddress */
715 dibdrv_wglMakeContextCurrentARB
, /* pwglMakeContextCurrentARB */
716 dibdrv_wglMakeCurrent
, /* pwglMakeCurrent */
717 dibdrv_wglSetPixelFormatWINE
, /* pwglSetPixelFormatWINE */
718 dibdrv_wglShareLists
, /* pwglShareLists */
719 dibdrv_wglUseFontBitmapsA
, /* pwglUseFontBitmapsA */
720 dibdrv_wglUseFontBitmapsW
, /* pwglUseFontBitmapsW */