From b70330e61d2a8283aa7c0629511fb31cb3a69d21 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Wed, 16 Dec 2020 17:27:21 -0800 Subject: [PATCH] [web] Rich text painting on bitmap canvas --- engine/web/canvas_paragraph_align.png | Bin 0 -> 9288 bytes engine/web/canvas_paragraph_ellipsis.png | Bin 0 -> 9717 bytes engine/web/canvas_paragraph_general.png | Bin 0 -> 8249 bytes engine/web/canvas_paragraph_varying_heights.png | Bin 0 -> 8622 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 engine/web/canvas_paragraph_align.png create mode 100644 engine/web/canvas_paragraph_ellipsis.png create mode 100644 engine/web/canvas_paragraph_general.png create mode 100644 engine/web/canvas_paragraph_varying_heights.png diff --git a/engine/web/canvas_paragraph_align.png b/engine/web/canvas_paragraph_align.png new file mode 100644 index 0000000000000000000000000000000000000000..180a8474b899d0249f265e999d83ea009e35762a GIT binary patch literal 9288 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 BzG(me literal 0 HcmV?d00001 diff --git a/engine/web/canvas_paragraph_general.png b/engine/web/canvas_paragraph_general.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3fc5695f61d253456d6ab95446eed263253d99 GIT binary patch literal 8249 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 literal 0 HcmV?d00001 diff --git a/engine/web/canvas_paragraph_varying_heights.png b/engine/web/canvas_paragraph_varying_heights.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8ff94ed94915ddb3eb8e7e1f80304df0d4b535 GIT binary patch literal 8622 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 U)K(w20^nt8WNC=L;q~yp0M_*V_y7O^ literal 0 HcmV?d00001