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