xref: /haiku/src/apps/icon-o-matic/transformable/TransformGradientCommand.cpp (revision a75a222b35d17cd83bc75253f3cd8e24a6a911f4)
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