mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:52:44 +00:00 
			
		
		
		
	LibWeb: Make TextMetrics GC-allocated
This commit is contained in:
		
							parent
							
								
									2704bcdaaa
								
							
						
					
					
						commit
						6b7a1d13e9
					
				
					 7 changed files with 28 additions and 18 deletions
				
			
		|  | @ -470,7 +470,6 @@ class StorageWrapper; | |||
| class SubtleCryptoWrapper; | ||||
| class TextDecoderWrapper; | ||||
| class TextEncoderWrapper; | ||||
| class TextMetricsWrapper; | ||||
| class URLSearchParamsIteratorWrapper; | ||||
| class URLSearchParamsWrapper; | ||||
| class URLWrapper; | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ public: | |||
| 
 | ||||
|     virtual void fill_text(String const&, float x, float y, Optional<double> max_width) = 0; | ||||
|     virtual void stroke_text(String const&, float x, float y, Optional<double> max_width) = 0; | ||||
|     virtual RefPtr<TextMetrics> measure_text(String const& text) = 0; | ||||
|     virtual JS::NonnullGCPtr<TextMetrics> measure_text(String const& text) = 0; | ||||
| 
 | ||||
| protected: | ||||
|     CanvasText() = default; | ||||
|  |  | |||
|  | @ -396,7 +396,7 @@ void CanvasRenderingContext2D::reset_to_default_state() | |||
| } | ||||
| 
 | ||||
| // https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-measuretext
 | ||||
| RefPtr<TextMetrics> CanvasRenderingContext2D::measure_text(String const& text) | ||||
| JS::NonnullGCPtr<TextMetrics> CanvasRenderingContext2D::measure_text(String const& text) | ||||
| { | ||||
|     // The measureText(text) method steps are to run the text preparation
 | ||||
|     // algorithm, passing it text and the object implementing the CanvasText
 | ||||
|  | @ -404,7 +404,7 @@ RefPtr<TextMetrics> CanvasRenderingContext2D::measure_text(String const& text) | |||
|     // TextMetrics object with members behaving as described in the following
 | ||||
|     // list:
 | ||||
|     auto prepared_text = prepare_text(text); | ||||
|     auto metrics = TextMetrics::create(); | ||||
|     auto metrics = TextMetrics::create(global_object()); | ||||
|     // FIXME: Use the font that was used to create the glyphs in prepared_text.
 | ||||
|     auto& font = Gfx::FontDatabase::default_font(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -78,7 +78,7 @@ public: | |||
| 
 | ||||
|     JS::NonnullGCPtr<HTMLCanvasElement> canvas_for_binding() const; | ||||
| 
 | ||||
|     virtual RefPtr<TextMetrics> measure_text(String const& text) override; | ||||
|     virtual JS::NonnullGCPtr<TextMetrics> measure_text(String const& text) override; | ||||
| 
 | ||||
|     virtual void clip() override; | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,13 +4,23 @@ | |||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #include "TextMetrics.h" | ||||
| #include <LibWeb/Bindings/TextMetricsPrototype.h> | ||||
| #include <LibWeb/HTML/TextMetrics.h> | ||||
| #include <LibWeb/HTML/Window.h> | ||||
| 
 | ||||
| namespace Web::HTML { | ||||
| 
 | ||||
| RefPtr<TextMetrics> TextMetrics::create() | ||||
| JS::NonnullGCPtr<TextMetrics> TextMetrics::create(HTML::Window& window) | ||||
| { | ||||
|     return adopt_ref(*new TextMetrics()); | ||||
|     return *window.heap().allocate<TextMetrics>(window.realm(), window); | ||||
| } | ||||
| 
 | ||||
| TextMetrics::TextMetrics(HTML::Window& window) | ||||
|     : PlatformObject(window.realm()) | ||||
| { | ||||
|     set_prototype(&window.ensure_web_prototype<Bindings::TextMetricsPrototype>("TextMetrics")); | ||||
| } | ||||
| 
 | ||||
| TextMetrics::~TextMetrics() = default; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -6,18 +6,17 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <LibJS/Heap/Handle.h> | ||||
| #include <LibWeb/Bindings/Wrappable.h> | ||||
| #include <LibWeb/Bindings/PlatformObject.h> | ||||
| 
 | ||||
| namespace Web::HTML { | ||||
| 
 | ||||
| class TextMetrics | ||||
|     : public RefCounted<TextMetrics> | ||||
|     , public Bindings::Wrappable { | ||||
| public: | ||||
|     using WrapperType = Bindings::TextMetricsWrapper; | ||||
| class TextMetrics : public Bindings::PlatformObject { | ||||
|     WEB_PLATFORM_OBJECT(TextMetrics, Bindings::PlatformObject); | ||||
| 
 | ||||
|     static RefPtr<TextMetrics> create(); | ||||
| public: | ||||
|     static JS::NonnullGCPtr<TextMetrics> create(HTML::Window&); | ||||
| 
 | ||||
|     virtual ~TextMetrics() override; | ||||
| 
 | ||||
|     double width() const { return m_width; } | ||||
|     double actual_bounding_box_left() const { return m_actual_bounding_box_left; } | ||||
|  | @ -46,7 +45,7 @@ public: | |||
|     void set_ideographic_baseline(double baseline) { m_ideographic_baseline = baseline; } | ||||
| 
 | ||||
| private: | ||||
|     explicit TextMetrics() = default; | ||||
|     explicit TextMetrics(HTML::Window&); | ||||
| 
 | ||||
|     double m_width { 0 }; | ||||
|     double m_actual_bounding_box_left { 0 }; | ||||
|  | @ -64,3 +63,5 @@ private: | |||
| }; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| WRAPPER_HACK(TextMetrics, Web::HTML) | ||||
|  |  | |||
|  | @ -149,7 +149,7 @@ libweb_js_wrapper(HTML/Path2D NO_INSTANCE) | |||
| libweb_js_wrapper(HTML/PromiseRejectionEvent NO_INSTANCE) | ||||
| libweb_js_wrapper(HTML/Storage) | ||||
| libweb_js_wrapper(HTML/SubmitEvent NO_INSTANCE) | ||||
| libweb_js_wrapper(HTML/TextMetrics) | ||||
| libweb_js_wrapper(HTML/TextMetrics NO_INSTANCE) | ||||
| libweb_js_wrapper(HTML/Worker NO_INSTANCE) | ||||
| libweb_js_wrapper(HTML/WorkerGlobalScope NO_INSTANCE) | ||||
| libweb_js_wrapper(HTML/WorkerLocation) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling