mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-11-23 15:03:03 -05:00
Use std::to_chars for formatting float numbers as well
this gives us a larger representation in many cases since it tries to represent floats to max precision, but that tradeoff is worth it for dropping 2000 lines of C code.
This commit is contained in:
parent
be304b6f99
commit
2a10f39e68
@ -149,7 +149,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "fast_css_transform",
|
"name": "fast_css_transform",
|
||||||
"headers": "calibre/utils/cpp_binding.h calibre/utils/stb_sprintf.h",
|
"headers": "calibre/utils/cpp_binding.h",
|
||||||
"sources": "calibre/srv/fast_css_transform.cpp",
|
"sources": "calibre/srv/fast_css_transform.cpp",
|
||||||
"inc_dirs": "perfect-hashing",
|
"inc_dirs": "perfect-hashing",
|
||||||
"needs_c++": "17"
|
"needs_c++": "17"
|
||||||
|
|||||||
@ -26,8 +26,6 @@
|
|||||||
#include <frozen/unordered_map.h>
|
#include <frozen/unordered_map.h>
|
||||||
#include <frozen/string.h>
|
#include <frozen/string.h>
|
||||||
#include "../utils/cpp_binding.h"
|
#include "../utils/cpp_binding.h"
|
||||||
#define STB_SPRINTF_IMPLEMENTATION
|
|
||||||
#include "../utils/stb_sprintf.h"
|
|
||||||
|
|
||||||
// character classes {{{
|
// character classes {{{
|
||||||
static inline bool
|
static inline bool
|
||||||
@ -465,9 +463,10 @@ class Token {
|
|||||||
double new_val = convert_font_size(val, lit->second);
|
double new_val = convert_font_size(val, lit->second);
|
||||||
if (val == new_val) return false;
|
if (val == new_val) return false;
|
||||||
char txt[128];
|
char txt[128];
|
||||||
// stbsp_snprintf is locale independent unlike std::snprintf
|
auto res = std::to_chars(txt, txt + sizeof(txt)-8, new_val, std::chars_format::general);
|
||||||
int num = stbsp_snprintf(txt, sizeof(txt), "%grem", new_val);
|
if (res.ec != std::errc()) throw std::runtime_error("Failed to format font size");
|
||||||
if (num <= 0) throw std::runtime_error("Failed to format font size");
|
size_t num = res.ptr - txt;
|
||||||
|
txt[num++] = 'r'; txt[num++] = 'e'; txt[num++] = 'm';
|
||||||
set_ascii_text(txt, num);
|
set_ascii_text(txt, num);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -64,11 +64,11 @@ class TestTransform(SimpleTest):
|
|||||||
u('a:url( "( )" /**/ )', 'a:url("( )")')
|
u('a:url( "( )" /**/ )', 'a:url("( )")')
|
||||||
u('a:url( "(/*)" )', 'a:url( "(/*)" )', url_callback=lambda x: x)
|
u('a:url( "(/*)" )', 'a:url( "(/*)" )', url_callback=lambda x: x)
|
||||||
|
|
||||||
d('font-size: 197583965730245.28px', 'font-size: 1.2349e+13rem')
|
d('font-size: 197583965730245.28px', 'font-size: 1.234899785814033e+13rem')
|
||||||
d('font-size: 19.28px', 'font-size: 1.205rem')
|
d('font-size: 19.28px', 'font-size: 1.205rem')
|
||||||
d('font-size:+19.28px', 'font-size:1.205rem')
|
d('font-size:+19.28px', 'font-size:1.205rem')
|
||||||
d('font-size: .28in', 'font-size: 1.68rem')
|
d('font-size: .28in', 'font-size: 1.6800000000000002rem')
|
||||||
d('font-size: +.28in', 'font-size: 1.68rem')
|
d('font-size: +.28in', 'font-size: 1.6800000000000002rem')
|
||||||
d(r'f\ont-s\69z\65 : 16\px', 'font-size: 1rem')
|
d(r'f\ont-s\69z\65 : 16\px', 'font-size: 1rem')
|
||||||
d('font -size: 16px', 'font -size: 16px')
|
d('font -size: 16px', 'font -size: 16px')
|
||||||
d('font-/* */size: 1/*x*/6/**/p/**/x !important', 'font-size: 1rem !important')
|
d('font-/* */size: 1/*x*/6/**/p/**/x !important', 'font-size: 1rem !important')
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user