When you write a struct like, TtfDecode<R>, it means that R can be any type at all. When you define the impl block like impl<R: BufRead> TtfDecoder<R>, it means that R is any type that implements the BufRead trait. Note the word any. While the variable r is of type std::io::BufReader and hence compatible with R, it may not be the type specified by the caller of TtfDecoder::new. Note that the generic type is decided by the caller of the function. What you probably want is:
Type parameters are outside of your control. The specific type of R will be chosen by the user of the struct, not by you, so you can't say R is a BufReader, because that would be a bug for TtfDecoder<File>, for example. Note that R is a single specific, but unknown at this point, type. It's not the same as Box<dyn Read> which allows multiple types with the same interface.
You can have reader: BufReader<R>. Or you can move new to impl block for TtfDecoder<BufReader<R>>.