You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.9 KiB
110 lines
2.9 KiB
decode_aco_v2 <- function(aco, n_colors) {
|
|
|
|
con <- rawConnection(aco)
|
|
on.exit(close(con))
|
|
|
|
tmp <- readBin(con, "raw", 4, endian="big")
|
|
|
|
val <- sapply(1:n_colors, function(i) {
|
|
parse_aco_v2_block(con)
|
|
})
|
|
|
|
val[!is.na(val)]
|
|
|
|
}
|
|
|
|
parse_aco_v2_block <- function(con) {
|
|
|
|
colorspace <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
|
|
color <- NA
|
|
|
|
if (colorspace == 0) { # RGB
|
|
|
|
w <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
x <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
y <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
z <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
|
|
color <- rgb(w, x, y, maxColorValue=65535)
|
|
|
|
} else if (colorspace == 1) { # HSB
|
|
|
|
w <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
x <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
y <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
z <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
|
|
color <- hsv((w/182.04)/360, ((x/655.35)/360), ((y/655.35)/360))
|
|
|
|
} else if (colorspace == 2) { # CMYK
|
|
|
|
w <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
x <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
y <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
z <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
|
|
color <- cmyk((100-w/655.35), (100-x/655.35), (100-y/655.35), (100-z/655.35))
|
|
|
|
} else if (colorspace == 7) { # Lab
|
|
|
|
w <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
x <- readBin(con, "integer", 1, 2, signed=TRUE, endian="big")
|
|
y <- readBin(con, "integer", 1, 2, signed=TRUE, endian="big")
|
|
z <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
|
|
# color <- LAB(w/100, x/100, y/100)
|
|
|
|
color <- NA
|
|
|
|
message("Lab colors not supported yet")
|
|
|
|
} else if (colorspace == 8) { # Grayscale
|
|
|
|
w <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
x <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
y <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
z <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
|
|
message("Grayscale not supported yet")
|
|
|
|
color <- w/39.0625
|
|
|
|
} else if (colorspace == 9) { # Wide CMYK
|
|
|
|
w <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
x <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
y <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
z <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
|
|
color <- cmyk(w/100, x/100, y/100, z/100)
|
|
|
|
} else {
|
|
|
|
w <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
x <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
y <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
z <- b2i(readBin(con, "raw", 2, endian="big"))
|
|
|
|
message("Color format unknown")
|
|
|
|
color <- NA
|
|
}
|
|
|
|
tmp <- readBin(con, "raw", 2, endian="big")
|
|
|
|
label <- ""
|
|
label_length <- b2i(readBin(con, "raw", 2, endian="big")) * 2
|
|
if (label_length > 0) {
|
|
label <- readBin(con, "raw", label_length-2, endian="big")
|
|
label <- rawToChar(label[1:length(label)], multiple=TRUE)
|
|
label <- paste(label, sep="", collapse="")
|
|
}
|
|
|
|
names(color) <- label
|
|
|
|
tmp <- readBin(con, "raw", 2, endian="big")
|
|
|
|
return(color)
|
|
|
|
}
|