summaryrefslogtreecommitdiff
path: root/libs/litehtml
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2024-03-31 12:29:36 +0300
committerGeorge Hazan <george.hazan@gmail.com>2024-03-31 12:29:36 +0300
commit482709434f32ea4e476a477a534e5baa048f2886 (patch)
tree94647f06756b5c22645fc0654b6a1131c13941ea /libs/litehtml
parentc96a3b3959b6e618311e5c5157d9af0bf3439dd2 (diff)
NewStory: fix for image drawing
Diffstat (limited to 'libs/litehtml')
-rw-r--r--libs/litehtml/containers/windows/gdiplus/gdiplus_container.cpp43
-rw-r--r--libs/litehtml/containers/windows/gdiplus/gdiplus_container.h1
-rw-r--r--libs/litehtml/containers/windows/win32/win32_container.cpp17
-rw-r--r--libs/litehtml/containers/windows/win32/win32_container.h2
4 files changed, 40 insertions, 23 deletions
diff --git a/libs/litehtml/containers/windows/gdiplus/gdiplus_container.cpp b/libs/litehtml/containers/windows/gdiplus/gdiplus_container.cpp
index 5950b01882..faf38d0869 100644
--- a/libs/litehtml/containers/windows/gdiplus/gdiplus_container.cpp
+++ b/libs/litehtml/containers/windows/gdiplus/gdiplus_container.cpp
@@ -70,25 +70,33 @@ void gdiplus_container::free_image(uint_ptr img)
Bitmap* bmp = (Bitmap*)img;
delete bmp;
}
-/*
-void gdiplus_container::draw_img_bg(HDC hdc, uint_ptr img, const background_paint& bg)
+
+void gdiplus_container::draw_image(litehtml::uint_ptr _hdc, const litehtml::background_layer &bg, const std::string &src, const std::string &base_url)
{
- Bitmap* bgbmp = (Bitmap*)img;
+ if (src.empty() || (!bg.clip_box.width && !bg.clip_box.height))
+ return;
- Graphics graphics(hdc);
- graphics.SetInterpolationMode(InterpolationModeNearestNeighbor);
- graphics.SetPixelOffsetMode(PixelOffsetModeHalf);
+ std::wstring url;
+ make_url_utf8(src.c_str(), base_url.c_str(), url);
+
+ Bitmap* bgbmp = (Bitmap*)find_image(url.c_str());
+ if (!bgbmp)
+ return;
+
+ Graphics graphics((HDC)_hdc);
+ graphics.SetInterpolationMode(Gdiplus::InterpolationModeNearestNeighbor);
+ graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHalf);
Region reg(Rect(bg.border_box.left(), bg.border_box.top(), bg.border_box.width, bg.border_box.height));
graphics.SetClip(&reg);
Bitmap* scaled_img = nullptr;
- if (bg.image_size.width != bgbmp->GetWidth() || bg.image_size.height != bgbmp->GetHeight())
+ if (bg.origin_box.width != bgbmp->GetWidth() || bg.origin_box.height != bgbmp->GetHeight())
{
- scaled_img = new Bitmap(bg.image_size.width, bg.image_size.height);
+ scaled_img = new Bitmap(bg.origin_box.width, bg.origin_box.height);
Graphics gr(scaled_img);
- gr.SetPixelOffsetMode(PixelOffsetModeHighQuality);
- gr.DrawImage(bgbmp, 0, 0, bg.image_size.width, bg.image_size.height);
+ gr.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHighQuality);
+ gr.DrawImage(bgbmp, 0, 0, bg.origin_box.width, bg.origin_box.height);
bgbmp = scaled_img;
}
@@ -96,37 +104,37 @@ void gdiplus_container::draw_img_bg(HDC hdc, uint_ptr img, const background_pain
{
case background_repeat_no_repeat:
{
- graphics.DrawImage(bgbmp, bg.position_x, bg.position_y, bgbmp->GetWidth(), bgbmp->GetHeight());
+ graphics.DrawImage(bgbmp, bg.origin_box.x, bg.origin_box.y, bgbmp->GetWidth(), bgbmp->GetHeight());
}
break;
case background_repeat_repeat_x:
{
CachedBitmap bmp(bgbmp, &graphics);
- int x = bg.position_x;
+ int x = bg.origin_box.x;
while(x > bg.clip_box.left()) x -= bgbmp->GetWidth();
for(; x < bg.clip_box.right(); x += bgbmp->GetWidth())
{
- graphics.DrawCachedBitmap(&bmp, x, bg.position_y);
+ graphics.DrawCachedBitmap(&bmp, x, bg.origin_box.y);
}
}
break;
case background_repeat_repeat_y:
{
CachedBitmap bmp(bgbmp, &graphics);
- int y = bg.position_y;
+ int y = bg.origin_box.y;
while(y > bg.clip_box.top()) y -= bgbmp->GetHeight();
for(; y < bg.clip_box.bottom(); y += bgbmp->GetHeight())
{
- graphics.DrawCachedBitmap(&bmp, bg.position_x, y);
+ graphics.DrawCachedBitmap(&bmp, bg.origin_box.x, y);
}
}
break;
case background_repeat_repeat:
{
CachedBitmap bmp(bgbmp, &graphics);
- int x = bg.position_x;
+ int x = bg.origin_box.x;
while(x > bg.clip_box.left()) x -= bgbmp->GetWidth();
- int y0 = bg.position_y;
+ int y0 = bg.origin_box.y;
while(y0 > bg.clip_box.top()) y0 -= bgbmp->GetHeight();
for(; x < bg.clip_box.right(); x += bgbmp->GetWidth())
@@ -142,7 +150,6 @@ void gdiplus_container::draw_img_bg(HDC hdc, uint_ptr img, const background_pain
delete scaled_img;
}
-*/
// length of dash and space for "dashed" style, in multiples of pen width
const float dash = 3;
diff --git a/libs/litehtml/containers/windows/gdiplus/gdiplus_container.h b/libs/litehtml/containers/windows/gdiplus/gdiplus_container.h
index cb0e0337dc..008bd7956d 100644
--- a/libs/litehtml/containers/windows/gdiplus/gdiplus_container.h
+++ b/libs/litehtml/containers/windows/gdiplus/gdiplus_container.h
@@ -15,6 +15,7 @@ protected:
void draw_ellipse(HDC hdc, int x, int y, int width, int height, litehtml::web_color color, int line_width) override;
void fill_ellipse(HDC hdc, int x, int y, int width, int height, litehtml::web_color color) override;
void fill_rect(HDC hdc, int x, int y, int width, int height, litehtml::web_color color) override;
+ void draw_image(litehtml::uint_ptr, const litehtml::background_layer &, const std::string &, const std::string &) override;
void get_img_size(uint_ptr img, litehtml::size& sz) override;
void free_image(uint_ptr img) override;
diff --git a/libs/litehtml/containers/windows/win32/win32_container.cpp b/libs/litehtml/containers/windows/win32/win32_container.cpp
index e028c986fb..117db3748b 100644
--- a/libs/litehtml/containers/windows/win32/win32_container.cpp
+++ b/libs/litehtml/containers/windows/win32/win32_container.cpp
@@ -148,10 +148,6 @@ int win32_container::pt_to_px( int pt ) const
return MulDiv(pt, GetDeviceCaps(m_tmp_hdc, LOGPIXELSY), 72);
}
-void win32_container::draw_image(litehtml::uint_ptr, const litehtml::background_layer &, const std::string &, const std::string &)
-{
-}
-
void win32_container::draw_solid_fill(litehtml::uint_ptr _hdc, const litehtml::background_layer &bg, const litehtml::web_color &color)
{
HDC hdc = (HDC)_hdc;
@@ -213,6 +209,19 @@ void win32_container::make_url_utf8(const char* url, const char* basepath, std::
make_url(Utf2T(url), Utf2T(basepath), out);
}
+litehtml::uint_ptr win32_container::find_image(const std::wstring &url)
+{
+ uint_ptr ret = 0;
+
+ lock_images_cache();
+ images_map::iterator img = m_images.find(url);
+ if (img != m_images.end() && img->second)
+ ret = img->second;
+
+ unlock_images_cache();
+ return ret;
+}
+
void win32_container::load_image( const char* src, const char* baseurl, bool redraw_on_ready )
{
std::wstring url;
diff --git a/libs/litehtml/containers/windows/win32/win32_container.h b/libs/litehtml/containers/windows/win32/win32_container.h
index 888a52d2e3..f5239d572d 100644
--- a/libs/litehtml/containers/windows/win32/win32_container.h
+++ b/libs/litehtml/containers/windows/win32/win32_container.h
@@ -33,7 +33,6 @@ public:
void draw_text(uint_ptr hdc, const char* text, uint_ptr hFont, litehtml::web_color color, const litehtml::position& pos) override;
void transform_text(litehtml::string& text, litehtml::text_transform tt) override;
- void draw_image(litehtml::uint_ptr, const litehtml::background_layer &, const std::string &, const std::string &) override;
void draw_solid_fill(litehtml::uint_ptr, const litehtml::background_layer &, const litehtml::web_color &) override;
void draw_linear_gradient(litehtml::uint_ptr, const litehtml::background_layer &, const litehtml::background_layer::linear_gradient &) override;
void draw_radial_gradient(litehtml::uint_ptr, const litehtml::background_layer &, const litehtml::background_layer::radial_gradient &) override;
@@ -43,6 +42,7 @@ public:
void draw_list_marker(uint_ptr hdc, const litehtml::list_marker& marker) override;
void load_image(const char* src, const char* baseurl, bool redraw_on_ready) override;
void get_image_size(const char* src, const char* baseurl, litehtml::size& sz) override;
+ uint_ptr find_image(const std::wstring &url);
void set_clip(const litehtml::position& pos, const litehtml::border_radiuses& bdr_radius) override;
void del_clip() override;