// Copyright (c) 2007, Rodrigo Braz Monteiro // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of the Aegisub Group nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // ----------------------------------------------------------------------------- // // AEGISUB // // Website: http://aegisub.cellosoft.com // Contact: mailto:zeratul@cellosoft.com // /////////// // Headers #include "visual_tool_vector_clip.h" #include "ass_dialogue.h" /////// // IDs enum { BUTTON_DRAG = 1300, BUTTON_LINE, BUTTON_BICUBIC, BUTTON_INSERT, BUTTON_REMOVE, BUTTON_CONVERT, BUTTON_FREEHAND }; /////////////// // Constructor VisualToolVectorClip::VisualToolVectorClip(VideoDisplay *parent,wxSizer *toolbar,wxWindow *toolWindow) : VisualTool(parent) { DoRefresh(); // Create toolbar wxButton *drag = new wxBitmapButton(toolWindow,BUTTON_DRAG,wxBITMAP(visual_vector_clip_drag)); wxButton *line = new wxBitmapButton(toolWindow,BUTTON_LINE,wxBITMAP(visual_vector_clip_line)); wxButton *bicubic = new wxBitmapButton(toolWindow,BUTTON_BICUBIC,wxBITMAP(visual_vector_clip_bicubic)); wxButton *convert = new wxBitmapButton(toolWindow,BUTTON_CONVERT,wxBITMAP(visual_vector_clip_convert)); wxButton *insert = new wxBitmapButton(toolWindow,BUTTON_INSERT,wxBITMAP(visual_vector_clip_insert)); wxButton *remove = new wxBitmapButton(toolWindow,BUTTON_REMOVE,wxBITMAP(visual_vector_clip_remove)); wxButton *freehand = new wxBitmapButton(toolWindow,BUTTON_FREEHAND,wxBITMAP(visual_vector_clip_freehand)); drag->SetToolTip(_("Drag control points.")); line->SetToolTip(_("Appends a line.")); bicubic->SetToolTip(_("Appends a bezier bicubic curve.")); convert->SetToolTip(_("Converts a segment between line and bicubic.")); insert->SetToolTip(_("Inserts a control point.")); remove->SetToolTip(_("Removes a control point.")); freehand->SetToolTip(_("Draws a freehand shape.")); ConnectButton(drag); ConnectButton(line); ConnectButton(bicubic); ConnectButton(convert); ConnectButton(insert); ConnectButton(remove); ConnectButton(freehand); toolbar->Add(drag,0,wxEXPAND); toolbar->Add(line,0,wxEXPAND); toolbar->Add(bicubic,0,wxEXPAND | wxRIGHT,5); toolbar->Add(new wxStaticLine(toolWindow,-1,wxDefaultPosition,wxDefaultSize,wxLI_VERTICAL),0,wxEXPAND | wxRIGHT,5); toolbar->Add(convert,0,wxEXPAND); toolbar->Add(insert,0,wxEXPAND); toolbar->Add(remove,0,wxEXPAND | wxRIGHT,5); toolbar->Add(new wxStaticLine(toolWindow,-1,wxDefaultPosition,wxDefaultSize,wxLI_VERTICAL),0,wxEXPAND | wxRIGHT,5); toolbar->Add(freehand,0,wxEXPAND); toolbar->AddStretchSpacer(1); } ////////// // Update void VisualToolVectorClip::Update() { GetParent()->Render(); } //////// // Draw void VisualToolVectorClip::Draw() { // Get line AssDialogue *line = GetActiveDialogueLine(); if (!line) return; // Parse vector std::vector points; spline.GetPointList(points); // Draw lines SetLineColour(colour[3],1.0f,2); SetFillColour(colour[3],0.0f); for (size_t i=0;i::iterator cur=spline.curves.begin();cur!=spline.curves.end();cur++) { if (cur->type == CURVE_BICUBIC) { DrawDashedLine(cur->x1,cur->y1,cur->x2,cur->y2,6); DrawDashedLine(cur->x3,cur->y3,cur->x4,cur->y4,6); } } } ///////////////////////// // Populate feature list void VisualToolVectorClip::PopulateFeatureList() { // Clear features.clear(); VisualDraggableFeature feat; // Go through each curve bool isFirst = true; int i = 0; for (std::list::iterator cur=spline.curves.begin();cur!=spline.curves.end();cur++,i++) { // First point if (isFirst) { isFirst = false; feat.x = cur->x1; feat.y = cur->y1; feat.type = DRAG_SMALL_CIRCLE; feat.value = i; feat.value2 = 0; features.push_back(feat); } // Line if (cur->type == CURVE_LINE) { feat.x = cur->x2; feat.y = cur->y2; feat.type = DRAG_SMALL_CIRCLE; feat.value = i; feat.value2 = 1; features.push_back(feat); } // Bicubic if (cur->type == CURVE_BICUBIC) { // Current size int size = features.size(); // Control points feat.x = cur->x2; feat.y = cur->y2; feat.value = i; feat.value2 = 1; feat.brother[0] = size-1; feat.type = DRAG_SMALL_SQUARE; features.push_back(feat); feat.x = cur->x3; feat.y = cur->y3; feat.value2 = 2; feat.brother[0] = size+2; features.push_back(feat); // End point feat.x = cur->x4; feat.y = cur->y4; feat.type = DRAG_SMALL_CIRCLE; feat.value2 = 3; features.push_back(feat); } } } ////////// // Update void VisualToolVectorClip::UpdateDrag(VisualDraggableFeature &feature) { spline.MovePoint(feature.value,feature.value2,wxPoint(feature.x,feature.y)); } ////////// // Commit void VisualToolVectorClip::CommitDrag(VisualDraggableFeature &feature) { SetOverride(_T("\\clip"),_T("(") + spline.EncodeToASS() + _T(")")); } /////////// // Refresh void VisualToolVectorClip::DoRefresh() { if (!dragging) { // Get line AssDialogue *line = GetActiveDialogueLine(); if (!line) return; // Get clip vector wxString vect; int scale; vect = GetLineVectorClip(line,scale); if (vect.IsEmpty()) return; spline.DecodeFromASS(vect); PopulateFeatureList(); } }