summaryrefslogtreecommitdiff
path: root/libs/litehtml/containers/windows/cairo/windows_container.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/litehtml/containers/windows/cairo/windows_container.cpp')
-rw-r--r--libs/litehtml/containers/windows/cairo/windows_container.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/libs/litehtml/containers/windows/cairo/windows_container.cpp b/libs/litehtml/containers/windows/cairo/windows_container.cpp
new file mode 100644
index 0000000000..e19ad337e7
--- /dev/null
+++ b/libs/litehtml/containers/windows/cairo/windows_container.cpp
@@ -0,0 +1,194 @@
+#include "windows_container.h"
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include "cairo_font.h"
+#include <strsafe.h>
+
+windows_container::windows_container(void)
+{
+ m_temp_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 2, 2);
+ m_temp_cr = cairo_create(m_temp_surface);
+ m_font_link = NULL;
+ CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_ALL, IID_IMLangFontLink2, (void**) &m_font_link);
+}
+
+windows_container::~windows_container(void)
+{
+ clear_images();
+ if(m_font_link)
+ {
+ m_font_link->Release();
+ }
+ cairo_surface_destroy(m_temp_surface);
+ cairo_destroy(m_temp_cr);
+}
+
+litehtml::uint_ptr windows_container::create_font( const char* faceName, int size, int weight, litehtml::font_style italic, unsigned int decoration, litehtml::font_metrics* fm )
+{
+ std::wstring fnt_name = L"sans-serif";
+
+ litehtml::string_vector fonts;
+ litehtml::split_string(faceName, fonts, ",");
+ if(!fonts.empty())
+ {
+ litehtml::trim(fonts[0]);
+ fnt_name = cairo_font::utf8_to_wchar(fonts[0]);
+ if (fnt_name.front() == L'"' || fnt_name.front() == L'\'')
+ {
+ fnt_name.erase(0, 1);
+ }
+ if (fnt_name.back() == L'"' || fnt_name.back() == L'\'')
+ {
+ fnt_name.erase(fnt_name.length() - 1, 1);
+ }
+ }
+
+ cairo_font* fnt = new cairo_font( m_font_link,
+ fnt_name.c_str(),
+ size,
+ weight,
+ (italic == litehtml::font_style_italic) ? TRUE : FALSE,
+ (decoration & litehtml::font_decoration_linethrough) ? TRUE : FALSE,
+ (decoration & litehtml::font_decoration_underline) ? TRUE : FALSE);
+
+ cairo_save(m_temp_cr);
+ fnt->load_metrics(m_temp_cr);
+
+ if(fm)
+ {
+ fm->ascent = fnt->metrics().ascent;
+ fm->descent = fnt->metrics().descent;
+ fm->height = fnt->metrics().height;
+ fm->x_height = fnt->metrics().x_height;
+ if(italic == litehtml::font_style_italic || decoration)
+ {
+ fm->draw_spaces = true;
+ } else
+ {
+ fm->draw_spaces = false;
+ }
+ }
+
+ cairo_restore(m_temp_cr);
+
+ return (litehtml::uint_ptr) fnt;
+}
+
+void windows_container::delete_font( litehtml::uint_ptr hFont )
+{
+ cairo_font* fnt = (cairo_font*) hFont;
+ if(fnt)
+ {
+ delete fnt;
+ }
+}
+
+int windows_container::text_width( const char* text, litehtml::uint_ptr hFont )
+{
+ cairo_font* fnt = (cairo_font*) hFont;
+
+ cairo_save(m_temp_cr);
+ int ret = fnt->text_width(m_temp_cr, text);
+ cairo_restore(m_temp_cr);
+ return ret;
+}
+
+void windows_container::draw_text( litehtml::uint_ptr hdc, const char* text, litehtml::uint_ptr hFont, litehtml::web_color color, const litehtml::position& pos )
+{
+ if(hFont)
+ {
+ cairo_font* fnt = (cairo_font*) hFont;
+ cairo_t* cr = (cairo_t*) hdc;
+ cairo_save(cr);
+
+ apply_clip(cr);
+
+ int x = pos.left();
+ int y = pos.bottom() - fnt->metrics().descent;
+
+ set_color(cr, color);
+ fnt->show_text(cr, x, y, text);
+
+ cairo_restore(cr);
+ }
+}
+
+litehtml::string windows_container::resolve_color(const litehtml::string& color) const
+{
+ struct custom_color
+ {
+ const char* name;
+ int color_index;
+ };
+
+ static custom_color colors[] = {
+ { "ActiveBorder", COLOR_ACTIVEBORDER},
+ { "ActiveCaption", COLOR_ACTIVECAPTION},
+ { "AppWorkspace", COLOR_APPWORKSPACE },
+ { "Background", COLOR_BACKGROUND },
+ { "ButtonFace", COLOR_BTNFACE },
+ { "ButtonHighlight", COLOR_BTNHIGHLIGHT },
+ { "ButtonShadow", COLOR_BTNSHADOW },
+ { "ButtonText", COLOR_BTNTEXT },
+ { "CaptionText", COLOR_CAPTIONTEXT },
+ { "GrayText", COLOR_GRAYTEXT },
+ { "Highlight", COLOR_HIGHLIGHT },
+ { "HighlightText", COLOR_HIGHLIGHTTEXT },
+ { "InactiveBorder", COLOR_INACTIVEBORDER },
+ { "InactiveCaption", COLOR_INACTIVECAPTION },
+ { "InactiveCaptionText", COLOR_INACTIVECAPTIONTEXT },
+ { "InfoBackground", COLOR_INFOBK },
+ { "InfoText", COLOR_INFOTEXT },
+ { "Menu", COLOR_MENU },
+ { "MenuText", COLOR_MENUTEXT },
+ { "Scrollbar", COLOR_SCROLLBAR },
+ { "ThreeDDarkShadow", COLOR_3DDKSHADOW },
+ { "ThreeDFace", COLOR_3DFACE },
+ { "ThreeDHighlight", COLOR_3DHILIGHT },
+ { "ThreeDLightShadow", COLOR_3DLIGHT },
+ { "ThreeDShadow", COLOR_3DSHADOW },
+ { "Window", COLOR_WINDOW },
+ { "WindowFrame", COLOR_WINDOWFRAME },
+ { "WindowText", COLOR_WINDOWTEXT }
+ };
+
+ for (auto& clr : colors)
+ {
+ if (!litehtml::t_strcasecmp(clr.name, color.c_str()))
+ {
+ char str_clr[20];
+ DWORD rgb_color = GetSysColor(clr.color_index);
+ StringCchPrintfA(str_clr, 20, "#%02X%02X%02X", GetRValue(rgb_color), GetGValue(rgb_color), GetBValue(rgb_color));
+ return std::move(litehtml::string(str_clr));
+ }
+ }
+ return std::move(litehtml::string());
+}
+
+cairo_surface_t* windows_container::get_image(const std::string& url)
+{
+ return nullptr;
+}
+
+double windows_container::get_screen_dpi() const
+{
+ HDC hdc = GetDC(NULL);
+ int ret = GetDeviceCaps(hdc, LOGPIXELSX);
+ ReleaseDC(NULL, hdc);
+ return ret;
+}
+
+int windows_container::get_screen_width() const
+{
+ HDC hdc = GetDC(NULL);
+ int ret = GetDeviceCaps(hdc, HORZRES);
+ ReleaseDC(NULL, hdc);
+ return ret;
+}
+int windows_container::get_screen_height() const
+{
+ HDC hdc = GetDC(NULL);
+ int ret = GetDeviceCaps(hdc, VERTRES);
+ ReleaseDC(NULL, hdc);
+ return ret;
+}