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