Skip to content

Commit 655ef2b

Browse files
committed
make font_descent() not vectorized. closes #3492.
1 parent b842024 commit 655ef2b

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

R/margins.R

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -333,29 +333,36 @@ rotate_just <- function(angle, hjust, vjust) {
333333
list(hjust = hnew, vjust = vnew)
334334
}
335335
descent_cache <- new.env(parent = emptyenv())
336+
# Important: This function is not vectorized. Do not use to look up multiple
337+
# font descents at once.
336338
font_descent <- function(family = "", face = "plain", size = 12, cex = 1) {
337339
cur_dev <- names(grDevices::dev.cur())
340+
if (cur_dev == "null device") {
341+
cache <- FALSE # don't cache if no device open
342+
} else {
343+
cache <- TRUE
344+
}
338345
key <- paste0(cur_dev, ':', family, ':', face, ":", size, ":", cex)
339-
descents <- lapply(key, function(k) {
340-
descent <- descent_cache[[k]]
341-
342-
if (is.null(descent)) {
343-
descent <- convertHeight(grobDescent(textGrob(
344-
label = "gjpqyQ",
345-
gp = gpar(
346-
fontsize = size,
347-
cex = cex,
348-
fontfamily = family,
349-
fontface = face
350-
)
351-
)), 'inches')
352-
descent_cache[[k]] <- descent
346+
# we only look up the first result; this function is not vectorized
347+
key <- key[1]
348+
349+
descent <- descent_cache[[key]]
350+
351+
if (is.null(descent)) {
352+
descent <- convertHeight(grobDescent(textGrob(
353+
label = "gjpqyQ",
354+
gp = gpar(
355+
fontsize = size,
356+
cex = cex,
357+
fontfamily = family,
358+
fontface = face
359+
)
360+
)), 'inches')
361+
362+
if (cache) {
363+
descent_cache[[key]] <- descent
353364
}
354-
descent
355-
})
356-
if (length(descents) == 1) {
357-
descents[[1]]
358-
} else {
359-
do.call(unit.c, descents)
360365
}
366+
367+
descent
361368
}

0 commit comments

Comments
 (0)