Here is some code I've used in the past. Fully integer based, which may or may not be needed, but it draws an ellipse within a rectangle.
void FrameEllipse(long left,long top,long right,long bottom)
{
long a,b,x,y,temp;
long long d1,d2;
long long a2,b2,a2b2,a2sqr,b2sqr,a4sqr,b4sqr;
long long a8sqr,b8sqr,a4sqr_b4sqr;
long long fn,fnw,fw;
long long fnn,fnnw,fnwn,fnwnw,fnww,fww,fwnw;
if(right < left)
{
temp = left;
left = right;
right = temp;
}
if(bottom < top)
{
temp = top;
top = bottom;
bottom = temp;
}
a = (right - left) / 2;
b = (bottom - top) / 2;
x = 0;
y = b;
a2 = a * a;
b2 = b * b;
a2b2 = a2 + b2;
a2sqr = a2 + a2;
b2sqr = b2 + b2;
a4sqr = a2sqr + a2sqr;
b4sqr = b2sqr + b2sqr;
a8sqr = a4sqr + a4sqr;
b8sqr = b4sqr + b4sqr;
a4sqr_b4sqr = a4sqr + b4sqr;
fn = a8sqr + a4sqr;
fnn = a8sqr;
fnnw = a8sqr;
fnw = a8sqr + a4sqr - b8sqr * a + b8sqr;
fnwn = a8sqr;
fnwnw = a8sqr + b8sqr;
fnww = b8sqr;
fwnw = b8sqr;
fww = b8sqr;
d1 = b2 - b4sqr * a + a4sqr;
while((fnw < a2b2) || (d1 < 0) || ((fnw - fn > b2) && (y > 0)))
{
SetPixel(right - x,bottom - y,Color.white);
SetPixel(left + x,bottom - y,Color.white);
SetPixel(left + x,top + y,Color.white);
SetPixel(right - x,top + y,Color.white);
y--;
if((d1 < 0) || (fnw - fn > b2))
{
d1 += fn;
fn += fnn;
fnw += fnwn;
}else{
x++;
d1 += fnw;
fn += fnnw;
fnw += fnwnw;
}
}
fw = fnw - fn + b4sqr;
d2 = d1 + (fw + fw - fn - fn + a4sqr_b4sqr + a8sqr) / 4;
fnw += b4sqr - a4sqr;
while(x <= a)
{
SetPixel(right - x,bottom - y,Color.white);
SetPixel(left + x,bottom - y,Color.white);
SetPixel(left + x,top + y,Color.white);
SetPixel(right - x,top + y,Color.white);
x++;
if(d2 < 0)
{
y--;
d2 += fnw;
fw += fwnw;
fnw += fnwnw;
}else{
d2 += fw;
fw += fww;
fnw += fnww;
}
}
}