ReactOS 0.4.17-dev-1133-gc25e4fd
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#ifdef _MSC_VER
79 char bmibuf[FIELD_OFFSET(BITMAPINFO, bmiColors) + 256 * sizeof(RGBQUAD)];
80#else
81 char bmibuf[FIELD_OFFSET(BITMAPINFO, bmiColors[256])];
82#endif
83 BITMAPINFO *bmi = (BITMAPINFO*)bmibuf;
85
86 target->size.cx = width;
87 target->size.cy = height;
88
89 memset(bmi, 0, sizeof(bmibuf));
90 bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
92 bmi->bmiHeader.biWidth = width;
93 bmi->bmiHeader.biBitCount = 32;
94 bmi->bmiHeader.biPlanes = 1;
96
97 hbm = CreateDIBSection(target->hdc, bmi, DIB_RGB_COLORS, (void**)&target->dib.ptr, NULL, 0);
98 if (!hbm) {
99 hbm = CreateBitmap(1, 1, 1, 1, NULL);
100 target->dib.ptr = NULL;
101 target->dib.stride = 0;
102 target->dib.width = 0;
103 }
104 else {
105 target->dib.stride = get_dib_stride(width, 32);
106 target->dib.width = width;
107 }
108
110 return S_OK;
111}
112
114{
116}
117
119{
121}
122
124{
126}
127
129{
131}
132
134{
135 if (IsEqualIID(riid, &IID_ID2D1SimplifiedGeometrySink) ||
137 {
138 *obj = iface;
139 ID2D1SimplifiedGeometrySink_AddRef(iface);
140 return S_OK;
141 }
142
143 WARN("%s not implemented.\n", debugstr_guid(riid));
144
145 *obj = NULL;
146
147 return E_NOINTERFACE;
148}
149
151{
153 return IDWriteBitmapRenderTarget1_AddRef(&target->IDWriteBitmapRenderTarget1_iface);
154}
155
157{
159 return IDWriteBitmapRenderTarget1_Release(&target->IDWriteBitmapRenderTarget1_iface);
160}
161
163{
166}
167
169{
170}
171
173{
175 MoveToEx(target->hdc, startPoint.x, startPoint.y, NULL);
176}
177
179{
181
182 while (count--)
183 {
184 LineTo(target->hdc, points->x, points->y);
185 points++;
186 }
187}
188
190{
192 POINT points[3];
193
194 while (count--)
195 {
196 points[0].x = beziers->point1.x;
197 points[0].y = beziers->point1.y;
198 points[1].x = beziers->point2.x;
199 points[1].y = beziers->point2.y;
200 points[2].x = beziers->point3.x;
201 points[2].y = beziers->point3.y;
202
203 PolyBezierTo(target->hdc, points, 3);
204 beziers++;
205 }
206}
207
209{
211 CloseFigure(target->hdc);
212}
213
215{
216 return S_OK;
217}
218
219static const ID2D1SimplifiedGeometrySinkVtbl rendertargetsinkvtbl =
220{
231};
232
234{
235 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
236
237 if (IsEqualIID(riid, &IID_IDWriteBitmapRenderTarget1) ||
238 IsEqualIID(riid, &IID_IDWriteBitmapRenderTarget) ||
240 {
241 *obj = iface;
242 IDWriteBitmapRenderTarget1_AddRef(iface);
243 return S_OK;
244 }
245
246 WARN("%s not implemented.\n", debugstr_guid(riid));
247
248 *obj = NULL;
249
250 return E_NOINTERFACE;
251}
252
254{
257
258 TRACE("%p, refcount %lu.\n", iface, refcount);
259
260 return refcount;
261}
262
264{
267
268 TRACE("%p, refcount %lu.\n", iface, refcount);
269
270 if (!refcount)
271 {
272 IDWriteFactory7_Release(target->factory);
273 DeleteDC(target->hdc);
274 free(target);
275 }
276
277 return refcount;
278}
279
280static inline DWORD *get_pixel_ptr_32(struct dib_data *dib, int x, int y)
281{
282 return (DWORD *)((BYTE*)dib->ptr + y * dib->stride + x * 4);
283}
284
286{
287 return (src * alpha + dst * (255 - alpha) + 127) / 255;
288}
289
291{
292 return blend_color(r, text >> 16, alpha[0]) << 16 |
293 blend_color(g, text >> 8, alpha[1]) << 8 |
294 blend_color(b, text, alpha[2]);
295}
296
298{
299 return blend_color(r, text >> 16, alpha) << 16 |
300 blend_color(g, text >> 8, alpha) << 8 |
302}
303
304static void blit_8(struct dib_data *dib, const BYTE *src, const RECT *rect, DWORD text_pixel)
305{
306 DWORD *dst_ptr = get_pixel_ptr_32(dib, rect->left, rect->top);
307 int x, y, src_width = rect->right - rect->left;
308
309 for (y = rect->top; y < rect->bottom; y++) {
310 for (x = 0; x < src_width; x++) {
311 if (!src[x]) continue;
312 if (src[x] == DWRITE_ALPHA_MAX)
313 dst_ptr[x] = text_pixel;
314 else
315 dst_ptr[x] = blend_pixel(dst_ptr[x] >> 16, dst_ptr[x] >> 8, dst_ptr[x], text_pixel, src[x]);
316 }
317
318 src += src_width;
319 dst_ptr += dib->stride / 4;
320 }
321}
322
323static void blit_subpixel_888(struct dib_data *dib, int dib_width, const BYTE *src,
324 const RECT *rect, DWORD text_pixel)
325{
326 DWORD *dst_ptr = get_pixel_ptr_32(dib, rect->left, rect->top);
327 int x, y, src_width = rect->right - rect->left;
328
329 for (y = rect->top; y < rect->bottom; y++) {
330 for (x = 0; x < src_width; x++) {
331 if (src[3*x] == 0 && src[3*x+1] == 0 && src[3*x+2] == 0) continue;
332 dst_ptr[x] = blend_subpixel(dst_ptr[x] >> 16, dst_ptr[x] >> 8, dst_ptr[x], text_pixel, &src[3*x]);
333 }
334 dst_ptr += dib->stride / 4;
335 src += src_width * 3;
336 }
337}
338
340{
341 return (((color >> 16) & 0xff) | (color & 0xff00) | ((color << 16) & 0xff0000));
342}
343
345 FLOAT originX, FLOAT originY, DWRITE_MEASURING_MODE measuring_mode,
347 RECT *bbox_ret)
348{
350 IDWriteGlyphRunAnalysis *analysis;
351 DWRITE_RENDERING_MODE1 rendermode;
352 DWRITE_GRID_FIT_MODE gridfitmode;
353 DWRITE_TEXTURE_TYPE texturetype;
354 DWRITE_MATRIX m, scale = { 0 };
355 IDWriteFontFace3 *fontface;
356 RECT target_rect, bounds;
357 HRESULT hr;
358
359 TRACE("%p, %.8e, %.8e, %d, %p, %p, 0x%08lx, %p.\n", iface, originX, originY,
360 measuring_mode, run, params, color, bbox_ret);
361
362 SetRectEmpty(bbox_ret);
363
364 if (!target->dib.ptr)
365 return S_OK;
366
367 if (!params)
368 return E_INVALIDARG;
369
370 if (FAILED(hr = IDWriteFontFace_QueryInterface(run->fontFace, &IID_IDWriteFontFace3, (void **)&fontface))) {
371 WARN("Failed to get IDWriteFontFace2 interface, hr %#lx.\n", hr);
372 return hr;
373 }
374
375 hr = IDWriteFontFace3_GetRecommendedRenderingMode(fontface, run->fontEmSize, target->ppdip * 96.0f,
376 target->ppdip * 96.0f, &target->m, run->isSideways, DWRITE_OUTLINE_THRESHOLD_ALIASED, measuring_mode,
377 params, &rendermode, &gridfitmode);
378 IDWriteFontFace3_Release(fontface);
379 if (FAILED(hr))
380 return hr;
381
382 SetRect(&target_rect, 0, 0, target->size.cx, target->size.cy);
383
384 if (rendermode == DWRITE_RENDERING_MODE1_OUTLINE)
385 {
386 static const XFORM identity = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
387 const DWRITE_MATRIX *m = &target->m;
388 XFORM xform;
389
390 /* target allows any transform to be set, filter it here */
391 if (m->m11 * m->m22 == m->m12 * m->m21) {
392 xform.eM11 = 1.0f;
393 xform.eM12 = 0.0f;
394 xform.eM21 = 0.0f;
395 xform.eM22 = 1.0f;
396 xform.eDx = originX;
397 xform.eDy = originY;
398 } else {
399 xform.eM11 = m->m11;
400 xform.eM12 = m->m12;
401 xform.eM21 = m->m21;
402 xform.eM22 = m->m22;
403 xform.eDx = m->m11 * originX + m->m21 * originY + m->dx;
404 xform.eDy = m->m12 * originX + m->m22 * originY + m->dy;
405 }
406 SetWorldTransform(target->hdc, &xform);
407
408 BeginPath(target->hdc);
409
410 hr = IDWriteFontFace_GetGlyphRunOutline(run->fontFace, run->fontEmSize * target->ppdip,
411 run->glyphIndices, run->glyphAdvances, run->glyphOffsets, run->glyphCount,
412 run->isSideways, run->bidiLevel & 1, &target->ID2D1SimplifiedGeometrySink_iface);
413
414 EndPath(target->hdc);
415
416 if (hr == S_OK)
417 {
418 HBRUSH brush = CreateSolidBrush(color);
419
420 SelectObject(target->hdc, brush);
421
422 FillPath(target->hdc);
423
424 /* FIXME: one way to get affected rectangle bounds is to use region fill */
425 if (bbox_ret)
426 *bbox_ret = target_rect;
427
428 DeleteObject(brush);
429 }
430
432
433 return hr;
434 }
435
436 m = target->m;
437 scale.m11 = scale.m22 = target->ppdip;
439 hr = IDWriteFactory7_CreateGlyphRunAnalysis(target->factory, run, &m, rendermode, measuring_mode,
440 gridfitmode, target->antialiasmode, originX, originY, &analysis);
441 if (FAILED(hr))
442 {
443 WARN("failed to create analysis instance, 0x%08lx\n", hr);
444 return hr;
445 }
446
447 SetRectEmpty(&bounds);
448 texturetype = DWRITE_TEXTURE_ALIASED_1x1;
449 hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_ALIASED_1x1, &bounds);
450 if (FAILED(hr) || IsRectEmpty(&bounds)) {
451 hr = IDWriteGlyphRunAnalysis_GetAlphaTextureBounds(analysis, DWRITE_TEXTURE_CLEARTYPE_3x1, &bounds);
452 if (FAILED(hr)) {
453 WARN("GetAlphaTextureBounds() failed, 0x%08lx\n", hr);
454 IDWriteGlyphRunAnalysis_Release(analysis);
455 return hr;
456 }
457 texturetype = DWRITE_TEXTURE_CLEARTYPE_3x1;
458 }
459
460 if (IntersectRect(&target_rect, &target_rect, &bounds))
461 {
462 UINT32 size = (target_rect.right - target_rect.left) * (target_rect.bottom - target_rect.top);
463 BYTE *bitmap;
464
466 if (texturetype == DWRITE_TEXTURE_CLEARTYPE_3x1)
467 size *= 3;
468 if (!(bitmap = calloc(1, size)))
469 {
470 IDWriteGlyphRunAnalysis_Release(analysis);
471 return E_OUTOFMEMORY;
472 }
473
474 hr = IDWriteGlyphRunAnalysis_CreateAlphaTexture(analysis, texturetype, &target_rect, bitmap, size);
475 if (hr == S_OK) {
476 /* blit to target dib */
477 if (texturetype == DWRITE_TEXTURE_ALIASED_1x1)
478 blit_8(&target->dib, bitmap, &target_rect, color);
479 else
480 blit_subpixel_888(&target->dib, target->size.cx, bitmap, &target_rect, color);
481
482 if (bbox_ret) *bbox_ret = target_rect;
483 }
484
485 free(bitmap);
486 }
487 else if (bbox_ret)
488 {
489 *bbox_ret = bounds;
490 }
491
492 IDWriteGlyphRunAnalysis_Release(analysis);
493
494 return S_OK;
495}
496
498{
500
501 TRACE("%p.\n", iface);
502
503 return target->hdc;
504}
505
507{
509
510 TRACE("%p.\n", iface);
511
512 return target->ppdip;
513}
514
516{
518
519 TRACE("%p, %.2f.\n", iface, ppdip);
520
521 if (ppdip <= 0.0f)
522 return E_INVALIDARG;
523
524 target->ppdip = ppdip;
525 return S_OK;
526}
527
529{
531
532 TRACE("%p, %p.\n", iface, transform);
533
534 *transform = target->m;
535 return S_OK;
536}
537
539{
541
542 TRACE("%p, %p.\n", iface, transform);
543
545 return S_OK;
546}
547
549{
551
552 TRACE("%p, %p.\n", iface, size);
553
554 *size = target->size;
555 return S_OK;
556}
557
559{
561
562 TRACE("%p, %u, %u.\n", iface, width, height);
563
564 if (target->size.cx == width && target->size.cy == height)
565 return S_OK;
566
568}
569
571{
573
574 TRACE("%p.\n", iface);
575
576 return target->antialiasmode;
577}
578
580{
582
583 TRACE("%p, %d.\n", iface, mode);
584
585 if ((DWORD)mode > DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE)
586 return E_INVALIDARG;
587
588 target->antialiasmode = mode;
589 return S_OK;
590}
591
592static const IDWriteBitmapRenderTarget1Vtbl rendertargetvtbl =
593{
607};
608
611{
612 struct rendertarget *target;
613 HRESULT hr;
614
615 *ret = NULL;
616
617 if (!(target = malloc(sizeof(*target))))
618 return E_OUTOFMEMORY;
619
620 target->IDWriteBitmapRenderTarget1_iface.lpVtbl = &rendertargetvtbl;
621 target->ID2D1SimplifiedGeometrySink_iface.lpVtbl = &rendertargetsinkvtbl;
622 target->refcount = 1;
623
627 if (FAILED(hr)) {
628 IDWriteBitmapRenderTarget1_Release(&target->IDWriteBitmapRenderTarget1_iface);
629 return hr;
630 }
631
632 target->m = identity;
633 target->ppdip = GetDeviceCaps(target->hdc, LOGPIXELSX) / 96.0f;
634 target->antialiasmode = DWRITE_TEXT_ANTIALIAS_MODE_CLEARTYPE;
635 target->factory = factory;
636 IDWriteFactory7_AddRef(factory);
637
638 *ret = (IDWriteBitmapRenderTarget*)&target->IDWriteBitmapRenderTarget1_iface;
639
640 return S_OK;
641}
642
644{
645 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
646
647 if (IsEqualIID(riid, &IID_IDWriteGdiInterop1) ||
648 IsEqualIID(riid, &IID_IDWriteGdiInterop) ||
650 {
651 *obj = iface;
652 IDWriteGdiInterop1_AddRef(iface);
653 return S_OK;
654 }
655
656 WARN("%s not implemented.\n", debugstr_guid(riid));
657
658 *obj = NULL;
659 return E_NOINTERFACE;
660}
661
663{
664 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
666
667 TRACE("%p, refcount %lu.\n", iface, refcount);
668
669 return refcount;
670}
671
673{
674 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
676
677 TRACE("%p, refcount %lu.\n", iface, refcount);
678
679 if (!refcount)
680 {
681 IDWriteFactory7_UnregisterFontFileLoader(interop->factory, &interop->IDWriteFontFileLoader_iface);
682 factory_detach_gdiinterop(interop->factory, iface);
683 free(interop);
684 }
685
686 return refcount;
687}
688
690 LOGFONTW const *logfont, IDWriteFont **font)
691{
692 TRACE("%p, %p, %p.\n", iface, logfont, font);
693
694 return IDWriteGdiInterop1_CreateFontFromLOGFONT(iface, logfont, NULL, font);
695}
696
698 IDWriteFont *font, LOGFONTW *logfont, BOOL *is_systemfont)
699{
701 IDWriteFontFamily *family;
702 HRESULT hr;
703
704 TRACE("%p, %p, %p, %p.\n", iface, font, logfont, is_systemfont);
705
706 *is_systemfont = FALSE;
707
708 memset(logfont, 0, sizeof(*logfont));
709
710 if (!font)
711 return E_INVALIDARG;
712
713 hr = IDWriteFont_GetFontFamily(font, &family);
714 if (FAILED(hr))
715 return hr;
716
717 hr = IDWriteFontFamily_GetFontCollection(family, &collection);
718 IDWriteFontFamily_Release(family);
719 if (FAILED(hr))
720 return hr;
721
722 *is_systemfont = is_system_collection(collection);
723 IDWriteFontCollection_Release(collection);
724
725 get_logfont_from_font(font, logfont);
726 logfont->lfCharSet = DEFAULT_CHARSET;
728
729 return hr;
730}
731
733 IDWriteFontFace *fontface, LOGFONTW *logfont)
734{
735 TRACE("%p, %p, %p.\n", iface, fontface, logfont);
736
737 memset(logfont, 0, sizeof(*logfont));
738
739 if (!fontface)
740 return E_INVALIDARG;
741
742 get_logfont_from_fontface(fontface, logfont);
743 logfont->lfCharSet = DEFAULT_CHARSET;
745
746 return S_OK;
747}
748
750{
758};
759
761{
765};
766
767/* Undocumented gdi32 exports, used to access actually selected font information */
769extern BOOL WINAPI GetFontFileInfo(DWORD instance_id, DWORD file_index, struct font_fileinfo *info, SIZE_T size, SIZE_T *needed);
770extern BOOL WINAPI GetFontFileData(DWORD instance_id, DWORD file_index, UINT64 offset, void *buff, SIZE_T buff_size);
771
773 HDC hdc, IDWriteFontFace **fontface)
774{
775 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
777 struct font_fileinfo *fileinfo;
779 DWRITE_FONT_FACE_TYPE facetype;
781 BOOL is_supported;
782 UINT32 facenum;
783 SIZE_T needed;
784 HRESULT hr;
785
786 TRACE("%p, %p, %p.\n", iface, hdc, fontface);
787
788 *fontface = NULL;
789
790 if (!hdc)
791 return E_INVALIDARG;
792
793 /* get selected font id */
794 info.size = sizeof(info);
796 WARN("failed to get selected font id\n");
797 return E_FAIL;
798 }
799
800 needed = 0;
801 GetFontFileInfo(info.instance_id, 0, NULL, 0, &needed);
802 if (needed == 0) {
803 WARN("failed to get font file info size\n");
804 return E_FAIL;
805 }
806
807 if (!(fileinfo = malloc(needed)))
808 return E_OUTOFMEMORY;
809
810 if (!GetFontFileInfo(info.instance_id, 0, fileinfo, needed, &needed))
811 {
812 free(fileinfo);
813 return E_FAIL;
814 }
815
816 if (*fileinfo->path)
817 hr = IDWriteFactory7_CreateFontFileReference(interop->factory, fileinfo->path, &fileinfo->writetime, &file);
818 else
819 hr = IDWriteFactory7_CreateCustomFontFileReference(interop->factory, &info.instance_id,
820 sizeof(info.instance_id), &interop->IDWriteFontFileLoader_iface, &file);
821
822 free(fileinfo);
823 if (FAILED(hr))
824 return hr;
825
826 is_supported = FALSE;
827 hr = IDWriteFontFile_Analyze(file, &is_supported, &filetype, &facetype, &facenum);
828 if (SUCCEEDED(hr)) {
829 if (is_supported)
830 /* Simulations flags values match DWRITE_FONT_SIMULATIONS */
831 hr = IDWriteFactory7_CreateFontFace(interop->factory, facetype, 1, &file, info.face_index,
832 info.simulations, fontface);
833 else
835 }
836
837 IDWriteFontFile_Release(file);
838 return hr;
839}
840
843{
844 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
845
846 TRACE("%p, %p, %u, %u, %p.\n", iface, hdc, width, height, target);
847
848 return create_rendertarget(interop->factory, hdc, width, height, target);
849}
850
853{
854 struct gdiinterop *interop = impl_from_IDWriteGdiInterop1(iface);
855 IDWriteFontFamily *family;
857 BOOL exists = FALSE;
859 HRESULT hr;
860
861 TRACE("%p, %p, %p, %p.\n", iface, logfont, collection, font);
862
863 *font = NULL;
864
865 if (!logfont) return E_INVALIDARG;
866
867 if (collection)
868 IDWriteFontCollection_AddRef(collection);
869 else {
870 hr = IDWriteFactory5_GetSystemFontCollection((IDWriteFactory5 *)interop->factory, FALSE, (IDWriteFontCollection1 **)&collection, FALSE);
871 if (FAILED(hr)) {
872 ERR("failed to get system font collection: 0x%08lx.\n", hr);
873 return hr;
874 }
875 }
876
877 hr = IDWriteFontCollection_FindFamilyName(collection, logfont->lfFaceName, &index, &exists);
878 if (FAILED(hr))
879 goto done;
880
881 if (!exists) {
883 goto done;
884 }
885
886 hr = IDWriteFontCollection_GetFontFamily(collection, index, &family);
887 if (FAILED(hr))
888 goto done;
889
891 hr = IDWriteFontFamily_GetFirstMatchingFont(family, logfont->lfWeight, DWRITE_FONT_STRETCH_NORMAL, style, font);
892 IDWriteFontFamily_Release(family);
893
894done:
895 IDWriteFontCollection_Release(collection);
896 return hr;
897}
898
900 FONTSIGNATURE *fontsig)
901{
902 TRACE("%p, %p, %p.\n", iface, fontface, fontsig);
903
904 return get_fontsig_from_fontface(fontface, fontsig);
905}
906
908{
909 TRACE("%p, %p, %p.\n", iface, font, fontsig);
910
911 if (!font)
912 return E_INVALIDARG;
913
914 return get_fontsig_from_font(font, fontsig);
915}
916
918 IDWriteFontSet *fontset, IDWriteFontSet **subset)
919{
921
922 TRACE("%p, %p, %p, %p.\n", iface, logfont, fontset, subset);
923
924 if (!logfont || !fontset)
925 return E_INVALIDARG;
926
927 property.propertyId = DWRITE_FONT_PROPERTY_ID_WIN32_FAMILY_NAME;
928 property.propertyValue = logfont->lfFaceName;
929 property.localeName = L"";
930
931 return IDWriteFontSet_GetMatchingFonts(fontset, &property, 1, subset);
932}
933
934static const IDWriteGdiInterop1Vtbl gdiinteropvtbl =
935{
948};
949
951{
952 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
953
954 if (IsEqualIID(&IID_IDWriteFontFileStream, riid) || IsEqualIID(&IID_IUnknown, riid)) {
955 *out = iface;
956 IDWriteFontFileStream_AddRef(iface);
957 return S_OK;
958 }
959
960 *out = NULL;
961 WARN("Unsupported interface %s.\n", debugstr_guid(riid));
962 return E_NOINTERFACE;
963}
964
966{
969
970 TRACE("%p, refcount %ld.\n", iface, refcount);
971
972 return refcount;
973}
974
976{
979
980 TRACE("%p, refcount %ld.\n", iface, refcount);
981
982 if (!refcount)
983 free(stream);
984
985 return refcount;
986}
987
989 UINT64 offset, UINT64 fragment_size, void **fragment_context)
990{
992 struct font_fileinfo fileinfo;
993 void *fragment;
994
995 TRACE("%p, %p, %s, %s, %p.\n", iface, fragment_start, wine_dbgstr_longlong(offset),
996 wine_dbgstr_longlong(fragment_size), fragment_context);
997
998 *fragment_context = NULL;
999 *fragment_start = NULL;
1000
1001 if (!GetFontFileInfo(stream->key, 0, &fileinfo, sizeof(fileinfo), NULL))
1002 return E_INVALIDARG;
1003
1004 if ((offset >= fileinfo.size.QuadPart - 1) || (fragment_size > fileinfo.size.QuadPart - offset))
1005 return E_INVALIDARG;
1006
1007 if (!(fragment = malloc(fragment_size)))
1008 return E_OUTOFMEMORY;
1009
1010 if (!GetFontFileData(stream->key, 0, offset, fragment, fragment_size))
1011 return E_FAIL;
1012
1013 *fragment_start = *fragment_context = fragment;
1014 return S_OK;
1015}
1016
1017static void WINAPI memresourcestream_ReleaseFileFragment(IDWriteFontFileStream *iface, void *fragment_context)
1018{
1019 TRACE("%p, %p.\n", iface, fragment_context);
1020
1021 free(fragment_context);
1022}
1023
1025{
1027 struct font_fileinfo fileinfo;
1028
1029 TRACE("%p, %p.\n", iface, size);
1030
1031 if (!GetFontFileInfo(stream->key, 0, &fileinfo, sizeof(fileinfo), NULL))
1032 return E_INVALIDARG;
1033
1034 *size = fileinfo.size.QuadPart;
1035
1036 return S_OK;
1037}
1038
1040{
1041 TRACE("%p, %p.\n", iface, last_writetime);
1042
1043 return E_NOTIMPL;
1044}
1045
1046static const IDWriteFontFileStreamVtbl memresourcestreamvtbl =
1047{
1055};
1056
1058{
1059 TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
1060
1061 if (IsEqualIID(&IID_IDWriteFontFileLoader, riid) || IsEqualIID(&IID_IUnknown, riid)) {
1062 *out = iface;
1063 IDWriteFontFileLoader_AddRef(iface);
1064 return S_OK;
1065 }
1066
1067 *out = NULL;
1068 WARN("Unsupported interface %s.\n", debugstr_guid(riid));
1069 return E_NOINTERFACE;
1070}
1071
1073{
1074 return 2;
1075}
1076
1078{
1079 return 1;
1080}
1081
1083 UINT32 key_size, IDWriteFontFileStream **ret)
1084{
1085 struct memresource_stream *stream;
1086
1087 TRACE("%p, %p, %u, %p.\n", iface, key, key_size, ret);
1088
1089 *ret = NULL;
1090
1091 if (!key || key_size != sizeof(DWORD))
1092 return E_INVALIDARG;
1093
1094 if (!(stream = malloc(sizeof(*stream))))
1095 return E_OUTOFMEMORY;
1096
1097 stream->IDWriteFontFileStream_iface.lpVtbl = &memresourcestreamvtbl;
1098 stream->refcount = 1;
1099 memcpy(&stream->key, key, sizeof(stream->key));
1100
1101 *ret = &stream->IDWriteFontFileStream_iface;
1102
1103 return S_OK;
1104}
1105
1106static const IDWriteFontFileLoaderVtbl memresourceloadervtbl =
1107{
1112};
1113
1115{
1116 struct gdiinterop *interop;
1117
1118 *ret = NULL;
1119
1120 if (!(interop = malloc(sizeof(*interop))))
1121 return E_OUTOFMEMORY;
1122
1123 interop->IDWriteGdiInterop1_iface.lpVtbl = &gdiinteropvtbl;
1125 interop->refcount = 1;
1126 interop->factory = factory;
1127 IDWriteFactory7_AddRef(interop->factory);
1128 IDWriteFactory7_RegisterFontFileLoader(factory, &interop->IDWriteFontFileLoader_iface);
1129
1130 *ret = &interop->IDWriteGdiInterop1_iface;
1131 return S_OK;
1132}
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
ULONG RGBQUAD
Definition: precomp.h:47
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:697
static HRESULT WINAPI gdiinterop1_GetFontSignature_(IDWriteGdiInterop1 *iface, IDWriteFontFace *fontface, FONTSIGNATURE *fontsig)
Definition: gdiinterop.c:899
static ULONG WINAPI rendertarget_sink_Release(ID2D1SimplifiedGeometrySink *iface)
Definition: gdiinterop.c:156
static HRESULT WINAPI gdiinterop1_CreateFontFromLOGFONT(IDWriteGdiInterop1 *iface, LOGFONTW const *logfont, IDWriteFontCollection *collection, IDWriteFont **font)
Definition: gdiinterop.c:851
static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop1 *iface, LOGFONTW const *logfont, IDWriteFont **font)
Definition: gdiinterop.c:689
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:1039
static DWORD colorref_to_pixel_888(COLORREF color)
Definition: gdiinterop.c:339
static HRESULT create_rendertarget(IDWriteFactory7 *factory, HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **ret)
Definition: gdiinterop.c:609
static HRESULT WINAPI memresourcestream_GetFileSize(IDWriteFontFileStream *iface, UINT64 *size)
Definition: gdiinterop.c:1024
static HRESULT WINAPI rendertarget_SetPixelsPerDip(IDWriteBitmapRenderTarget1 *iface, float ppdip)
Definition: gdiinterop.c:515
static ULONG WINAPI rendertarget_Release(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:263
static HRESULT WINAPI memresourcestream_QueryInterface(IDWriteFontFileStream *iface, REFIID riid, void **out)
Definition: gdiinterop.c:950
static void WINAPI rendertarget_sink_EndFigure(ID2D1SimplifiedGeometrySink *iface, D2D1_FIGURE_END figureEnd)
Definition: gdiinterop.c:208
static ULONG WINAPI rendertarget_AddRef(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:253
static const IDWriteFontFileStreamVtbl memresourcestreamvtbl
Definition: gdiinterop.c:1046
static HRESULT WINAPI memresourceloader_QueryInterface(IDWriteFontFileLoader *iface, REFIID riid, void **out)
Definition: gdiinterop.c:1057
static HDC WINAPI rendertarget_GetMemoryDC(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:497
static ULONG WINAPI memresourceloader_Release(IDWriteFontFileLoader *iface)
Definition: gdiinterop.c:1077
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:344
static struct memresource_stream * impl_from_IDWriteFontFileStream(IDWriteFontFileStream *iface)
Definition: gdiinterop.c:128
static struct rendertarget * impl_from_ID2D1SimplifiedGeometrySink(ID2D1SimplifiedGeometrySink *iface)
Definition: gdiinterop.c:118
static HRESULT WINAPI gdiinterop1_GetFontSignature(IDWriteGdiInterop1 *iface, IDWriteFont *font, FONTSIGNATURE *fontsig)
Definition: gdiinterop.c:907
static void WINAPI rendertarget_sink_BeginFigure(ID2D1SimplifiedGeometrySink *iface, D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin)
Definition: gdiinterop.c:172
static void WINAPI memresourcestream_ReleaseFileFragment(IDWriteFontFileStream *iface, void *fragment_context)
Definition: gdiinterop.c:1017
static DWORD blend_pixel(BYTE r, BYTE g, BYTE b, DWORD text, BYTE alpha)
Definition: gdiinterop.c:297
static const IDWriteBitmapRenderTarget1Vtbl rendertargetvtbl
Definition: gdiinterop.c:592
static HRESULT WINAPI gdiinterop_CreateBitmapRenderTarget(IDWriteGdiInterop1 *iface, HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget **target)
Definition: gdiinterop.c:841
static DWRITE_TEXT_ANTIALIAS_MODE WINAPI rendertarget_GetTextAntialiasMode(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:570
static HRESULT WINAPI gdiinterop_ConvertFontFaceToLOGFONT(IDWriteGdiInterop1 *iface, IDWriteFontFace *fontface, LOGFONTW *logfont)
Definition: gdiinterop.c:732
static ULONG WINAPI rendertarget_sink_AddRef(ID2D1SimplifiedGeometrySink *iface)
Definition: gdiinterop.c:150
static const IDWriteFontFileLoaderVtbl memresourceloadervtbl
Definition: gdiinterop.c:1106
HRESULT create_gdiinterop(IDWriteFactory7 *factory, IDWriteGdiInterop1 **ret)
Definition: gdiinterop.c:1114
BOOL WINAPI GetFontRealizationInfo(HDC hdc, struct font_realization_info *info)
static ULONG WINAPI memresourcestream_Release(IDWriteFontFileStream *iface)
Definition: gdiinterop.c:975
static DWORD blend_subpixel(BYTE r, BYTE g, BYTE b, DWORD text, const BYTE *alpha)
Definition: gdiinterop.c:290
static HRESULT WINAPI memresourceloader_CreateStreamFromKey(IDWriteFontFileLoader *iface, void const *key, UINT32 key_size, IDWriteFontFileStream **ret)
Definition: gdiinterop.c:1082
static HRESULT WINAPI rendertarget_sink_QueryInterface(ID2D1SimplifiedGeometrySink *iface, REFIID riid, void **obj)
Definition: gdiinterop.c:133
static ULONG WINAPI memresourcestream_AddRef(IDWriteFontFileStream *iface)
Definition: gdiinterop.c:965
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:917
static DWORD * get_pixel_ptr_32(struct dib_data *dib, int x, int y)
Definition: gdiinterop.c:280
static void WINAPI rendertarget_sink_AddBeziers(ID2D1SimplifiedGeometrySink *iface, const D2D1_BEZIER_SEGMENT *beziers, UINT32 count)
Definition: gdiinterop.c:189
static HRESULT WINAPI memresourcestream_ReadFileFragment(IDWriteFontFileStream *iface, void const **fragment_start, UINT64 offset, UINT64 fragment_size, void **fragment_context)
Definition: gdiinterop.c:988
static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop1 *iface, HDC hdc, IDWriteFontFace **fontface)
Definition: gdiinterop.c:772
static ULONG WINAPI gdiinterop_AddRef(IDWriteGdiInterop1 *iface)
Definition: gdiinterop.c:662
static void WINAPI rendertarget_sink_SetFillMode(ID2D1SimplifiedGeometrySink *iface, D2D1_FILL_MODE mode)
Definition: gdiinterop.c:162
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:548
static void blit_subpixel_888(struct dib_data *dib, int dib_width, const BYTE *src, const RECT *rect, DWORD text_pixel)
Definition: gdiinterop.c:323
static HRESULT WINAPI rendertarget_SetCurrentTransform(IDWriteBitmapRenderTarget1 *iface, DWRITE_MATRIX const *transform)
Definition: gdiinterop.c:538
static HRESULT WINAPI rendertarget_GetCurrentTransform(IDWriteBitmapRenderTarget1 *iface, DWRITE_MATRIX *transform)
Definition: gdiinterop.c:528
static const IDWriteGdiInterop1Vtbl gdiinteropvtbl
Definition: gdiinterop.c:934
static HRESULT WINAPI rendertarget_SetTextAntialiasMode(IDWriteBitmapRenderTarget1 *iface, DWRITE_TEXT_ANTIALIAS_MODE mode)
Definition: gdiinterop.c:579
static void blit_8(struct dib_data *dib, const BYTE *src, const RECT *rect, DWORD text_pixel)
Definition: gdiinterop.c:304
static struct rendertarget * impl_from_IDWriteBitmapRenderTarget1(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:113
static HRESULT WINAPI rendertarget_QueryInterface(IDWriteBitmapRenderTarget1 *iface, REFIID riid, void **obj)
Definition: gdiinterop.c:233
static float WINAPI rendertarget_GetPixelsPerDip(IDWriteBitmapRenderTarget1 *iface)
Definition: gdiinterop.c:506
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:672
static const ID2D1SimplifiedGeometrySinkVtbl rendertargetsinkvtbl
Definition: gdiinterop.c:219
static struct gdiinterop * impl_from_IDWriteGdiInterop1(IDWriteGdiInterop1 *iface)
Definition: gdiinterop.c:123
static HRESULT WINAPI rendertarget_Resize(IDWriteBitmapRenderTarget1 *iface, UINT32 width, UINT32 height)
Definition: gdiinterop.c:558
static BYTE blend_color(BYTE dst, BYTE src, BYTE alpha)
Definition: gdiinterop.c:285
static ULONG WINAPI memresourceloader_AddRef(IDWriteFontFileLoader *iface)
Definition: gdiinterop.c:1072
static HRESULT WINAPI gdiinterop_QueryInterface(IDWriteGdiInterop1 *iface, REFIID riid, void **obj)
Definition: gdiinterop.c:643
static HRESULT WINAPI rendertarget_sink_Close(ID2D1SimplifiedGeometrySink *iface)
Definition: gdiinterop.c:214
static void WINAPI rendertarget_sink_AddLines(ID2D1SimplifiedGeometrySink *iface, const D2D1_POINT_2F *points, UINT32 count)
Definition: gdiinterop.c:178
static void WINAPI rendertarget_sink_SetSegmentFlags(ID2D1SimplifiedGeometrySink *iface, D2D1_PATH_SEGMENT vertexFlags)
Definition: gdiinterop.c:168
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 GLenum dst
Definition: glext.h:6340
GLint GLint bottom
Definition: glext.h:7726
GLboolean GLboolean g
Definition: glext.h:6204
GLenum const GLfloat * params
Definition: glext.h:5645
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:2804
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:763
FILETIME writetime
Definition: gdiinterop.c:762
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