mirror of
https://github.com/rdkit/rdkit.git
synced 2026-06-04 21:54:27 +08:00
* MolDraw2D refactoring - rename setupMoleculeDraw->initMoleculeDraw - track whether or not initDrawing() has been called - centralize calls to initDrawing() and clearDrawing() into initMoleculeDraw() - update svg hashes in tests * update some expected test results * support changing font scale and default scale add reaction test * does not work... this is hard * all tests pass * do something about legends * docs * more tests * more docs * cleanup * going around in circles... hopefully converging * cleanup * Single bond skeleton works. * Simple bond drawing seems to be working. * Initial addition of atom symbols. * Stash of not-quite-working atom symbols prior to major surgery. * Atom symbols seem to be working. Major surgery not required, just inverted Y coords at the outset. * Add classes to atom labels. * Renamed AtomLabel AtomSymbol. * Add highlights. * Fix bug from PR4839. * Molecule note. * Added atom notes. * Added bond notes. * Extract radicals. * Annotation via new DrawAnnotation class. * Add brackets. * Add linknodes. * Add close contacts. * Add attachment points. Fix wavy lines. * Draw molecules in grid. * Tidy. * Fix radicals when font has hit maxFontSize. Make getDrawCoords work. * Draw primitives take atom or draw coords. * Fix legends. * More fixing for tests. DrawMol::setScale now takes font scale as well. * tidy debug writes * Variable fraction of panel for legend. * Better legend positioning. * Fix sub- and super-script spacing. Added spaces to Freetype strings. * Basic reaction drawing. * Reaction highlighting. * Minor tweak to reacctions. * Tweaked reaction DrawMol widths. * Fix atomTags. * Fix catch tests except contours. * Contouring working in catch_tests.cpp. * Fix catch tests. * AtomSymbol and DrawAnnotation into MolDraw2D_detail. * DrawMol and DrawShape into MolDraw2D_detail. * DrawText inot MolDraw2D_detail. * Machete out. * DrawText goes private. * Move some stuff about, such as StringRect to its own header. * Python wrapper compiles (but crashes when Draw imported). * More tidying. Python DrawArrow failing. * Linux changes. * Fixed error in DrawShapeArrow spotted by valgrind. Fixed some warnings from gcc. * Maybe fixed DrawArrow. * Added basic argparse interface. * Added newlines. * Changes in response to review. Non-const args in move constructors and operator=. Added missing classes to MolDraw2D_detail. Deleted move operator= where it had been forgotten. Fixed copyright dates. * Deleted all default c'tors in derived classes. * Changes in response to review: Wedge widths now a proportion of mean bond length in draw coords.. Add padding below legend when positioning it. * Fix tests. * Fix the private/protected mess of the new classes. * Moved doesLineIntersect etc. * Reinstate original alignString for non-FT drawings. * More faffing about with reaction layouts. * Fix font sizes in testGitHub3391. * Fix atom notes fitting inside fat wedges. * Fix molecule annotation font size. * More fixes of rectangle/triangle collision detection. * Test for highlight linewidth multiplier. * Use push_back not emplace_back. * Attempt at better Freetype char spacing. * Option to turn off TEST_ASSERT. Currently off. * Fixed embarrassing maths to do with wedge fatness. * More tidying post-review. * Document highlight_linewidth_multipliers. * Expose baseFontSize to Python. * Changes in response to review. * Allow DrawMolecules molecules to be drawn to different scales. * Fix bond sneaking between C:8 in, for example, reactions. * Fix bad re-factoring. * Fix globbing. * Changes in response to review. * Add invariant check. * Add draw option to fix font size. * suggested changes * Update catch test results. * Fix expected freetype results. * Fix non-freetype drawers. * Fin non-freetype test results. * get the Qt drawer working too * Fix disappearing reaction highlights. * Changes as result of review. * Fixed non-FreeType hash codes for reaction SVGs. Extra comment in catch_tests. * reactant highlighting was clearning properties * Fix for failing contour python test. * fix a non-freetype problem * swig wrappers working * Bump timeouts in test. Co-authored-by: greg landrum <greg.landrum@gmail.com> Co-authored-by: David Cosgrove <david@cozchemix.co.uk>
97 lines
3.2 KiB
C++
97 lines
3.2 KiB
C++
//
|
|
// Copyright (C) 2020-2022 David Cosgrove and other RDKit contributors
|
|
//
|
|
// @@ All Rights Reserved @@
|
|
// This file is part of the RDKit.
|
|
// The contents are covered by the terms of the BSD license
|
|
// which is included in the file license.txt, found at the root
|
|
// of the RDKit source tree.
|
|
//
|
|
// Original author: David Cosgrove (CozChemIx).
|
|
//
|
|
|
|
#include <GraphMol/MolDraw2D/DrawTextFTCairo.h>
|
|
|
|
namespace RDKit {
|
|
namespace MolDraw2D_detail {
|
|
|
|
// ****************************************************************************
|
|
DrawTextFTCairo::DrawTextFTCairo(double max_fnt_sz, double min_fnt_sz,
|
|
const std::string &font_file, cairo_t *dp_cr)
|
|
: DrawTextFT(max_fnt_sz, min_fnt_sz, font_file), dp_cr_(dp_cr) {}
|
|
|
|
void DrawTextFTCairo::setCairoContext(cairo_t *cr) { dp_cr_ = cr; }
|
|
|
|
// ****************************************************************************
|
|
double DrawTextFTCairo::extractOutline() {
|
|
cairo_set_source_rgba(dp_cr_, colour().r, colour().g, colour().b, colour().a);
|
|
double adv = DrawTextFT::extractOutline();
|
|
cairo_fill(dp_cr_);
|
|
|
|
return adv;
|
|
}
|
|
|
|
// ****************************************************************************
|
|
int DrawTextFTCairo::MoveToFunctionImpl(const FT_Vector *to) {
|
|
double dx, dy;
|
|
fontPosToDrawPos(to->x, to->y, dx, dy);
|
|
cairo_move_to(dp_cr_, dx, dy);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ****************************************************************************
|
|
int DrawTextFTCairo::LineToFunctionImpl(const FT_Vector *to) {
|
|
double dx, dy;
|
|
fontPosToDrawPos(to->x, to->y, dx, dy);
|
|
cairo_line_to(dp_cr_, dx, dy);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ****************************************************************************
|
|
int DrawTextFTCairo::ConicToFunctionImpl(const FT_Vector *control,
|
|
const FT_Vector *to) {
|
|
// Cairo doesn't have a quadratic bezier function, we need to promote
|
|
// it to a cubic using formula from
|
|
// https://lists.cairographics.org/archives/cairo/2010-April/019691.html
|
|
// and correcting the typo on the last line.
|
|
|
|
double x0, y0;
|
|
cairo_get_current_point(dp_cr_, &x0, &y0);
|
|
|
|
double x1, y1;
|
|
fontPosToDrawPos(control->x, control->y, x1, y1);
|
|
|
|
double x2, y2;
|
|
fontPosToDrawPos(to->x, to->y, x2, y2);
|
|
|
|
cairo_curve_to(dp_cr_, (2.0 / 3.0) * x1 + (1.0 / 3.0) * x0,
|
|
(2.0 / 3.0) * y1 + (1.0 / 3.0) * y0,
|
|
(2.0 / 3.0) * x1 + (1.0 / 3.0) * x2,
|
|
(2.0 / 3.0) * y1 + (1.0 / 3.0) * y2, x2, y2);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ****************************************************************************
|
|
int DrawTextFTCairo::CubicToFunctionImpl(const FT_Vector *controlOne,
|
|
const FT_Vector *controlTwo,
|
|
const FT_Vector *to) {
|
|
double controlOneX, controlOneY;
|
|
fontPosToDrawPos(controlOne->x, controlOne->y, controlOneX, controlOneY);
|
|
double controlTwoX, controlTwoY;
|
|
fontPosToDrawPos(controlTwo->x, controlTwo->y, controlTwoX, controlTwoY);
|
|
|
|
double dx, dy;
|
|
fontPosToDrawPos(to->x, to->y, dx, dy);
|
|
|
|
cairo_curve_to(dp_cr_, controlOneX, controlOneY, controlTwoX, controlTwoY, dx,
|
|
dy);
|
|
|
|
return 0;
|
|
}
|
|
|
|
} // namespace MolDraw2D_detail
|
|
} // namespace RDKit
|