/************************************************
Algorithmen und Problemloesungen mit C++,
http://www.algorithmen-und-problemloesungen.de
Copyright @2007 by Doina Logofatu
************************************************/

#include "stdafx.h" 
#include "MainWindow.h"

class PaintInvariant {
public:
  PaintInvariant(HDC& refHdc, int minimumL = 10):
      rHdc(refHdc), dx(0), dy(0), minL(minimumL) {}

    HDC& rHdc;

    int dx;

    int dy;

    int minL;
};


class CSquareCircleWindow: public CMainWindow{
protected:

  virtual void OnPaintImpl(HDC &hdc);

private:

  void _drawRec(PaintInvariant &rPaintInvariant, 
    int x, int y, int l);
  void _drawCircle(PaintInvariant &rPaintInvariant, 
    int x, int y, int l);
};


CMainWindow *CreateMainWindow() {
  return new CSquareCircleWindow();
}

void CSquareCircleWindow::OnPaintImpl(HDC &hdc) {

  RECT rect;
  GetClientRect(&rect);

  int diff = rect.right-rect.bottom;	
  PaintInvariant paintInv(hdc, 10);	
  int l;
  if(diff<0) {
    diff *=-1;
    l = rect.right/2;
    paintInv.dx = 0;
    paintInv.dy = diff/2;
  }
  else {
    l = rect.bottom/2;
    paintInv.dx = diff/2;
    paintInv.dy=0;
  }

  _drawRec(paintInv, l, l, l);
}

void CSquareCircleWindow::_drawRec(
                                   PaintInvariant &rPaintInvariant, 
                                   int x, int y, int l)
{
if(l>rPaintInvariant.minL) {
  _drawCircle(rPaintInvariant, x-l/2, y-l/2, l/2);
  _drawCircle(rPaintInvariant, x-l/2, y+l/2, l/2);
  _drawCircle(rPaintInvariant, x+l/2, y-l/2, l/2);
  _drawCircle(rPaintInvariant, x+l/2, y+l/2, l/2);
  Rectangle(rPaintInvariant.rHdc,  
    x-l/2  + rPaintInvariant.dx, 
    y-l/2  + rPaintInvariant.dy, 
    x+l/2  + rPaintInvariant.dx, 
    y+l/2  + rPaintInvariant.dy);
  }
} 

void CSquareCircleWindow::_drawCircle(
                                      PaintInvariant &rPaintInvariant, 
                                      int x, int y, int l)
{
  if(l>rPaintInvariant.minL) {
    _drawRec(rPaintInvariant, x-l/2, y-l/2, l/2);
    _drawRec(rPaintInvariant, x-l/2, y+l/2, l/2);
    _drawRec(rPaintInvariant, x+l/2, y-l/2, l/2);
    _drawRec(rPaintInvariant, x+l/2, y+l/2, l/2);
    Ellipse(rPaintInvariant.rHdc,  
      x-l/2  + rPaintInvariant.dx, 
      y-l/2  + rPaintInvariant.dy, 
      x+l/2  + rPaintInvariant.dx, 
      y+l/2  + rPaintInvariant.dy);
  }
}
