ReactOS 0.4.17-dev-923-g4c9a150
gdiinterop.c
Go to the documentation of this file.
1/*
2 * GDI Interop
3 *
4 * Copyright 2011 Huw Davies
5 * Copyright 2012, 2014-2018 Nikolay Sivov for CodeWeavers
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#define COBJMACROS
23
24#include <stdarg.h>
25
26#include "windef.h"
27#include "winbase.h"
28#include "wingdi.h"
29#include "dwrite_private.h"
30
31#include "wine/debug.h"
32
34
35struct dib_data {
37 int stride;
38 int width;
39};
40
42{
46
49 float ppdip;
53 struct dib_data dib;
54};
55
57{
62};
63
65{
69};
70
71static inline int get_dib_stride(int width, int bpp)
72{
73 return ((width * bpp + 31) >> 3) & ~3;
74}
75
77{
78 char bmibuf[FIELD_OFFSET(BITMAPINFO, bmiColors[256])];
79 BITMAPINFO *bmi = (BITMAPINFO*)bmibuf;
81
82 target->size.cx = width;
83 target->size.cy = height;
84
85 memset(bmi, 0, sizeof(bmibuf));
86 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
88 bmi->bmiHeader.biWidth = width;
89 bmi->bmiHeader.biBitCount = 32;
90 bmi->bmiHeader.biPlanes = 1;
92
93 hbm = CreateDIBSection(target->hdc, bmi, DIB_RGB_COLORS, (void**)&target->dib.ptr, NULL, 0);
94 if (!hbm) {
95 hbm = CreateBitmap(1, 1, 1, 1, NULL);
96 target->dib.ptr = NULL;
97 target->dib.stride = 0;
98 target->dib.width = 0;
99 }
100 else {
101 target->dib.stride = get_dib_stride(width, 32);
102 target->dib.width = width;
103 }
104
106 return S_OK;
107}
108
110{
112}
113
115{
117}
118
120{
122}
123
125{
127}
128
130{
131 if (IsEqualIID(riid, &IID_ID2D1SimplifiedGeometrySink) ||
133 {
134 *obj = iface;
135 ID2D1SimplifiedGeometrySink_AddRef(iface);
136 return S_OK;
137 }
138
139 WARN("%s not implemented.\n", debugstr_guid(riid));
140
141 *obj = NULL;
142
143 return E_NOINTERFACE;
144}
145
147{
149 return IDWriteBitmapRenderTarget1_AddRef(&target->IDWriteBitmapRenderTarget1_iface);
150}
151
153{
155 return IDWriteBitmapRenderTarget1_Release(&target->IDWriteBitmapRenderTarget1_iface);
156}
157
159{
162}
163
165{
166}
167
169{
171 MoveToEx(target->hdc, startPoint.x, startPoint.y, NULL);
172}
173
175{
177
178 while (count--)
179 {
180 LineTo(target->hdc, points->x, points->y);
181 points++;
182 }
183}
184
186{
188 POINT points[3];
189
190 while (count--)
191 {
192 points[0].x = beziers->point1.x;
193 points[0].y = beziers->point1.y;
194 points[1].x = beziers->point2.x;
195 points[1].y = beziers->point2.y;
196 points[2].x = beziers->point3.x;
197 points[2].y = beziers->point3.y;
198
199 PolyBezierTo(target->hdc, points, 3);
200 beziers++;
201 }
202}
203
205{
207 CloseFigure(target->hdc);
208}
209
211{
212 return S_OK;
213}
214
215static const ID2D1SimplifiedGeometrySinkVtbl rendertargetsinkvtbl =
216{
227};
228
230{
231 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
232
233 if (IsEqualIID(riid, &IID_IDWriteBitmapRenderTarget1) ||
234 IsEqualIID(riid, &IID_IDWriteBitmapRenderTarget) ||
236 {
237 *obj = iface;
238 IDWriteBitmapRenderTarget1_AddRef(iface);
239 return S_OK;
240 }
241
242 WARN("%s not implemented.\n", debugstr_guid(riid));
243
244 *obj = NULL;
245
246 return E_NOINTERFACE;
247}
248
250{
253
254 TRACE("%p, refcount %lu.\n", iface, refcount);
255
256 return refcount;
257}
258
260{
263
264 TRACE("%p, refcount %lu.\n", iface, refcount);
265
266 if (!refcount)
267 {
268 IDWriteFactory7_Release(target->factory);
269 DeleteDC(target->hdc);
270 free(target);
271 }
272
273 return refcount;
274}
275
276static inline DWORD *get_pixel_ptr_32(struct dib_data *dib, int x, int y)
277{
278 return (DWORD *)((BYTE*)dib->ptr + y * dib->stride + x * 4);
279}
280
282{
283 return (src * alpha + dst * (255 - alpha) + 127) / 255;
284}
285
287{
288 return blend_color(r, text >> 16, alpha[0]) << 16 |
289 blend_color(g, text >> 8, alpha[1]) << 8 |
290 blend_color(b, text, alpha[2]);
291}
292
294{
295 return blend_color(r, text >> 16, alpha) << 16 |
296 blend_color(g, text >> 8, alpha) << 8 |
298}
299
300static void blit_8(struct dib_data *dib, const BYTE *src, const RECT *rect, DWORD text_pixel)
301{
302 DWORD *dst_ptr = get_pixel_ptr_32(dib, rect->left, rect->top);
303 int x, y, src_width = rect->right - rect->left;
304
305 for (y = rect->top; y < rect->bottom; y++) {
306 for (x = 0; x < src_width; x++) {
307 if (!src[x]) continue;
308 if (src[x] == DWRITE_ALPHA_MAX)
309 dst_ptr[x] = text_pixel;
310 else
311 dst_ptr[x] = blend_pixel(dst_ptr[x] >> 16, dst_ptr[x] >> 8, dst_ptr[x], text_pixel, src[x]);
312 }
313
314 src += src_width;
315 dst_ptr += dib->stride / 4;
316 }
317}
318
319static void blit_subpixel_888(struct dib_data *dib, int dib_width, const BYTE *src,
320 const RECT *rect, DWORD text_pixel)
321{
322 DWORD *dst_ptr = get_pixel_ptr_32(dib, rect->left, rect->top);
323 int x, y, src_width = rect->right - rect->left;
324
325 for (y = rect->top; y < rect->bottom; y++) {
326 for (x = 0; x < src_width; x++) {
327 if (src[3*x] == 0 && src[3*x+1] == 0 && src[3*x+2] == 0) continue;
328 dst_ptr[x] = blend_subpixel(dst_ptr[x] >> 16, dst_ptr[x] >> 8, dst_ptr[x], text_pixel, &src[3*x]);
329 }
330 dst_ptr += dib->stride / 4;
331 src += src_width * 3;
332 }
333}
334
336{
337 return (((color >> 16) & 0xff) | (color & 0xff00) | ((color << 16) & 0xff0000));
338}
339
341 FLOAT originX, FLOAT originY, DWRITE_MEASURING_MODE measuring_mode,
343 RECT *bbox_ret)
344{
346 IDWriteGlyphRunAnalysis *analysis;
347 DWRITE_RENDERING_MODE1 rendermode;
348 DWRITE_GRID_FIT_MODE gridfitmode;
349 DWRITE_TEXTURE_TYPE texturetype;
350 DWRITE_MATRIX m, scale = { 0 };
351 IDWriteFontFace3 *fontface;
352 RECT target_rect, bounds;
353 HRESULT hr;
354
355 TRACE("%p, %.8e, %.8e, %d, %p, %p, 0x%08lx, %p.\n", iface, originX, originY,
356 measuring_mode, run, params, color, bbox_ret);
357
358 SetRectEmpty(bbox_ret);
359
360 if (!target->dib.ptr)
361 return S_OK;
362
363 if (!params)
364 return E_INVALIDARG;
365
366 if (FAILED(hr = IDWriteFontFace_QueryInterface(run->fontFace, &IID_IDWriteFontFace3, (void **)&fontface))) {
367 WARN("Failed to get IDWriteFontFace2 interface, hr %#lx.\n", hr);
368 return hr;
369 }
370
371 hr = IDWriteFontFace3_GetRecommendedRenderingMode(fontface, run->fontEmSize, target->ppdip * 96.0f,
372 target->ppdip * 96.0f, &target->m, run->isSideways, DWRITE_OUTLINE_THRESHOLD_ALIASED, measuring_mode,
373 params, &rendermode, &gridfitmode);
374 IDWriteFontFace3_Release(fontface);
375 if (FAILED(hr))
376 return hr;
377
378 SetRect(&target_rect, 0, 0, target->size.cx, target->size.cy);
379
380 if (rendermode == DWRITE_RENDERING_MODE1_OUTLINE)
381 {
382 static const XFORM identity = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
383 const DWRITE_MATRIX *m = &target->m;
384 XFORM xform;
385
386 /* target allows any transform to be set, filter it here */
387 if (m->m11 * m->m22 == m->m12 * m->m21) {
388 xform.eM11 = 1.0f;
389 xform.eM12 = 0.0f;
390 xform.eM21 = 0.0f;
391 xform.eM22 = 1.0f;
392 xform.eDx = originX;
393 xform.eDy = originY;
394 } else {
395 xform.eM11 = m->m11;
396 xform.eM12 = m->m12;
397 xform.eM21 = m->m21;
398 xform.eM22 = m->m22;
399 xform.eDx = m->m11 * originX + m->m21 * originY + m->dx;
400 xform.eDy = m->m12 * originX + m->m22 * originY + m->dy;
401 }
402 SetWorldTransform(target->hdc, &xform);
403
404 BeginPath(target->hdc);
405
406 hr = IDWriteFontFace_GetGlyphRunOutline(run->fontFace, run->fontEmSize * target->ppdip,
407 run->glyphIndices, run->glyphAdvances, run->glyphOffsets, run->glyphCount,
408 run->isSideways, run->bidiLevel & 1, &target->ID2D1SimplifiedGeometrySink_iface);
409
410 EndPath(target->hdc);
411
412 if (hr == S_OK)
413 {
414 HBRUSH brush = CreateSolidBrush(color);
415
416 SelectObject(target->hdc, brush);
417
418 FillPath(target->hdc);
419
420 /* FIXME: one way to get affected rectangle bounds is to use region fill */
421 if (bbox_ret)
422 *bbox_ret = target_rect;
423
424 DeleteObject(brush);
425 }
426
428
429 return hr;
430 }
431
432 m = target->m;
433 scale.m11 = scale.m22 = target->ppdip;
435 hr = IDWriteFactory7_CreateGlyphRunAnalysis(target->factory, run, &m, rendermode, measuring_mode,
436 gridfitmode, target->antialiasmode, originX, originY, &analysis);
437 if (FAILED(hr))
438 {
439 WARN("failed to create analysis instance, 0x%08lx\n", hr);
440 return hr;
441 }
442
443 SetRectEmpty(&bounds);
444 texturetype = DWRITE_TEXTURE_ALIASED_1x1;
445 hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_ALIASED_1x1, &bounds);
446 if (FAILED(hr) || IsRectEmpty(&bounds)) {
447 hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_CLEARTYPE_3x1, &bounds);
448 if (FAILED(hr)) {
449 WARN("GetAlphaTextureBounds() failed, 0x%08lx\n", hr);
450 IDWriteGlyphRunAnalysis_Release(analysis);
451 return hr;
452 }
453 texturetype = DWRITE_TEXTURE_CLEARTYPE_3x1;
454 }
455
456 if (IntersectRect(&target_rect, &target_rect, &bounds))
457 {
458 UINT32 size = (target_rect.right - target_rect.left) * (target_rect.bottom - target_rect.top);
459 BYTE *bitmap;
460
462 if (texturetype == DWRITE_TEXTURE_CLEARTYPE_3x1)
463 size *= 3;
464 if (!(bitmap = calloc(1, size)))
465 {
466 IDWriteGlyphRunAnalysis_Release(analysis);
467 return E_OUTOFMEMORY;
468 }
469
470 hr = IDWriteGlyphRunAnalysis_CreateAlphaTexture(analysis, texturetype, &target_rect, bitmap, size);
471 if (hr == S_OK) {
472 /* blit to target dib */
473 if (texturetype == DWRITE_TEXTURE_ALIASED_1x1)
474 blit_8(&target->dib, bitmap, &target_rect, color);
475 else
476 blit_subpixel_888(&target->dib, target->size.cx, bitmap, &target_rect, color);
477
478 if (bbox_ret) *bbox_ret = target_rect;
479 }
480
481 free(bitmap);
482 }
483 else if (bbox_ret)
484 {
485 *bbox_ret = bounds;
486 }
487
488 IDWriteGlyphRunAnalysis_Release(analysis);
489
490 return S_OK;
491}
492
494{
496
497 TRACE("%p.\n", iface);
498
499 return target->hdc;
500}
501
503{
505
506 TRACE("%p.\n", iface);
507
508 return target->ppdip;
509}
510
512{
514
515 TRACE("%p, %.2f.\n", iface, ppdip);
516
517 if (ppdip <= 0.0f)
518 return E_INVALIDARG;
519
520 target->ppdip = ppdip;
521 return S_OK;
522}
523
525{
527
528 TRACE("%p, %p.\n", iface, transform);
529
530 *transform = target->m;
531 return S_OK;
532}
533
535{
537
538 TRACE("%p, %p.\n", iface, transform);
539
541 return S_OK;
542}
543
545{
547
548 TRACE("%p, %p.\n", iface, size);
549
550 *size = target->size;
551 return S_OK;
552}
553
555{
557
558 TRACE("%p, %u, %u.\n", iface, width, height);
559
560 if (target->size.cx == width && target->size.cy == height)
561 return S_OK;
562
564}
565
567{
569
570 TRACE("%p.\n", iface);
571
572 return target->antialiasmode;
573}
574
576{
578
579 TRACE("%p, %d.\n", iface, mode);
580
581 if ((DWORD)mode > DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE)
582 return E_INVALIDARG;
583
584 target->antialiasmode = mode;
585 return S_OK;
586}
587
588static const IDWriteBitmapRenderTarget1Vtbl rendertargetvtbl =
589{
603};
604
607{
608 struct rendertarget *target;
609 HRESULT hr;
610
611 *ret = NULL;
612
613 if (!(target = malloc(sizeof(*target))))
614 return E_OUTOFMEMORY;
615
616 target->IDWriteBitmapRenderTarget1_iface.lpVtbl = &rendertargetvtbl;
617 target->ID2D1SimplifiedGeometrySink_iface.lpVtbl = &rendertargetsinkvtbl;
618 target->refcount = 1;
619
623 if (FAILED(hr)) {
624 IDWriteBitmapRenderTarget1_Release(&target->IDWriteBitmapRenderTarget1_iface);
625 return hr;
626 }
627
628 target->m = identity;
629 target->ppdip = GetDeviceCaps(target->hdc, LOGPIXELSX) / 96.0f;
630 target->antialiasmode = DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE;
631 target->factory = factory;
632 IDWriteFactory7_AddRef(factory);
633
634 *ret = (IDWriteBitmapRenderTarget*)&target->IDWriteBitmapRenderTarget1_iface;
635
636 return S_OK;
637}
638
640{
641 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
642
643 if (IsEqualIID(riid, &IID_IDWriteGdiInterop1) ||
644 IsEqualIID(riid, &IID_IDWriteGdiInterop) ||
646 {
647 *obj = iface;
648 IDWriteGdiInterop1_AddRef(iface);
649 return S_OK;
650 }
651
652 WARN("%s not implemented.\n", debugstr_guid(riid));
653
654 *obj = NULL;
655 return E_NOINTERFACE;
656}
657
659{
660 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
662
663 TRACE("%p, refcount %lu.\n", iface, refcount);
664
665 return refcount;
666}
667
669{
670 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
672
673 TRACE("%p, refcount %lu.\n", iface, refcount);
674
675 if (!refcount)
676 {
677 IDWriteFactory7_UnregisterFontFileLoader(interop->factory, &interop->IDWriteFontFileLoader_iface);
678 factory_detach_gdiinterop(interop->factory, iface);
679 free(interop);
680 }
681
682 return refcount;
683}
684
686 LOGFONTW const *logfont, IDWriteFont **font)
687{
688 TRACE("%p, %p, %p.\n", iface, logfont, font);
689
690 return IDWriteGdiInterop1_CreateFontFromLOGFONT(iface, logfont, NULL, font);
691}
692
694 IDWriteFont *font, LOGFONTW *logfont, BOOL *is_systemfont)
695{
697 IDWriteFontFamily *family;
698 HRESULT hr;
699
700 TRACE("%p, %p, %p, %p.\n", iface, font, logfont, is_systemfont);
701
702 *is_systemfont = FALSE;
703
704 memset(logfont, 0, sizeof(*logfont));
705
706 if (!font)
707 return E_INVALIDARG;
708
709 hr = IDWriteFont_GetFontFamily(font, &family);
710 if (FAILED(hr))
711 return hr;
712
713 hr = IDWriteFontFamily_GetFontCollection(family, &collection);
714 IDWriteFontFamily_Release(family);
715 if (FAILED(hr))
716 return hr;
717
718 *is_systemfont = is_system_collection(collection);
719 IDWriteFontCollection_Release(collection);
720
721 get_logfont_from_font(font, logfont);
722 logfont->lfCharSet = DEFAULT_CHARSET;
724
725 return hr;
726}
727
729 IDWriteFontFace *fontface, LOGFONTW *logfont)
730{
731 TRACE("%p, %p, %p.\n", iface, fontface, logfont);
732
733 memset(logfont, 0, sizeof(*logfont));
734
735 if (!fontface)
736 return E_INVALIDARG;
737
738 get_logfont_from_fontface(fontface, logfont);
739 logfont->lfCharSet = DEFAULT_CHARSET;
741
742 return S_OK;
743}
744
746{
754};
755
757{
761};
762
763/* Undocumented gdi32 exports, used to access actually selected font information */
765extern BOOL WINAPI GetFontFileInfo(DWORD instance_id, DWORD file_index, struct font_fileinfo *info, SIZE_T size, SIZE_T *needed);
766extern BOOL WINAPI GetFontFileData(DWORD instance_id, DWORD file_index, UINT64 offset, void *buff, SIZE_T buff_size);
767
769 HDC hdc, IDWriteFontFace **fontface)
770{
771 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
773 struct font_fileinfo *fileinfo;
775 DWRITE_FONT_FACE_TYPE facetype;
777 BOOL is_supported;
778 UINT32 facenum;
779 SIZE_T needed;
780 HRESULT hr;
781
782 TRACE("%p, %p, %p.\n", iface, hdc, fontface);
783
784 *fontface = NULL;
785
786 if (!hdc)
787 return E_INVALIDARG;
788
789 /* get selected font id */
790 info.size = sizeof(info);
792 WARN("failed to get selected font id\n");
793 return E_FAIL;
794 }
795
796 needed = 0;
797 GetFontFileInfo(info.instance_id, 0, NULL, 0, &needed);
798 if (needed == 0) {
799 WARN("failed to get font file info size\n");
800 return E_FAIL;
801 }
802
803 if (!(fileinfo = malloc(needed)))
804 return E_OUTOFMEMORY;
805
806 if (!GetFontFileInfo(info.instance_id, 0, fileinfo, needed, &needed))
807 {
808 free(fileinfo);
809 return E_FAIL;
810 }
811
812 if (*fileinfo->path)
813 hr = IDWriteFactory7_CreateFontFileReference(interop->factory, fileinfo->path, &fileinfo->writetime, &file);
814 else
815 hr = IDWriteFactory7_CreateCustomFontFileReference(interop->factory, &info.instance_id,
816 sizeof(info.instance_id), &interop->IDWriteFontFileLoader_iface, &file);
817
818 free(fileinfo);
819 if (FAILED(hr))
820 return hr;
821
822 is_supported = FALSE;
823 hr = IDWriteFontFile_Analyze(file, &is_supported, &filetype, &facetype, &facenum);
824 if (SUCCEEDED(hr)) {
825 if (is_supported)
826 /* Simulations flags values match DWRITE_FONT_SIMULATIONS */
827 hr = IDWriteFactory7_CreateFontFace(interop->factory, facetype, 1, &file, info.face_index,
828 info.simulations, fontface);
829 else
831 }
832
833 IDWriteFontFile_Release(file);
834 return hr;
835}
836
839{
840 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
841
842 TRACE("%p, %p, %u, %u, %p.\n", iface, hdc, width, height, target);
843
844 return create_rendertarget(interop->factory, hdc, width, height, target);
845}
846
849{
850 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
851 IDWriteFontFamily *family;
853 BOOL exists = FALSE;
855 HRESULT hr;
856
857 TRACE("%p, %p, %p, %p.\n", iface, logfont, collection, font);
858
859 *font = NULL;
860
861 if (!logfont) return E_INVALIDARG;
862
863 if (collection)
864 IDWriteFontCollection_AddRef(collection);
865 else {
866 hr = IDWriteFactory5_GetSystemFontCollection((IDWriteFactory5 *)interop->factory, FALSE, (IDWriteFontCollection1 **)&collection, FALSE);
867 if (FAILED(hr)) {
868 ERR("failed to get system font collection: 0x%08lx.\n", hr);
869 return hr;
870 }
871 }
872
873 hr = IDWriteFontCollection_FindFamilyName(collection, logfont->lfFaceName, &index, &exists);
874 if (FAILED(hr))
875 goto done;
876
877 if (!exists) {
879 goto done;
880 }
881
882 hr = IDWriteFontCollection_GetFontFamily(collection, index, &family);
883 if (FAILED(hr))
884 goto done;
885
887 hr = IDWriteFontFamily_GetFirstMatchingFont(family, logfont->lfWeight, DWRITE_FONT_STRETCH_NORMAL, style, font);
888 IDWriteFontFamily_Release(family);
889
890done:
891 IDWriteFontCollection_Release(collection);
892 return hr;
893}
894
896 FONTSIGNATURE *fontsig)
897{
898 TRACE("%p, %p, %p.\n", iface, fontface, fontsig);
899
900 return get_fontsig_from_fontface(fontface, fontsig);
901}
902
904{
905 TRACE("%p, %p, %p.\n", iface, font, fontsig);
906
907 if (!font)
908 return E_INVALIDARG;
909
910 return get_fontsig_from_font(font, fontsig);
911}
912
914 IDWriteFontSet *fontset, IDWriteFontSet **subset)
915{
917
918 TRACE("%p, %p, %p, %p.\n", iface, logfont, fontset, subset);
919
920 if (!logfont || !fontset)
921 return E_INVALIDARG;
922
923 property.propertyId = DWRITE_FONT_PROPERTY_ID_WIN32_FAMILY_NAME;
924 property.propertyValue = logfont->lfFaceName;
925 property.localeName = L"";
926
927 return IDWriteFontSet_GetMatchingFonts(fontset, &property, 1, subset);
928}
929
930static const IDWriteGdiInterop1Vtbl gdiinteropvtbl =
931{
944};
945
947{
948 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
949
950 if (IsEqualIID(&IID_IDWriteFontFileStream, riid) || IsEqualIID(&IID_IUnknown, riid)) {
951 *out = iface;
952 IDWriteFontFileStream_AddRef(iface);
953 return S_OK;
954 }
955
956 *out = NULL;
957 WARN("Unsupported interface %s.\n", debugstr_guid(riid));
958 return E_NOINTERFACE;
959}
960
962{
965
966 TRACE("%p, refcount %ld.\n", iface, refcount);
967
968 return refcount;
969}
970
972{
975
976 TRACE("%p, refcount %ld.\n", iface, refcount);
977
978 if (!refcount)
979 free(stream);
980
981 return refcount;
982}
983
985 UINT64 offset, UINT64 fragment_size, void **fragment_context)
986{
988 struct font_fileinfo fileinfo;
989 void *fragment;
990
991 TRACE("%p, %p, %s, %s, %p.\n", iface, fragment_start, wine_dbgstr_longlong(offset),
992 wine_dbgstr_longlong(fragment_size), fragment_context);
993
994 *fragment_context = NULL;
995 *fragment_start = NULL;
996
997 if (!GetFontFileInfo(stream->key, 0, &fileinfo, sizeof(fileinfo), NULL))
998 return E_INVALIDARG;
999
1000 if ((offset >= fileinfo.size.QuadPart - 1) || (fragment_size > fileinfo.size.QuadPart - offset))
1001 return E_INVALIDARG;
1002
1003 if (!(fragment = malloc(fragment_size)))
1004 return E_OUTOFMEMORY;
1005
1006 if (!GetFontFileData(stream->key, 0, offset, fragment, fragment_size))
1007 return E_FAIL;
1008
1009 *fragment_start = *fragment_context = fragment;
1010 return S_OK;
1011}
1012
1013static void WINAPI memresourcestream_ReleaseFileFragment(IDWriteFontFileStream *iface, void *fragment_context)
1014{
1015 TRACE("%p, %p.\n", iface, fragment_context);
1016
1017 free(fragment_context);
1018}
1019
1021{
1023 struct font_fileinfo fileinfo;
1024
1025 TRACE("%p, %p.\n", iface, size);
1026
1027 if (!GetFontFileInfo(stream->key, 0, &fileinfo, sizeof(fileinfo), NULL))
1028 return E_INVALIDARG;
1029
1030 *size = fileinfo.size.QuadPart;
1031
1032 return S_OK;
1033}
1034
1036{
1037 TRACE("%p, %p.\n", iface, last_writetime);
1038
1039 return E_NOTIMPL;
1040}
1041
1042static const IDWriteFontFileStreamVtbl memresourcestreamvtbl =
1043{
1051};
1052
1054{
1055 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
1056
1057 if (IsEqualIID(&IID_IDWriteFontFileLoader, riid) || IsEqualIID(&IID_IUnknown, riid)) {
1058 *out = iface;
1059 IDWriteFontFileLoader_AddRef(iface);
1060 return S_OK;
1061 }
1062
1063 *out = NULL;
1064 WARN("Unsupported interface %s.\n", debugstr_guid(riid));
1065 return E_NOINTERFACE;
1066}
1067
1069{
1070 return 2;
1071}
1072
1074{
1075 return 1;
1076}
1077
1079 UINT32 key_size, IDWriteFontFileStream **ret)
1080{
1081 struct memresource_stream *stream;
1082
1083 TRACE("%p, %p, %u, %p.\n", iface, key, key_size, ret);
1084
1085 *ret = NULL;
1086
1087 if (!key || key_size != sizeof(DWORD))
1088 return E_INVALIDARG;
1089
1090 if (!(stream = malloc(sizeof(*stream))))
1091 return E_OUTOFMEMORY;
1092
1093 stream->IDWriteFontFileStream_iface.lpVtbl = &memresourcestreamvtbl;
1094 stream->refcount = 1;
1095 memcpy(&stream->key, key, sizeof(stream->key));
1096
1097 *ret = &stream->IDWriteFontFileStream_iface;
1098
1099 return S_OK;
1100}
1101
1102static const IDWriteFontFileLoaderVtbl memresourceloadervtbl =
1103{
1108};
1109
1111{
1112 struct gdiinterop *interop;
1113
1114 *ret = NULL;
1115
1116 if (!(interop = malloc(sizeof(*interop))))
1117 return E_OUTOFMEMORY;
1118
1119 interop->IDWriteGdiInterop1_iface.lpVtbl = &gdiinteropvtbl;
1121 interop->refcount = 1;
1122 interop->factory = factory;
1123 IDWriteFactory7_AddRef(interop->factory);
1124 IDWriteFactory7_RegisterFontFileLoader(factory, &interop->IDWriteFontFileLoader_iface);
1125
1126 *ret = &interop->IDWriteGdiInterop1_iface;
1127 return S_OK;
1128}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WINDING
Definition: constants.h:279
#define ALTERNATE
Definition: constants.h:278
#define index(s, c)
Definition: various.h:29
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
RECT rect
Definition: combotst.c:67
D2D1_FILL_MODE
Definition: d2d1.idl:84
@ D2D1_FILL_MODE_ALTERNATE
Definition: d2d1.idl:85
D2D1_FIGURE_BEGIN
Definition: d2d1.idl:99
D2D1_PATH_SEGMENT
Definition: d2d1.idl:91
D2D1_FIGURE_END
Definition: d2d1.idl:106
DWRITE_MEASURING_MODE
Definition: dcommon.idl:36
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
const WCHAR * text
Definition: package.c:1826
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
DWRITE_FONT_FILE_TYPE
Definition: dwrite.idl:47
DWRITE_FONT_FACE_TYPE
Definition: dwrite.idl:60
DWRITE_FONT_STYLE
Definition: dwrite.idl:109
@ DWRITE_FONT_STYLE_NORMAL
Definition: dwrite.idl:110
@ DWRITE_FONT_STYLE_ITALIC
Definition: dwrite.idl:112
DWRITE_TEXTURE_TYPE
Definition: dwrite.idl:346
@ DWRITE_TEXTURE_ALIASED_1x1
Definition: dwrite.idl:347
@ DWRITE_TEXTURE_CLEARTYPE_3x1
Definition: dwrite.idl:348
@ DWRITE_FONT_STRETCH_NORMAL
Definition: dwrite.idl:100
@ DWRITE_OUTLINE_THRESHOLD_ALIASED
Definition: dwrite_1.idl:409
DWRITE_GRID_FIT_MODE
Definition: dwrite_2.idl:28
struct FONTSIGNATURE FONTSIGNATURE
Definition: dwrite_3.idl:31
DWRITE_RENDERING_MODE1
Definition: dwrite_3.idl:77
@ DWRITE_RENDERING_MODE1_OUTLINE
Definition: dwrite_3.idl:84
@ DWRITE_FONT_PROPERTY_ID_WIN32_FAMILY_NAME
Definition: dwrite_3.idl:95
HRESULT get_fontsig_from_fontface(IDWriteFontFace *, FONTSIGNATURE *)
Definition: font.c:2573
BOOL is_system_collection(IDWriteFontCollection *)
Definition: font.c:3201
void get_logfont_from_fontface(IDWriteFontFace *, LOGFONTW *)
Definition: font.c:2560
HRESULT get_fontsig_from_font(IDWriteFont *, FONTSIGNATURE *)
Definition: font.c:2566
void factory_detach_gdiinterop(IDWriteFactory7 *factory, IDWriteGdiInterop1 *interop)
Definition: main.c:2103
static void dwrite_matrix_multiply(DWRITE_MATRIX *a, const DWRITE_MATRIX *b)
void get_logfont_from_font(IDWriteFont *, LOGFONTW *)
Definition: font.c:2554
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop1 *iface, IDWriteFont *font, LOGFONTW *logfont, BOOL *is_systemfont)
Definition: gdiinterop.c:693
static HRESULT WINAPI gdiinterop1_GetFontSignature_(IDWriteGdiInterop1 *iface, IDWriteFontFace *fontface, FONTSIGNATURE *fontsig)
Definition: gdiinterop.c:895
static ULONG WINAPI rendertarget_sink_Release(ID2D1SimplifiedGeometrySink *iface)
Definition: gdiinterop.c:152
static HRESULT WINAPI gdiinterop1_CreateFontFromLOGFONT(IDWriteGdiInterop1 *iface, LOGFONTW const *logfont, IDWriteFontCollection *collection, IDWriteFont **font)
Definition: gdiinterop.c:847
static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop1 *iface, LOGFONTW const *logfont, IDWriteFont **font)
Definition: gdiinterop.c:685
static int get_dib_stride(int width, int bpp)
Definition: gdiinterop.c:71
static HRESULT WINAPI memresourcestream_GetLastWriteTime(IDWriteFontFileStream *iface, UINT64 *last_writetime)
Definition: gdiinterop.c:1035
static DWORD colorref_to_pixel_888(COLORREF color)
Definition: gdiinterop.c:335
static HRESULT create_rendertarget(IDWriteFactory7 *factory, HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **ret)
Definition: gdiinterop.c:605
static HRESULT WINAPI memresourcestream_GetFileSize(IDWriteFontFileStream *iface, UINT64 *size)
Definition: gdiinterop.c:1020
static HRESULT WINAPI rendertarget_SetPixelsPerDip(IDWriteBitmapRenderTarget1 *iface, float ppdip)
Definition: gdiinterop.c:511
static ULONG WINAPI rendertarget_Release(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:259
static HRESULT WINAPI memresourcestream_QueryInterface(IDWriteFontFileStream *iface, REFIID riid, void **out)
Definition: gdiinterop.c:946
static void WINAPI rendertarget_sink_EndFigure(ID2D1SimplifiedGeometrySink *iface, D2D1_FIGURE_END figureEnd)
Definition: gdiinterop.c:204
static ULONG WINAPI rendertarget_AddRef(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:249
static const IDWriteFontFileStreamVtbl memresourcestreamvtbl
Definition: gdiinterop.c:1042
static HRESULT WINAPI memresourceloader_QueryInterface(IDWriteFontFileLoader *iface, REFIID riid, void **out)
Definition: gdiinterop.c:1053
static HDC WINAPI rendertarget_GetMemoryDC(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:493
static ULONG WINAPI memresourceloader_Release(IDWriteFontFileLoader *iface)
Definition: gdiinterop.c:1073
static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *iface, FLOAT originX, FLOAT originY, DWRITE_MEASURING_MODE measuring_mode, DWRITE_GLYPH_RUN const *run, IDWriteRenderingParams *params, COLORREF color, RECT *bbox_ret)
Definition: gdiinterop.c:340
static struct memresource_stream * impl_from_IDWriteFontFileStream(IDWriteFontFileStream *iface)
Definition: gdiinterop.c:124
static struct rendertarget * impl_from_ID2D1SimplifiedGeometrySink(ID2D1SimplifiedGeometrySink *iface)
Definition: gdiinterop.c:114
static HRESULT WINAPI gdiinterop1_GetFontSignature(IDWriteGdiInterop1 *iface, IDWriteFont *font, FONTSIGNATURE *fontsig)
Definition: gdiinterop.c:903
static void WINAPI rendertarget_sink_BeginFigure(ID2D1SimplifiedGeometrySink *iface, D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin)
Definition: gdiinterop.c:168
static void WINAPI memresourcestream_ReleaseFileFragment(IDWriteFontFileStream *iface, void *fragment_context)
Definition: gdiinterop.c:1013
static DWORD blend_pixel(BYTE r, BYTE g, BYTE b, DWORD text, BYTE alpha)
Definition: gdiinterop.c:293
static const IDWriteBitmapRenderTarget1Vtbl rendertargetvtbl
Definition: gdiinterop.c:588
static HRESULT WINAPI gdiinterop_CreateBitmapRenderTarget(IDWriteGdiInterop1 *iface, HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **target)
Definition: gdiinterop.c:837
static DWRITE_TEXT_ANTIALIAS_MODE WINAPI rendertarget_GetTextAntialiasMode(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:566
static HRESULT WINAPI gdiinterop_ConvertFontFaceToLOGFONT(IDWriteGdiInterop1 *iface, IDWriteFontFace *fontface, LOGFONTW *logfont)
Definition: gdiinterop.c:728
static ULONG WINAPI rendertarget_sink_AddRef(ID2D1SimplifiedGeometrySink *iface)
Definition: gdiinterop.c:146
static const IDWriteFontFileLoaderVtbl memresourceloadervtbl
Definition: gdiinterop.c:1102
HRESULT create_gdiinterop(IDWriteFactory7 *factory, IDWriteGdiInterop1 **ret)
Definition: gdiinterop.c:1110
BOOL WINAPI GetFontRealizationInfo(HDC hdc, struct font_realization_info *info)
static ULONG WINAPI memresourcestream_Release(IDWriteFontFileStream *iface)
Definition: gdiinterop.c:971
static DWORD blend_subpixel(BYTE r, BYTE g, BYTE b, DWORD text, const BYTE *alpha)
Definition: gdiinterop.c:286
static HRESULT WINAPI memresourceloader_CreateStreamFromKey(IDWriteFontFileLoader *iface, void const *key, UINT32 key_size, IDWriteFontFileStream **ret)
Definition: gdiinterop.c:1078
static HRESULT WINAPI rendertarget_sink_QueryInterface(ID2D1SimplifiedGeometrySink *iface, REFIID riid, void **obj)
Definition: gdiinterop.c:129
static ULONG WINAPI memresourcestream_AddRef(IDWriteFontFileStream *iface)
Definition: gdiinterop.c:961
BOOL WINAPI GetFontFileInfo(DWORD instance_id, DWORD file_index, struct font_fileinfo *info, SIZE_T size, SIZE_T *needed)
static HRESULT WINAPI gdiinterop1_GetMatchingFontsByLOGFONT(IDWriteGdiInterop1 *iface, LOGFONTW const *logfont, IDWriteFontSet *fontset, IDWriteFontSet **subset)
Definition: gdiinterop.c:913
static DWORD * get_pixel_ptr_32(struct dib_data *dib, int x, int y)
Definition: gdiinterop.c:276
static void WINAPI rendertarget_sink_AddBeziers(ID2D1SimplifiedGeometrySink *iface, const D2D1_BEZIER_SEGMENT *beziers, UINT32 count)
Definition: gdiinterop.c:185
static HRESULT WINAPI memresourcestream_ReadFileFragment(IDWriteFontFileStream *iface, void const **fragment_start, UINT64 offset, UINT64 fragment_size, void **fragment_context)
Definition: gdiinterop.c:984
static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop1 *iface, HDC hdc, IDWriteFontFace **fontface)
Definition: gdiinterop.c:768
static ULONG WINAPI gdiinterop_AddRef(IDWriteGdiInterop1 *iface)
Definition: gdiinterop.c:658
static void WINAPI rendertarget_sink_SetFillMode(ID2D1SimplifiedGeometrySink *iface, D2D1_FILL_MODE mode)
Definition: gdiinterop.c:158
static HRESULT create_target_dibsection(struct rendertarget *target, UINT32 width, UINT32 height)
Definition: gdiinterop.c:76
static HRESULT WINAPI rendertarget_GetSize(IDWriteBitmapRenderTarget1 *iface, SIZE *size)
Definition: gdiinterop.c:544
static void blit_subpixel_888(struct dib_data *dib, int dib_width, const BYTE *src, const RECT *rect, DWORD text_pixel)
Definition: gdiinterop.c:319
static HRESULT WINAPI rendertarget_SetCurrentTransform(IDWriteBitmapRenderTarget1 *iface, DWRITE_MATRIX const *transform)
Definition: gdiinterop.c:534
static HRESULT WINAPI rendertarget_GetCurrentTransform(IDWriteBitmapRenderTarget1 *iface, DWRITE_MATRIX *transform)
Definition: gdiinterop.c:524
static const IDWriteGdiInterop1Vtbl gdiinteropvtbl
Definition: gdiinterop.c:930
static HRESULT WINAPI rendertarget_SetTextAntialiasMode(IDWriteBitmapRenderTarget1 *iface, DWRITE_TEXT_ANTIALIAS_MODE mode)
Definition: gdiinterop.c:575
static void blit_8(struct dib_data *dib, const BYTE *src, const RECT *rect, DWORD text_pixel)
Definition: gdiinterop.c:300
static struct rendertarget * impl_from_IDWriteBitmapRenderTarget1(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:109
static HRESULT WINAPI rendertarget_QueryInterface(IDWriteBitmapRenderTarget1 *iface, REFIID riid, void **obj)
Definition: gdiinterop.c:229
static float WINAPI rendertarget_GetPixelsPerDip(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:502
BOOL WINAPI GetFontFileData(DWORD instance_id, DWORD file_index, UINT64 offset, void *buff, SIZE_T buff_size)
static ULONG WINAPI gdiinterop_Release(IDWriteGdiInterop1 *iface)
Definition: gdiinterop.c:668
static const ID2D1SimplifiedGeometrySinkVtbl rendertargetsinkvtbl
Definition: gdiinterop.c:215
static struct gdiinterop * impl_from_IDWriteGdiInterop1(IDWriteGdiInterop1 *iface)
Definition: gdiinterop.c:119
static HRESULT WINAPI rendertarget_Resize(IDWriteBitmapRenderTarget1 *iface, UINT32 width, UINT32 height)
Definition: gdiinterop.c:554
static BYTE blend_color(BYTE dst, BYTE src, BYTE alpha)
Definition: gdiinterop.c:281
static ULONG WINAPI memresourceloader_AddRef(IDWriteFontFileLoader *iface)
Definition: gdiinterop.c:1068
static HRESULT WINAPI gdiinterop_QueryInterface(IDWriteGdiInterop1 *iface, REFIID riid, void **obj)
Definition: gdiinterop.c:639
static HRESULT WINAPI rendertarget_sink_Close(ID2D1SimplifiedGeometrySink *iface)
Definition: gdiinterop.c:210
static void WINAPI rendertarget_sink_AddLines(ID2D1SimplifiedGeometrySink *iface, const D2D1_POINT_2F *points, UINT32 count)
Definition: gdiinterop.c:174
static void WINAPI rendertarget_sink_SetSegmentFlags(ID2D1SimplifiedGeometrySink *iface, D2D1_PATH_SEGMENT vertexFlags)
Definition: gdiinterop.c:164
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLclampf GLclampf GLclampf alpha
Definition: gl.h:1740
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint GLenum GLenum transform
Definition: glext.h:9407
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9032
GLenum src
Definition: glext.h:6340
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLuint color
Definition: glext.h:6243
GLuint index
Definition: glext.h:6031
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum mode
Definition: glext.h:6217
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLenum dst
Definition: glext.h:6340
GLint GLint bottom
Definition: glext.h:7726
GLboolean GLboolean g
Definition: glext.h:6204
GLsizei const GLfloat * points
Definition: glext.h:8112
const GLfloat * m
Definition: glext.h:10848
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
HDC hdc
Definition: main.c:9
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
Definition: mk_font.cpp:20
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
BOOL WINAPI IsRectEmpty(_In_ LPCRECT)
BOOL WINAPI IntersectRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT)
BOOL WINAPI SetRectEmpty(_Out_ LPRECT)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define calloc
Definition: rosglue.h:14
#define memset(x, y, z)
Definition: compat.h:39
LOCAL char * filetype(int t)
Definition: tree.c:114
static const char *static const char const char DWORD void DWORD *static const char const char DWORD void DWORD *static const char DWORD DWORD void * buff
Definition: shcore.c:41
#define TRACE(s)
Definition: solgame.cpp:4
D2D1_POINT_2F point1
Definition: d2d1.idl:299
D2D1_POINT_2F point3
Definition: d2d1.idl:301
D2D1_POINT_2F point2
Definition: d2d1.idl:300
IDWriteFontFace * fontFace
Definition: dwrite.idl:405
DWRITE_GLYPH_OFFSET const * glyphOffsets
Definition: dwrite.idl:410
UINT32 bidiLevel
Definition: dwrite.idl:412
FLOAT fontEmSize
Definition: dwrite.idl:406
UINT16 const * glyphIndices
Definition: dwrite.idl:408
FLOAT const * glyphAdvances
Definition: dwrite.idl:409
UINT32 glyphCount
Definition: dwrite.idl:407
BYTE lfOutPrecision
Definition: dimm.idl:68
BYTE lfItalic
Definition: dimm.idl:64
LONG lfWeight
Definition: dimm.idl:63
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
BYTE lfCharSet
Definition: dimm.idl:67
long x
Definition: dcommon.idl:24
Definition: dcommon.idl:28
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
FLOAT eDy
Definition: wingdi.h:2172
FLOAT eM11
Definition: wingdi.h:2167
FLOAT eM21
Definition: wingdi.h:2169
FLOAT eM22
Definition: wingdi.h:2170
FLOAT eM12
Definition: wingdi.h:2168
FLOAT eDx
Definition: wingdi.h:2171
Definition: uimain.c:89
int width
Definition: gdiinterop.c:38
DWORD * ptr
Definition: gdiinterop.c:36
int stride
Definition: gdiinterop.c:37
Definition: main.c:439
Definition: fci.c:123
char path[PATH_MAX]
Definition: types.h:286
LARGE_INTEGER size
Definition: gdiinterop.c:759
FILETIME writetime
Definition: gdiinterop.c:758
LONG refcount
Definition: gdiinterop.c:60
IDWriteFontFileLoader IDWriteFontFileLoader_iface
Definition: gdiinterop.c:59
IDWriteFactory7 * factory
Definition: gdiinterop.c:61
IDWriteGdiInterop1 IDWriteGdiInterop1_iface
Definition: gdiinterop.c:58
Definition: copy.c:22
IDWriteFontFileStream IDWriteFontFileStream_iface
Definition: gdiinterop.c:66
DWRITE_TEXT_ANTIALIAS_MODE antialiasmode
Definition: gdiinterop.c:48
IDWriteFactory7 * factory
Definition: gdiinterop.c:47
ID2D1SimplifiedGeometrySink ID2D1SimplifiedGeometrySink_iface
Definition: gdiinterop.c:44
DWRITE_MATRIX m
Definition: gdiinterop.c:50
float ppdip
Definition: gdiinterop.c:49
LONG refcount
Definition: gdiinterop.c:45
struct dib_data dib
Definition: gdiinterop.c:53
IDWriteBitmapRenderTarget1 IDWriteBitmapRenderTarget1_iface
Definition: gdiinterop.c:43
Definition: parse.h:23
Definition: style.c:91
USHORT biBitCount
Definition: precomp.h:34
ULONG biCompression
Definition: precomp.h:35
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1922
Definition: tools.h:99
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
float FLOAT
Definition: typedefs.h:69
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t UINT32
Definition: typedefs.h:59
uint32_t ULONG
Definition: typedefs.h:59
#define BI_RGB
Definition: uefivid.c:46
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:245
DWORD COLORREF
Definition: windef.h:100
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define DWRITE_E_NOFONT
Definition: winerror.h:7336
#define DWRITE_E_FILEFORMAT
Definition: winerror.h:7334
#define DIB_RGB_COLORS
Definition: wingdi.h:367
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
int WINAPI SetGraphicsMode(_In_ HDC, _In_ int)
Definition: dc.c:1233
#define GM_ADVANCED
Definition: wingdi.h:865
BOOL WINAPI PolyBezierTo(_In_ HDC hdc, _In_reads_(cpt) const POINT *apt, _In_ DWORD cpt)
Definition: painting.c:281
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
BOOL WINAPI MoveToEx(_In_ HDC, _In_ int, _In_ int, _Out_opt_ LPPOINT)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI FillPath(_In_ HDC)
#define DEFAULT_CHARSET
Definition: wingdi.h:384
#define LOGPIXELSX
Definition: wingdi.h:718
BOOL WINAPI SetWorldTransform(_In_ HDC, _In_ const XFORM *)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
BOOL WINAPI DeleteDC(_In_ HDC)
BOOL WINAPI EndPath(_In_ HDC)
BOOL WINAPI LineTo(_In_ HDC, _In_ int, _In_ int)
BOOL WINAPI BeginPath(_In_ HDC hdc)
BOOL WINAPI CloseFigure(_In_ HDC hdc)
int WINAPI SetPolyFillMode(_In_ HDC, _In_ int)
Definition: dc.c:1174
#define OUT_OUTLINE_PRECIS
Definition: wingdi.h:423
ULONG bpp[]
Definition: xlate.c:19
unsigned char BYTE
Definition: xxhash.c:193