rays 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.doc/ext/rays/bitmap.cpp +70 -233
- data/.doc/ext/rays/bounds.cpp +339 -57
- data/.doc/ext/rays/color.cpp +58 -48
- data/.doc/ext/rays/color_space.cpp +174 -0
- data/.doc/ext/rays/font.cpp +31 -53
- data/.doc/ext/rays/image.cpp +64 -67
- data/.doc/ext/rays/matrix.cpp +22 -50
- data/.doc/ext/rays/native.cpp +9 -2
- data/.doc/ext/rays/painter.cpp +276 -259
- data/.doc/ext/rays/point.cpp +186 -52
- data/.doc/ext/rays/rays.cpp +25 -20
- data/.doc/ext/rays/shader.cpp +61 -0
- data/.doc/ext/rays/texture.cpp +47 -59
- data/{README → README.md} +0 -0
- data/Rakefile +6 -5
- data/VERSION +1 -1
- data/ext/rays/bitmap.cpp +88 -248
- data/ext/rays/bounds.cpp +437 -141
- data/ext/rays/color.cpp +79 -69
- data/ext/rays/color_space.cpp +185 -0
- data/ext/rays/extconf.rb +14 -63
- data/ext/rays/font.cpp +44 -65
- data/ext/rays/image.cpp +82 -81
- data/ext/rays/matrix.cpp +32 -60
- data/ext/rays/native.cpp +9 -2
- data/ext/rays/painter.cpp +345 -321
- data/ext/rays/point.cpp +212 -69
- data/ext/rays/rays.cpp +29 -23
- data/ext/rays/shader.cpp +63 -0
- data/ext/rays/texture.cpp +64 -74
- data/include/rays/bitmap.h +21 -12
- data/include/rays/bounds.h +67 -9
- data/include/rays/color.h +23 -7
- data/include/rays/{colorspace.h → color_space.h} +6 -3
- data/include/rays/exception.h +17 -11
- data/include/rays/font.h +4 -3
- data/include/rays/image.h +11 -6
- data/include/rays/matrix.h +15 -12
- data/include/rays/opengl.h +54 -1
- data/include/rays/painter.h +98 -108
- data/include/rays/point.h +45 -5
- data/include/rays/rays.h +2 -2
- data/include/rays/ruby/bitmap.h +2 -16
- data/include/rays/ruby/bounds.h +4 -16
- data/include/rays/ruby/color.h +3 -16
- data/include/rays/ruby/color_space.h +27 -0
- data/include/rays/ruby/font.h +2 -16
- data/include/rays/ruby/image.h +2 -16
- data/include/rays/ruby/matrix.h +2 -16
- data/include/rays/ruby/painter.h +2 -16
- data/include/rays/ruby/point.h +3 -16
- data/include/rays/ruby/shader.h +27 -0
- data/include/rays/ruby/texture.h +2 -16
- data/include/rays/ruby.h +1 -0
- data/include/rays/shader.h +48 -0
- data/include/rays/texture.h +13 -2
- data/include/rays.h +2 -1
- data/lib/rays/bitmap.rb +20 -11
- data/lib/rays/bounds.rb +29 -68
- data/lib/rays/color.rb +39 -0
- data/lib/rays/color_space.rb +33 -0
- data/lib/rays/font.rb +29 -0
- data/lib/rays/image.rb +22 -0
- data/lib/rays/module.rb +11 -7
- data/lib/rays/painter.rb +103 -40
- data/lib/rays/point.rb +19 -36
- data/lib/rays/shader.rb +13 -0
- data/lib/rays/texture.rb +9 -0
- data/lib/rays.rb +4 -0
- data/rays.gemspec +3 -4
- data/src/bounds.cpp +272 -63
- data/src/color.cpp +168 -21
- data/src/{colorspace.cpp → color_space.cpp} +38 -1
- data/src/exception.cpp +24 -15
- data/src/frame_buffer.cpp +275 -0
- data/src/frame_buffer.h +79 -0
- data/src/image.cpp +80 -36
- data/src/ios/bitmap.mm +340 -0
- data/src/ios/font.mm +206 -0
- data/src/{cocoa → ios}/helper.h +2 -2
- data/src/{cocoa → ios}/helper.mm +0 -0
- data/src/ios/opengl.mm +21 -0
- data/src/ios/program.cpp +122 -0
- data/src/{cocoa → ios}/rays.mm +8 -7
- data/src/matrix.cpp +10 -22
- data/src/opengl.cpp +64 -0
- data/src/{cocoa → osx}/bitmap.mm +121 -70
- data/src/{cocoa → osx}/font.mm +32 -24
- data/src/osx/helper.h +26 -0
- data/src/osx/helper.mm +25 -0
- data/src/osx/opengl.mm +103 -0
- data/src/osx/rays.mm +43 -0
- data/src/painter.cpp +596 -422
- data/src/point.cpp +154 -11
- data/src/program.cpp +513 -0
- data/src/program.h +73 -0
- data/src/render_buffer.cpp +120 -0
- data/src/render_buffer.h +47 -0
- data/src/shader.cpp +117 -0
- data/src/texture.cpp +104 -134
- data/test/helper.rb +10 -3
- data/test/test_bitmap.rb +18 -0
- data/test/test_bounds.rb +81 -35
- data/test/test_color.rb +29 -2
- data/test/test_image.rb +63 -0
- data/test/test_painter.rb +120 -0
- data/test/test_point.rb +30 -9
- data/test/test_shader.rb +37 -0
- data/test/test_texture.rb +18 -0
- metadata +75 -58
- data/.gitignore +0 -14
- data/ChangeLog +0 -8
data/src/ios/bitmap.mm
ADDED
@@ -0,0 +1,340 @@
|
|
1
|
+
// -*- objc -*-
|
2
|
+
#import "rays/bitmap.h"
|
3
|
+
|
4
|
+
|
5
|
+
#include <assert.h>
|
6
|
+
#include <boost/scoped_array.hpp>
|
7
|
+
#import <ImageIO/ImageIO.h>
|
8
|
+
#import <MobileCoreServices/UTCoreTypes.h>
|
9
|
+
#include "rays/exception.h"
|
10
|
+
#include "rays/texture.h"
|
11
|
+
#include "../frame_buffer.h"
|
12
|
+
#include "helper.h"
|
13
|
+
|
14
|
+
|
15
|
+
namespace Rays
|
16
|
+
{
|
17
|
+
|
18
|
+
|
19
|
+
static CGBitmapInfo
|
20
|
+
make_bitmapinfo (const ColorSpace& cs)
|
21
|
+
{
|
22
|
+
// Q: What color spaces does CGBitmapContextCreate support?
|
23
|
+
// http://developer.apple.com/library/mac/#qa/qa1037/_index.html
|
24
|
+
|
25
|
+
CGBitmapInfo info = 0;
|
26
|
+
|
27
|
+
if (cs.is_alpha_first())
|
28
|
+
{
|
29
|
+
info |= cs.is_premult()
|
30
|
+
? kCGImageAlphaPremultipliedFirst
|
31
|
+
: kCGImageAlphaFirst;
|
32
|
+
}
|
33
|
+
else if (cs.is_alpha_last())
|
34
|
+
{
|
35
|
+
info |= cs.is_premult()
|
36
|
+
? kCGImageAlphaPremultipliedLast
|
37
|
+
: kCGImageAlphaLast;
|
38
|
+
}
|
39
|
+
else if (cs.is_skip_first())
|
40
|
+
info |= kCGImageAlphaNoneSkipFirst;
|
41
|
+
else if (cs.is_skip_last())
|
42
|
+
info |= kCGImageAlphaNoneSkipLast;
|
43
|
+
else
|
44
|
+
info |= kCGImageAlphaNone;
|
45
|
+
|
46
|
+
if (cs.is_rgb()) info |= kCGBitmapByteOrder32Big;
|
47
|
+
else if (cs.is_bgr()) info |= kCGBitmapByteOrder32Little;
|
48
|
+
else return false;
|
49
|
+
|
50
|
+
if (cs.is_float()) info |= kCGBitmapFloatComponents;
|
51
|
+
|
52
|
+
return info;
|
53
|
+
}
|
54
|
+
|
55
|
+
|
56
|
+
struct Bitmap::Data
|
57
|
+
{
|
58
|
+
|
59
|
+
int width, height;
|
60
|
+
|
61
|
+
ColorSpace color_space;
|
62
|
+
|
63
|
+
void* pixels;
|
64
|
+
|
65
|
+
CGContextRef context;
|
66
|
+
|
67
|
+
bool dirty;
|
68
|
+
|
69
|
+
Data ()
|
70
|
+
: pixels(NULL), context(NULL)
|
71
|
+
{
|
72
|
+
clear();
|
73
|
+
}
|
74
|
+
|
75
|
+
~Data ()
|
76
|
+
{
|
77
|
+
clear();
|
78
|
+
}
|
79
|
+
|
80
|
+
CGContextRef get_context ()
|
81
|
+
{
|
82
|
+
if (context) return context;
|
83
|
+
|
84
|
+
int bpc = color_space.bpc();
|
85
|
+
int pitch = width * color_space.Bpp();
|
86
|
+
if (bpc <= 0 || pitch <= 0) return NULL;
|
87
|
+
|
88
|
+
CGColorSpaceRef cgcs = NULL;
|
89
|
+
if (color_space.is_gray())
|
90
|
+
cgcs = CGColorSpaceCreateDeviceGray();
|
91
|
+
else if (color_space.is_rgb() || color_space.is_bgr())
|
92
|
+
cgcs = CGColorSpaceCreateDeviceRGB();
|
93
|
+
else
|
94
|
+
return NULL;
|
95
|
+
|
96
|
+
context = CGBitmapContextCreate(
|
97
|
+
pixels, width, height, bpc, pitch, cgcs, make_bitmapinfo(color_space));
|
98
|
+
CGColorSpaceRelease(cgcs);
|
99
|
+
return context;
|
100
|
+
}
|
101
|
+
|
102
|
+
CGImageRef get_image ()
|
103
|
+
{
|
104
|
+
CGContextRef c = get_context();
|
105
|
+
if (!c) return NULL;
|
106
|
+
return CGBitmapContextCreateImage(c);
|
107
|
+
}
|
108
|
+
|
109
|
+
void clear ()
|
110
|
+
{
|
111
|
+
if (context) CGContextRelease(context);
|
112
|
+
if (pixels) delete [] (uchar*) pixels;
|
113
|
+
|
114
|
+
width = height = 0;
|
115
|
+
color_space = COLORSPACE_UNKNOWN;
|
116
|
+
pixels = NULL;
|
117
|
+
context = NULL;
|
118
|
+
dirty = false;
|
119
|
+
}
|
120
|
+
|
121
|
+
};// Bitmap::Data
|
122
|
+
|
123
|
+
|
124
|
+
static void
|
125
|
+
setup_bitmap (
|
126
|
+
Bitmap* this_,
|
127
|
+
int w, int h, const ColorSpace& cs,
|
128
|
+
const void* pixels_ = NULL, bool clear_pixels = true)
|
129
|
+
{
|
130
|
+
if (!this_ || w <= 0 || h <= 0 || !cs)
|
131
|
+
argument_error(__FILE__, __LINE__);
|
132
|
+
|
133
|
+
this_->self->clear();
|
134
|
+
|
135
|
+
this_->self->width = w;
|
136
|
+
this_->self->height = h;
|
137
|
+
this_->self->color_space = cs;
|
138
|
+
this_->self->dirty = true;
|
139
|
+
|
140
|
+
size_t size = w * h * cs.Bpp();
|
141
|
+
this_->self->pixels = new uchar[size];
|
142
|
+
|
143
|
+
if (pixels_)
|
144
|
+
memcpy(this_->self->pixels, pixels_, size);
|
145
|
+
else if (clear_pixels)
|
146
|
+
memset(this_->self->pixels, 0, size);
|
147
|
+
}
|
148
|
+
|
149
|
+
static void
|
150
|
+
setup_bitmap (Bitmap* this_, const Texture& tex)
|
151
|
+
{
|
152
|
+
if (!this_ || !tex)
|
153
|
+
argument_error(__FILE__, __LINE__);
|
154
|
+
|
155
|
+
setup_bitmap(this_, tex.width(), tex.height(), tex.color_space(), NULL, false);
|
156
|
+
|
157
|
+
GLenum format, type;
|
158
|
+
tex.color_space().get_gl_enums(&format, &type, tex.alpha_only());
|
159
|
+
|
160
|
+
FrameBuffer fb(tex);
|
161
|
+
FrameBufferBinder binder(fb.id());
|
162
|
+
|
163
|
+
for (int y = 0; y < this_->height(); ++y)
|
164
|
+
glReadPixels(0, y, this_->width(), 1, format, type, (GLvoid*) this_->at<uchar>(0, y));
|
165
|
+
}
|
166
|
+
|
167
|
+
|
168
|
+
Bitmap::Bitmap ()
|
169
|
+
{
|
170
|
+
}
|
171
|
+
|
172
|
+
Bitmap::Bitmap (
|
173
|
+
int width, int height, const ColorSpace& color_space, const void* pixels)
|
174
|
+
{
|
175
|
+
setup_bitmap(this, width, height, color_space, pixels);
|
176
|
+
}
|
177
|
+
|
178
|
+
Bitmap::Bitmap (const Texture& texture)
|
179
|
+
{
|
180
|
+
setup_bitmap(this, texture);
|
181
|
+
}
|
182
|
+
|
183
|
+
Bitmap::~Bitmap ()
|
184
|
+
{
|
185
|
+
}
|
186
|
+
|
187
|
+
Bitmap
|
188
|
+
Bitmap::copy () const
|
189
|
+
{
|
190
|
+
return Bitmap(width(), height(), color_space(), pixels());
|
191
|
+
}
|
192
|
+
|
193
|
+
int
|
194
|
+
Bitmap::width () const
|
195
|
+
{
|
196
|
+
if (!*this) return 0;
|
197
|
+
return self->width;
|
198
|
+
}
|
199
|
+
|
200
|
+
int
|
201
|
+
Bitmap::height () const
|
202
|
+
{
|
203
|
+
if (!*this) return 0;
|
204
|
+
return self->height;
|
205
|
+
}
|
206
|
+
|
207
|
+
const ColorSpace&
|
208
|
+
Bitmap::color_space () const
|
209
|
+
{
|
210
|
+
if (!*this)
|
211
|
+
{
|
212
|
+
static const ColorSpace UNKNOWN = COLORSPACE_UNKNOWN;
|
213
|
+
return UNKNOWN;
|
214
|
+
}
|
215
|
+
return self->color_space;
|
216
|
+
}
|
217
|
+
|
218
|
+
int
|
219
|
+
Bitmap::pitch () const
|
220
|
+
{
|
221
|
+
return width() * self->color_space.Bpp();
|
222
|
+
}
|
223
|
+
|
224
|
+
size_t
|
225
|
+
Bitmap::size () const
|
226
|
+
{
|
227
|
+
return pitch() * height();
|
228
|
+
}
|
229
|
+
|
230
|
+
void*
|
231
|
+
Bitmap::pixels ()
|
232
|
+
{
|
233
|
+
if (!*this) return NULL;
|
234
|
+
return self->pixels;
|
235
|
+
}
|
236
|
+
|
237
|
+
const void*
|
238
|
+
Bitmap::pixels () const
|
239
|
+
{
|
240
|
+
return const_cast<This*>(this)->pixels();
|
241
|
+
}
|
242
|
+
|
243
|
+
bool
|
244
|
+
Bitmap::dirty () const
|
245
|
+
{
|
246
|
+
return self->dirty;
|
247
|
+
}
|
248
|
+
|
249
|
+
void
|
250
|
+
Bitmap::set_dirty (bool b)
|
251
|
+
{
|
252
|
+
self->dirty = b;
|
253
|
+
}
|
254
|
+
|
255
|
+
Bitmap::operator bool () const
|
256
|
+
{
|
257
|
+
return
|
258
|
+
self->width > 0 && self->height > 0 && self->color_space && self->pixels;
|
259
|
+
}
|
260
|
+
|
261
|
+
bool
|
262
|
+
Bitmap::operator ! () const
|
263
|
+
{
|
264
|
+
return !operator bool();
|
265
|
+
}
|
266
|
+
|
267
|
+
|
268
|
+
Bitmap
|
269
|
+
load_bitmap (const char* path_)
|
270
|
+
{
|
271
|
+
if (!path_ || path_[0] == '\0')
|
272
|
+
argument_error(__FILE__, __LINE__);
|
273
|
+
|
274
|
+
NSString* path = [NSString stringWithUTF8String: path_];
|
275
|
+
UIImage* uiimage = [UIImage imageWithContentsOfFile: path];
|
276
|
+
if (!uiimage)
|
277
|
+
rays_error(__FILE__, __LINE__, "[UIImage imageWithContentsOfFile:] failed.");
|
278
|
+
|
279
|
+
CGImageRef image = [uiimage CGImage];
|
280
|
+
if (!image)
|
281
|
+
rays_error(__FILE__, __LINE__, "[imagerep CGImage] failed.");
|
282
|
+
|
283
|
+
size_t width = CGImageGetWidth(image);
|
284
|
+
size_t height = CGImageGetHeight(image);
|
285
|
+
|
286
|
+
Bitmap bmp((int) width, (int) height, RGBA);
|
287
|
+
if (!bmp)
|
288
|
+
rays_error(__FILE__, __LINE__, "invalid bitmap.");
|
289
|
+
|
290
|
+
CGContextRef context = bmp.self->get_context();
|
291
|
+
if (!context)
|
292
|
+
rays_error(__FILE__, __LINE__, "creating CGContext failed.");
|
293
|
+
|
294
|
+
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
|
295
|
+
return bmp;
|
296
|
+
}
|
297
|
+
|
298
|
+
void
|
299
|
+
save_bitmap (const Bitmap& bmp, const char* path_)
|
300
|
+
{
|
301
|
+
boost::shared_ptr<CGImage> img(
|
302
|
+
bmp.self->get_image(), CGImageRelease);
|
303
|
+
if (!img)
|
304
|
+
rays_error(__FILE__, __LINE__, "getting CGImage failed.");
|
305
|
+
|
306
|
+
NSString* path = [NSString stringWithUTF8String: path_];
|
307
|
+
NSURL* url = [NSURL fileURLWithPath: path];
|
308
|
+
if (!url)
|
309
|
+
rays_error(__FILE__, __LINE__, "creating NSURL failed.");
|
310
|
+
|
311
|
+
boost::shared_ptr<CGImageDestination> dest(
|
312
|
+
CGImageDestinationCreateWithURL((CFURLRef) url, kUTTypePNG, 1, NULL),
|
313
|
+
safe_cfrelease);
|
314
|
+
if (!dest)
|
315
|
+
rays_error(__FILE__, __LINE__, "CGImageDestinationCreateWithURL() failed.");
|
316
|
+
|
317
|
+
CGImageDestinationAddImage(dest.get(), img.get(), NULL);
|
318
|
+
if (!CGImageDestinationFinalize(dest.get()))
|
319
|
+
rays_error(__FILE__, __LINE__, "CGImageDestinationFinalize() failed.");
|
320
|
+
}
|
321
|
+
|
322
|
+
|
323
|
+
void draw_string (
|
324
|
+
CGContextRef, coord, const char*, coord, coord, const Font&);
|
325
|
+
|
326
|
+
void
|
327
|
+
draw_string (
|
328
|
+
Bitmap* bmp, const char* str, coord x, coord y, const Font& font)
|
329
|
+
{
|
330
|
+
if (!bmp || !*bmp || !str || !font)
|
331
|
+
argument_error(__FILE__, __LINE__);
|
332
|
+
|
333
|
+
if (*str == '\0') return;
|
334
|
+
|
335
|
+
draw_string(bmp->self->get_context(), bmp->height(), str, x, y, font);
|
336
|
+
bmp->set_dirty();
|
337
|
+
}
|
338
|
+
|
339
|
+
|
340
|
+
}// Rays
|
data/src/ios/font.mm
ADDED
@@ -0,0 +1,206 @@
|
|
1
|
+
// -*- objc -*-
|
2
|
+
#include "rays/font.h"
|
3
|
+
|
4
|
+
|
5
|
+
#import <CoreText/CoreText.h>
|
6
|
+
#include "rays/exception.h"
|
7
|
+
#include "helper.h"
|
8
|
+
|
9
|
+
|
10
|
+
namespace Rays
|
11
|
+
{
|
12
|
+
|
13
|
+
|
14
|
+
struct Font::Data
|
15
|
+
{
|
16
|
+
|
17
|
+
CTFontRef font;
|
18
|
+
|
19
|
+
Data ()
|
20
|
+
: font(NULL)
|
21
|
+
{
|
22
|
+
}
|
23
|
+
|
24
|
+
~Data ()
|
25
|
+
{
|
26
|
+
if (font)
|
27
|
+
{
|
28
|
+
CFRelease(font);
|
29
|
+
font = NULL;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
};// Font::Data
|
34
|
+
|
35
|
+
|
36
|
+
static CTLineRef
|
37
|
+
make_line (CTFontRef font, const char* str)
|
38
|
+
{
|
39
|
+
if (!font || !str || *str == '\0')
|
40
|
+
return NULL;
|
41
|
+
|
42
|
+
CFStringRef keys[] = {
|
43
|
+
kCTFontAttributeName,
|
44
|
+
kCTForegroundColorFromContextAttributeName
|
45
|
+
};
|
46
|
+
CFTypeRef values[] = {
|
47
|
+
font,
|
48
|
+
kCFBooleanTrue
|
49
|
+
};
|
50
|
+
size_t nkeys = sizeof(keys) / sizeof(keys[0]);
|
51
|
+
|
52
|
+
CFDictionaryRef attr = CFDictionaryCreate(
|
53
|
+
NULL, (const void**) &keys, (const void**) &values, nkeys,
|
54
|
+
&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
|
55
|
+
|
56
|
+
CFAttributedStringRef attrstr = CFAttributedStringCreate(
|
57
|
+
NULL, cfstring(str).get(), attr);
|
58
|
+
CFRelease(attr);
|
59
|
+
|
60
|
+
CTLineRef line = CTLineCreateWithAttributedString(attrstr);
|
61
|
+
CFRelease(attrstr);
|
62
|
+
|
63
|
+
return line;
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
Font::Font ()
|
68
|
+
{
|
69
|
+
}
|
70
|
+
|
71
|
+
Font::Font (const char* name, coord size)
|
72
|
+
{
|
73
|
+
self->font = name
|
74
|
+
? CTFontCreateWithName(cfstring(name).get(), size, NULL)
|
75
|
+
: CTFontCreateUIFontForLanguage(kCTFontSystemFontType, size, NULL);
|
76
|
+
}
|
77
|
+
|
78
|
+
Font::~Font ()
|
79
|
+
{
|
80
|
+
}
|
81
|
+
|
82
|
+
Font
|
83
|
+
Font::copy () const
|
84
|
+
{
|
85
|
+
return Font(name(), size());
|
86
|
+
}
|
87
|
+
|
88
|
+
String
|
89
|
+
Font::name () const
|
90
|
+
{
|
91
|
+
if (!*this) return "";
|
92
|
+
|
93
|
+
CFStringRef str = CTFontCopyFullName(self->font);
|
94
|
+
|
95
|
+
enum {BUFSIZE = 2048};
|
96
|
+
char buf[BUFSIZE + 1];
|
97
|
+
if (!CFStringGetCString(str, buf, BUFSIZE, kCFStringEncodingUTF8))
|
98
|
+
buf[0] = '\0';
|
99
|
+
|
100
|
+
CFRelease(str);
|
101
|
+
return buf;
|
102
|
+
}
|
103
|
+
|
104
|
+
coord
|
105
|
+
Font::size () const
|
106
|
+
{
|
107
|
+
if (!*this) return 0;
|
108
|
+
return CTFontGetSize(self->font);
|
109
|
+
}
|
110
|
+
|
111
|
+
coord
|
112
|
+
Font::get_width (const char* str) const
|
113
|
+
{
|
114
|
+
if (!str)
|
115
|
+
argument_error(__FILE__, __LINE__);
|
116
|
+
|
117
|
+
if (!*this)
|
118
|
+
invalid_state_error(__FILE__, __LINE__);
|
119
|
+
|
120
|
+
if (*str == '\0') return 0;
|
121
|
+
|
122
|
+
CTLineRef line = make_line(self->font, str);
|
123
|
+
if (!line)
|
124
|
+
rays_error(__FILE__, __LINE__, "creating CTLineRef failed.");
|
125
|
+
|
126
|
+
coord w = CTLineGetTypographicBounds(line, NULL, NULL, NULL);
|
127
|
+
CFRelease(line);
|
128
|
+
|
129
|
+
return w;
|
130
|
+
}
|
131
|
+
|
132
|
+
coord
|
133
|
+
Font::get_height (coord* ascent, coord* descent, coord* leading) const
|
134
|
+
{
|
135
|
+
if (!*this)
|
136
|
+
invalid_state_error(__FILE__, __LINE__);
|
137
|
+
|
138
|
+
CGFloat asc = CTFontGetAscent(self->font);
|
139
|
+
CGFloat desc = CTFontGetDescent(self->font);
|
140
|
+
CGFloat lead = CTFontGetLeading(self->font);
|
141
|
+
|
142
|
+
if (ascent) *ascent = asc;
|
143
|
+
if (descent) *descent = desc;
|
144
|
+
if (leading) *leading = lead;
|
145
|
+
|
146
|
+
return asc + desc + lead;
|
147
|
+
}
|
148
|
+
|
149
|
+
Font::operator bool () const
|
150
|
+
{
|
151
|
+
return !!self->font;
|
152
|
+
}
|
153
|
+
|
154
|
+
bool
|
155
|
+
Font::operator ! () const
|
156
|
+
{
|
157
|
+
return !operator bool();
|
158
|
+
}
|
159
|
+
|
160
|
+
|
161
|
+
const Font&
|
162
|
+
default_font ()
|
163
|
+
{
|
164
|
+
static const Font FONT(NULL);
|
165
|
+
return FONT;
|
166
|
+
}
|
167
|
+
|
168
|
+
|
169
|
+
void
|
170
|
+
draw_string (
|
171
|
+
CGContextRef context, coord context_height,
|
172
|
+
const char* str, coord x, coord y, const Font& font)
|
173
|
+
{
|
174
|
+
if (!context || !str || !font)
|
175
|
+
argument_error(__FILE__, __LINE__);
|
176
|
+
|
177
|
+
if (*str == '\0') return;
|
178
|
+
|
179
|
+
CTLineRef line = make_line(font.self->font, str);
|
180
|
+
if (!line)
|
181
|
+
rays_error(__FILE__, __LINE__, "creating CTLineRef failed.");
|
182
|
+
|
183
|
+
coord width = 0, height = 0, ascent = 0;
|
184
|
+
width = font.get_width(str);
|
185
|
+
height = font.get_height(&ascent);
|
186
|
+
|
187
|
+
height = ceil(height);
|
188
|
+
ascent = floor(ascent);
|
189
|
+
|
190
|
+
CGRect rect = CGRectMake(x, context_height - height - y, width, height);
|
191
|
+
CGContextClearRect(context, rect);
|
192
|
+
//CGContextSetRGBFillColor(context, 0, 0, 0, 1);
|
193
|
+
//CGContextFillRect(context, rect);
|
194
|
+
CGContextSetRGBFillColor(context, 1, 1, 1, 1);
|
195
|
+
|
196
|
+
CGContextSaveGState(context);
|
197
|
+
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
|
198
|
+
CGContextSetTextPosition(context, x, context_height - ascent - y);
|
199
|
+
CTLineDraw(line, context);
|
200
|
+
CGContextRestoreGState(context);
|
201
|
+
|
202
|
+
CFRelease(line);
|
203
|
+
}
|
204
|
+
|
205
|
+
|
206
|
+
}// Rays
|
data/src/{cocoa → ios}/helper.h
RENAMED
data/src/{cocoa → ios}/helper.mm
RENAMED
File without changes
|
data/src/ios/opengl.mm
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
// -*- objc -*-
|
2
|
+
#include "rays/opengl.h"
|
3
|
+
|
4
|
+
|
5
|
+
#include <vector>
|
6
|
+
#import <OpenGLES/EAGL.h>
|
7
|
+
|
8
|
+
|
9
|
+
namespace Rays
|
10
|
+
{
|
11
|
+
|
12
|
+
|
13
|
+
void
|
14
|
+
init_offscreen_context ()
|
15
|
+
{
|
16
|
+
EAGLContext* c = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES1];
|
17
|
+
[EAGLContext setCurrentContext: c];
|
18
|
+
}
|
19
|
+
|
20
|
+
|
21
|
+
}// Rays
|
data/src/ios/program.cpp
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
#include "program.h"
|
2
|
+
|
3
|
+
|
4
|
+
#include "rays/exception.h"
|
5
|
+
|
6
|
+
|
7
|
+
namespace Rays
|
8
|
+
{
|
9
|
+
|
10
|
+
|
11
|
+
struct Program::Data {};
|
12
|
+
|
13
|
+
|
14
|
+
Program::Program ()
|
15
|
+
{
|
16
|
+
}
|
17
|
+
|
18
|
+
Program::~Program ()
|
19
|
+
{
|
20
|
+
}
|
21
|
+
|
22
|
+
void
|
23
|
+
Program::attach (const Shader& shader)
|
24
|
+
{
|
25
|
+
not_implemented_error(__FILE__, __LINE__);
|
26
|
+
}
|
27
|
+
|
28
|
+
void
|
29
|
+
Program::detach (const Shader& shader)
|
30
|
+
{
|
31
|
+
not_implemented_error(__FILE__, __LINE__);
|
32
|
+
}
|
33
|
+
|
34
|
+
void
|
35
|
+
Program::set_uniform (const char* name, int arg1)
|
36
|
+
{
|
37
|
+
not_implemented_error(__FILE__, __LINE__);
|
38
|
+
}
|
39
|
+
|
40
|
+
void
|
41
|
+
Program::set_uniform (const char* name, int arg1, int arg2)
|
42
|
+
{
|
43
|
+
not_implemented_error(__FILE__, __LINE__);
|
44
|
+
}
|
45
|
+
|
46
|
+
void
|
47
|
+
Program::set_uniform (const char* name, int arg1, int arg2, int arg3)
|
48
|
+
{
|
49
|
+
not_implemented_error(__FILE__, __LINE__);
|
50
|
+
}
|
51
|
+
|
52
|
+
void
|
53
|
+
Program::set_uniform (const char* name, int arg1, int arg2, int arg3, int arg4)
|
54
|
+
{
|
55
|
+
not_implemented_error(__FILE__, __LINE__);
|
56
|
+
}
|
57
|
+
|
58
|
+
void
|
59
|
+
Program::set_uniform (const char* name, const int* args, size_t size)
|
60
|
+
{
|
61
|
+
not_implemented_error(__FILE__, __LINE__);
|
62
|
+
}
|
63
|
+
|
64
|
+
void
|
65
|
+
Program::set_uniform (const char* name, float arg1)
|
66
|
+
{
|
67
|
+
not_implemented_error(__FILE__, __LINE__);
|
68
|
+
}
|
69
|
+
|
70
|
+
void
|
71
|
+
Program::set_uniform (const char* name, float arg1, float arg2)
|
72
|
+
{
|
73
|
+
not_implemented_error(__FILE__, __LINE__);
|
74
|
+
}
|
75
|
+
|
76
|
+
void
|
77
|
+
Program::set_uniform (const char* name, float arg1, float arg2, float arg3)
|
78
|
+
{
|
79
|
+
not_implemented_error(__FILE__, __LINE__);
|
80
|
+
}
|
81
|
+
|
82
|
+
void
|
83
|
+
Program::set_uniform (const char* name, float arg1, float arg2, float arg3, float arg4)
|
84
|
+
{
|
85
|
+
not_implemented_error(__FILE__, __LINE__);
|
86
|
+
}
|
87
|
+
|
88
|
+
void
|
89
|
+
Program::set_uniform (const char* name, const float* args, size_t size)
|
90
|
+
{
|
91
|
+
not_implemented_error(__FILE__, __LINE__);
|
92
|
+
}
|
93
|
+
|
94
|
+
void
|
95
|
+
Program::push ()
|
96
|
+
{
|
97
|
+
}
|
98
|
+
|
99
|
+
void
|
100
|
+
Program::pop ()
|
101
|
+
{
|
102
|
+
}
|
103
|
+
|
104
|
+
GLuint
|
105
|
+
Program::id () const
|
106
|
+
{
|
107
|
+
return 0;
|
108
|
+
}
|
109
|
+
|
110
|
+
Program::operator bool () const
|
111
|
+
{
|
112
|
+
return false;
|
113
|
+
}
|
114
|
+
|
115
|
+
bool
|
116
|
+
Program::operator ! () const
|
117
|
+
{
|
118
|
+
return !operator bool();
|
119
|
+
}
|
120
|
+
|
121
|
+
|
122
|
+
}// Rays
|