The Best Photographer in Shanghai (杨学友)
On the 8th we had our wedding photos taken, which I will describe in more detail in a later post.
Right now I just wanted to tell the world that 杨学友 (yáng xué yǒu – Mr. Yang of Paris Bride) is one superb photographer.
He took 340 photos over the course of the day, and they were all so good that it took us over 5 hours to select the 29 we would keep.
5 hours.
Well done Mr. Yang, and thank you!
Like this post? Move it on along with:
Email |
delicious |
Digg |
Tweet |
Reddit |
Newsvine |
Furl |
Google |
Stumble |
HaoHao
| Trackback: |
Scroll to post title
Rotate NSImage in an NSImageView
I didn’t want to half-implement the new tab feature in Slider – I want people to have almost as much control as if they were coding the site by hand.
This has meant I’ve had to rethink Slider’s UI many times, and I’ve had (re: couldn’t face shipping without) to implement many small features that I feel are required, from a usability standpoint.
When I decided that the user may choose to place tabs in 12 different positions, I needed to consider how this would effect the arrows and sliding animations. I came to the conclusion that if the user elects to place the tabs on the top or bottom, the arrows will be on the left and right, with the animation going right/left. If the user chooses to place tabs on the left or right, the arrows will be positioned on the top and bottom, with the animation going up/down.
Pictures make it easier:


As soon as I implemented this I realised how much of a pain it would be to copy out the arrow images, rotate them in an external program, then copy them back in. So I put some buttons next to the arrow image wells that allow the user to rotate the arrows within Slider itself.
Here is the code I used to rotate the images (thanks to Jerry Krinock and Steve Christensen and for posting this solution to the Cocoa-dev list):
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 | #import <Cocoa/Cocoa.h> @interface NSImage (Transform) /*! @brief Rotates an image around its center by a given angle in degrees and returns the new image. @details The width and height of the returned image are, respectively, the height and width of the receiver. I have not yet tested this with a non-square image. authors: Jerry Krinock and Steve Christensen */ - (NSImage*)imageRotatedByDegrees:(CGFloat)degrees ; @end #import "NSImage+Transform.h" @implementation NSImage (Transform) - (NSImage*)imageRotatedByDegrees:(CGFloat)degrees { // calculate the bounds for the rotated image NSRect imageBounds = {NSZeroPoint, [self size]}; NSBezierPath* boundsPath = [NSBezierPath bezierPathWithRect:imageBounds]; NSAffineTransform* transform = [NSAffineTransform transform]; [transform rotateByDegrees:degrees]; [boundsPath transformUsingAffineTransform:transform]; NSRect rotatedBounds = {NSZeroPoint, [boundsPath bounds].size}; NSImage* rotatedImage = [[NSImage alloc] initWithSize:rotatedBounds.size]; // center the image within the rotated bounds imageBounds.origin.x = NSMidX(rotatedBounds) - (NSWidth (imageBounds) / 2); imageBounds.origin.y = NSMidY(rotatedBounds) - (NSHeight (imageBounds) / 2); // set up the rotation transform transform = [NSAffineTransform transform]; [transform translateXBy:+(NSWidth(rotatedBounds) / 2) yBy:+ (NSHeight(rotatedBounds) / 2)]; [transform rotateByDegrees:degrees]; [transform translateXBy:-(NSWidth(rotatedBounds) / 2) yBy:- (NSHeight(rotatedBounds) / 2)]; // draw the original image, rotated, into the new image [rotatedImage lockFocus]; [transform concat]; [self drawInRect:imageBounds fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0] ; [rotatedImage unlockFocus]; return [rotatedImage autorelease]; } @end |
I had to change (from/to):
NSImage* rotatedImage = [[[NSImage alloc] initWithSize:rotatedBounds.size] autorelease];
NSImage* rotatedImage = [[NSImage alloc] initWithSize:rotatedBounds.size];
return rotatedImage;return [rotatedImage autorelease];
[transform set];
[transform concat];
For it to work flawlessly with Slider.
Thanks guys!
Like this post? Move it on along with:
Email |
delicious |
Digg |
Tweet |
Reddit |
Newsvine |
Furl |
Google |
Stumble |
HaoHao
| Trackback: |
Scroll to post title
Drag and Drop Reordering of NSTableView’s Rows
Scroll to comments
I just had to re-implement drag-and-drop-reordering of Slider cells. I was lucky enough to find my post on the Cocoa-dev list – I just had to copy-paste the code.
#define MyPrivateTableViewDataType @”NSMutableDictionary”
- (void)awakeFromNib {
[table registerForDraggedTypes:[NSArray arrayWithObject:MyPrivateTableViewDataType]];
}
- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexestoPasteboard:(NSPasteboard*)pboard{
// Copy the row numbers to the pasteboard.
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
[pboard declareTypes:[NSArray arrayWithObject:MyPrivateTableViewDataType] owner:controller];
[pboard setData:data forType:MyPrivateTableViewDataType];
return YES;
}
- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op{
// Add code here to validate the drop
NSLog(@”validate Drop”);
return NSDragOperationEvery;
}
- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id )info row:(int)to dropOperation:(NSTableViewDropOperation)operation{
//this is the code that handles dnd ordering – my table doesn’t need to accept [...] Continue Reading…
Eclipse Negative Colour Scheme
Scroll to comments
Moving from XCode to Eclipse, I miss the simplicity of switching colour schemes in XCode. My eyes have become accustomed to light text on black, and the reverse shocks them.
After some googling I found this eclipse negative colour scheme preferences file: Inkpot. If you don’t like that one, there are more at the Eclipse Colour Scheme page.
Prepare your eyes for a feast, for I have included a screenshot of Inkpot below:
Ooooooh yeeeeeaaaah.....
Slider Update – Tab Feature Coming Together
Scroll to comments
As I finally reached a programming goal I had set – the tab hover javascript was working fairly well – I realised that users would want the option of positioning the tabs in the middle or corners of Slider’s four sides. Initially I had assumed it would be OK for users to have tabs positioned only in the center of either of the four sides.
Great, I thought. This shouldn’t be too bad – just increase the number of radio buttons available and position the tabs accordingly.
Four hours later, I “achieve” a build of Slider that exports [...] Continue Reading…
How to Prevent Noisy NSBitmapImageReps
Scroll to comments
Images generated for Slider’s background and tabs contained a lot of noise – random ugly pixels throughout the images.
I was unsure why this was happening, so I asked the Cocoa-Dev mailing list.
Rob Keniger kindly replied with the following solution:
“An NSBitmapImageRep is not guaranteed to be empty when you create it and in general it’s just full of random bits. You need to clear it explicitly if you are drawing non-opaque content”
He included the following snippet that solved my problem nicely:
- (void) clearBitmapImageRep:(NSBitmapImageRep *)bitmap {
unsigned char* bitmapData = [bitmap bitmapData];
if (bitmapData [...] Continue Reading…
The Mutations of Slider’s Tab Option Pane
Scroll to comments
During the past week, I’ve been working on Slider’s new Tab option pane.
I took screen shots before making changes to the layout.
Here they are:
I hope I’m not tempted to change things around again… I really need to get the backend going now!
en.grand-piano.org Comment Spam!
Scroll to comments
What are spam comments?
From Wikipedia:
Spam in blogs (also called simply blog spam or comment spam) is a form of spamdexing. It is done by automatically posting random comments or promoting commercial services to blogs, wikis, guestbooks, or other publicly accessible online discussion boards. Any web application that accepts and displays hyperlinks submitted by visitors may be a target.
Adding links that point to the spammer’s web site artificially increases the site’s search engine ranking. An increased ranking often results in the spammer’s commercial site being listed ahead of other sites for certain searches, increasing the number of potential [...] Continue Reading…
Accessing Primitives From NSDictionarys in Cocoa…
Scroll to comments
This “gotcha” had me scratching my head for a little while.
Edit: this “gotcha” stemmed more from my inexperience with Cocoa than anything else. NSDictionaries store only objects, one shouldn’t try to insert int/float/bool etc into one. Instead use NSNumber for these values. Duh.
When storing various NSObjects in an NSMutableDictionary, I assumed one would access (in this case the object being stored is an NSColor) them like:
[[dictionary objectForKey:idle_TabBorderAllColourKey] color]
I also assumed that one would access “int”, “float” and other primitives like:
[dictionary objectForKey:idle_TabBorderAllWidthKey]
After writing, compiling and attempting run my code, however, I discovered that I was wrong.
It should [...] Continue Reading…
Coder’s Quotes #1: Ted Nelson
Scroll to comments
“Any fool can use a computer. Many do.”
– Ted Nelson
This is true. Keep fools in mind when designing software anything.
One should always be wary of creating convoluted workflows, confusing UI layouts and unexpected behaviours when coding. Software exhibiting these qualities drives away not only the fools, but discerning, classy users as well. Smart people like ease-of-use as well!
When designing for others, try to do exactly that: design for others. Avoid falling into the trap of thinking that others will understand your application and it’s behaviour as well [...] Continue Reading…
Slider Progress: Slider Styling Option Pane
Scroll to comments
During the great rewrite, I’ve been trying to focus on one section at a time. The first section to come under attack was “everything pertaining to the styling of Slider that is not Arrow-related”. After much mucking-about I decided to combine the Border, Rounded Corner, Background Image, Gradient and Background Colour onto one Pane.
I don’t know why I didn’t do this before, it is obvious and really the only logical way to present these controls – enabling some may disable others, it was confusing and clumsy when they were on different tabs.
Now users will be able [...] Continue Reading…
Return an NSMutableString as NSString Avoiding “Uncaught Error 11″ with Cocoa
Scroll to comments
Another stumbling block on the road to Slider completion was this:
NSUncaughtSystemExceptionException — Uncaught system exception: signal 11
This vague and unhelpful error message (in this case) was caused by my trying to return an NSMutableString in place of an NSString:
- (NSString *)generateHTML{
NSMutableString *html = [NSMutableString string];
@try{
//Begin wrapper
[html appendString:[NSString stringWithFormat:@"",
UID, (int)portalSize.height, (int)portalSize.width, leftMargin, [self generateBGCSS]]];
//Begin other content
[html appendString:[self someYetToBeWrittenFunction]];
//Close wrapper
[html appendString:@""];
}
@catch (NSException *e) {
NSLog(@”generateHTML: %@”, e);
}
return html;
}
Googling resulted in this solution, from the Cocoa Dev Archives (which have saved me from suicide more times than I can count).
The successful code is:
- (NSString *)generateHTML{
NSMutableString *html = [NSMutableString string];
@try{
//Begin wrapper
[html appendString:[NSString [...] Continue Reading…
Lesson #1: InvalidDnDOperationException Ruins Sanity
Scroll to comments
A friend with whom I am currently working on a programming contract called me today to tell me that the latest build wasn’t working. At all.
This irritated and confused me, as I hadn’t worked on that particular project for a week or so, and couldn’t remember having any issues with it.
I booted into Windows (I use Linux mostly), downloaded Eclipse and imported the project.
Sure enough:
java.awt.dnd.InvalidDnDOperationException: Drag and drop in progress
at sun.awt.dnd.SunDragSourceContextPeer.setDragDropInProgress(Unknown Source)
at java.awt.dnd.DragSource.startDrag(Unknown Source)
This error had attacked me before, but a quick investigation revealed that the issue was different this time. Joyous news.
I poked about in the [...] Continue Reading…
Tile an NSImage Within an NSBezierPath
Scroll to comments
Another snippet I had to write during the great Slider rebuild.
I needed to be able to take an NSImage supplied by the user and tile it within an NSBezierPath defined by more user-set values.
The below example uses a rounded rectangle.
NSBitmapImageRep *theImage = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:imageSize.width pixelsHigh:imageSize.height
bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace bytesPerRow:0 bitsPerPixel:0];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:theImage]];
//bgImage can be any NSImage
NSColor *c = [NSColor colorWithPatternImage:bgImage];
[c set];
[path appendBezierPathWithRoundedRect:NSMakeRect(0, 0, imageSize.width, imageSize.height) xRadius:10.0 yRadius:10.0];
[path fill];
[NSGraphicsContext restoreGraphicsState];
Fill a Path With A Scaled Image, Ignoring Image Proportions
Scroll to comments
While continuing to rebuild Slider’s background image features, I was forced to rewrite the code that scales an image up/down to Slider’s portal size, ignoring the image’s original proportions. The image also had to be painted within a path, as Slider may have differently shaped corners compared to the image to be scaled.
The below code accomplishes the scaling and painting of the image.
//theImage = the resulting image, that will have a scaled (proportions ignored) version of “bgImage” painted onto it
NSBitmapImageRep *theImage = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:imageSize.width pixelsHigh:imageSize.height
bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace bytesPerRow:0 bitsPerPixel:0];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext [...] Continue Reading…

























Recent Comments
Great Wall
LinkedIn
Thu, 14 Jan 2010 12:54:50 +0000
Tag Cloud
LinkedIn
Thu, 14 Jan 2010 12:54:50 +0000
The Best Photographer In Shanghai
When we pick them up :( Don't know when that will be yet!
Chose another 49 today
Wed, 13 Jan 2010 14:13:21 +0000
The Best Photographer In Shanghai
When do we get to see them!!!!!
Tue, 12 Jan 2010 19:08:51 +0000
Installing Jdownloader In Ubuntu
Thank You!!!!
It works like a charm!!!!!!!!!!!!
Tue, 05 Jan 2010 13:02:35 +0000
Arrived In Shanghai
Done, look left!
Sun, 03 Jan 2010 15:37:03 +0000