library(grid) HersheyLabel <- function(x, y=unit(.5, "npc")) { lines <- strsplit(x, "\n")[[1]] if (!is.unit(y)) y <- unit(y, "npc") n <- length(lines) if (n > 1) { y <- y + unit(rev(seq(n)) - mean(seq(n)), "lines") } grid.text(lines, y=y, gp=gpar(fontfamily="HersheySans")) } r1 <- rectGrob(x=1/3, y=2/3, width=.5, height=.5, gp=gpar(col=NA, fill=rgb(.7, 0, 0, .8))) r2 <- rectGrob(x=2/3, y=1/3, width=.5, height=.5, gp=gpar(col=NA, fill=rgb(0, 0, .9, .4))) group <- function(op) { grid.rect() grid.group(r2, op, r1) HersheyLabel(op, y=1/4) } porterDuff <- function() { grid.newpage() pushViewport(viewport(layout=grid.layout(3, 4, respect=TRUE))) pushViewport(viewport(layout.pos.row=1, layout.pos.col=1)) group("over") popViewport() pushViewport(viewport(layout.pos.row=1, layout.pos.col=2)) group("clear") popViewport() pushViewport(viewport(layout.pos.row=1, layout.pos.col=3)) group("source") popViewport() pushViewport(viewport(layout.pos.row=1, layout.pos.col=4)) group("in") popViewport() pushViewport(viewport(layout.pos.row=2, layout.pos.col=1)) group("out") popViewport() pushViewport(viewport(layout.pos.row=2, layout.pos.col=2)) group("atop") popViewport() pushViewport(viewport(layout.pos.row=2, layout.pos.col=3)) group("dest") popViewport() pushViewport(viewport(layout.pos.row=2, layout.pos.col=4)) group("dest.over") popViewport() pushViewport(viewport(layout.pos.row=3, layout.pos.col=1)) group("dest.in") popViewport() pushViewport(viewport(layout.pos.row=3, layout.pos.col=2)) group("dest.out") popViewport() pushViewport(viewport(layout.pos.row=3, layout.pos.col=3)) group("dest.atop") popViewport() pushViewport(viewport(layout.pos.row=3, layout.pos.col=4)) group("xor") popViewport() } blendModes <- function() { grid.newpage() pushViewport(viewport(layout=grid.layout(3, 4, respect=TRUE))) pushViewport(viewport(layout.pos.row=1, layout.pos.col=1)) group("add") popViewport() pushViewport(viewport(layout.pos.row=1, layout.pos.col=2)) group("saturate") popViewport() pushViewport(viewport(layout.pos.row=1, layout.pos.col=3)) group("multiply") popViewport() pushViewport(viewport(layout.pos.row=1, layout.pos.col=4)) group("screen") popViewport() pushViewport(viewport(layout.pos.row=2, layout.pos.col=1)) group("overlay") popViewport() pushViewport(viewport(layout.pos.row=2, layout.pos.col=2)) group("darken") popViewport() pushViewport(viewport(layout.pos.row=2, layout.pos.col=3)) group("lighten") popViewport() pushViewport(viewport(layout.pos.row=2, layout.pos.col=4)) group("color.dodge") popViewport() pushViewport(viewport(layout.pos.row=3, layout.pos.col=1)) group("color.burn") popViewport() pushViewport(viewport(layout.pos.row=3, layout.pos.col=2)) group("hard.light") popViewport() pushViewport(viewport(layout.pos.row=3, layout.pos.col=3)) group("soft.light") popViewport() pushViewport(viewport(layout.pos.row=3, layout.pos.col=4)) group("difference") popViewport() } porterDuff() blendModes()