-
Notifications
You must be signed in to change notification settings - Fork 16
/
TiBlob+Vignette.m
75 lines (59 loc) · 2.31 KB
/
TiBlob+Vignette.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
//
// TiBlob+Vignette.m
// tiimagefilters
//
// Created by KATAOKA,Atsushi on 11/06/28.
// Copyright 2011 MARSHMALLOW MACHINE. All rights reserved.
//
#import "TiBlob+Template.h"
#import "TiBlob+Vignette.h"
@implementation TiBlob (TiBlob_Vignette)
- (id)vignette:(id)arg
{
NSNumber *size;
NSNumber *strength;
ENSURE_ARG_AT_INDEX(size, arg, 0, NSNumber);
ENSURE_ARG_AT_INDEX(strength, arg, 1, NSNumber);
FilterOperation op = ^(uint8_t *buf, size_t bpr, ARGBIndex argb, uint32_t w, uint32_t h)
{
int32_t center[2] = { w / 2, h / 2};
int32_t start[2] = { 0, 1 };
int32_t ctrl1[2] = { 30, 30 };
int32_t ctrl2[2] = { 70, 60 };
int32_t end[2] = { 100, 80 };
int32_t bezier[256];
[self bezier:start
ctrl1:ctrl1
ctrl2:ctrl2
end:end
lowBound:0
highBound:255
into:bezier];
int32_t opSize = 100 - [size intValue];
opSize = MIN(w, h) * opSize / 100;
int32_t opStart = (int32_t)sqrtf(center[0]*center[0]+center[1]*center[1]);
int32_t opEnd = opStart - opSize;
float opStrength = [strength intValue] / 100.f;
NSLog(@"[DEBUG] vignette operation called. size:%d strength:%f", opSize, opStrength);
for(int y = 0; y < h; y++){
for(int x = 0; x < w; x++){
int32_t dist = (int32_t)sqrtf(((x-center[0])*(x-center[0]))+((y-center[1])*(y-center[1])));
if(dist <= opEnd){
continue;
}
uint8_t *pixel = buf + y * bpr + x * 4;
int16_t R, G, B;
R = *(pixel + argb.r);
G = *(pixel + argb.g);
B = *(pixel + argb.b);
int32_t index = (int32_t)((dist - opEnd) * 100.f / opSize);
float div = MAX(1.f, bezier[index] / 10.f * opStrength);
*(pixel + argb.r) = (uint8_t)(powf(R / 255.f, div) * 255.f);
*(pixel + argb.g) = (uint8_t)(powf(G / 255.f, div) * 255.f);
*(pixel + argb.b) = (uint8_t)(powf(B / 255.f, div) * 255.f);
}
}
};
return [self operate:op];
}
@end