Skip to content

Commit a73d209

Browse files
committed
Fixed GDI+ container
1 parent 687928f commit a73d209

File tree

4 files changed

+75
-70
lines changed

4 files changed

+75
-70
lines changed

containers/windows/gdiplus/gdiplus_container.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static Color gdiplus_color(web_color color)
2525
return Color(color.alpha, color.red, color.green, color.blue);
2626
}
2727

28-
void gdiplus_container::draw_ellipse(HDC hdc, int x, int y, int width, int height, web_color color, int line_width)
28+
void gdiplus_container::draw_ellipse(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, web_color color, int line_width)
2929
{
3030
Graphics graphics(hdc);
3131

@@ -36,7 +36,7 @@ void gdiplus_container::draw_ellipse(HDC hdc, int x, int y, int width, int heigh
3636
graphics.DrawEllipse(&pen, x, y, width, height);
3737
}
3838

39-
void gdiplus_container::fill_ellipse(HDC hdc, int x, int y, int width, int height, web_color color)
39+
void gdiplus_container::fill_ellipse(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, web_color color)
4040
{
4141
Graphics graphics(hdc);
4242

@@ -47,7 +47,7 @@ void gdiplus_container::fill_ellipse(HDC hdc, int x, int y, int width, int heigh
4747
graphics.FillEllipse(&brush, x, y, width, height);
4848
}
4949

50-
void gdiplus_container::fill_rect(HDC hdc, int x, int y, int width, int height, web_color color)
50+
void gdiplus_container::fill_rect(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, web_color color)
5151
{
5252
Graphics graphics(hdc);
5353

@@ -88,7 +88,7 @@ void gdiplus_container::draw_img_bg(HDC hdc, uint_ptr img, const litehtml::backg
8888
scaled_img = new Bitmap(bg.origin_box.width, bg.origin_box.height);
8989
Graphics gr(scaled_img);
9090
gr.SetPixelOffsetMode(PixelOffsetModeHighQuality);
91-
gr.DrawImage(bgbmp, 0, 0, bg.origin_box.width, bg.origin_box.height);
91+
gr.DrawImage(bgbmp, 0.0, 0.0, bg.origin_box.width, bg.origin_box.height);
9292
bgbmp = scaled_img;
9393
}
9494

@@ -147,11 +147,11 @@ void gdiplus_container::draw_img_bg(HDC hdc, uint_ptr img, const litehtml::backg
147147
const float dash = 3;
148148
const float space = 2;
149149

150-
static void draw_horz_border(Graphics& graphics, const border& border, int y, int left, int right)
150+
static void draw_horz_border(Graphics& graphics, const border& border, litehtml::pixel_t y, litehtml::pixel_t left, litehtml::pixel_t right)
151151
{
152152
if (border.style != border_style_double || border.width < 3)
153153
{
154-
if (border.width == 1) right--; // 1px-wide lines are longer by one pixel in GDI+ (the endpoint is also drawn)
154+
if (border.width == 1) right -= 1; // 1px-wide lines are longer by one pixel in GDI+ (the endpoint is also drawn)
155155
Pen pen(gdiplus_color(border.color), (float)border.width);
156156
if (border.style == border_style_dotted)
157157
{
@@ -164,24 +164,24 @@ static void draw_horz_border(Graphics& graphics, const border& border, int y, in
164164
pen.SetDashPattern(dashValues, 2);
165165
}
166166
graphics.DrawLine(&pen,
167-
Point(left, y + border.width / 2),
168-
Point(right, y + border.width / 2));
167+
PointF(left, y + border.width / 2),
168+
PointF(right, y + border.width / 2));
169169
}
170170
else
171171
{
172-
int single_line_width = (int)round(border.width / 3.);
173-
if (single_line_width == 1) right--;
172+
litehtml::pixel_t single_line_width = border.width / 3.0;
173+
if (single_line_width == 1) right -= 1;
174174
Pen pen(gdiplus_color(border.color), (float)single_line_width);
175175
graphics.DrawLine(&pen,
176-
Point(left, y + single_line_width / 2),
177-
Point(right, y + single_line_width / 2));
176+
PointF(left, y + single_line_width / 2),
177+
PointF(right, y + single_line_width / 2));
178178
graphics.DrawLine(&pen,
179-
Point(left, y + border.width - 1 - single_line_width / 2),
180-
Point(right, y + border.width - 1 - single_line_width / 2));
179+
PointF(left, y + border.width - 1 - single_line_width / 2),
180+
PointF(right, y + border.width - 1 - single_line_width / 2));
181181
}
182182
}
183183

184-
static void draw_vert_border(Graphics& graphics, const border& border, int x, int top, int bottom)
184+
static void draw_vert_border(Graphics& graphics, const border& border, litehtml::pixel_t x, litehtml::pixel_t top, litehtml::pixel_t bottom)
185185
{
186186
if (border.style != border_style_double || border.width < 3)
187187
{
@@ -198,20 +198,20 @@ static void draw_vert_border(Graphics& graphics, const border& border, int x, in
198198
pen.SetDashPattern(dashValues, 2);
199199
}
200200
graphics.DrawLine(&pen,
201-
Point(x + border.width / 2, top),
202-
Point(x + border.width / 2, bottom));
201+
PointF(x + border.width / 2, top),
202+
PointF(x + border.width / 2, bottom));
203203
}
204204
else
205205
{
206-
int single_line_width = (int)round(border.width / 3.);
206+
litehtml::pixel_t single_line_width = border.width / 3.0;
207207
if (single_line_width == 1) bottom--;
208208
Pen pen(gdiplus_color(border.color), (float)single_line_width);
209209
graphics.DrawLine(&pen,
210-
Point(x + single_line_width / 2, top),
211-
Point(x + single_line_width / 2, bottom));
210+
PointF(x + single_line_width / 2, top),
211+
PointF(x + single_line_width / 2, bottom));
212212
graphics.DrawLine(&pen,
213-
Point(x + border.width - 1 - single_line_width / 2, top),
214-
Point(x + border.width - 1 - single_line_width / 2, bottom));
213+
PointF(x + border.width - 1 - single_line_width / 2, top),
214+
PointF(x + border.width - 1 - single_line_width / 2, bottom));
215215
}
216216
}
217217

containers/windows/gdiplus/gdiplus_container.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ class gdiplus_container : public win32_container
1212

1313
protected:
1414
// win32_container members
15-
void draw_ellipse(HDC hdc, int x, int y, int width, int height, litehtml::web_color color, int line_width) override;
16-
void fill_ellipse(HDC hdc, int x, int y, int width, int height, litehtml::web_color color) override;
17-
void fill_rect(HDC hdc, int x, int y, int width, int height, litehtml::web_color color) override;
15+
void draw_ellipse(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, litehtml::web_color color, int line_width) override;
16+
void fill_ellipse(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, litehtml::web_color color) override;
17+
void fill_rect(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, litehtml::web_color color) override;
1818
void get_img_size(uint_ptr img, litehtml::size& sz) override;
1919
void free_image(uint_ptr img) override;
2020
void draw_img_bg(HDC hdc, uint_ptr img, const litehtml::background_layer& layer) override;

containers/windows/win32/win32_container.cpp

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
#include "win32_container.h"
2+
#include "litehtml/os_types.h"
3+
24
using namespace std;
35
using namespace litehtml;
46

5-
wstring utf8_to_utf16(string str)
7+
static wstring utf8_to_utf16(string str)
68
{
79
utf8_to_utf32 utf32 = str;
810
wstring wstr;
@@ -11,12 +13,12 @@ wstring utf8_to_utf16(string str)
1113
char32_t ch = *ptr;
1214
if (ch <= 0xFFFF) wstr += (wchar_t)ch;
1315
// high surrogate goes first in UTF-16LE
14-
else wstr += {(wchar_t)(((ch - 0x10000) >> 10) + 0xD800), (ch & 0x3FF) + 0xDC00};
16+
else wstr += {(wchar_t) (((ch - 0x10000) >> 10) + 0xD800), (wchar_t) ((ch & 0x3FF) + 0xDC00)};
1517
}
1618
return wstr;
1719
}
1820

19-
string utf16_to_utf8(wstring str)
21+
static string utf16_to_utf8(wstring str)
2022
{
2123
u32string ustr;
2224
for (size_t i = 0; i < str.size(); i++)
@@ -87,11 +89,11 @@ static void trim_quotes(string& str)
8789
str.erase(str.length() - 1, 1);
8890
}
8991

90-
uint_ptr win32_container::create_font( const char* font_list, int size, int weight, font_style italic, unsigned int decoration, font_metrics* fm )
92+
uint_ptr win32_container::create_font(const litehtml::font_description& descr, const litehtml::document* doc, litehtml::font_metrics* fm)
9193
{
9294
wstring font_name;
9395
string_vector fonts;
94-
split_string(font_list, fonts, ",");
96+
split_string(descr.family, fonts, ",");
9597
bool found = false;
9698
for (auto& name : fonts)
9799
{
@@ -111,27 +113,31 @@ uint_ptr win32_container::create_font( const char* font_list, int size, int weig
111113
LOGFONT lf = {};
112114
wcscpy_s(lf.lfFaceName, LF_FACESIZE, font_name.c_str());
113115

114-
lf.lfHeight = -size;
115-
lf.lfWeight = weight;
116-
lf.lfItalic = italic == font_style_italic;
116+
lf.lfHeight = -descr.size;
117+
lf.lfWeight = descr.weight;
118+
lf.lfItalic = descr.style== font_style_italic;
117119
lf.lfCharSet = DEFAULT_CHARSET;
118120
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
119121
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
120122
lf.lfQuality = DEFAULT_QUALITY;
121-
lf.lfStrikeOut = (decoration & font_decoration_linethrough) != 0;
122-
lf.lfUnderline = (decoration & font_decoration_underline) != 0;
123+
lf.lfStrikeOut = (descr.decoration_line & text_decoration_line_line_through) != 0;
124+
lf.lfUnderline = (descr.decoration_line & text_decoration_line_underline) != 0;
123125
HFONT hFont = CreateFontIndirect(&lf);
124126

125127
if (fm)
126128
{
127129
SelectObject(m_tmp_hdc, hFont);
128130
TEXTMETRIC tm = {};
129131
GetTextMetrics(m_tmp_hdc, &tm);
132+
fm->font_size = descr.size;
130133
fm->ascent = tm.tmAscent;
131134
fm->descent = tm.tmDescent;
132135
fm->height = tm.tmHeight;
133136
fm->x_height = tm.tmHeight / 2; // this is an estimate; call GetGlyphOutline to get the real value
134-
fm->draw_spaces = italic || decoration;
137+
fm->ch_width = tm.tmAveCharWidth;
138+
fm->draw_spaces = descr.style == font_style_italic || descr.decoration_line != text_decoration_line_none;
139+
fm->sub_shift = descr.size / 5;
140+
fm->super_shift = descr.size / 3;
135141
}
136142

137143
return (uint_ptr) hFont;
@@ -147,12 +153,12 @@ const char* win32_container::get_default_font_name() const
147153
return "Times New Roman";
148154
}
149155

150-
int win32_container::get_default_font_size() const
156+
litehtml::pixel_t win32_container::get_default_font_size() const
151157
{
152158
return 16;
153159
}
154160

155-
int win32_container::text_width( const char* text, uint_ptr hFont )
161+
litehtml::pixel_t win32_container::text_width( const char* text, uint_ptr hFont )
156162
{
157163
SIZE size = {};
158164
SelectObject(m_tmp_hdc, (HFONT)hFont);
@@ -179,7 +185,7 @@ void win32_container::draw_text( uint_ptr hdc, const char* text, uint_ptr hFont,
179185
release_clip((HDC) hdc);
180186
}
181187

182-
int win32_container::pt_to_px( int pt ) const
188+
litehtml::pixel_t win32_container::pt_to_px(litehtml::pixel_t pt) const
183189
{
184190
return MulDiv(pt, GetDeviceCaps(m_tmp_hdc, LOGPIXELSY), 72);
185191
}
@@ -188,14 +194,14 @@ void win32_container::draw_list_marker(uint_ptr hdc, const list_marker& marker)
188194
{
189195
apply_clip((HDC)hdc);
190196

191-
int top_margin = marker.pos.height / 3;
197+
litehtml::pixel_t top_margin = marker.pos.height / 3;
192198
if (top_margin < 4)
193199
top_margin = 0;
194200

195-
int draw_x = marker.pos.x;
196-
int draw_y = marker.pos.y + top_margin;
197-
int draw_width = marker.pos.height - top_margin * 2;
198-
int draw_height = marker.pos.height - top_margin * 2;
201+
litehtml::pixel_t draw_x = marker.pos.x;
202+
litehtml::pixel_t draw_y = marker.pos.y + top_margin;
203+
litehtml::pixel_t draw_width = marker.pos.height - top_margin * 2;
204+
litehtml::pixel_t draw_height = marker.pos.height - top_margin * 2;
199205

200206
switch (marker.marker_type)
201207
{
@@ -371,7 +377,7 @@ element::ptr win32_container::create_element(const char* tag_name, const string_
371377
void win32_container::get_media_features(media_features& media) const
372378
{
373379
position client;
374-
get_client_rect(client);
380+
get_viewport(client);
375381

376382
media.type = media_type_screen;
377383
media.width = client.width;

containers/windows/win32/win32_container.h

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,30 @@ class win32_container : public litehtml::document_container
2525
virtual ~win32_container();
2626

2727
// litehtml::document_container members
28-
uint_ptr create_font(const char* faceName, int size, int weight, litehtml::font_style italic, unsigned int decoration, litehtml::font_metrics* fm) override;
29-
void delete_font(uint_ptr hFont) override;
30-
const char* get_default_font_name() const override;
31-
int get_default_font_size() const override;
32-
int text_width(const char* text, uint_ptr hFont) override;
33-
void draw_text(uint_ptr hdc, const char* text, uint_ptr hFont, litehtml::web_color color, const litehtml::position& pos) override;
34-
void transform_text(litehtml::string& text, litehtml::text_transform tt) override;
28+
uint_ptr create_font(const litehtml::font_description& descr, const litehtml::document* doc, litehtml::font_metrics* fm) override;
29+
void delete_font(uint_ptr hFont) override;
30+
const char* get_default_font_name() const override;
31+
litehtml::pixel_t get_default_font_size() const override;
32+
litehtml::pixel_t text_width(const char* text, uint_ptr hFont) override;
33+
void draw_text(uint_ptr hdc, const char* text, uint_ptr hFont, litehtml::web_color color, const litehtml::position& pos) override;
34+
void transform_text(litehtml::string& text, litehtml::text_transform tt) override;
3535

36-
int pt_to_px(int pt) const override;
37-
void draw_list_marker(uint_ptr hdc, const litehtml::list_marker& marker) override;
38-
void load_image(const char* src, const char* baseurl, bool redraw_on_ready) override;
39-
void get_image_size(const char* src, const char* baseurl, litehtml::size& sz) override;
40-
void draw_image(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const std::string& url, const std::string& base_url) override;
41-
void draw_solid_fill(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const litehtml::web_color& color) override;
42-
void draw_linear_gradient(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const litehtml::background_layer::linear_gradient& gradient) override {}
43-
void draw_radial_gradient(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const litehtml::background_layer::radial_gradient& gradient) override {}
44-
void draw_conic_gradient(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const litehtml::background_layer::conic_gradient& gradient) override {}
36+
litehtml::pixel_t pt_to_px(litehtml::pixel_t pt) const override;
37+
void draw_list_marker(uint_ptr hdc, const litehtml::list_marker& marker) override;
38+
void load_image(const char* src, const char* baseurl, bool redraw_on_ready) override;
39+
void get_image_size(const char* src, const char* baseurl, litehtml::size& sz) override;
40+
void draw_image(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const std::string& url, const std::string& base_url) override;
41+
void draw_solid_fill(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const litehtml::web_color& color) override;
42+
void draw_linear_gradient(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const litehtml::background_layer::linear_gradient& gradient) override {}
43+
void draw_radial_gradient(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const litehtml::background_layer::radial_gradient& gradient) override {}
44+
void draw_conic_gradient(litehtml::uint_ptr hdc, const litehtml::background_layer& layer, const litehtml::background_layer::conic_gradient& gradient) override {}
4545

46-
void set_clip(const litehtml::position& pos, const litehtml::border_radiuses& bdr_radius) override;
47-
void del_clip() override;
46+
void set_clip(const litehtml::position& pos, const litehtml::border_radiuses& bdr_radius) override;
47+
void del_clip() override;
4848
litehtml::element::ptr create_element(const char* tag_name, const litehtml::string_map& attributes, const litehtml::document::ptr& doc) override;
49-
void get_media_features(litehtml::media_features& media) const override;
50-
void get_language(litehtml::string& language, litehtml::string& culture) const override;
51-
void link(const litehtml::document::ptr& doc, const litehtml::element::ptr& el) override;
49+
void get_media_features(litehtml::media_features& media) const override;
50+
void get_language(litehtml::string& language, litehtml::string& culture) const override;
51+
void link(const litehtml::document::ptr& doc, const litehtml::element::ptr& el) override;
5252
litehtml::string resolve_color(const litehtml::string& color) const override;
5353

5454
protected:
@@ -57,7 +57,6 @@ class win32_container : public litehtml::document_container
5757

5858
virtual void make_url(LPCWSTR url, LPCWSTR basepath, std::wstring& out) = 0;
5959
void make_url_utf8(const char* url, const char* basepath, std::wstring& out);
60-
virtual void get_client_rect(litehtml::position& client) const = 0;
6160

6261
// get_image is called by load_image.
6362
// if url_or_path is URL then get_image may return 0, the image should be added later by add_image when it becomes available
@@ -68,9 +67,9 @@ class win32_container : public litehtml::document_container
6867
virtual void get_img_size(uint_ptr img, litehtml::size& sz) = 0;
6968
virtual void draw_img_bg(HDC hdc, uint_ptr img, const litehtml::background_layer& layer) = 0;
7069

71-
virtual void draw_ellipse(HDC hdc, int x, int y, int width, int height, litehtml::web_color color, int line_width) = 0;
72-
virtual void fill_ellipse(HDC hdc, int x, int y, int width, int height, litehtml::web_color color) = 0;
73-
virtual void fill_rect(HDC hdc, int x, int y, int width, int height, litehtml::web_color color) = 0;
70+
virtual void draw_ellipse(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, litehtml::web_color color, int line_width) = 0;
71+
virtual void fill_ellipse(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, litehtml::web_color color) = 0;
72+
virtual void fill_rect(HDC hdc, litehtml::pixel_t x, litehtml::pixel_t y, litehtml::pixel_t width, litehtml::pixel_t height, litehtml::web_color color) = 0;
7473

7574
private:
7675
static int CALLBACK EnumFontsProc(const LOGFONT* lplf, const TEXTMETRIC* lptm, DWORD dwType, LPARAM lpData);

0 commit comments

Comments
 (0)