Image crop bounds limited to not cause integer division by zero error

This commit is contained in:
Yousef Khadadeh 2026-04-03 11:08:56 +03:00
parent fb344f3a54
commit 5cbcc9af80
6 changed files with 15 additions and 8 deletions

View file

@ -102,7 +102,6 @@ void EditTool::input_mouse_button_on_canvas_callback(const InputManager::MouseBu
if(SCollision::collide(mouseCircle, SCollision::Circle<float>(drawP.world.drawData.cam.c.to_space(objInfoBeingEdited->obj->coords.from_space(h.coordMatrix * (*h.p))), drawP.drag_point_radius()))) {
pointDragging = &h;
isMovingPoint = true;
break;
}
}
if(!isMovingPoint && !objInfoBeingEdited->obj->collides_with_cam_coords(drawP.world.drawData.cam.c, cMouseCircle))
@ -141,9 +140,9 @@ void EditTool::input_mouse_motion_callback(const InputManager::MouseMotionCallba
Vector2f newPos = pointDragging->coordMatrix.inverse() * objInfoBeingEdited->obj->coords.get_mouse_pos(drawP.world);
if(newPos != *pointDragging->p) {
if(pointDragging->min)
newPos = cwise_vec_max((*pointDragging->min + Vector2f{pointDragging->minimumDistanceBetweenBoundsAndPoint, pointDragging->minimumDistanceBetweenBoundsAndPoint}).eval(), newPos);
newPos = cwise_vec_max((*pointDragging->min + Vector2f{pointDragging->minimumDistanceBetweenMinAndPoint, pointDragging->minimumDistanceBetweenMinAndPoint}).eval(), newPos);
if(pointDragging->max)
newPos = cwise_vec_min((*pointDragging->max - Vector2f{pointDragging->minimumDistanceBetweenBoundsAndPoint, pointDragging->minimumDistanceBetweenBoundsAndPoint}).eval(), newPos);
newPos = cwise_vec_min((*pointDragging->max - Vector2f{pointDragging->minimumDistanceBetweenMaxAndPoint, pointDragging->minimumDistanceBetweenMaxAndPoint}).eval(), newPos);
*pointDragging->p = newPos;
objInfoBeingEdited->obj->commit_update(drawP);
}

View file

@ -12,7 +12,8 @@ class EditTool : public DrawingProgramToolBase {
Vector2f* p;
Vector2f* min;
Vector2f* max;
float minimumDistanceBetweenBoundsAndPoint = MINIMUM_DISTANCE_BETWEEN_BOUNDS;
float minimumDistanceBetweenMinAndPoint = MINIMUM_DISTANCE_BETWEEN_BOUNDS;
float minimumDistanceBetweenMaxAndPoint = MINIMUM_DISTANCE_BETWEEN_BOUNDS;
Affine2f coordMatrix = Affine2f::Identity();
};

View file

@ -29,8 +29,9 @@ void ImageEditTool::edit_start(EditTool& editTool, CanvasComponentContainer::Obj
Affine2f transformMat = Translation2f(a.d.p1) * AlignedScaling2f(a.d.p2 - a.d.p1) * Affine2f::Identity();
prevData = a.d;
editTool.add_point_handle({&a.d.cropP1, &staticZero, &a.d.cropP2, 0.0f, transformMat});
editTool.add_point_handle({&a.d.cropP2, &a.d.cropP1, &staticOne, 0.0f, transformMat});
constexpr float MINIMUM_DISTANCE_BETWEEN_IMAGE_CROP_POINTS = 0.02f;
editTool.add_point_handle({&a.d.cropP1, &staticZero, &a.d.cropP2, 0.0f, MINIMUM_DISTANCE_BETWEEN_IMAGE_CROP_POINTS, transformMat});
editTool.add_point_handle({&a.d.cropP2, &a.d.cropP1, &staticOne, MINIMUM_DISTANCE_BETWEEN_IMAGE_CROP_POINTS, 0.0f, transformMat});
a.d.editing = true;
comp->obj->commit_update(drawP);
}

View file

@ -140,13 +140,13 @@ void InputManager::Text::add_textbox_undo(const RichText::TextBox::Cursor& prevC
if(!textBoxes.empty()) {
auto& frontTextBox = textBoxes.front();
frontTextBox.textboxUndo.push({[textBox = frontTextBox.textBox, cursor = frontTextBox.cursor, prevCursor = prevCursor, prevRichText = prevRichText]() {
textBox->set_rich_text_data(prevRichText);
textBox->set_rich_text_data_for_undo_redo(prevRichText);
cursor->selectionBeginPos = cursor->selectionEndPos = cursor->pos = std::max(prevCursor.selectionEndPos, prevCursor.selectionBeginPos);
cursor->previousX = std::nullopt;
return true;
},
[textBox = frontTextBox.textBox, cursor = frontTextBox.cursor, currentCursor = *frontTextBox.cursor, currentRichText = frontTextBox.textBox->get_rich_text_data()]() {
textBox->set_rich_text_data(currentRichText);
textBox->set_rich_text_data_for_undo_redo(currentRichText);
cursor->selectionBeginPos = cursor->selectionEndPos = cursor->pos = std::max(currentCursor.selectionEndPos, currentCursor.selectionBeginPos);
cursor->previousX = std::nullopt;
return true;

View file

@ -500,6 +500,11 @@ void TextBox::set_rich_text_data(const TextData& richText) {
needsRebuild = true;
}
void TextBox::set_rich_text_data_for_undo_redo(const TextData& richText) {
set_rich_text_data(richText);
if(onUserTextEdit) onUserTextEdit();
}
std::string TextBox::get_string() {
return get_text_between({0, 0}, move(TextBox::Movement::END, {0, 0}));
}

View file

@ -138,6 +138,7 @@ class TextBox {
TextData get_rich_text_data();
void set_rich_text_data(const TextData& richText);
void set_rich_text_data_for_undo_redo(const TextData& richText);
TextData get_rich_text_data_between(TextPosition p1, TextPosition p2);
TextPosition insert_rich_text(TextPosition p, const TextData& richText);