97 lines
3.4 KiB
Diff
97 lines
3.4 KiB
Diff
|
https://github.com/cacalabs/libcaca/commit/e4968ba6e93e9fd35429eb16895c785c51072015.patch
|
|||
|
Patch adjusted to remove the lines modifying caca/t/canvas.cpp. This file does not exist in the current release.
|
|||
|
|
|||
|
From e4968ba6e93e9fd35429eb16895c785c51072015 Mon Sep 17 00:00:00 2001
|
|||
|
From: Sam Hocevar <sam@hocevar.net>
|
|||
|
Date: Fri, 26 Feb 2021 12:40:06 +0100
|
|||
|
Subject: [PATCH] Fix a problem in the caca_resize() overflow detection and add
|
|||
|
several unit tests.
|
|||
|
|
|||
|
---
|
|||
|
caca/canvas.c | 16 ++++++++--------
|
|||
|
caca/t/canvas.cpp | 18 +++++++++++++++---
|
|||
|
tools/makefont.c | 22 +++++++++++++++++++---
|
|||
|
3 files changed, 42 insertions(+), 14 deletions(-)
|
|||
|
|
|||
|
diff --git a/caca/canvas.c b/caca/canvas.c
|
|||
|
index d0715392..08c628c9 100644
|
|||
|
--- a/caca/canvas.c
|
|||
|
+++ b/caca/canvas.c
|
|||
|
@@ -367,6 +367,14 @@ int caca_resize(caca_canvas_t *cv, int width, int height)
|
|||
|
{
|
|||
|
int x, y, f, old_width, old_height, old_size;
|
|||
|
|
|||
|
+ /* Check for overflow */
|
|||
|
+ int new_size = width * height;
|
|||
|
+ if (new_size < 0 || (width > 0 && new_size / width != height))
|
|||
|
+ {
|
|||
|
+ seterrno(EOVERFLOW);
|
|||
|
+ return -1;
|
|||
|
+ }
|
|||
|
+
|
|||
|
old_width = cv->width;
|
|||
|
old_height = cv->height;
|
|||
|
old_size = old_width * old_height;
|
|||
|
@@ -377,14 +385,6 @@ int caca_resize(caca_canvas_t *cv, int width, int height)
|
|||
|
* dirty rectangle handling */
|
|||
|
cv->width = width;
|
|||
|
cv->height = height;
|
|||
|
- int new_size = width * height;
|
|||
|
-
|
|||
|
- /* Check for overflow */
|
|||
|
- if (new_size / width != height)
|
|||
|
- {
|
|||
|
- seterrno(EOVERFLOW);
|
|||
|
- return -1;
|
|||
|
- }
|
|||
|
|
|||
|
/* If width or height is smaller (or both), we have the opportunity to
|
|||
|
* reduce or even remove dirty rectangles */
|
|||
|
diff --git a/tools/makefont.c b/tools/makefont.c
|
|||
|
index 226c8838..66718605 100644
|
|||
|
--- a/tools/makefont.c
|
|||
|
+++ b/tools/makefont.c
|
|||
|
@@ -40,7 +40,8 @@
|
|||
|
* and the UTF-8 glyphs necessary for canvas rotation and mirroring. */
|
|||
|
static unsigned int const blocklist[] =
|
|||
|
{
|
|||
|
- 0x0000, 0x0080, /* Basic latin: A, B, C, a, b, c */
|
|||
|
+ 0x0020, 0x0080, /* Basic latin: A, B, C, a, b, c */
|
|||
|
+#if 0
|
|||
|
0x0080, 0x0100, /* Latin-1 Supplement: Ä, Ç, å, ß */
|
|||
|
0x0100, 0x0180, /* Latin Extended-A: Ā č Ō œ */
|
|||
|
0x0180, 0x0250, /* Latin Extended-B: Ǝ Ƹ */
|
|||
|
@@ -63,6 +64,7 @@ static unsigned int const blocklist[] =
|
|||
|
0x30a0, 0x3100, /* Katakana: ロ ル */
|
|||
|
0xff00, 0xfff0, /* Halfwidth and Fullwidth Forms: A, B, C, a, b, c */
|
|||
|
0x10400, 0x10450, /* Deseret: 𐐒 𐐋 */
|
|||
|
+#endif
|
|||
|
0, 0
|
|||
|
};
|
|||
|
|
|||
|
@@ -317,8 +319,22 @@ int main(int argc, char *argv[])
|
|||
|
printf_unicode(>ab[n]);
|
|||
|
|
|||
|
if(gtab[n].same_as == n)
|
|||
|
- printf_hex(" */ %s\n",
|
|||
|
- glyph_data + gtab[n].data_offset, gtab[n].data_size);
|
|||
|
+ {
|
|||
|
+ char const *lut = " .:nmW@";
|
|||
|
+ printf("\n");
|
|||
|
+ for (int y = 0; y < height; ++y)
|
|||
|
+ {
|
|||
|
+ for (int x = 0; x < gtab[n].data_width; ++x)
|
|||
|
+ {
|
|||
|
+ int val = glyph_data[gtab[n].data_offset + y * gtab[n].data_width + x];
|
|||
|
+ char ch = lut[val * val * 7 / 256 / 256];
|
|||
|
+ printf("%c%c", ch, ch);
|
|||
|
+ }
|
|||
|
+ printf("\n");
|
|||
|
+ }
|
|||
|
+ //printf_hex(" */ %s\n",
|
|||
|
+ // glyph_data + gtab[n].data_offset, gtab[n].data_size);
|
|||
|
+ }
|
|||
|
else
|
|||
|
{
|
|||
|
printf(" is ");
|