mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-11-10 19:56:47 +03:00
Merge pull request #8369 from radarhere/stroke_width_float
This commit is contained in:
commit
575f574f5c
BIN
Tests/images/imagedraw_stroke_float.png
Normal file
BIN
Tests/images/imagedraw_stroke_float.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
|
@ -1368,6 +1368,20 @@ def test_stroke() -> None:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@skip_unless_feature("freetype2")
|
||||||
|
def test_stroke_float() -> None:
|
||||||
|
# Arrange
|
||||||
|
im = Image.new("RGB", (120, 130))
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
font = ImageFont.truetype("Tests/fonts/FreeMono.ttf", 120)
|
||||||
|
|
||||||
|
# Act
|
||||||
|
draw.text((12, 12), "A", "#f00", font, stroke_width=0.5)
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
assert_image_similar_tofile(im, "Tests/images/imagedraw_stroke_float.png", 3.1)
|
||||||
|
|
||||||
|
|
||||||
@skip_unless_feature("freetype2")
|
@skip_unless_feature("freetype2")
|
||||||
def test_stroke_descender() -> None:
|
def test_stroke_descender() -> None:
|
||||||
# Arrange
|
# Arrange
|
||||||
|
|
|
@ -833,7 +833,7 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
Py_ssize_t id;
|
Py_ssize_t id;
|
||||||
int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */
|
int mask = 0; /* is FT_LOAD_TARGET_MONO enabled? */
|
||||||
int color = 0; /* is FT_LOAD_COLOR enabled? */
|
int color = 0; /* is FT_LOAD_COLOR enabled? */
|
||||||
int stroke_width = 0;
|
float stroke_width = 0;
|
||||||
PY_LONG_LONG foreground_ink_long = 0;
|
PY_LONG_LONG foreground_ink_long = 0;
|
||||||
unsigned int foreground_ink;
|
unsigned int foreground_ink;
|
||||||
const char *mode = NULL;
|
const char *mode = NULL;
|
||||||
|
@ -853,7 +853,7 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(
|
if (!PyArg_ParseTuple(
|
||||||
args,
|
args,
|
||||||
"OO|zzOzizLffO:render",
|
"OO|zzOzfzLffO:render",
|
||||||
&string,
|
&string,
|
||||||
&fill,
|
&fill,
|
||||||
&mode,
|
&mode,
|
||||||
|
@ -919,8 +919,8 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
width += stroke_width * 2 + ceil(x_start);
|
width += ceil(stroke_width * 2 + x_start);
|
||||||
height += stroke_width * 2 + ceil(y_start);
|
height += ceil(stroke_width * 2 + y_start);
|
||||||
image = PyObject_CallFunction(fill, "ii", width, height);
|
image = PyObject_CallFunction(fill, "ii", width, height);
|
||||||
if (image == Py_None) {
|
if (image == Py_None) {
|
||||||
PyMem_Del(glyph_info);
|
PyMem_Del(glyph_info);
|
||||||
|
@ -934,8 +934,8 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
Py_XDECREF(imageId);
|
Py_XDECREF(imageId);
|
||||||
im = (Imaging)id;
|
im = (Imaging)id;
|
||||||
|
|
||||||
x_offset -= stroke_width;
|
x_offset = round(x_offset - stroke_width);
|
||||||
y_offset -= stroke_width;
|
y_offset = round(y_offset - stroke_width);
|
||||||
if (count == 0 || width == 0 || height == 0) {
|
if (count == 0 || width == 0 || height == 0) {
|
||||||
PyMem_Del(glyph_info);
|
PyMem_Del(glyph_info);
|
||||||
return Py_BuildValue("N(ii)", image, x_offset, y_offset);
|
return Py_BuildValue("N(ii)", image, x_offset, y_offset);
|
||||||
|
@ -950,7 +950,7 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
|
|
||||||
FT_Stroker_Set(
|
FT_Stroker_Set(
|
||||||
stroker,
|
stroker,
|
||||||
(FT_Fixed)stroke_width * 64,
|
(FT_Fixed)round(stroke_width * 64),
|
||||||
FT_STROKER_LINECAP_ROUND,
|
FT_STROKER_LINECAP_ROUND,
|
||||||
FT_STROKER_LINEJOIN_ROUND,
|
FT_STROKER_LINEJOIN_ROUND,
|
||||||
0
|
0
|
||||||
|
@ -988,8 +988,8 @@ font_render(FontObject *self, PyObject *args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set pen position to text origin */
|
/* set pen position to text origin */
|
||||||
x = (-x_min + stroke_width + x_start) * 64;
|
x = round((-x_min + stroke_width + x_start) * 64);
|
||||||
y = (-y_max + (-stroke_width) - y_start) * 64;
|
y = round((-y_max + (-stroke_width) - y_start) * 64);
|
||||||
|
|
||||||
if (stroker == NULL) {
|
if (stroker == NULL) {
|
||||||
load_flags |= FT_LOAD_RENDER;
|
load_flags |= FT_LOAD_RENDER;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user