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