1c88bc5e9SStephan Aßmus /*
2c88bc5e9SStephan Aßmus * Copyright 2006-2010, Stephan Aßmus <superstippi@gmx.de>.
3c88bc5e9SStephan Aßmus * All rights reserved. Distributed under the terms of the MIT License.
4c88bc5e9SStephan Aßmus */
5c88bc5e9SStephan Aßmus
6c88bc5e9SStephan Aßmus
7c88bc5e9SStephan Aßmus #include "TransformGradientCommand.h"
8c88bc5e9SStephan Aßmus
9c88bc5e9SStephan Aßmus #include <new>
10c88bc5e9SStephan Aßmus #include <stdio.h>
11c88bc5e9SStephan Aßmus
12c88bc5e9SStephan Aßmus #include "GradientTransformable.h"
13c88bc5e9SStephan Aßmus
14c88bc5e9SStephan Aßmus
15c88bc5e9SStephan Aßmus using std::nothrow;
16c88bc5e9SStephan Aßmus
17c88bc5e9SStephan Aßmus
TransformGradientCommand(TransformBox * box,Gradient * gradient,BPoint pivot,BPoint translation,double rotation,double xScale,double yScale,const char * name)18c88bc5e9SStephan Aßmus TransformGradientCommand::TransformGradientCommand(TransformBox* box,
19c88bc5e9SStephan Aßmus Gradient* gradient, BPoint pivot, BPoint translation, double rotation,
20*a75a222bSZardshard double xScale, double yScale, const char* name)
21c88bc5e9SStephan Aßmus :
22*a75a222bSZardshard TransformCommand(pivot, translation, rotation, xScale, yScale, name),
23c88bc5e9SStephan Aßmus fTransformBox(box),
24c88bc5e9SStephan Aßmus fGradient(gradient)
25c88bc5e9SStephan Aßmus {
26c88bc5e9SStephan Aßmus if (fGradient == NULL)
27c88bc5e9SStephan Aßmus return;
28c88bc5e9SStephan Aßmus
290cbb6c11SStephan Aßmus fGradient->AcquireReference();
30c88bc5e9SStephan Aßmus
31c88bc5e9SStephan Aßmus if (fTransformBox != NULL)
32c88bc5e9SStephan Aßmus fTransformBox->AddListener(this);
33c88bc5e9SStephan Aßmus }
34c88bc5e9SStephan Aßmus
35c88bc5e9SStephan Aßmus
~TransformGradientCommand()36c88bc5e9SStephan Aßmus TransformGradientCommand::~TransformGradientCommand()
37c88bc5e9SStephan Aßmus {
380cbb6c11SStephan Aßmus if (fGradient != NULL)
390cbb6c11SStephan Aßmus fGradient->ReleaseReference();
40c88bc5e9SStephan Aßmus
41c88bc5e9SStephan Aßmus if (fTransformBox != NULL)
42c88bc5e9SStephan Aßmus fTransformBox->RemoveListener(this);
43c88bc5e9SStephan Aßmus }
44c88bc5e9SStephan Aßmus
45c88bc5e9SStephan Aßmus
46c88bc5e9SStephan Aßmus status_t
InitCheck()47c88bc5e9SStephan Aßmus TransformGradientCommand::InitCheck()
48c88bc5e9SStephan Aßmus {
49c88bc5e9SStephan Aßmus return fGradient != NULL ? TransformCommand::InitCheck() : B_NO_INIT;
50c88bc5e9SStephan Aßmus }
51c88bc5e9SStephan Aßmus
52c88bc5e9SStephan Aßmus // #pragma mark -
53c88bc5e9SStephan Aßmus
54c88bc5e9SStephan Aßmus // TransformBoxDeleted
55c88bc5e9SStephan Aßmus void
TransformBoxDeleted(const TransformBox * box)56c88bc5e9SStephan Aßmus TransformGradientCommand::TransformBoxDeleted(const TransformBox* box)
57c88bc5e9SStephan Aßmus {
58c88bc5e9SStephan Aßmus if (fTransformBox == box) {
59c88bc5e9SStephan Aßmus if (fTransformBox != NULL)
60c88bc5e9SStephan Aßmus fTransformBox->RemoveListener(this);
61c88bc5e9SStephan Aßmus fTransformBox = NULL;
62c88bc5e9SStephan Aßmus }
63c88bc5e9SStephan Aßmus }
64c88bc5e9SStephan Aßmus
65c88bc5e9SStephan Aßmus
66c88bc5e9SStephan Aßmus // #pragma mark -
67c88bc5e9SStephan Aßmus
68c88bc5e9SStephan Aßmus
69c88bc5e9SStephan Aßmus status_t
_SetTransformation(BPoint pivot,BPoint translation,double rotation,double xScale,double yScale) const70c88bc5e9SStephan Aßmus TransformGradientCommand::_SetTransformation(BPoint pivot, BPoint translation,
71c88bc5e9SStephan Aßmus double rotation, double xScale, double yScale) const
72c88bc5e9SStephan Aßmus {
73c88bc5e9SStephan Aßmus if (fTransformBox) {
74c88bc5e9SStephan Aßmus fTransformBox->SetTransformation(pivot, translation, rotation, xScale,
75c88bc5e9SStephan Aßmus yScale);
76c88bc5e9SStephan Aßmus return B_OK;
77c88bc5e9SStephan Aßmus }
78c88bc5e9SStephan Aßmus
79c88bc5e9SStephan Aßmus ChannelTransform transform;
80c88bc5e9SStephan Aßmus transform.SetTransformation(pivot, translation, rotation, xScale, yScale);
81c88bc5e9SStephan Aßmus
82c88bc5e9SStephan Aßmus // Reset and apply transformation. (Gradients never have an original
83c88bc5e9SStephan Aßmus // transformation that needs to be taken into account, the box always
84c88bc5e9SStephan Aßmus // assignes it completely.)
85c88bc5e9SStephan Aßmus fGradient->Reset();
86c88bc5e9SStephan Aßmus fGradient->Multiply(transform);
87c88bc5e9SStephan Aßmus
88c88bc5e9SStephan Aßmus return B_OK;
89c88bc5e9SStephan Aßmus }
90c88bc5e9SStephan Aßmus
91