182 lines
5.3 KiB
Objective-C
182 lines
5.3 KiB
Objective-C
/*
|
|
* Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com>
|
|
* Copyright 2020 Anthony Cohn-Richardby <anthonyc@gmx.co.uk>
|
|
*
|
|
* This file is part of NetSurf, http://www.netsurf-browser.org/
|
|
*
|
|
* NetSurf is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* NetSurf is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#import <AppKit/AppKit.h>
|
|
#import "PlotView.h"
|
|
#import "utils/errors.h"
|
|
#import "netsurf/plotters.h"
|
|
#import "netsurf/browser_window.h"
|
|
|
|
#define colour_red_component( c ) (((c) >> 0) & 0xFF)
|
|
#define colour_green_component( c ) (((c) >> 8) & 0xFF)
|
|
#define colour_blue_component( c ) (((c) >> 16) & 0xFF)
|
|
#define colour_alpha_component( c ) (((c) >> 24) & 0xFF)
|
|
#define colour_from_rgba( r, g, b, a) ((((colour)(r)) << 0) | \
|
|
(((colour)(g)) << 8) | \
|
|
(((colour)(b)) << 16) | \
|
|
(((colour)(a)) << 24))
|
|
#define colour_from_rgb( r, g, b ) colour_from_rgba( (r), (g), (b), 0xFF )
|
|
|
|
static NSRect cocoa_plot_clip_rect;
|
|
|
|
static NSColor *cocoa_convert_colour( colour clr )
|
|
{
|
|
return [NSColor colorWithDeviceRed: (float)colour_red_component( clr ) / 0xFF
|
|
green: (float)colour_green_component( clr ) / 0xFF
|
|
blue: (float)colour_blue_component( clr ) / 0xFF
|
|
alpha: 1.0];
|
|
}
|
|
|
|
|
|
static void cocoa_plot_path_set_stroke_pattern(NSBezierPath *path, const plot_style_t *pstyle)
|
|
{
|
|
static const CGFloat dashed_pattern[2] = { 5.0, 2.0 };
|
|
static const CGFloat dotted_pattern[2] = { 2.0, 2.0 };
|
|
|
|
switch (pstyle->stroke_type) {
|
|
case PLOT_OP_TYPE_DASH:
|
|
[path setLineDash: dashed_pattern count: 2 phase: 0];
|
|
break;
|
|
|
|
case PLOT_OP_TYPE_DOT:
|
|
[path setLineDash: dotted_pattern count: 2 phase: 0];
|
|
break;
|
|
|
|
default:
|
|
// ignore
|
|
break;
|
|
}
|
|
|
|
[path setLineWidth: pstyle->stroke_width > 0 ? pstyle->stroke_width : 1];
|
|
}
|
|
|
|
void cocoa_plot_render_path(NSBezierPath *path, const plot_style_t *pstyle)
|
|
{
|
|
[NSGraphicsContext saveGraphicsState];
|
|
[NSBezierPath clipRect: cocoa_plot_clip_rect];
|
|
|
|
if (pstyle->fill_type != PLOT_OP_TYPE_NONE) {
|
|
[cocoa_convert_colour( pstyle->fill_colour ) setFill];
|
|
[path fill];
|
|
}
|
|
|
|
if (pstyle->stroke_type != PLOT_OP_TYPE_NONE) {
|
|
if (pstyle->stroke_width == 0 || pstyle->stroke_width % 2 != 0)
|
|
;
|
|
//cocoa_center_pixel( true, true );
|
|
|
|
cocoa_plot_path_set_stroke_pattern(path,pstyle);
|
|
|
|
[cocoa_convert_colour( pstyle->stroke_colour ) set];
|
|
|
|
[path stroke];
|
|
}
|
|
|
|
[NSGraphicsContext restoreGraphicsState];
|
|
}
|
|
|
|
static nserror plot_clip(const struct redraw_context *ctx, const struct rect *clip) {
|
|
NSLog(@"plot_clip");
|
|
cocoa_plot_clip_rect = NSMakeRect(clip->x0, clip->y0, clip->x1, clip->y1);
|
|
//[NSBezierPath clipRect: ];
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static nserror plot_arc(const struct redraw_context *ctx, const plot_style_t *pstyle, int x, int y, int radius, int angle1, int angle2) {
|
|
NSLog(@"plot_arc");
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static nserror plot_disc(const struct redraw_context *ctx, const plot_style_t *pstyle, int x, int y, int radius) {
|
|
NSLog(@"plot_disc");
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static nserror plot_line(const struct redraw_context *ctx, const plot_style_t *pstyle, const struct rect *line) {
|
|
NSLog(@"plot_line");
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static nserror plot_rectangle(const struct redraw_context *ctx, const plot_style_t *pstyle, const struct rect *rectangle) {
|
|
NSLog(@"plot_rectangle");
|
|
NSRect nsrect = NSMakeRect(rectangle->x0, rectangle->y0, rectangle->x1,
|
|
rectangle->y1);
|
|
NSBezierPath *path = [NSBezierPath bezierPathWithRect: nsrect];
|
|
cocoa_plot_render_path(path, pstyle);
|
|
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static nserror plot_polygon(const struct redraw_context *ctx, const plot_style_t *pstyle, const int *p, unsigned int n) {
|
|
NSLog(@"plot_polygon");
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static nserror plot_path(const struct redraw_context *ctx, const plot_style_t *pstyle, const float *p, unsigned int n, const float transform[6]) {
|
|
NSLog(@"plot_path");
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static nserror plot_bitmap(const struct redraw_context *ctx, struct bitmap *bitmap, int x, int y, int width, int height, colour bg, bitmap_flags_t flags) {
|
|
NSLog(@"plot_bitmap");
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static nserror plot_text(const struct redraw_context *ctx, const plot_font_style_t *fstyle, int x, int y, const char *text, size_t length) {
|
|
NSLog(@"plot_text");
|
|
return NSERROR_OK;
|
|
}
|
|
|
|
static const struct plotter_table gnustep_plotters = {
|
|
.clip = plot_clip,
|
|
.arc = plot_arc,
|
|
.disc = plot_disc,
|
|
.line = plot_line,
|
|
.rectangle = plot_rectangle,
|
|
.polygon = plot_polygon,
|
|
.path = plot_path,
|
|
.bitmap = plot_bitmap,
|
|
.text = plot_text,
|
|
.option_knockout = true
|
|
};
|
|
|
|
@implementation PlotView
|
|
|
|
-(void)setBrowser: (void*)aBrowser {
|
|
browser = aBrowser;
|
|
}
|
|
|
|
-(void)drawRect: (NSRect)rect {
|
|
NSLog(@"Drawing plotview");
|
|
struct redraw_context ctx = {
|
|
.interactive = true,
|
|
.background_images = true,
|
|
.plot = &gnustep_plotters
|
|
};
|
|
const struct rect clip = {
|
|
.x0 = NSMinX(rect),
|
|
.y0 = NSMinY(rect),
|
|
.x1 = NSMaxX(rect),
|
|
.y1 = NSMaxY(rect)
|
|
};
|
|
browser_window_redraw(browser, 0, 0, &clip, &ctx);
|
|
}
|
|
|
|
@end
|