Loading

Paste #pg0ywbmgr

  1. diff --git a/gsk/gsktransform.c b/gsk/gsktransform.c
  2. index ac81fe055b..36392945b0 100644
  3. --- a/gsk/gsktransform.c
  4. +++ b/gsk/gsktransform.c
  5. @@ -121,6 +121,22 @@ gsk_transform_alloc (const GskTransformClass *transform_class,
  6.    return self;
  7.  }
  8.  
  9. +static gpointer
  10. +gsk_transform_make_writable (GskTransform            *next,
  11. +                             const GskTransformClass *transform_class,
  12. +                             GskTransformCategory     category)
  13. +{
  14. +  GskTransform *result;
  15. +
  16. +  if (next == NULL || next->transform_class != transform_class)
  17. +    return gsk_transform_alloc (transform_class, category, next);
  18. +
  19. +  result = next->transform_class->apply (next, gsk_transform_ref (next->next));
  20. +  result->category = MIN (category, result->category);
  21. +  gsk_transform_unref (next);
  22. +  return result;
  23. +}
  24. +                
  25.  /*** IDENTITY ***/
  26.  
  27.  static void
  28. @@ -638,12 +654,14 @@ gsk_transform_translate_3d (GskTransform             *next,
  29.  {
  30.    GskTranslateTransform *result;
  31.    
  32. -  result = gsk_transform_alloc (&GSK_TRANSLATE_TRANSFORM_CLASS,
  33. -                                point->z == 0.0 ? GSK_TRANSFORM_CATEGORY_2D_TRANSLATE
  34. -                                                : GSK_TRANSFORM_CATEGORY_3D,
  35. -                                next);
  36. +  result = gsk_transform_make_writable (next,
  37. +                                        &GSK_TRANSLATE_TRANSFORM_CLASS,
  38. +                                        point->z == 0.0 ? GSK_TRANSFORM_CATEGORY_2D_TRANSLATE
  39. +                                                        : GSK_TRANSFORM_CATEGORY_3D);
  40.  
  41. -  graphene_point3d_init_from_point (&result->point, point);
  42. +  result->point.x += point->x;
  43. +  result->point.y += point->y;
  44. +  result->point.z += point->z;
  45.  
  46.    return &result->parent;
  47.  }
  48. @@ -777,11 +795,11 @@ GskTransform *
  49.  gsk_transform_rotate (GskTransform *next,
  50.                        float         angle)
  51.  {
  52. -  GskRotateTransform *result = gsk_transform_alloc (&GSK_ROTATE_TRANSFORM_CLASS,
  53. -                                                    GSK_TRANSFORM_CATEGORY_2D,
  54. -                                                    next);
  55. +  GskRotateTransform *result = gsk_transform_make_writable (next,
  56. +                                                            &GSK_ROTATE_TRANSFORM_CLASS,
  57. +                                                            GSK_TRANSFORM_CATEGORY_2D);
  58.  
  59. -  result->angle = angle;
  60. +  result->angle += angle;
  61.  
  62.    return &result->parent;
  63.  }
  64. @@ -1083,14 +1101,28 @@ gsk_transform_scale_3d (GskTransform *next,
  65.  {
  66.    GskScaleTransform *result;
  67.    
  68. -  result = gsk_transform_alloc (&GSK_SCALE_TRANSFORM_CLASS,
  69. -                                factor_z != 1.0 ? GSK_TRANSFORM_CATEGORY_3D
  70. -                                                : GSK_TRANSFORM_CATEGORY_2D_AFFINE,
  71. -                                next);
  72. -
  73. -  result->factor_x = factor_x;
  74. -  result->factor_y = factor_y;
  75. -  result->factor_z = factor_z;
  76. +  if (next->transform_class == &GSK_SCALE_TRANSFORM_CLASS)
  77. +    {
  78. +      result = gsk_transform_make_writable (next,
  79. +                                            &GSK_SCALE_TRANSFORM_CLASS,
  80. +                                            factor_z != 1.0 ? GSK_TRANSFORM_CATEGORY_3D
  81. +                                                            : GSK_TRANSFORM_CATEGORY_2D_AFFINE);
  82. +
  83. +      result->factor_x *= factor_x;
  84. +      result->factor_y *= factor_y;
  85. +      result->factor_z *= factor_z;
  86. +    }
  87. +  else
  88. +    {
  89. +      result = gsk_transform_alloc (&GSK_SCALE_TRANSFORM_CLASS,
  90. +                                    factor_z != 1.0 ? GSK_TRANSFORM_CATEGORY_3D
  91. +                                                    : GSK_TRANSFORM_CATEGORY_2D_AFFINE,
  92. +                                    next);
  93. +
  94. +      result->factor_x = factor_x;
  95. +      result->factor_y = factor_y;
  96. +      result->factor_z = factor_z;
  97. +    }
  98.  
  99.    return &result->parent;
  100.  }