[PATCH 1/3] d2d1: Support registering builtin effect.
Nikolay Sivov
nsivov at codeweavers.com
Tue Jun 21 03:35:45 CDT 2022
On 6/21/22 06:17, Ziqing Hui wrote:
> @@ -616,7 +651,9 @@ struct d2d_effect
> ID2D1Image ID2D1Image_iface;
> LONG refcount;
>
> - const struct d2d_effect_info *info;
> + CLSID id;
> + UINT32 min_inputs;
> + UINT32 max_inputs;
>
> struct d2d_effect_context *effect_context;
> ID2D1Image **inputs;
This should be a part of property system, not exposed like that.
> @@ -554,21 +563,21 @@ static HRESULT STDMETHODCALLTYPE d2d_effect_GetValue(ID2D1Effect *iface, UINT32
> {
> case D2D1_PROPERTY_CLSID:
> if ((type != D2D1_PROPERTY_TYPE_UNKNOWN && type != D2D1_PROPERTY_TYPE_CLSID)
> - || value_size != sizeof(*effect->info->clsid))
> + || value_size != sizeof(effect->id))
> return E_INVALIDARG;
> - src = effect->info->clsid;
> + src = &effect->id;
> break;
> case D2D1_PROPERTY_MIN_INPUTS:
> if ((type != D2D1_PROPERTY_TYPE_UNKNOWN && type != D2D1_PROPERTY_TYPE_UINT32)
> - || value_size != sizeof(effect->info->min_inputs))
> + || value_size != sizeof(effect->min_inputs))
> return E_INVALIDARG;
> - src = &effect->info->min_inputs;
> + src = &effect->min_inputs;
> break;
> case D2D1_PROPERTY_MAX_INPUTS:
> if ((type != D2D1_PROPERTY_TYPE_UNKNOWN && type != D2D1_PROPERTY_TYPE_UINT32)
> - || value_size != sizeof(effect->info->max_inputs))
> + || value_size != sizeof(effect->max_inputs))
> return E_INVALIDARG;
> - src = &effect->info->max_inputs;
> + src = &effect->max_inputs;
> break;
> default:
> if (index < D2D1_PROPERTY_CLSID)
Similarly, this needs rework.
> -static const struct d2d_effect_info builtin_effects[] =
> +struct d2d_builtin_effect_registration
> {
> - {&CLSID_D2D12DAffineTransform, 1, 1, 1},
> - {&CLSID_D2D13DPerspectiveTransform, 1, 1, 1},
> - {&CLSID_D2D1Composite, 2, 1, 0xffffffff},
> - {&CLSID_D2D1Crop, 1, 1, 1},
> - {&CLSID_D2D1Shadow, 1, 1, 1},
> - {&CLSID_D2D1Grayscale, 1, 1, 1},
> + const CLSID *id;
> + PD2D1_EFFECT_FACTORY factory;
> + UINT32 default_input_count;
> + UINT32 min_inputs;
> + UINT32 max_inputs;
> +};
It should be possible to reuse same structure for builtin effects.
> +HRESULT d2d_register_builtin_effects(struct d2d_factory *factory)
> +{
> + struct d2d_effect_registration *reg;
> + unsigned int i;
> +
> + for (i = 0; i < ARRAY_SIZE(builtin_effects); ++i)
> + {
> + const struct d2d_builtin_effect_registration *builtin_reg = &builtin_effects[i];
> +
> + if (!(reg = calloc(1, sizeof(*reg))))
> + return E_OUTOFMEMORY;
> +
> + reg->is_builtin = TRUE;
> + reg->factory = builtin_reg->factory;
> + reg->registration_count = 1;
> + reg->id = *builtin_reg->id;
> + reg->default_input_count = builtin_reg->default_input_count;
> + reg->min_inputs = builtin_reg->min_inputs;
> + reg->max_inputs = builtin_reg->max_inputs;
> + list_add_tail(&factory->effects, ®->entry);
> + }
> +
> + return S_OK;
> +}
I'm not sure if we want that. It should be enough to check if CLSID is
for builtin in Register* call, and redirect to builtin data in
CreateEffect().
More information about the wine-devel
mailing list