mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Transform font sizes
This commit is contained in:
parent
360a081c43
commit
94756715ef
@ -98,6 +98,7 @@ class ParsedNumber {
|
|||||||
double float_value;
|
double float_value;
|
||||||
ParsedNumber(integer_type val) : is_integer(true), integer_value(val), float_value(0) {}
|
ParsedNumber(integer_type val) : is_integer(true), integer_value(val), float_value(0) {}
|
||||||
ParsedNumber(double val) : is_integer(false), integer_value(0), float_value(val) {}
|
ParsedNumber(double val) : is_integer(false), integer_value(0), float_value(val) {}
|
||||||
|
double as_double() const { return is_integer ? (double)integer_value : float_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const double base_font_size = 16.0, dpi = 96.0, pt_to_px = dpi / 72.0, pt_to_rem = pt_to_px / base_font_size;
|
static const double base_font_size = 16.0, dpi = 96.0, pt_to_px = dpi / 72.0, pt_to_rem = pt_to_px / base_font_size;
|
||||||
@ -340,25 +341,39 @@ class Token {
|
|||||||
|
|
||||||
void set_text(const PyObject* src) {
|
void set_text(const PyObject* src) {
|
||||||
if (PyUnicode_READY(src) != 0) throw python_error("Failed to set token value from unicode object as readying the unicode obect failed");
|
if (PyUnicode_READY(src) != 0) throw python_error("Failed to set token value from unicode object as readying the unicode obect failed");
|
||||||
text.clear();
|
|
||||||
int kind = PyUnicode_KIND(src); void *data = PyUnicode_DATA(src);
|
int kind = PyUnicode_KIND(src); void *data = PyUnicode_DATA(src);
|
||||||
for (Py_ssize_t i = 0; i < PyUnicode_GET_LENGTH(src); i++) text.push_back(PyUnicode_READ(kind, data, i));
|
text.resize(PyUnicode_GET_LENGTH(src));
|
||||||
|
for (Py_ssize_t i = 0; i < PyUnicode_GET_LENGTH(src); i++) text[i] = PyUnicode_READ(kind, data, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_text(const char* src) {
|
void set_text(const char* src) {
|
||||||
text.clear();
|
text.resize(strlen(src));
|
||||||
while(*src) text.push_back(*(src++));
|
for (size_t i = 0; i < text.size(); i++) text[i] = src[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_text(const frozen::string &src) {
|
void set_text(const frozen::string &src) {
|
||||||
text.clear();
|
text.resize(src.size());
|
||||||
for (size_t i = 0; i < src.size(); i++) text.push_back(src[i]);
|
for (size_t i = 0; i < text.size(); i++) text[i] = src[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parse_dimension(std::string &scratch) {
|
void set_text(const std::string &src) {
|
||||||
if (!text_as_ascii_lowercase(scratch)) return false;
|
text.resize(src.size());
|
||||||
|
for (size_t i = 0; i < text.size(); i++) text[i] = src[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool convert_absolute_font_size(std::string &scratch) {
|
||||||
|
if (!unit_at || !text_as_ascii_lowercase(scratch)) return false;
|
||||||
|
frozen::string unit(scratch.data() + unit_at, scratch.size() - unit_at);
|
||||||
|
auto lit = absolute_length_units.find(unit);
|
||||||
|
if (lit == absolute_length_units.end()) return false;
|
||||||
|
double val = parse_css_number<std::string>(scratch, unit_at).as_double();
|
||||||
|
double new_val = convert_font_size(val, lit->second);
|
||||||
|
if (val == new_val) return false;
|
||||||
|
scratch.reserve(128); scratch.clear();
|
||||||
|
scratch.resize(std::snprintf(&scratch[0], scratch.capacity(), "%grem", new_val));
|
||||||
|
set_text(scratch);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TokenQueue {
|
class TokenQueue {
|
||||||
@ -488,6 +503,7 @@ class TokenQueue {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TokenType::dimension:
|
case TokenType::dimension:
|
||||||
|
if (it->convert_absolute_font_size(scratch2)) changed = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user