diff --git a/include/gdi.h b/include/gdi.h index e4274135..f1febb0e 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -6793,6 +6793,29 @@ MG_EXPORT PLOGFONT GUIAPI CreateLogFontByName (const char* font_name); */ MG_EXPORT PLOGFONT GUIAPI CreateLogFontIndirect (LOGFONT* logfont); +/** + * \fn PLOGFONT GUIAPI CreateLogFontIndirectEx (LOGFONT* logfont, int rotation) + * \brief Creates a new logical font indirectly from a LOGFONT structure with + * a rotation degrees. + * + * This function creates a new logical font from information in the LOGFONT object + * \a logfont and the new rotation value \a rotation. + * + * Since 3.4.0. + * + * \param logfont The pointer to the reference logical font structure. + * \param rotation The rotation of the logical font, it is in units of + * tenth degrees. Note that you can specify rotation only for + * vector fonts (use FreeType2 font engine). + * + * \return The pointer to the logical font created, NULL on error. + * If \a rotation is not zero and the devfonts of the \a logfont + * does not support rotation, it returns NULL. + * + * \sa CreateLogFont, CreateLogFontIndirect, SelectFont + */ +MG_EXPORT PLOGFONT GUIAPI CreateLogFontIndirectEx (LOGFONT* logfont, int rotation); + /** * \fn void GUIAPI DestroyLogFont (PLOGFONT log_font) * \brief Destroys a logical font. diff --git a/src/font/logfont.c b/src/font/logfont.c index 27beb5ee..c876ac81 100644 --- a/src/font/logfont.c +++ b/src/font/logfont.c @@ -136,7 +136,7 @@ static PLOGFONT gdiCreateLogFont (const char* type, const char* family, return INV_LOGFONT; } - /*check if sbc_devfont and mbc_devfont support rotation*/ + /* check if sbc_devfont and mbc_devfont support rotation */ if (get_rotation(log_font, sbc_devfont, rotation) == rotation && (!mbc_devfont || get_rotation(log_font, mbc_devfont, rotation) == rotation)) log_font->rotation = rotation; @@ -287,6 +287,50 @@ PLOGFONT GUIAPI CreateLogFontIndirect (LOGFONT *logfont) return font; } +PLOGFONT GUIAPI CreateLogFontIndirectEx (LOGFONT *logfont, int rotation) +{ + PLOGFONT newfont; + DEVFONT* sbc_devfont, *mbc_devfont; + + if (!logfont) return NULL; + + // VincentWei: make sure the logfont has the key for resource manager. + if ((newfont = (PLOGFONT)malloc (sizeof (FONT_RES))) == NULL) + return INV_LOGFONT; + + // VincentWei: make sure the logfont has an invalid key for resource manager. + memcpy (newfont, logfont, sizeof(LOGFONT)); + ((FONT_RES *)newfont)->key = -1; + + sbc_devfont = logfont->sbc_devfont; + mbc_devfont = logfont->mbc_devfont; + + newfont->rotation = rotation; + if (logfont->rotation == 0 && rotation != 0) { + /* check if sbc_devfont and mbc_devfont support rotation */ + if (get_rotation(newfont, sbc_devfont, rotation) == rotation + && (!mbc_devfont || get_rotation(newfont, mbc_devfont, rotation) == rotation)) + newfont->rotation = rotation; + else + newfont->rotation = 0; + } + + if (sbc_devfont->font_ops->new_instance) + sbc_devfont = (*sbc_devfont->font_ops->new_instance) (newfont, sbc_devfont, TRUE); + if (sbc_devfont == NULL) { + free (newfont); + return INV_LOGFONT; + } + + if (mbc_devfont && mbc_devfont->font_ops->new_instance) + mbc_devfont = (*mbc_devfont->font_ops->new_instance) (newfont, mbc_devfont, FALSE); + + newfont->sbc_devfont = sbc_devfont; + newfont->mbc_devfont = mbc_devfont; + + return newfont; +} + PLOGFONT GUIAPI CreateLogFont (const char* type, const char* family, const char* charset, char weight, char slant, char flip, char other, char underline, char struckout, int size, int rotation)