mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-05 22:34:56 +01:00
more experiments with cocoa/quartz drawing
This commit is contained in:
parent
e66975bc56
commit
17f45db41f
4 changed files with 58 additions and 32 deletions
|
|
@ -47,6 +47,7 @@ main (int argc, char* argv[])
|
|||
CTView* view = [[CTView alloc] initWithFrame:frameRect];
|
||||
|
||||
layout (view);
|
||||
[view setWantsLayer:NO];
|
||||
|
||||
[win setContentView:view];
|
||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||
|
|
|
|||
|
|
@ -20,5 +20,5 @@ struct Meter {
|
|||
Meter (NSView* view, double ax, double ay, double aw, double ah, double ar, double ag, double ab, double aa);
|
||||
|
||||
void set_level (double);
|
||||
void draw (CGContextRef);
|
||||
void draw (CGContextRef, bool required);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -13,14 +13,14 @@ Meter::Meter (NSView* v, double ax, double ay, double aw, double ah, double ar,
|
|||
, g (ag)
|
||||
, b (ab)
|
||||
, a (aa)
|
||||
, level (0.)
|
||||
, level ((random() % 100) / 100.)
|
||||
, view (v)
|
||||
, draw_queued (true)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
Meter::draw (CGContextRef cg)
|
||||
Meter::draw (CGContextRef cg, bool required)
|
||||
{
|
||||
NSRect bbox = NSMakeRect (x, y, width, height);
|
||||
|
||||
|
|
@ -29,8 +29,8 @@ Meter::draw (CGContextRef cg)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!draw_queued) {
|
||||
return;
|
||||
if (!draw_queued && !required) {
|
||||
// return;
|
||||
}
|
||||
|
||||
CGContextSetRGBStrokeColor (cg, 1., 1., 1., 1.);
|
||||
|
|
|
|||
|
|
@ -11,19 +11,10 @@
|
|||
extern std::vector<Meter*> meters;
|
||||
extern int queued_draws;
|
||||
|
||||
static int update_cnt = 0;
|
||||
|
||||
@implementation CTView
|
||||
|
||||
-(BOOL)acceptsFirstResponder
|
||||
{
|
||||
printf ("acceptsFirstResponder\n");
|
||||
return YES;
|
||||
}
|
||||
|
||||
-(void)noop: (id)sender
|
||||
{
|
||||
printf ("noop\n");
|
||||
}
|
||||
|
||||
-(BOOL)isFlipped
|
||||
{
|
||||
return YES;
|
||||
|
|
@ -31,57 +22,92 @@ extern int queued_draws;
|
|||
|
||||
-(BOOL)opaque
|
||||
{
|
||||
return NO;
|
||||
return YES;
|
||||
}
|
||||
|
||||
-(void) timedUpdate
|
||||
{
|
||||
#if 0
|
||||
int n = random() % meters.size();
|
||||
meters[n]->set_level ((random() % (int) meters[n]->height) / meters[n]->height);
|
||||
#endif
|
||||
for (auto & m : meters) {
|
||||
if ((random() % 100) == 0) {
|
||||
m->set_level ((random() % (int) m->height) / m->height);
|
||||
}
|
||||
assert (meters.size() >= 600);
|
||||
std::vector<int> m ({ 0, 99});
|
||||
for (auto & n : m) {
|
||||
meters[n]->set_level ((random() % (int) meters[n]->height) / meters[n]->height);
|
||||
}
|
||||
#endif
|
||||
#if 1
|
||||
static int howmany = 0;
|
||||
|
||||
if ((update_cnt++ % 500) == 0) {
|
||||
howmany += 1;
|
||||
printf ("now drawing %d\n", howmany);
|
||||
}
|
||||
|
||||
int cnt = howmany;
|
||||
|
||||
while (cnt) {
|
||||
int n = random() % meters.size();
|
||||
meters[n]->set_level ((random() % (int) meters[n]->height) / meters[n]->height);
|
||||
cnt--;
|
||||
}
|
||||
#endif
|
||||
#if 0
|
||||
for (auto & m : meters) {
|
||||
// if ((random() % 100) == 0) {
|
||||
m->set_level ((random() % (int) m->height) / m->height);
|
||||
//}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if 1
|
||||
-(void)viewWillDraw
|
||||
{
|
||||
CALayer* layer = [self layer];
|
||||
layer.contentsFormat = kCAContentsFormatRGBA8Uint;
|
||||
[super viewWillDraw];
|
||||
}
|
||||
#endif
|
||||
|
||||
-(void)drawRect: (NSRect)rect
|
||||
{
|
||||
|
||||
bool required_redraw;
|
||||
|
||||
if (NSContainsRect (rect, [self bounds])) {
|
||||
printf ("full redraw, queued = %d\n", queued_draws);
|
||||
required_redraw = true;
|
||||
} else {
|
||||
required_redraw = false;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (rect.size.width != 10 && rect.size.height != 50) {
|
||||
NSRect me = [self bounds];
|
||||
printf ("%g, %g %g x %g vs %g, %g %g x %g\n",
|
||||
rect.origin.x, rect.origin.y, rect.size.width, rect.size.height,
|
||||
rect.origin.x, rect.origin.y, rect.size.width, rect.size.height,
|
||||
me.origin.x, me.origin.y, me.size.width, me.size.height);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
const NSRect *drawn_rects;
|
||||
long count;
|
||||
int i;
|
||||
|
||||
[self getRectsBeingDrawn: &drawn_rects count: &count];
|
||||
|
||||
printf ("%ld rects to draw\n", count);
|
||||
// printf ("%ld rects to draw\n", count);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
printf ("\trect %d: %g, %g %g x %g\n", i, drawn_rects[i].origin.x, drawn_rects[i].origin.y, drawn_rects[i].size.width, drawn_rects[i].size.height);
|
||||
}
|
||||
// for (i = 0; i < count; i++) {
|
||||
// printf ("\trect %d: %g, %g %g x %g\n", i, drawn_rects[i].origin.x, drawn_rects[i].origin.y, drawn_rects[i].size.width, drawn_rects[i].size.height);
|
||||
// }
|
||||
#endif
|
||||
|
||||
CGContextRef cg = [[NSGraphicsContext currentContext] CGContext];
|
||||
|
||||
for (auto & m : meters) {
|
||||
m->draw (cg);
|
||||
m->draw (cg, required_redraw);
|
||||
}
|
||||
|
||||
queued_draws = 0;
|
||||
|
|
@ -93,4 +119,3 @@ extern int queued_draws;
|
|||
}
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue