Introduce a front-end function to draw circles.
[sgt/puzzles] / osx.m
diff --git a/osx.m b/osx.m
index ed33bf6..bc87021 100644 (file)
--- a/osx.m
+++ b/osx.m
@@ -383,7 +383,7 @@ struct frontend {
 - (void)keyDown:(NSEvent *)ev;
 - (void)activateTimer;
 - (void)deactivateTimer;
-- (void)setStatusLine:(NSString *)text;
+- (void)setStatusLine:(char *)text;
 @end
 
 @implementation MyImageView
@@ -470,7 +470,8 @@ struct frontend {
        frame.origin.y = 0;
     frame.origin.x = 0;
 
-    midend_size(me, &w, &h);
+    w = h = INT_MAX;
+    midend_size(me, &w, &h, FALSE);
     frame.size.width = w;
     frame.size.height = h;
 
@@ -501,7 +502,8 @@ struct frontend {
      * initWithGame: simply call that one and pass it NULL.
      */
     midend_new_game(me);
-    midend_size(me, &w, &h);
+    w = h = INT_MAX;
+    midend_size(me, &w, &h, FALSE);
     rect.size.width = w;
     rect.size.height = h;
 
@@ -771,7 +773,8 @@ struct frontend {
     NSSize size = {0,0};
     int w, h;
 
-    midend_size(me, &w, &h);
+    w = h = INT_MAX;
+    midend_size(me, &w, &h, FALSE);
     size.width = w;
     size.height = h;
 
@@ -1131,9 +1134,11 @@ struct frontend {
     [self sheetEndWithStatus:NO];
 }
 
-- (void)setStatusLine:(NSString *)text
+- (void)setStatusLine:(char *)text
 {
-    [[status cell] setTitle:text];
+    char *rewritten = midend_rewrite_statusbar(me, text);
+    [[status cell] setTitle:[NSString stringWithCString:rewritten]];
+    sfree(rewritten);
 }
 
 @end
@@ -1167,6 +1172,26 @@ void draw_polygon(frontend *fe, int *coords, int npoints,
     else
        [path stroke];
 }
+void draw_circle(frontend *fe, int cx, int cy, int radius,
+                 int fill, int colour)
+{
+    NSBezierPath *path = [NSBezierPath bezierPath];
+
+    [[NSGraphicsContext currentContext] setShouldAntialias:YES];
+
+    assert(colour >= 0 && colour < fe->ncolours);
+    [fe->colours[colour] set];
+
+    [path appendBezierPathWithArcWithCenter:NSMakePoint(cx + 0.5, cy + 0.5)
+        radius:radius startAngle:0.0 endAngle:360.0];
+
+    [path closePath];
+
+    if (fill)
+       [path fill];
+    else
+       [path stroke];
+}
 void draw_line(frontend *fe, int x1, int y1, int x2, int y2, int colour)
 {
     NSBezierPath *path = [NSBezierPath bezierPath];
@@ -1227,6 +1252,48 @@ void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,
 
     [string drawAtPoint:point withAttributes:attr];
 }
+struct blitter {
+    int w, h;
+    int x, y;
+    NSImage *img;
+};
+blitter *blitter_new(int w, int h)
+{
+    blitter *bl = snew(blitter);
+    bl->x = bl->y = -1;
+    bl->w = w;
+    bl->h = h;
+    bl->img = [[NSImage alloc] initWithSize:NSMakeSize(w, h)];
+    [bl->img setFlipped:YES];
+    return bl;
+}
+void blitter_free(blitter *bl)
+{
+    [bl->img release];
+    sfree(bl);
+}
+void blitter_save(frontend *fe, blitter *bl, int x, int y)
+{
+    [fe->image unlockFocus];
+    [bl->img lockFocus];
+    [fe->image drawInRect:NSMakeRect(0, 0, bl->w, bl->h)
+       fromRect:NSMakeRect(x, y, bl->w, bl->h)
+       operation:NSCompositeCopy fraction:1.0];
+    [bl->img unlockFocus];
+    [fe->image lockFocus];
+    bl->x = x;
+    bl->y = y;
+}
+void blitter_load(frontend *fe, blitter *bl, int x, int y)
+{
+    if (x == BLITTER_FROMSAVED && y == BLITTER_FROMSAVED) {
+        x = bl->x;
+        y = bl->y;
+    }
+    [bl->img drawInRect:NSMakeRect(x, y, bl->w, bl->h)
+       fromRect:NSMakeRect(0, 0, bl->w, bl->h)
+       operation:NSCompositeCopy fraction:1.0];
+}
 void draw_update(frontend *fe, int x, int y, int w, int h)
 {
     [fe->view setNeedsDisplayInRect:NSMakeRect(x,y,w,h)];
@@ -1267,7 +1334,7 @@ void activate_timer(frontend *fe)
 
 void status_bar(frontend *fe, char *text)
 {
-    [fe->window setStatusLine:[NSString stringWithCString:text]];
+    [fe->window setStatusLine:text];
 }
 
 /* ----------------------------------------------------------------------