Changes in trunk/MacFaceLibrary/FaceDef.cs [19:30]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MacFaceLibrary/FaceDef.cs
r19 r30 18 18 public class FaceDef 19 19 { 20 // p^[XC[gID 20 21 public enum PatternSuite 21 22 { … … 25 26 } 26 27 28 public const int PatternCount = 11; 29 public const int ImageWidth = 128; 30 public const int ImageHeight = 128; 31 32 // }[J[ 27 33 public const int MarkerNone = 0x00; 28 34 public const int MarkerPageIn = 0x01; 29 35 public const int MarkerPageOut = 0x02; 30 36 37 // çp^[è`vpeBXgt@C¼ 31 38 private const string FaceDefName = "faceDef.plist"; 32 private const int PatternCols = 11; 33 private const int PatternRows = 3; 34 private const int ImageWidth = 128; 35 private const int ImageHeight = 128; 36 39 40 // çp^[è`ÌL[¼Ì 41 private const string KeyInfoTitle = "title"; 42 private const string KeyInfoAuthor = "author"; 43 private const string KeyInfoVersion = "version"; 44 private const string KeyInfoSiteURL = "web site"; 45 46 private const string KeyDefParts = "parts"; 47 private const string KeyDefPatterns = "pattern"; 48 private const string KeyDefMarkers = "markers"; 49 private const string KeyDefTitlePattern = "title pattern"; 50 51 private const string KeyPartImage = "filename"; 52 private const string KeyPartPosX = "pos x"; 53 private const string KeyPartPosY = "pos y"; 54 55 // 37 56 private string _path; 38 57 private string _title; … … 58 77 // îñ 59 78 _path = path; 60 _title = (def.ContainsKey("title") ? def["title"] as string : String.Empty);61 _author = (def.ContainsKey("author") ? def["author"] as string : String.Empty);62 _version = (def.ContainsKey("version") ? def["version"] as string : String.Empty);63 64 if (def.ContainsKey( "web site"))79 _title = ReadInfoString(def, KeyInfoTitle); 80 _author = ReadInfoString(def, KeyInfoAuthor); 81 _version = ReadInfoString(def, KeyInfoVersion); 82 83 if (def.ContainsKey(KeyInfoSiteURL)) 65 84 { 66 85 try 67 86 { 68 _webSite = new Uri(def[ "web site"] as string);87 _webSite = new Uri(def[KeyInfoSiteURL] as string); 69 88 } 70 89 catch (UriFormatException) {} … … 73 92 74 93 // p[cÌÇÝÝ 75 ArrayList partDefList = (ArrayList)def[ "parts"];94 ArrayList partDefList = (ArrayList)def[KeyDefParts]; 76 95 if (partDefList == null) 77 96 { … … 82 101 for (int i = 0; i < partDefList.Count; i++) 83 102 { 84 Hashtable partDef = (Hashtable)partDefList[i]; 85 string filename = (String)partDef["filename"]; 86 int x = (int)partDef["pos x"]; 87 int y = (int)partDef["pos y"]; 88 _parts[i] = new Part(System.IO.Path.Combine(path, filename), x, y); 89 } 103 _parts[i] = ReadPart(path, (Hashtable)partDefList[i]); 104 } 90 105 91 106 // p^[ÌÇÝÝ 92 ArrayList suiteDefList = (ArrayList)def["pattern"]; 93 _patternSuites = new Part[PatternRows][][]; 94 for (int i = 0; i < PatternRows; i++) 95 { 96 ArrayList suiteDef = (ArrayList)suiteDefList[i]; 97 Part[][] suite = new Part[PatternCols][]; 98 for (int j = 0; j < PatternCols; j++) 99 { 100 ArrayList patternDef = (ArrayList)suiteDef[j]; 101 Part[] pattern = new Part[patternDef.Count]; 102 for (int k = 0; k < patternDef.Count; k++) 103 { 104 pattern[k] = _parts[(int)patternDef[k]]; 105 } 106 suite[j] = pattern; 107 } 108 _patternSuites[i] = suite; 107 int suiteCount = PatternSuite.GetNames(typeof(PatternSuite)).Length; 108 ; 109 ArrayList suiteDefList = (ArrayList)def[KeyDefPatterns]; 110 _patternSuites = new Part[suiteCount][][]; 111 for (int i = 0; i < suiteCount; i++) 112 { 113 _patternSuites[i] = ReadPatternSuite(_parts, (ArrayList)suiteDefList[i]); 109 114 } 110 115 111 116 // }[J[ÌÇÝÝ 112 ArrayList markerDefList = (ArrayList)def[ "markers"];117 ArrayList markerDefList = (ArrayList)def[KeyDefMarkers]; 113 118 _markers = new Part[markerDefList.Count]; 114 119 for (int i = 0; i < markerDefList.Count; i++) … … 118 123 119 124 // ^Cgp^[ÌÇÝÝ 120 ArrayList titlePatternDef = (ArrayList)def["title pattern"]; 121 _titlePattern = new Part[titlePatternDef.Count]; 122 for (int i = 0; i < titlePatternDef.Count; i++) 123 { 124 _titlePattern[i] = _parts[(int)titlePatternDef[i]]; 125 } 126 } 127 128 public Uri WebSite 129 { 125 _titlePattern = ReadPattern(_parts, (ArrayList)def[KeyDefTitlePattern]); 126 } 127 128 private string ReadInfoString(Hashtable def, string key) 129 { 130 string str = def[key] as string; 131 return str != null ? str : ""; 132 } 133 134 private Part ReadPart(string path, Hashtable partDef) 135 { 136 string filename = (String)partDef[KeyPartImage]; 137 string imgPath = System.IO.Path.Combine(path, filename); 138 Image img = Image.FromFile(imgPath); 139 140 int x = (int)partDef[KeyPartPosX]; 141 int y = ImageHeight - (int)partDef[KeyPartPosY] - img.Height; 142 143 return new Part(imgPath, img, x, y); 144 } 145 146 private Part[] ReadPattern(Part[] parts, ArrayList patternDef) 147 { 148 Part[] pattern = new Part[patternDef.Count]; 149 for (int i = 0; i < patternDef.Count; i++) 150 { 151 pattern[i] = _parts[(int)patternDef[i]]; 152 } 153 return pattern; 154 } 155 156 private Part[][] ReadPatternSuite(Part[] parts, ArrayList suiteDef) 157 { 158 Part[][] suite = new Part[PatternCount][]; 159 for (int i = 0; i < PatternCount; i++) 160 { 161 suite[i] = ReadPattern(_parts, (ArrayList)suiteDef[i]); 162 } 163 return suite; 164 } 165 166 167 public string Path 168 { 169 get { return _path; } 170 } 171 172 public string Title 173 { 174 get { return _title; } 175 } 176 177 public string Author 178 { 179 get { return _author; } 180 } 181 182 public string Version 183 { 184 get { return _version; } 185 } 186 187 public Uri WebSite 188 { 130 189 get { return _webSite; } 131 190 } 132 191 133 public string /*Version*/ Version 134 { 135 get { return _version; } 136 } 137 138 public string Author 139 { 140 get { return _author; } 141 } 142 143 public string Title 144 { 145 get { return _title; } 146 } 147 148 public string Path 149 { 150 get { return _path; } 151 } 152 153 public Image TitleImage() 154 { 155 Bitmap image = new Bitmap(ImageWidth, ImageHeight); 156 Graphics g = Graphics.FromImage(image); 157 158 foreach (Part part in _titlePattern) 192 public Image TitleImage 193 { 194 get 195 { 196 Bitmap image = new Bitmap(ImageWidth, ImageHeight); 197 Graphics g = Graphics.FromImage(image); 198 199 foreach (Part part in _titlePattern) 200 { 201 g.DrawImage(part.Image, 202 part.Point.X, part.Point.Y, 203 part.Image.Size.Width, part.Image.Size.Height); 204 } 205 206 g.Dispose(); 207 return image; 208 } 209 } 210 211 public void DrawPatternImage(Graphics g, PatternSuite suite, int no, int markers, float rate) 212 { 213 Part[] pattern = _patternSuites[(int)suite][no]; 214 foreach (Part part in pattern) 159 215 { 160 216 g.DrawImage(part.Image, 161 part.Point.X, part.Point.Y, 162 part.Image.Size.Width, part.Image.Size.Height); 163 } 164 165 g.Dispose(); 166 return image; 217 part.Point.X * rate, part.Point.Y * rate, 218 part.Image.Size.Width * rate, part.Image.Size.Height * rate); 219 } 220 221 if (markers != 0) 222 { 223 for (int i = 0; i < 8; i++) 224 { 225 if ((markers & (1 << i)) != 0) 226 { 227 Part part = _markers[i]; 228 g.DrawImage(part.Image, 229 part.Point.X * rate, part.Point.Y * rate, 230 part.Image.Size.Width * rate, part.Image.Size.Height * rate); 231 } 232 } 233 } 167 234 } 168 235 … … 206 273 } 207 274 } 208 209 210 /*211 #import <Cocoa/Cocoa.h>212 213 //214 #define FACE_ROWMAX 3215 #define FACE_COLMAX 11216 #define FACE_PATMAX 8217 #define FACE_IMGW 128218 #define FACE_IMGH 128219 #define FACE_IMGSIZE (NSMakeSize(128,128))220 221 // }[J[rbg}XN222 #define FDMARKER_PAGEIN 0x0001223 #define FDMARKER_PAGEOUT 0x0002224 225 //226 #define FACE_INFO_TITLE @"title"227 #define FACE_INFO_AUTHOR @"author"228 #define FACE_INFO_VERSION @"version"229 #define FACE_INFO_SITE_URL @"web site"230 231 #define FACE_INFO_PARTS @"parts"232 #define FACE_INFO_PATTERN @"pattern"233 #define FACE_INFO_MARKER @"markers"234 #define FACE_INFO_TITLE_PATTERN @"title pattern"235 #define FACE_INFO_MARK_PGOUT @"pagein pattern"236 #define FACE_INFO_MARK_PGIN @"pageout pattern"237 238 #define FACE_PART_IMAGE @"filename"239 #define FACE_PART_POSX @"pos x"240 #define FACE_PART_POSY @"pos y"241 242 typedef struct {243 NSString *filename;244 NSImage *image;245 NSPoint pos;246 } PartDef;247 248 typedef struct {249 unsigned count;250 int parts[FACE_PATMAX];251 } PatternDef;252 253 254 @interface FaceDef : NSObject255 {256 NSString *packagePath;257 NSDictionary *definition;258 int partCount;259 PartDef *parts;260 PatternDef patterns[FACE_ROWMAX][FACE_COLMAX];261 int markers[8];262 PatternDef titlePattern;263 }264 265 + (NSDictionary*)infoAtPath:(NSString*)path;266 267 + (id)faceDefWithContentOfFile:(NSString*)path;268 269 - (id)initWithContentOfFile:(NSString*)path;270 271 - (NSString*)path;272 273 - (NSString*)title;274 - (NSString*)author;275 - (NSString*)version;276 - (NSString*)siteURL;277 278 - (NSImage*)titleImage;279 280 - (int)partCount;281 - (const PartDef*)partOfIndex:(int)index;282 - (const PatternDef*)patternOfRow:(int)row col:(int)col;283 - (int)patternCountOfRow:(int)row col:(int)col;284 - (int)patternNoOfRow:(int)row col:(int)col index:(int)index;285 286 - (NSImage*)imageOfRow:(int)row col:(int)col marker:(int)marker;287 288 - (void)drawImageOfRow:(int)row col:(int)col marker:(int)marker atPoint:(NSPoint)pt;289 - (void)drawPart:(PartDef*)part atPoint:(NSPoint)point;290 291 - (void)dumpPattern:(NSString*)path;292 293 @end294 295 @implementation FaceDef296 297 + (NSDictionary*)infoAtPath:(NSString*)path298 {299 NSDictionary *info;300 301 info = [NSDictionary dictionaryWithContentsOfFile:302 [path stringByAppendingPathComponent:@"faceDef.plist"]];303 304 return info;305 }306 307 + (id)faceDefWithContentOfFile:(NSString*)path308 {309 return [[[self alloc] initWithContentOfFile:path] autorelease];310 }311 312 - (id)initWithContentOfFile:(NSString*)path313 {314 NSDictionary *partDefDict;315 NSArray *partArray,*patternArray,*colArray,*elemArray;316 NSEnumerator *enumerator;317 NSString *imagePath;318 NSNumber *value;319 int i,count;320 int row,col,no;321 int maxPartNo;322 323 [super init];324 325 NS_DURING326 definition = [FaceDef infoAtPath:path];327 328 if (definition == nil) {329 [NSException raise:@"FaceDefInfoLoadException" format:@"failuer loading faceDef.plist"];330 }331 332 [definition retain];333 334 packagePath = [path retain];335 336 // p[cè`ÌÇÝÝ337 partArray = [definition objectForKey:FACE_INFO_PARTS];338 339 if ([partArray isMemberOfClass:[NSArray class]]) {340 [NSException raise:@"FaceDefPartListLoadException" format:@"failed in reading part list."];341 }342 343 parts = calloc([partArray count],sizeof(PartDef));344 count = [partArray count];345 346 for (partCount = 0; partCount < count; partCount++){347 partDefDict = [partArray objectAtIndex:partCount];348 parts[partCount].filename = [[partDefDict objectForKey:FACE_PART_IMAGE] retain];349 parts[partCount].pos.x = [(NSNumber*)[partDefDict objectForKey:FACE_PART_POSX] floatValue];350 parts[partCount].pos.y = [(NSNumber*)[partDefDict objectForKey:FACE_PART_POSY] floatValue];351 imagePath = [path stringByAppendingPathComponent:parts[partCount].filename];352 parts[partCount].image = [[NSImage alloc]initWithContentsOfFile:imagePath];353 354 if (parts[partCount].image == nil){ // æªÇÝßÈ©Á½355 [NSException raise:@"FaceDefPartLoadException"356 format:@"failed in loading of image '%@'",parts[partCount].filename];357 }358 }359 360 maxPartNo = count - 1;361 362 // p^[è`ÌÇÝÝ363 patternArray = [definition objectForKey:FACE_INFO_PATTERN];364 365 for (row = 0; row < FACE_ROWMAX; row++){366 colArray = [patternArray objectAtIndex:row];367 368 if ([colArray count] != FACE_COLMAX) {369 [NSException raise:@"FaceDefPatternLoadException"370 format:@"number of pattern columns is not 10 at row %d",row];371 }372 373 for (col = 0; col < FACE_COLMAX; col++){374 elemArray = [colArray objectAtIndex:col];375 enumerator = [[colArray objectAtIndex:col] objectEnumerator];376 for (i = 0; i <= FACE_PATMAX && (value = [enumerator nextObject]) != nil; i++){377 no = [value intValue];378 patterns[row][col].parts[i] = no;379 if (0 > no || no > maxPartNo) { // p[cÔ`FbN380 [NSException raise:@"FaceDefPatternLoadException"381 format:@"illigal part no %d in patterns[%d,%d,%d]",no,row,col,i];382 }383 }384 patterns[row][col].count = i;385 }386 }387 388 // }[J[XgÌÇÝÝ389 enumerator = [[definition objectForKey:FACE_INFO_MARKER] objectEnumerator];390 for (i = 0; i < 8 && (value = [enumerator nextObject]) != nil; i++){391 markers[i] = [value intValue];392 }393 394 // ã\æp^[ÌÇÝÝ395 enumerator = [[definition objectForKey:FACE_INFO_TITLE_PATTERN] objectEnumerator];396 for (i = 0; i <= FACE_PATMAX && (value = [enumerator nextObject]) != nil; i++){397 no = [value intValue];398 titlePattern.parts[i] = no;399 if (0 > no || no > maxPartNo) { // p[cÔ`FbN400 [NSException raise:@"FaceDefPatternLoadException"401 format:@"illigal part no %d in title pattern",no];402 }403 }404 titlePattern.count = i;405 NS_HANDLER406 NSLog(@"FaceDef load error: %@",localException);407 [self dealloc];408 self = nil;409 NS_ENDHANDLER410 411 return self;412 }413 414 - (void)dealloc415 {416 int i;417 418 [packagePath release];419 [definition release];420 421 if (parts != nil) {422 for (i = 0; i < partCount; i++){423 [parts[i].filename release];424 [parts[i].image release];425 }426 free(parts);427 }428 }429 430 -(NSString*)path431 {432 return packagePath;433 }434 435 -(NSString*)title436 {437 NSString *str;438 str = [definition objectForKey:@"title"];439 return (str != nil) ? str : @"";440 }441 442 -(NSString*)author443 {444 NSString *str;445 str = [definition objectForKey:@"author"];446 return (str != nil) ? str : @"";447 }448 449 -(NSString*)version450 {451 NSString *str;452 str = [definition objectForKey:@"version"];453 return (str != nil) ? str : @"";454 }455 456 - (NSString*)siteURL457 {458 NSString *str;459 str = [definition objectForKey:@"web site"];460 return (str != nil) ? str : @"";461 }462 463 - (NSImage*)titleImage464 {465 NSImage *image;466 int i;467 468 image = [[NSImage alloc] initWithSize:FACE_IMGSIZE];469 [image lockFocus];470 471 if (titlePattern.count > 0) {472 for (i=0; i<titlePattern.count; i++) {473 [self drawPart:&parts[titlePattern.parts[i]] atPoint:NSMakePoint(0,0)];474 }475 } else {476 [self drawImageOfRow:0 col:FACE_COLMAX marker:0 atPoint:NSMakePoint(0,0)];477 }478 479 [image unlockFocus];480 return [image autorelease];481 }482 483 - (int)partCount484 {485 return partCount;486 }487 488 - (const PartDef*)partOfIndex:(int)index489 {490 if (0 <= index && index < partCount) return &parts[index];491 else return nil;492 }493 494 - (const PatternDef*)patternOfRow:(int)row col:(int)col495 {496 if (0 <= row && row < FACE_ROWMAX497 && 0 <= col && col < FACE_COLMAX) return &patterns[row][col];498 else return nil;499 }500 501 - (int)patternCountOfRow:(int)row col:(int)col502 {503 if (0 <= row && row < FACE_ROWMAX504 && 0 <= col && col < FACE_COLMAX) return patterns[row][col].count;505 else return -1;506 }507 508 - (int)patternNoOfRow:(int)row col:(int)col index:(int)index509 {510 if (0 <= row && row < FACE_ROWMAX511 && 0 <= col && col < FACE_COLMAX512 && 0 <= index && index < patterns[row][col].count) return patterns[row][col].parts[index];513 else return -1;514 }515 516 - (NSImage*)imageOfRow:(int)row col:(int)col marker:(int)marker517 {518 NSImage *image;519 image = [[NSImage alloc] initWithSize:FACE_IMGSIZE];520 [image lockFocus];521 [self drawImageOfRow:row col:col marker:marker atPoint:NSMakePoint(0,0)];522 [image unlockFocus];523 return [image autorelease];524 }525 526 - (void)drawImageOfRow:(int)row col:(int)col marker:(int)marker atPoint:(NSPoint)point527 {528 int count;529 int i;530 531 count = patterns[row][col].count;532 for (i=0; i<count; i++){533 [self drawPart:&parts[patterns[row][col].parts[i]] atPoint:point];534 };535 536 if (marker != 0) {537 for (i=0; i<8; i++) {538 if (marker & (1<<i)) {539 [self drawPart:&parts[markers[i]] atPoint:point];540 }541 }542 }543 }544 545 - (void)drawPart:(PartDef*)part atPoint:(NSPoint)point546 {547 point.x += part->pos.x;548 point.y += part->pos.y;549 [part->image compositeToPoint:point operation:NSCompositeSourceOver];550 }551 552 -(void)dumpPattern:(NSString*)path;553 {554 NSImage *img;555 NSSize imgSize;556 NSPoint pos;557 float offset;558 int i,j,rows;559 NSMutableDictionary *attr;560 NSString *str;561 562 rows = partCount / FACE_COLMAX + 1;563 offset = rows * FACE_IMGW + 10;564 imgSize.width = FACE_IMGW * FACE_COLMAX;565 imgSize.height = FACE_IMGH * FACE_ROWMAX + offset + 14;566 567 img = [[NSImage alloc] initWithSize:imgSize];568 if (img == nil) {569 NSLog(@"failure dump pattern!");570 return;571 }572 573 [img lockFocus];574 [[NSColor whiteColor] set];575 NSRectFill(NSMakeRect(0,0,imgSize.width,imgSize.height));576 577 [[NSColor blackColor] set];578 NSRectFill(NSMakeRect(0,offset-6,imgSize.width,2));579 580 attr = [[NSMutableDictionary alloc] initWithObjectsAndKeys:581 [NSFont systemFontOfSize:14.0], NSFontAttributeName,582 [NSColor blackColor], NSForegroundColorAttributeName,583 nil];584 585 for (i = 0; i <= partCount; i++) {586 pos.x = (i % FACE_COLMAX) * FACE_IMGW;587 pos.y = (rows-1 - i / FACE_COLMAX) * FACE_IMGH;588 [self drawPart:&parts[i] atPoint:pos];589 590 str = [NSString stringWithFormat:@"%d",i];591 pos.x = (i % FACE_COLMAX) * FACE_IMGW;592 pos.y = (rows-1 - i / FACE_COLMAX) * FACE_IMGH + FACE_IMGH - 12;593 [str drawAtPoint:pos withAttributes:attr];594 }595 596 for (i = 0; i < FACE_ROWMAX; i++) {597 pos.y = (FACE_ROWMAX-1 - i) * FACE_IMGH + offset;598 for (j=0; j<FACE_COLMAX; j++) {599 pos.x = j * FACE_IMGW;600 [self drawImageOfRow:i col:j marker:0 atPoint:pos];601 }602 }603 604 pos.y = imgSize.height - 14;605 for (i = 0; i < FACE_COLMAX-1; i++) {606 str = [NSString stringWithFormat:@"%d-%d%%",i*10,(i+1)*10-1];607 pos.x = i * FACE_IMGW;608 [str drawAtPoint:pos withAttributes:attr];609 }610 str = [NSString stringWithFormat:@"%d%%",100];611 pos.x = (FACE_COLMAX-1) * FACE_IMGW;612 [str drawAtPoint:pos withAttributes:attr];613 614 [img unlockFocus];615 616 [[img TIFFRepresentation] writeToFile:path atomically:NO];617 [img release];618 }619 620 @end621 622 */
Note: See TracChangeset
for help on using the changeset viewer.