Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/c/indigo-renderer/src/indigo_render2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,7 @@ void IndigoRenderer::setOptionsHandlers()
mgr->setOptionHandlerString("render-output-format", indigoRenderSetOutputFormat, indigoRenderGetOutputFormat);

mgr->setOptionHandlerString("render-comment", SETTER_GETTER_STR_OPTION(rp.cnvOpt.comment));
mgr->setOptionHandlerString("render-font-family", SETTER_GETTER_STR_OPTION(rp.cnvOpt.fontFamily));
mgr->setOptionHandlerString("render-comment-position", indigoRenderSetCommentPosition, indigoRenderGetCommentPosition);
mgr->setOptionHandlerString("render-stereo-style", indigoRenderSetStereoStyle, indigoRenderGetStereoStyle);
mgr->setOptionHandlerString("render-catalysts-placement", indigoRenderSetCatalystsPlacement, indigoRenderGetCatalystsPlacement);
Expand Down
45 changes: 45 additions & 0 deletions api/c/tests/unit/tests/renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,31 @@ class IndigoApiRendererTest : public IndigoApiTest
indigoRendererDispose(_session);
indigoReleaseSessionId(_session);
}

std::string renderWithFontFamily(const char* format, const char* font_family = nullptr)
{
indigoResetOptions();
indigoSetOption("render-comment", "Font comment");
indigoSetOption("render-output-format", format);
indigoSetOptionXY("render-image-size", 300, 200);
if (font_family != nullptr)
indigoSetOption("render-font-family", font_family);

int m = indigoLoadMoleculeFromString("C");
int buf = indigoWriteBuffer();
char* raw = nullptr;
int size = 0;

indigoRender(m, buf);
indigoToBuffer(buf, &raw, &size);

std::string output(raw, size);

indigoFree(buf);
indigoFree(m);

return output;
}
};

TEST_F(IndigoApiRendererTest, layout_rings)
Expand Down Expand Up @@ -132,3 +157,23 @@ TEST_F(IndigoApiRendererTest, render_superatoms)
thread.join();
}
}

TEST_F(IndigoApiRendererTest, svg_font_family_option_changes_rendering)
{
auto default_svg = renderWithFontFamily("svg");
auto arial_svg = renderWithFontFamily("svg", "Arial");
auto courier_svg = renderWithFontFamily("svg", "Courier New");

ASSERT_EQ(default_svg, arial_svg);
ASSERT_NE(default_svg, courier_svg);
}

TEST_F(IndigoApiRendererTest, png_font_family_option_changes_rendering)
{
auto default_png = renderWithFontFamily("png");
auto arial_png = renderWithFontFamily("png", "Arial");
auto courier_png = renderWithFontFamily("png", "Courier New");

ASSERT_EQ(default_png, arial_png);
ASSERT_NE(default_png, courier_png);
}
1 change: 1 addition & 0 deletions core/render2d/render_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,7 @@ namespace indigo
int commentOffset;
int titleOffset;
Array<char> comment;
Array<char> fontFamily;
Array<char> titleProp;
COMMENT_POS commentPos;
MultilineTextLayout commentAlign;
Expand Down
3 changes: 2 additions & 1 deletion core/render2d/render_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ namespace indigo

void checkPathNonEmpty() const;

RenderContext(const RenderOptions& opt, float relativeThickness, float bondLineWidthFactor);
RenderContext(const RenderOptions& opt, const CanvasOptions& cnvOpt, float relativeThickness, float bondLineWidthFactor);
void setDefaultScale(float scale);
void setHDC(PVOID hdc);
int getMaxPageSize() const;
Expand Down Expand Up @@ -217,6 +217,7 @@ namespace indigo
cairo_scaled_font_t* _scaled_fonts[FONT_SIZE_COUNT * 2];

bool metafileFontsToCurves;
bool _hasCustomFontFamily;
cairo_t* _cr;
cairo_surface_t* _surface;
void* _meta_hdc;
Expand Down
1 change: 1 addition & 0 deletions core/render2d/src/render_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,7 @@ void CanvasOptions::clear()
titleOffset = 0;
gridColumnNumber = 1;
comment.clear();
fontFamily.clear();
titleProp.clear();
titleProp.appendString("^NAME", true);
outputSheetWidth = -1;
Expand Down
11 changes: 7 additions & 4 deletions core/render2d/src/render_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@ void RenderContext::storeAndDestroyMetafile(bool discard)

CP_DEF(RenderContext);

RenderContext::RenderContext(const RenderOptions& ropt, float relativeThickness, float bondLineWidthFactor)
: CP_INIT, TL_CP_GET(_fontfamily), TL_CP_GET(transforms), metafileFontsToCurves(false), _cr(NULL), _surface(NULL), _meta_hdc(NULL), opt(ropt),
_pattern(NULL), _settings()
RenderContext::RenderContext(const RenderOptions& ropt, const CanvasOptions& cnvOpt, float relativeThickness, float bondLineWidthFactor)
: CP_INIT, TL_CP_GET(_fontfamily), TL_CP_GET(transforms), metafileFontsToCurves(false), _hasCustomFontFamily(cnvOpt.fontFamily.size() > 0),
_cr(NULL), _surface(NULL), _meta_hdc(NULL), opt(ropt), _pattern(NULL), _settings()
{
AcsOptions acs;
if (ropt.fontSize > 0)
Expand All @@ -138,7 +138,10 @@ RenderContext::RenderContext(const RenderOptions& ropt, float relativeThickness,
acs.bondSpacing = ropt.bondSpacing;
_settings.init(relativeThickness, bondLineWidthFactor, &acs);

bprintf(_fontfamily, "Arial");
if (cnvOpt.fontFamily.size() > 0)
bprintf(_fontfamily, "%s", cnvOpt.fontFamily.ptr());
else
bprintf(_fontfamily, "Arial");
bbmin.x = bbmin.y = 1;
bbmax.x = bbmax.y = -1;
_defaultScale = 0.0f;
Expand Down
10 changes: 10 additions & 0 deletions core/render2d/src/render_fonts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,16 @@ void RenderContext::fontsSetFont(const TextItem& ti)
{
std::lock_guard<std::mutex> _lock(_cairo_mutex);

if (_hasCustomFontFamily)
{
cairo_select_font_face(_cr, _fontfamily.ptr(), ti.italic ? CAIRO_FONT_SLANT_ITALIC : CAIRO_FONT_SLANT_NORMAL,
ti.bold ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL);
cairoCheckStatus();
cairo_set_font_size(_cr, ti.size > 0 ? ti.size : fontGetSize(ti.fontsize));
cairoCheckStatus();
return;
}

cairo_font_face_t* _cairo_face = _font_face_manager.selectCairoFontFace(ti);
cairoCheckStatus();

Expand Down
2 changes: 1 addition & 1 deletion core/render2d/src/render_params.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ void RenderParamInterface::render(RenderParams& params)
if (params.rmode == RENDER_NONE)
throw Error("No object to render specified");

RenderContext rc(params.rOpt, params.relativeThickness, params.bondLineWidthFactor);
RenderContext rc(params.rOpt, params.cnvOpt, params.relativeThickness, params.bondLineWidthFactor);

int bondLength_px = (int)(params.rOpt.bond_length_px > EPSILON ? params.rOpt.bond_length_px : LayoutOptions::DEFAULT_BOND_LENGTH_PX);

Expand Down
Loading