-
Notifications
You must be signed in to change notification settings - Fork 11
/
BackgroundUpdater.m
120 lines (110 loc) · 2.98 KB
/
BackgroundUpdater.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//
// BackgroundUpdater.m
// Textmate-Minimap
//
// Created by Julian Eberius on 20.03.10.
// Copyright 2010 Julian Eberius. All rights reserved.
//
#import "BackgroundUpdater.h"
#include "math.h"
#import "MinimapView.h"
#import "AsyncBGDrawOperation.h"
#define REGION_LENGTH 200
@implementation BackgroundUpdater
- (id)initWithMinimapView:(MinimapView*)mv andOperationQueue:(NSOperationQueue*)opQueue
{
self = [super init];
if (self) {
minimapView = mv;
operationQueue = opQueue;
dirtyRegions = [[NSMutableArray arrayWithCapacity:[[minimapView theImage] size].height/REGION_LENGTH] retain];
}
return self;
}
- (void) dealloc
{
[super dealloc];
[dirtyRegions release];
}
- (void)startRedrawInBackground
{
NSRect visRect = [minimapView visiblePartOfTextView];
[operationQueue cancelAllOperations];
[operationQueue setSuspended:YES];
for (NSValue* val in dirtyRegions) {
NSRange range = [val rangeValue];
NSRect rectToDraw = NSMakeRect(visRect.origin.x, range.location-1, visRect.size.width, range.length+1);
AsyncBGDrawOperation* op = [[[AsyncBGDrawOperation alloc] initWithMinimapView:minimapView andUpdater:self] autorelease];
[op setPartToDraw:rectToDraw andRangeObject:(NSValue*)val];
[operationQueue addOperation:op];
}
[operationQueue setSuspended:NO];
}
- (void)rangeWasRedrawn:(NSValue*)range
{
[dirtyRegions removeObject:range];
}
- (void)setDirtyExceptForVisiblePart
{
[dirtyRegions removeAllObjects];
NSImage* image = [minimapView theImage];
NSRect visRect = [minimapView visiblePartOfTextView];
int i = visRect.origin.y+visRect.size.height;
int t = visRect.origin.y;
BOOL goUp = TRUE;
BOOL goDown = TRUE;
while (goUp || goDown) {
if (goDown) {
int length = REGION_LENGTH;
if ((i+length) > [image size].height) {
length = [image size].height - i;
}
NSRange range = NSMakeRange(i, length+1);
[self setRangeDirty:range];
i=i+REGION_LENGTH;
if (i>[image size].height)
goDown = FALSE;
}
if (goUp) {
int length = REGION_LENGTH;
if ((t-length) < 0) {
length = t;
}
NSRange range = NSMakeRange(t-length+1, length+1);
[self setRangeDirty:range];
t = t-REGION_LENGTH;
if (t<0)
goUp = FALSE;
}
}
}
- (void)setRangeDirty:(NSRange)range
{
NSValue* val = [NSValue valueWithRange:range];
/*
for (NSValue* v in dirtyRegions)
if ([v isEqualToValue:val]) {
return;
}
*/
[dirtyRegions addObject:val];
}
- (void)addDirtyRegions:(NSArray *)regions
{
[dirtyRegions addObjectsFromArray:regions];
}
- (void)setCompleteImageDirty
{
[dirtyRegions removeAllObjects];
NSImage* image = [minimapView theImage];
int i;
for (i=0;i<[image size].height;i=i+REGION_LENGTH) {
int length = REGION_LENGTH;
if ((i+length) > [image size].height) {
length = [image size].height - i;
}
NSRange range = NSMakeRange(i-1,length+1);
[dirtyRegions addObject:[NSValue valueWithRange:range]];
}
}
@end