ReactOS 0.4.17-dev-923-g4c9a150
command_list.c
Go to the documentation of this file.
1/*
2 * Copyright 2022 Nikolay Sivov for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "d2d1_private.h"
20
22
24{
26};
27
29{
52};
53
55{
57 size_t size;
58};
59
61{
62 struct d2d_command c;
64};
65
67{
68 struct d2d_command c;
70};
71
73{
74 struct d2d_command c;
76};
77
79{
80 struct d2d_command c;
82};
83
85{
86 struct d2d_command c;
88};
89
91{
92 struct d2d_command c;
94};
95
97{
98 struct d2d_command c;
100};
101
103{
106};
107
109{
113};
114
116{
120};
121
123{
129};
130
132{
138};
139
141{
147};
148
150{
154};
155
157{
163};
164
166{
171};
172
174{
178};
179
181{
188};
189
191{
193 float opacity;
199};
200
202{
209};
210
212{
214}
215
217{
218 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
219
220 if (IsEqualGUID(iid, &IID_ID2D1CommandList)
221 || IsEqualGUID(iid, &IID_ID2D1Image)
222 || IsEqualGUID(iid, &IID_ID2D1Resource)
223 || IsEqualGUID(iid, &IID_IUnknown))
224 {
225 ID2D1CommandList_AddRef(iface);
226 *out = iface;
227 return S_OK;
228 }
229
230 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
231
232 *out = NULL;
233 return E_NOINTERFACE;
234}
235
237{
238 struct d2d_command_list *command_list = impl_from_ID2D1CommandList(iface);
240
241 TRACE("%p increasing refcount to %lu.\n", iface, refcount);
242
243 return refcount;
244}
245
247{
248 struct d2d_command_list *command_list = impl_from_ID2D1CommandList(iface);
250 size_t i;
251
252 TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
253
254 if (!refcount)
255 {
256 ID2D1Factory_Release(command_list->factory);
257 for (i = 0; i < command_list->objects_count; ++i)
258 IUnknown_Release(command_list->objects[i]);
259 free(command_list->objects);
260 free(command_list->data);
261 free(command_list);
262 }
263
264 return refcount;
265}
266
268{
269 struct d2d_command_list *command_list = impl_from_ID2D1CommandList(iface);
270
271 TRACE("iface %p, factory %p.\n", iface, factory);
272
273 ID2D1Factory_AddRef(*factory = command_list->factory);
274}
275
277{
278 struct d2d_command_list *command_list = impl_from_ID2D1CommandList(iface);
279 const void *data, *end;
280 HRESULT hr;
281
282 TRACE("iface %p, sink %p.\n", iface, sink);
283
284 if (command_list->state != D2D_COMMAND_LIST_STATE_CLOSED) return S_OK;
285
286 if (FAILED(hr = ID2D1CommandSink_BeginDraw(sink)))
287 return hr;
288
289 data = command_list->data;
290 end = (char *)command_list->data + command_list->size;
291 while (data < end)
292 {
293 const struct d2d_command *command = data;
294
295 switch (command->op)
296 {
298 {
299 const struct d2d_command_set_antialias_mode *c = data;
300 hr = ID2D1CommandSink_SetAntialiasMode(sink, c->mode);
301 break;
302 }
304 {
305 const struct d2d_command_set_tags *c = data;
306 hr = ID2D1CommandSink_SetTags(sink, c->tag1, c->tag2);
307 break;
308 }
310 {
312 hr = ID2D1CommandSink_SetTextAntialiasMode(sink, c->mode);
313 break;
314 }
316 {
318 hr = ID2D1CommandSink_SetTextRenderingParams(sink, c->params);
319 break;
320 }
322 {
323 const struct d2d_command_set_transform *c = data;
324 hr = ID2D1CommandSink_SetTransform(sink, &c->transform);
325 break;
326 }
328 {
329 const struct d2d_command_set_primitive_blend *c = data;
330 ID2D1CommandSink1 *sink1;
331 ID2D1CommandSink4 *sink4;
332
333 switch (c->primitive_blend)
334 {
337 hr = ID2D1CommandSink_SetPrimitiveBlend(sink, c->primitive_blend);
338 break;
341 if (SUCCEEDED(ID2D1CommandSink_QueryInterface(sink, &IID_ID2D1CommandSink1, (void **)&sink1)))
342 {
343 hr = ID2D1CommandSink1_SetPrimitiveBlend1(sink1, c->primitive_blend);
344 ID2D1CommandSink1_Release(sink1);
345 }
346 else
347 hr = ID2D1CommandSink_SetPrimitiveBlend(sink, D2D1_PRIMITIVE_BLEND_SOURCE_OVER);
348 break;
350 if (SUCCEEDED(ID2D1CommandSink_QueryInterface(sink, &IID_ID2D1CommandSink4, (void **)&sink4)))
351 {
352 hr = ID2D1CommandSink4_SetPrimitiveBlend2(sink4, c->primitive_blend);
353 ID2D1CommandSink4_Release(sink4);
354 }
355 else
356 hr = ID2D1CommandSink_SetPrimitiveBlend(sink, D2D1_PRIMITIVE_BLEND_SOURCE_OVER);
357 break;
358 default:
359 FIXME("Unexpected blend mode %u.\n", c->primitive_blend);
361 }
362 break;
363 }
365 {
366 const struct d2d_command_set_unit_mode *c = data;
367 hr = ID2D1CommandSink_SetUnitMode(sink, c->mode);
368 break;
369 }
371 {
372 const struct d2d_command_clear *c = data;
373 hr = ID2D1CommandSink_Clear(sink, &c->color);
374 break;
375 }
377 {
378 const struct d2d_command_draw_glyph_run *c = data;
379 hr = ID2D1CommandSink_DrawGlyphRun(sink, c->origin, &c->run, c->run_desc, c->brush, c->measuring_mode);
380 break;
381 }
383 {
384 const struct d2d_command_draw_line *c = data;
385 hr = ID2D1CommandSink_DrawLine(sink, c->p0, c->p1, c->brush, c->stroke_width,
386 c->stroke_style);
387 break;
388 }
390 {
391 const struct d2d_command_draw_geometry *c = data;
392 hr = ID2D1CommandSink_DrawGeometry(sink, c->geometry, c->brush, c->stroke_width,
393 c->stroke_style);
394 break;
395 }
397 {
398 const struct d2d_command_draw_rectangle *c = data;
399 hr = ID2D1CommandSink_DrawRectangle(sink, &c->rect, c->brush, c->stroke_width,
400 c->stroke_style);
401 break;
402 }
404 {
405 const struct d2d_command_draw_bitmap *c = data;
406 hr = ID2D1CommandSink_DrawBitmap(sink, c->bitmap, c->dst_rect, c->opacity,
407 c->interpolation_mode, c->src_rect, c->perspective_transform);
408 break;
409 }
411 {
412 const struct d2d_command_draw_image *c = data;
413 hr = ID2D1CommandSink_DrawImage(sink, c->image, c->target_offset, c->image_rect,
414 c->interpolation_mode, c->composite_mode);
415 break;
416 }
418 {
419 const struct d2d_command_fill_mesh *c = data;
420 hr = ID2D1CommandSink_FillMesh(sink, c->mesh, c->brush);
421 break;
422 }
424 {
425 const struct d2d_command_fill_opacity_mask *c = data;
426 hr = ID2D1CommandSink_FillOpacityMask(sink, c->bitmap, c->brush, c->dst_rect, c->src_rect);
427 break;
428 }
430 {
431 const struct d2d_command_fill_geometry *c = data;
432 hr = ID2D1CommandSink_FillGeometry(sink, c->geometry, c->brush, c->opacity_brush);
433 break;
434 }
436 {
437 const struct d2d_command_fill_rectangle *c = data;
438 hr = ID2D1CommandSink_FillRectangle(sink, &c->rect, c->brush);
439 break;
440 }
442 {
443 const struct d2d_command_push_clip *c = data;
444 hr = ID2D1CommandSink_PushAxisAlignedClip(sink, &c->rect, c->mode);
445 break;
446 }
448 {
449 const struct d2d_command_push_layer *c = data;
450 hr = ID2D1CommandSink_PushLayer(sink, &c->params, c->layer);
451 break;
452 }
454 hr = ID2D1CommandSink_PopAxisAlignedClip(sink);
455 break;
457 hr = ID2D1CommandSink_PopLayer(sink);
458 break;
459 default:
460 FIXME("Unhandled command %u.\n", command->op);
462 }
463
464 if (FAILED(hr)) return hr;
465
466 data = (char *)data + command->size;
467 }
468
469 return ID2D1CommandSink_EndDraw(sink);
470}
471
473{
474 struct d2d_command_list *command_list = impl_from_ID2D1CommandList(iface);
475
476 FIXME("iface %p stub.\n", iface);
477
478 if (command_list->state != D2D_COMMAND_LIST_STATE_OPEN)
479 return D2DERR_WRONG_STATE;
480
481 command_list->state = D2D_COMMAND_LIST_STATE_CLOSED;
482
483 /* FIXME: reset as a target */
484
485 return S_OK;
486}
487
488static const ID2D1CommandListVtbl d2d_command_list_vtbl =
489{
496};
497
499{
500 if (!(*command_list = calloc(1, sizeof(**command_list))))
501 return E_OUTOFMEMORY;
502
503 (*command_list)->ID2D1CommandList_iface.lpVtbl = &d2d_command_list_vtbl;
504 (*command_list)->refcount = 1;
505 ID2D1Factory_AddRef((*command_list)->factory = factory);
506
507 TRACE("Created command list %p.\n", *command_list);
508
509 return S_OK;
510}
511
513{
514 if (!iface)
515 return NULL;
516 assert(iface->lpVtbl == (ID2D1CommandListVtbl *)&d2d_command_list_vtbl);
518}
519
520static void * d2d_command_list_require_space(struct d2d_command_list *command_list, size_t size)
521{
522 struct d2d_command *command;
523
524 if (!d2d_array_reserve(&command_list->data, &command_list->capacity, command_list->size + size, 1))
525 return NULL;
526
527 command = (struct d2d_command *)((char *)command_list->data + command_list->size);
528 command->size = size;
529
530 command_list->size += size;
531
532 return command;
533}
534
535static void d2d_command_list_reference_object(struct d2d_command_list *command_list, void *object)
536{
538
539 if (!obj) return;
540
541 if (!d2d_array_reserve((void **)&command_list->objects, &command_list->objects_capacity,
542 command_list->objects_count + 1, sizeof(*command_list->objects)))
543 {
544 return;
545 }
546
547 command_list->objects[command_list->objects_count++] = obj;
548 IUnknown_AddRef(obj);
549}
550
552 const struct d2d_device_context *ctx, ID2D1Brush *orig_brush, ID2D1Brush **ret)
553{
554 ID2D1DeviceContext *context = (ID2D1DeviceContext *)&ctx->ID2D1DeviceContext6_iface;
555 struct d2d_brush *brush = unsafe_impl_from_ID2D1Brush(orig_brush);
558 D2D1_BITMAP_BRUSH_PROPERTIES1 bitmap_properties;
559 D2D1_IMAGE_BRUSH_PROPERTIES image_properties;
560 D2D1_BRUSH_PROPERTIES properties;
561 HRESULT hr;
562
563 properties.opacity = brush->opacity;
564 properties.transform = brush->transform;
565
566 switch (brush->type)
567 {
569 hr = ID2D1DeviceContext_CreateSolidColorBrush(context, &brush->u.solid.color,
570 &properties, (ID2D1SolidColorBrush **)ret);
571 break;
573 linear_properties.startPoint = brush->u.linear.start;
574 linear_properties.endPoint = brush->u.linear.end;
575 hr = ID2D1DeviceContext_CreateLinearGradientBrush(context, &linear_properties,
576 &properties, &brush->u.linear.gradient->ID2D1GradientStopCollection_iface,
578 break;
580 radial_properties.center = brush->u.radial.centre;
581 radial_properties.gradientOriginOffset = brush->u.radial.offset;
582 radial_properties.radiusX = brush->u.radial.radius.x;
583 radial_properties.radiusY = brush->u.radial.radius.y;
584 hr = ID2D1DeviceContext_CreateRadialGradientBrush(context, &radial_properties,
585 &properties, &brush->u.radial.gradient->ID2D1GradientStopCollection_iface,
587 break;
589 bitmap_properties.extendModeX = brush->u.bitmap.extend_mode_x;
590 bitmap_properties.extendModeY = brush->u.bitmap.extend_mode_y;
591 bitmap_properties.interpolationMode = brush->u.bitmap.interpolation_mode;
592 hr = ID2D1DeviceContext_CreateBitmapBrush(context, (ID2D1Bitmap *)&brush->u.bitmap.bitmap->ID2D1Bitmap1_iface,
593 &bitmap_properties, &properties, (ID2D1BitmapBrush1 **)ret);
594 break;
596 image_properties.sourceRectangle = brush->u.image.source_rect;
597 image_properties.extendModeX = brush->u.image.extend_mode_x;
598 image_properties.extendModeY = brush->u.image.extend_mode_y;
599 image_properties.interpolationMode = brush->u.image.interpolation_mode;
600 hr = ID2D1DeviceContext_CreateImageBrush(context, brush->u.image.image,
601 &image_properties, &properties, (ID2D1ImageBrush **)ret);
602 break;
603 default:
604 FIXME("Unsupported brush type %u.\n", brush->type);
605 return E_UNEXPECTED;
606 }
607
608 if (SUCCEEDED(hr))
609 {
611 ID2D1Brush_Release(*ret);
612 }
613
614 return hr;
615}
616
619{
621
622 command = d2d_command_list_require_space(command_list, sizeof(*command));
624 command->mode = mode;
625}
626
628 D2D1_PRIMITIVE_BLEND primitive_blend)
629{
631
632 command = d2d_command_list_require_space(command_list, sizeof(*command));
634 command->primitive_blend = primitive_blend;
635}
636
638{
640
641 command = d2d_command_list_require_space(command_list, sizeof(*command));
643 command->mode = mode;
644}
645
648{
650
651 command = d2d_command_list_require_space(command_list, sizeof(*command));
653 command->mode = mode;
654}
655
656void d2d_command_list_set_tags(struct d2d_command_list *command_list, D2D1_TAG tag1, D2D1_TAG tag2)
657{
659
660 command = d2d_command_list_require_space(command_list, sizeof(*command));
662 command->tag1 = tag1;
663 command->tag2 = tag2;
664}
665
668{
670
671 command = d2d_command_list_require_space(command_list, sizeof(*command));
673 command->transform = *transform;
674}
675
677 const struct d2d_device_context *context)
678{
679 if (command_list->state != D2D_COMMAND_LIST_STATE_INITIAL)
680 {
681 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
682 return;
683 }
684
685 d2d_command_list_set_antialias_mode(command_list, context->drawing_state.antialiasMode);
686 d2d_command_list_set_primitive_blend(command_list, context->drawing_state.primitiveBlend);
687 d2d_command_list_set_unit_mode(command_list, context->drawing_state.unitMode);
688 d2d_command_list_set_text_antialias_mode(command_list, context->drawing_state.textAntialiasMode);
689 d2d_command_list_set_tags(command_list, context->drawing_state.tag1, context->drawing_state.tag2);
690 d2d_command_list_set_transform(command_list, &context->drawing_state.transform);
691 d2d_command_list_set_text_rendering_params(command_list, context->text_rendering_params);
692
693 command_list->state = D2D_COMMAND_LIST_STATE_OPEN;
694}
695
698{
700
701 command = d2d_command_list_require_space(command_list, sizeof(*command));
703 command->rect = *rect;
704 command->mode = mode;
705}
706
708{
709 struct d2d_command *command;
710
711 command = d2d_command_list_require_space(command_list, sizeof(*command));
713}
714
717{
719 ID2D1Brush *opacity_brush = NULL;
720
721 if (params->opacityBrush && FAILED(d2d_command_list_create_brush(command_list, context,
722 params->opacityBrush, &opacity_brush)))
723 {
724 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
725 return;
726 }
727
729 d2d_command_list_reference_object(command_list, params->geometricMask);
730
731 command = d2d_command_list_require_space(command_list, sizeof(*command));
733 command->params = *params;
734 command->params.opacityBrush = opacity_brush;
735 command->layer = layer;
736}
737
739{
740 struct d2d_command *command;
741
742 command = d2d_command_list_require_space(command_list, sizeof(*command));
744}
745
747{
749
750 command = d2d_command_list_require_space(command_list, sizeof(*command));
752 if (color) command->color = *color;
753 else memset(&command->color, 0, sizeof(command->color));
754}
755
758 ID2D1Brush *orig_brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
759{
762
763 if (FAILED(d2d_command_list_create_brush(command_list, context, orig_brush, &brush)))
764 {
765 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
766 return;
767 }
768
770
771 command = d2d_command_list_require_space(command_list, sizeof(*command));
773 command->p0 = p0;
774 command->p1 = p1;
775 command->brush = brush;
776 command->stroke_width = stroke_width;
777 command->stroke_style = stroke_style;
778}
779
781 const struct d2d_device_context *context, ID2D1Geometry *geometry, ID2D1Brush *orig_brush,
783{
786
787 if (FAILED(d2d_command_list_create_brush(command_list, context, orig_brush, &brush)))
788 {
789 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
790 return;
791 }
792
795
796 command = d2d_command_list_require_space(command_list, sizeof(*command));
798 command->brush = brush;
799 command->stroke_width = stroke_width;
800 command->stroke_style = stroke_style;
801}
802
805{
808
809 if (FAILED(d2d_command_list_create_brush(command_list, context, orig_brush, &brush)))
810 {
811 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
812 return;
813 }
814
816
817 command = d2d_command_list_require_space(command_list, sizeof(*command));
819 command->rect = *rect;
820 command->brush = brush;
821 command->stroke_width = stroke_width;
822 command->stroke_style = stroke_style;
823}
824
826 const struct d2d_device_context *context, ID2D1Geometry *geometry, ID2D1Brush *orig_brush,
827 ID2D1Brush *orig_opacity_brush)
828{
829 ID2D1Brush *brush, *opacity_brush = NULL;
831
832 if (FAILED(d2d_command_list_create_brush(command_list, context, orig_brush, &brush)))
833 {
834 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
835 return;
836 }
837
838 if (orig_opacity_brush && FAILED(d2d_command_list_create_brush(command_list, context,
839 orig_opacity_brush, &opacity_brush)))
840 {
841 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
842 ID2D1Brush_Release(brush);
843 return;
844 }
845
847
848 command = d2d_command_list_require_space(command_list, sizeof(*command));
850 command->geometry = geometry;
851 command->brush = brush;
852 command->opacity_brush = opacity_brush;
853}
854
856 const struct d2d_device_context *context, const D2D1_RECT_F *rect, ID2D1Brush *orig_brush)
857{
860
861 if (FAILED(d2d_command_list_create_brush(command_list, context, orig_brush, &brush)))
862 {
863 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
864 return;
865 }
866
867 command = d2d_command_list_require_space(command_list, sizeof(*command));
869 command->rect = *rect;
870 command->brush = brush;
871}
872
875{
877
878 if (!params && !allow_null) return;
879
881 && !params)
882 {
883 return;
884 }
885
887
888 if (params)
889 command_list->flags &= ~D2D_COMMAND_LIST_HAS_NULL_TEXT_RENDERING_PARAMS;
890 else
892
893 command = d2d_command_list_require_space(command_list, sizeof(*command));
895 command->params = params;
896}
897
900{
902}
903
904static inline void d2d_command_list_write_field(BYTE **data, void *dst, const void *src, size_t size)
905{
906 void **ptr = dst;
907
908 if (!src)
909 {
910 *ptr = NULL;
911 return;
912 }
913
914 *ptr = *data;
915 memcpy(*data, src, size);
916 *data = *data + size;
917}
918
921 const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc, ID2D1Brush *orig_brush,
922 DWRITE_MEASURING_MODE measuring_mode)
923{
927 UINT32 glyph_count;
929 size_t size;
930 BYTE *data;
931
932 if (FAILED(d2d_command_list_create_brush(command_list, context, orig_brush, &brush)))
933 {
934 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
935 return;
936 }
937
938 /* Set rendering parameters automatically. Explicitly set null parameters are not recorded,
939 either separately or as a part of a restored state block. Forcing parameters update on
940 DrawGlyphRun() ensures that state is reset correctly. */
941
943 context->text_rendering_params);
944
945 /* Get combined size of variable data. */
946
947 glyph_count = run->glyphCount;
948 size = sizeof(*command);
949 if (run->glyphIndices) size += glyph_count * sizeof(*run->glyphIndices);
950 if (run->glyphAdvances) size += glyph_count * sizeof(*run->glyphAdvances);
951 if (run->glyphOffsets) size += glyph_count * sizeof(*run->glyphOffsets);
952 if (run_desc)
953 {
954 size += sizeof(*run_desc);
958 size += sizeof(run_desc->stringLength);
959 size += sizeof(run_desc->textPosition);
960 }
961
963
966 r = &command->run;
967
968 r->fontFace = run->fontFace;
969 r->fontEmSize = run->fontEmSize;
970 r->glyphCount = run->glyphCount;
971 r->isSideways = run->isSideways;
972 r->bidiLevel = run->bidiLevel;
973
974 data = (BYTE *)(command + 1);
975
976 d2d_command_list_write_field(&data, &r->glyphIndices, run->glyphIndices, glyph_count * sizeof(*r->glyphIndices));
977 d2d_command_list_write_field(&data, &r->glyphAdvances, run->glyphAdvances, glyph_count * sizeof(*r->glyphAdvances));
978 d2d_command_list_write_field(&data, &r->glyphOffsets, run->glyphOffsets, glyph_count * sizeof(*r->glyphOffsets));
979
980 command->run_desc = NULL;
981 if (run_desc)
982 {
984 memset(d, 0, sizeof(*d));
985 data += sizeof(*d);
986
989 d->stringLength = run_desc->stringLength;
991 d->textPosition = run_desc->textPosition;
992 }
993
994 command->brush = brush;
995 command->origin = origin;
996 command->measuring_mode = measuring_mode;
997}
998
1000 const D2D1_RECT_F *dst_rect, float opacity, D2D1_INTERPOLATION_MODE interpolation_mode,
1001 const D2D1_RECT_F *src_rect, const D2D1_MATRIX_4X4_F *perspective_transform)
1002{
1004 size_t size;
1005 BYTE *data;
1006
1007 size = sizeof(*command);
1008 if (dst_rect) size += sizeof(*dst_rect);
1009 if (src_rect) size += sizeof(*src_rect);
1010 if (perspective_transform) size += sizeof(*perspective_transform);
1011
1013
1016 command->bitmap = bitmap;
1017 command->opacity = opacity;
1018 command->interpolation_mode = interpolation_mode;
1019
1020 data = (BYTE *)(command + 1);
1021
1025}
1026
1028 const D2D1_POINT_2F *target_offset, const D2D1_RECT_F *image_rect, D2D1_INTERPOLATION_MODE interpolation_mode,
1029 D2D1_COMPOSITE_MODE composite_mode)
1030{
1032 size_t size;
1033 BYTE *data;
1034
1035 size = sizeof(*command);
1036 if (target_offset) size += sizeof(*target_offset);
1037 if (image_rect) size += sizeof(*image_rect);
1038
1040
1043 command->image = image;
1044 command->interpolation_mode = interpolation_mode;
1045 command->composite_mode = composite_mode;
1046
1047 data = (BYTE *)(command + 1);
1048
1051}
1052
1054 ID2D1Mesh *mesh, ID2D1Brush *orig_brush)
1055{
1058
1059 if (FAILED(d2d_command_list_create_brush(command_list, context, orig_brush, &brush)))
1060 {
1061 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
1062 return;
1063 }
1064
1066
1067 command = d2d_command_list_require_space(command_list, sizeof(*command));
1069 command->mesh = mesh;
1070 command->brush = brush;
1071}
1072
1074 ID2D1Bitmap *bitmap, ID2D1Brush *orig_brush, const D2D1_RECT_F *dst_rect, const D2D1_RECT_F *src_rect)
1075{
1078 size_t size;
1079 BYTE *data;
1080
1081 if (FAILED(d2d_command_list_create_brush(command_list, context, orig_brush, &brush)))
1082 {
1083 command_list->state = D2D_COMMAND_LIST_STATE_ERROR;
1084 return;
1085 }
1086
1087 size = sizeof(*command);
1088 if (dst_rect) size += sizeof(*dst_rect);
1089 if (src_rect) size += sizeof(*src_rect);
1090
1092
1095 command->bitmap = bitmap;
1096 command->brush = brush;
1097
1098 data = (BYTE *)(command + 1);
1099
1102}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
RECT rect
Definition: combotst.c:67
void d2d_command_list_draw_geometry(struct d2d_command_list *command_list, const struct d2d_device_context *context, ID2D1Geometry *geometry, ID2D1Brush *orig_brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
Definition: command_list.c:780
void d2d_command_list_fill_opacity_mask(struct d2d_command_list *command_list, const struct d2d_device_context *context, ID2D1Bitmap *bitmap, ID2D1Brush *orig_brush, const D2D1_RECT_F *dst_rect, const D2D1_RECT_F *src_rect)
void d2d_command_list_set_unit_mode(struct d2d_command_list *command_list, D2D1_UNIT_MODE mode)
Definition: command_list.c:637
static HRESULT d2d_command_list_create_brush(struct d2d_command_list *command_list, const struct d2d_device_context *ctx, ID2D1Brush *orig_brush, ID2D1Brush **ret)
Definition: command_list.c:551
static struct d2d_command_list * impl_from_ID2D1CommandList(ID2D1CommandList *iface)
Definition: command_list.c:211
void d2d_command_list_pop_layer(struct d2d_command_list *command_list)
Definition: command_list.c:738
void d2d_command_list_push_layer(struct d2d_command_list *command_list, const struct d2d_device_context *context, const D2D1_LAYER_PARAMETERS1 *params, ID2D1Layer *layer)
Definition: command_list.c:715
void d2d_command_list_set_text_rendering_params(struct d2d_command_list *command_list, IDWriteRenderingParams *params)
Definition: command_list.c:898
void d2d_command_list_draw_line(struct d2d_command_list *command_list, const struct d2d_device_context *context, D2D1_POINT_2F p0, D2D1_POINT_2F p1, ID2D1Brush *orig_brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
Definition: command_list.c:756
void d2d_command_list_fill_mesh(struct d2d_command_list *command_list, const struct d2d_device_context *context, ID2D1Mesh *mesh, ID2D1Brush *orig_brush)
void d2d_command_list_set_transform(struct d2d_command_list *command_list, const D2D1_MATRIX_3X2_F *transform)
Definition: command_list.c:666
d2d_command_list_flags
Definition: command_list.c:24
@ D2D_COMMAND_LIST_HAS_NULL_TEXT_RENDERING_PARAMS
Definition: command_list.c:25
d2d_command_type
Definition: command_list.c:29
@ D2D_COMMAND_DRAW_IMAGE
Definition: command_list.c:43
@ D2D_COMMAND_FILL_OPACITY_MASK
Definition: command_list.c:45
@ D2D_COMMAND_DRAW_GLYPH_RUN
Definition: command_list.c:38
@ D2D_COMMAND_SET_PRIMITIVE_BLEND
Definition: command_list.c:35
@ D2D_COMMAND_SET_ANTIALIAS_MODE
Definition: command_list.c:30
@ D2D_COMMAND_CLEAR
Definition: command_list.c:37
@ D2D_COMMAND_SET_UNIT_MODE
Definition: command_list.c:36
@ D2D_COMMAND_FILL_RECTANGLE
Definition: command_list.c:47
@ D2D_COMMAND_DRAW_GEOMETRY
Definition: command_list.c:40
@ D2D_COMMAND_DRAW_RECTANGLE
Definition: command_list.c:41
@ D2D_COMMAND_PUSH_LAYER
Definition: command_list.c:49
@ D2D_COMMAND_POP_LAYER
Definition: command_list.c:51
@ D2D_COMMAND_SET_TEXT_ANTIALIAS_MODE
Definition: command_list.c:32
@ D2D_COMMAND_SET_TEXT_RENDERING_PARAMS
Definition: command_list.c:33
@ D2D_COMMAND_FILL_GEOMETRY
Definition: command_list.c:46
@ D2D_COMMAND_PUSH_CLIP
Definition: command_list.c:48
@ D2D_COMMAND_DRAW_LINE
Definition: command_list.c:39
@ D2D_COMMAND_SET_TAGS
Definition: command_list.c:31
@ D2D_COMMAND_DRAW_BITMAP
Definition: command_list.c:42
@ D2D_COMMAND_FILL_MESH
Definition: command_list.c:44
@ D2D_COMMAND_SET_TRANSFORM
Definition: command_list.c:34
@ D2D_COMMAND_POP_CLIP
Definition: command_list.c:50
void d2d_command_list_set_text_antialias_mode(struct d2d_command_list *command_list, D2D1_TEXT_ANTIALIAS_MODE mode)
Definition: command_list.c:646
HRESULT d2d_command_list_create(ID2D1Factory *factory, struct d2d_command_list **command_list)
Definition: command_list.c:498
void d2d_command_list_set_tags(struct d2d_command_list *command_list, D2D1_TAG tag1, D2D1_TAG tag2)
Definition: command_list.c:656
static void d2d_command_list_set_text_rendering_params_internal(struct d2d_command_list *command_list, BOOL allow_null, IDWriteRenderingParams *params)
Definition: command_list.c:873
void d2d_command_list_set_primitive_blend(struct d2d_command_list *command_list, D2D1_PRIMITIVE_BLEND primitive_blend)
Definition: command_list.c:627
void d2d_command_list_draw_bitmap(struct d2d_command_list *command_list, ID2D1Bitmap *bitmap, const D2D1_RECT_F *dst_rect, float opacity, D2D1_INTERPOLATION_MODE interpolation_mode, const D2D1_RECT_F *src_rect, const D2D1_MATRIX_4X4_F *perspective_transform)
Definition: command_list.c:999
void d2d_command_list_draw_rectangle(struct d2d_command_list *command_list, const struct d2d_device_context *context, const D2D1_RECT_F *rect, ID2D1Brush *orig_brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
Definition: command_list.c:803
void d2d_command_list_push_clip(struct d2d_command_list *command_list, const D2D1_RECT_F *rect, D2D1_ANTIALIAS_MODE mode)
Definition: command_list.c:696
void d2d_command_list_fill_geometry(struct d2d_command_list *command_list, const struct d2d_device_context *context, ID2D1Geometry *geometry, ID2D1Brush *orig_brush, ID2D1Brush *orig_opacity_brush)
Definition: command_list.c:825
void d2d_command_list_draw_glyph_run(struct d2d_command_list *command_list, const struct d2d_device_context *context, D2D1_POINT_2F origin, const DWRITE_GLYPH_RUN *run, const DWRITE_GLYPH_RUN_DESCRIPTION *run_desc, ID2D1Brush *orig_brush, DWRITE_MEASURING_MODE measuring_mode)
Definition: command_list.c:919
static void d2d_command_list_reference_object(struct d2d_command_list *command_list, void *object)
Definition: command_list.c:535
struct d2d_command_list * unsafe_impl_from_ID2D1CommandList(ID2D1CommandList *iface)
Definition: command_list.c:512
static void d2d_command_list_write_field(BYTE **data, void *dst, const void *src, size_t size)
Definition: command_list.c:904
void d2d_command_list_clear(struct d2d_command_list *command_list, const D2D1_COLOR_F *color)
Definition: command_list.c:746
void d2d_command_list_draw_image(struct d2d_command_list *command_list, ID2D1Image *image, const D2D1_POINT_2F *target_offset, const D2D1_RECT_F *image_rect, D2D1_INTERPOLATION_MODE interpolation_mode, D2D1_COMPOSITE_MODE composite_mode)
void d2d_command_list_set_antialias_mode(struct d2d_command_list *command_list, D2D1_ANTIALIAS_MODE mode)
Definition: command_list.c:617
static HRESULT STDMETHODCALLTYPE d2d_command_list_Close(ID2D1CommandList *iface)
Definition: command_list.c:472
void d2d_command_list_begin_draw(struct d2d_command_list *command_list, const struct d2d_device_context *context)
Definition: command_list.c:676
void d2d_command_list_fill_rectangle(struct d2d_command_list *command_list, const struct d2d_device_context *context, const D2D1_RECT_F *rect, ID2D1Brush *orig_brush)
Definition: command_list.c:855
static HRESULT STDMETHODCALLTYPE d2d_command_list_QueryInterface(ID2D1CommandList *iface, REFIID iid, void **out)
Definition: command_list.c:216
static void * d2d_command_list_require_space(struct d2d_command_list *command_list, size_t size)
Definition: command_list.c:520
static const ID2D1CommandListVtbl d2d_command_list_vtbl
Definition: command_list.c:488
static ULONG STDMETHODCALLTYPE d2d_command_list_AddRef(ID2D1CommandList *iface)
Definition: command_list.c:236
static ULONG STDMETHODCALLTYPE d2d_command_list_Release(ID2D1CommandList *iface)
Definition: command_list.c:246
static void STDMETHODCALLTYPE d2d_command_list_GetFactory(ID2D1CommandList *iface, ID2D1Factory **factory)
Definition: command_list.c:267
void d2d_command_list_pop_clip(struct d2d_command_list *command_list)
Definition: command_list.c:707
static HRESULT STDMETHODCALLTYPE d2d_command_list_Stream(ID2D1CommandList *iface, ID2D1CommandSink *sink)
Definition: command_list.c:276
UINT64 D2D1_TAG
Definition: d2d1.idl:48
D2D1_TEXT_ANTIALIAS_MODE
Definition: d2d1.idl:189
D2D1_ANTIALIAS_MODE
Definition: d2d1.idl:182
D2D1_INTERPOLATION_MODE
Definition: d2d1_1.idl:124
D2D1_UNIT_MODE
Definition: d2d1_1.idl:64
D2D1_PRIMITIVE_BLEND
Definition: d2d1_1.idl:54
@ D2D1_PRIMITIVE_BLEND_ADD
Definition: d2d1_1.idl:58
@ D2D1_PRIMITIVE_BLEND_SOURCE_OVER
Definition: d2d1_1.idl:55
@ D2D1_PRIMITIVE_BLEND_MIN
Definition: d2d1_1.idl:57
@ D2D1_PRIMITIVE_BLEND_MAX
Definition: d2d1_1.idl:59
@ D2D1_PRIMITIVE_BLEND_COPY
Definition: d2d1_1.idl:56
D2D1_COMPOSITE_MODE
Definition: d2d1_1.idl:135
@ D2D_BRUSH_TYPE_SOLID
Definition: d2d1_private.h:41
@ D2D_BRUSH_TYPE_RADIAL
Definition: d2d1_private.h:43
@ D2D_BRUSH_TYPE_LINEAR
Definition: d2d1_private.h:42
@ D2D_BRUSH_TYPE_BITMAP
Definition: d2d1_private.h:44
@ D2D_BRUSH_TYPE_IMAGE
Definition: d2d1_private.h:45
static BOOL d2d_array_reserve(void **elements, size_t *capacity, size_t count, size_t size)
Definition: d2d1_private.h:897
@ D2D_COMMAND_LIST_STATE_INITIAL
Definition: d2d1_private.h:824
@ D2D_COMMAND_LIST_STATE_CLOSED
Definition: d2d1_private.h:827
@ D2D_COMMAND_LIST_STATE_ERROR
Definition: d2d1_private.h:825
@ D2D_COMMAND_LIST_STATE_OPEN
Definition: d2d1_private.h:826
DWRITE_MEASURING_MODE
Definition: dcommon.idl:36
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
struct d2d_brush * unsafe_impl_from_ID2D1Brush(ID2D1Brush *iface)
Definition: brush.c:1344
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
return ret
Definition: mutex.c:147
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint GLenum GLenum transform
Definition: glext.h:9407
GLenum src
Definition: glext.h:6340
GLsizeiptr size
Definition: glext.h:5919
GLuint color
Definition: glext.h:6243
const GLubyte * c
Definition: glext.h:8905
GLenum mode
Definition: glext.h:6217
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLenum dst
Definition: glext.h:6340
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
GLenum GLuint GLint GLint layer
Definition: glext.h:7007
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
voidpf uLong int origin
Definition: ioapi.h:144
#define d
Definition: ke_i.h:81
#define debugstr_guid
Definition: kernel32.h:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define calloc
Definition: rosglue.h:14
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
D2D1_INTERPOLATION_MODE interpolationMode
Definition: d2d1_1.idl:285
D2D1_EXTEND_MODE extendModeY
Definition: d2d1_1.idl:284
D2D1_EXTEND_MODE extendModeX
Definition: d2d1_1.idl:283
D2D1_MATRIX_3X2_F transform
Definition: d2d1.idl:377
D2D1_INTERPOLATION_MODE interpolationMode
Definition: d2d1_1.idl:278
D2D1_EXTEND_MODE extendModeX
Definition: d2d1_1.idl:276
D2D1_EXTEND_MODE extendModeY
Definition: d2d1_1.idl:277
D2D1_RECT_F sourceRectangle
Definition: d2d1_1.idl:275
UINT16 const * clusterMap
Definition: dwrite.idl:424
WCHAR const * localeName
Definition: dwrite.idl:421
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
Definition: uimain.c:89
Definition: http.c:7252
D2D1_COLOR_F color
Definition: command_list.c:105
D2D1_RECT_F * dst_rect
Definition: command_list.c:196
D2D1_MATRIX_4X4_F * perspective_transform
Definition: command_list.c:198
D2D1_INTERPOLATION_MODE interpolation_mode
Definition: command_list.c:194
D2D1_RECT_F * src_rect
Definition: command_list.c:197
ID2D1Geometry * geometry
Definition: command_list.c:134
ID2D1StrokeStyle * stroke_style
Definition: command_list.c:137
DWRITE_GLYPH_RUN_DESCRIPTION * run_desc
Definition: command_list.c:187
DWRITE_MEASURING_MODE measuring_mode
Definition: command_list.c:184
D2D1_RECT_F * image_rect
Definition: command_list.c:208
D2D1_COMPOSITE_MODE composite_mode
Definition: command_list.c:206
D2D1_POINT_2F * target_offset
Definition: command_list.c:207
D2D1_INTERPOLATION_MODE interpolation_mode
Definition: command_list.c:205
ID2D1StrokeStyle * stroke_style
Definition: command_list.c:128
ID2D1StrokeStyle * stroke_style
Definition: command_list.c:146
ID2D1Geometry * geometry
Definition: command_list.c:168
ID2D1CommandList ID2D1CommandList_iface
Definition: d2d1_private.h:832
enum d2d_command_list_state state
Definition: d2d1_private.h:836
size_t objects_capacity
Definition: d2d1_private.h:844
IUnknown ** objects
Definition: d2d1_private.h:845
ID2D1Factory * factory
Definition: d2d1_private.h:835
unsigned int flags
Definition: d2d1_private.h:837
D2D1_ANTIALIAS_MODE mode
Definition: command_list.c:112
D2D1_LAYER_PARAMETERS1 params
Definition: command_list.c:118
D2D1_ANTIALIAS_MODE mode
Definition: command_list.c:63
D2D1_PRIMITIVE_BLEND primitive_blend
Definition: command_list.c:93
D2D1_TEXT_ANTIALIAS_MODE mode
Definition: command_list.c:75
IDWriteRenderingParams * params
Definition: command_list.c:81
D2D1_MATRIX_3X2_F transform
Definition: command_list.c:87
size_t size
Definition: command_list.c:57
enum d2d_command_type op
Definition: command_list.c:56
Definition: main.c:439
Definition: image.c:84
Definition: mesh.c:189
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t UINT32
Definition: typedefs.h:59
uint32_t ULONG
Definition: typedefs.h:59
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define D2DERR_WRONG_STATE
Definition: winerror.h:7352
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_UNEXPECTED
Definition: winerror.h:3528
unsigned char BYTE
Definition: xxhash.c:193