[cairo] help building cairo on windows

Andrea Canciani ranma42 at gmail.com
Mon Sep 10 13:48:30 PDT 2012


This reminds me that I have some patches to improve building pixman on win32:
http://cgit.freedesktop.org/~ranma42/pixman/commit/?h=wip/simpleops-to-master

Soren, is it ok if I push the attached patches?

I will work a little more on simpleops before proposing it again (in
particular, I'd like to make it behave like the gstreamer git
submodules and I need to investigate how it is integrated with
packaging and releasing), but the first two commits in the branch
should be ok for merge regardless of simpleops.

Andrea

On Mon, Sep 10, 2012 at 8:17 PM, Dimiter 'malkia' Stanev
<malkia at gmail.com> wrote:
> On 9/10/2012 7:04 AM, Cosmin Apreutesei wrote:
>>
>> Hi,
>>
>> I have to build cairo on windows because I want to use the recording
>> surface and I can't find binaries above 1.10 anywhere on the net (till
>> now I have used the binaries from GTK but these are old and the
>> recording surface doesn't work with those).
>>
>> Trying to build pixman with:
>>
>>> make CFG=debug -f Makefile.win32
>>
>>
>> gives me:
>>
>> pixman-mmx.c(545) : error C2143: syntax error : missing ';' before 'type'
>>
>> and then 100 syntax errors like that (other c files compile ok until
>> the mmx one).
>>
>> The sources were pulled today from git. The environment is VSE2008.
>> make is 3.81 from mingw (I also had to throw in pkg-config binaries +
>> dependencies from GTK).
>>
>> I also tried to build the latest pixman (0.26.2) with the same command
>> but it failed with:
>>
>> Entering directory `/x/work/pixman-0.26.2/test'
>> Makefile.win32: No such file or directory
>>
>> I also tried building with mozilla-build from the mingw bash prompt,
>> with the same results.
>>
>>
>> So what's the best (preferably from cmdline) way to build pixman and
>> cairo under windows? And which is the best version? The release or the
>> git one?
>>
>> Btw, if anyone has an up-to-date cairo.dll that would work for me too.
>>
>
> Hi Cosmin,
>
> With this patch you should be able to compile.
>
> Thanks,
> Dimiter 'malkia' Stanev
>
> pixman-mmx.diff
>
> diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c
> index 74a5e87..9e597db 100644
> --- a/pixman/pixman-mmx.c
> +++ b/pixman/pixman-mmx.c
> @@ -541,7 +541,7 @@ expand565 (__m64 pixel, int pos)
>  static force_inline void
>  expand_4xpacked565 (__m64 vin, __m64 *vout0, __m64 *vout1, int full_alpha)
>  {
> -    __m64 t0, t1, alpha = _mm_setzero_si64 ();;
> +    __m64 t0, t1, alpha = _mm_setzero_si64 ();
>      __m64 r = _mm_and_si64 (vin, MC (expand_565_r));
>      __m64 g = _mm_and_si64 (vin, MC (expand_565_g));
>      __m64 b = _mm_and_si64 (vin, MC (expand_565_b));
> @@ -1902,22 +1902,22 @@ mmx_composite_over_8888_0565
> (pixman_implementation_t *imp,
>         while (w >= 4)
>         {
>             __m64 vdest = *(__m64 *)dst;
> -           __m64 v0, v1, v2, v3;
> +           __m64 v0, v1, v2, v3, vsrc0, vsrc1, vsrc2, vsrc3;
>
>             expand_4x565 (vdest, &v0, &v1, &v2, &v3, 0);
>
> -           __m64 vsrc0 = load8888 ((src + 0));
> -           __m64 vsrc1 = load8888 ((src + 1));
> -           __m64 vsrc2 = load8888 ((src + 2));
> -           __m64 vsrc3 = load8888 ((src + 3));
> -
> +           vsrc0 = load8888 ((src + 0));
> +           vsrc1 = load8888 ((src + 1));
> +           vsrc2 = load8888 ((src + 2));
> +           vsrc3 = load8888 ((src + 3));
> +
>             v0 = over (vsrc0, expand_alpha (vsrc0), v0);
>             v1 = over (vsrc1, expand_alpha (vsrc1), v1);
>             v2 = over (vsrc2, expand_alpha (vsrc2), v2);
>             v3 = over (vsrc3, expand_alpha (vsrc3), v3);
> -
> +
>             *(__m64 *)dst = pack_4x565 (v0, v1, v2, v3);
> -
> +
>             w -= 4;
>             dst += 4;
>             src += 4;
> @@ -2454,22 +2454,22 @@ mmx_composite_over_n_8_0565 (pixman_implementation_t
> *imp,
>             else if (m0 | m1 | m2 | m3)
>             {
>                 __m64 vdest = *(__m64 *)dst;
> -               __m64 v0, v1, v2, v3;
> +               __m64 v0, v1, v2, v3, vm0, vm1, vm2, vm3;
>
>                 expand_4x565 (vdest, &v0, &v1, &v2, &v3, 0);
>
> -               __m64 vm0 = to_m64 (m0);
> +               vm0 = to_m64 (m0);
>                 v0 = in_over (vsrc, vsrca, expand_alpha_rev (vm0), v0);
> -
> -               __m64 vm1 = to_m64 (m1);
> +
> +               vm1 = to_m64 (m1);
>                 v1 = in_over (vsrc, vsrca, expand_alpha_rev (vm1), v1);
> -
> -               __m64 vm2 = to_m64 (m2);
> +
> +               vm2 = to_m64 (m2);
>                 v2 = in_over (vsrc, vsrca, expand_alpha_rev (vm2), v2);
> -
> -               __m64 vm3 = to_m64 (m3);
> +
> +               vm3 = to_m64 (m3);
>                 v3 = in_over (vsrc, vsrca, expand_alpha_rev (vm3), v3);
> -
> +
>                 *(__m64 *)dst = pack_4x565 (v0, v1, v2, v3);;
>             }
>
> @@ -3545,32 +3545,35 @@ mmx_composite_over_reverse_n_8888
> (pixman_implementation_t *imp,
>
>  #define BILINEAR_INTERPOLATE_ONE_PIXEL(pix)
> \
>  do {
> \
> +    __m64 t_hi, t_lo, b_hi, b_lo, hi, lo;          \
>      /* fetch 2x2 pixel block into 2 mmx registers */
> \
>      __m64 t = ldq_u ((__m64 *)&src_top [pixman_fixed_to_int (vx)]);
> \
>      __m64 b = ldq_u ((__m64 *)&src_bottom [pixman_fixed_to_int (vx)]);
> \
>      vx += unit_x;
> \
>      /* vertical interpolation */
> \
> -    __m64 t_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (t, mm_zero), mm_wt);
> \
> -    __m64 t_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (t, mm_zero), mm_wt);
> \
> -    __m64 b_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (b, mm_zero), mm_wb);
> \
> -    __m64 b_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (b, mm_zero), mm_wb);
> \
> -    __m64 hi = _mm_add_pi16 (t_hi, b_hi);
> \
> -    __m64 lo = _mm_add_pi16 (t_lo, b_lo);
> \
> +    t_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (t, mm_zero), mm_wt);
> \
> +    t_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (t, mm_zero), mm_wt);
> \
> +    b_hi = _mm_mullo_pi16 (_mm_unpackhi_pi8 (b, mm_zero), mm_wb);
> \
> +    b_lo = _mm_mullo_pi16 (_mm_unpacklo_pi8 (b, mm_zero), mm_wb);
> \
> +    hi = _mm_add_pi16 (t_hi, b_hi);
> \
> +    lo = _mm_add_pi16 (t_lo, b_lo);
> \
>      if (BILINEAR_INTERPOLATION_BITS < 8)
> \
>      {
> \
> +        __m64 p, q;          \
>         /* calculate horizontal weights */
> \
>         __m64 mm_wh = _mm_add_pi16 (mm_addc7, _mm_xor_si64 (mm_xorc7,
> \
>                           _mm_srli_pi16 (mm_x,
> \
>                                          16 -
> BILINEAR_INTERPOLATION_BITS)));   \
>         mm_x = _mm_add_pi16 (mm_x, mm_ux);
> \
>         /* horizontal interpolation */
> \
> -       __m64 p = _mm_unpacklo_pi16 (lo, hi);
> \
> -       __m64 q = _mm_unpackhi_pi16 (lo, hi);
> \
> +        p = _mm_unpacklo_pi16 (lo, hi);
> \
> +       q = _mm_unpackhi_pi16 (lo, hi);
> \
>         lo = _mm_madd_pi16 (p, mm_wh);
> \
>         hi = _mm_madd_pi16 (q, mm_wh);
> \
>      }
> \
>      else
> \
>      {
> \
> +        __m64 mm_lo_lo, mm_lo_hi, mm_hi_lo, mm_hi_hi;
> \
>         /* calculate horizontal weights */
> \
>         __m64 mm_wh_lo = _mm_sub_pi16 (mm_BSHIFT, _mm_srli_pi16 (mm_x,
> \
>                                         16 - BILINEAR_INTERPOLATION_BITS));
> \
> @@ -3578,10 +3581,10 @@ do {
> \
>                                         16 - BILINEAR_INTERPOLATION_BITS);
> \
>         mm_x = _mm_add_pi16 (mm_x, mm_ux);
> \
>         /* horizontal interpolation */
> \
> -       __m64 mm_lo_lo = _mm_mullo_pi16 (lo, mm_wh_lo);
> \
> -       __m64 mm_lo_hi = _mm_mullo_pi16 (hi, mm_wh_hi);
> \
> -       __m64 mm_hi_lo = _mm_mulhi_pu16 (lo, mm_wh_lo);
> \
> -       __m64 mm_hi_hi = _mm_mulhi_pu16 (hi, mm_wh_hi);
> \
> +       mm_lo_lo = _mm_mullo_pi16 (lo, mm_wh_lo);
> \
> +       mm_lo_hi = _mm_mullo_pi16 (hi, mm_wh_hi);
> \
> +       mm_hi_lo = _mm_mulhi_pu16 (lo, mm_wh_lo);
> \
> +       mm_hi_hi = _mm_mulhi_pu16 (hi, mm_wh_hi);
> \
>         lo = _mm_add_pi32 (_mm_unpacklo_pi16 (mm_lo_lo, mm_hi_lo),
> \
>                            _mm_unpacklo_pi16 (mm_lo_hi, mm_hi_hi));
> \
>         hi = _mm_add_pi32 (_mm_unpackhi_pi16 (mm_lo_lo, mm_hi_lo),
> \
>
> --
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-build-Improve-win32-build-system.patch
Type: application/octet-stream
Size: 2775 bytes
Desc: not available
URL: <http://lists.cairographics.org/archives/cairo/attachments/20120910/c84b861b/attachment-0002.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-mmx-Fix-x86-build-on-MSVC.patch
Type: application/octet-stream
Size: 4436 bytes
Desc: not available
URL: <http://lists.cairographics.org/archives/cairo/attachments/20120910/c84b861b/attachment-0003.obj>


More information about the cairo mailing list