I'm going to give you an answer that may be considered a little clumsy, but since no rules have been set unless it's CSS and no border-radius
it's one more suggestion (even if "controversial") .. .
First you'll need a well-geometric font type Future , which has the letter O as a perfect circle. Another detail, the "thicker" the font trait the easier to make the effect, then the more Bold
In my example I used a font in those requirements that I found in Google Fonts at Montserrat
After that I just created some css styles for :: after elements that I used to cover the "eyes" of the characters. In short, just use pseudo elements to fill the holes in the font and have the perfect circle and other shapes ...
See the result in the example:
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
background-color: azure;
}
.container {
position: relative;
z-index: 1;
}
.texto {
font-family: 'Montserrat', Verdana, sans-serif;
font-weight: bold;
color: red;
font-size: 10rem;
position: relative;
text-transform: uppercase;
}
.texto-o::after, .texto-p::after, .texto-a::after {
content: "";
position: absolute;
background-color: red;
z-index: -1;
}
.texto-o::after {
top: 30%;
left: 25%;
width: 50%;
height: 45%;
}
.texto-p::after {
top: 30%;
left: 20%;
width: 60%;
height: 25%;
background-color: rgba(255,0,0,0.75);
}
.texto-a::after {
top: 30%;
left: 35%;
width: 30%;
height: 35%;
background-image: url(http://unsplash.it/40/40);
}
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,900" rel="stylesheet">
<div class="container">
<span class="texto texto-o">o</span>
<span class="texto texto-p">p</span>
<span class="texto texto-a">a</span>
<span class="texto">!</span>
</div>
OBS: works from IE8 up link