Changes in trunk/MacFaceLibrary/FaceDef.cs [30:19]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MacFaceLibrary/FaceDef.cs
r30 r19 18 18 public class FaceDef 19 19 { 20 // p^[XC[gID21 20 public enum PatternSuite 22 21 { … … 26 25 } 27 26 28 public const int PatternCount = 11;29 public const int ImageWidth = 128;30 public const int ImageHeight = 128;31 32 // }[J[33 27 public const int MarkerNone = 0x00; 34 28 public const int MarkerPageIn = 0x01; 35 29 public const int MarkerPageOut = 0x02; 36 30 37 // çp^[è`vpeBXgt@C¼38 31 private const string FaceDefName = "faceDef.plist"; 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 // 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 56 37 private string _path; 57 38 private string _title; … … 77 58 // îñ 78 59 _path = path; 79 _title = ReadInfoString(def, KeyInfoTitle);80 _author = ReadInfoString(def, KeyInfoAuthor);81 _version = ReadInfoString(def, KeyInfoVersion);82 83 if (def.ContainsKey( KeyInfoSiteURL))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")) 84 65 { 85 66 try 86 67 { 87 _webSite = new Uri(def[ KeyInfoSiteURL] as string);68 _webSite = new Uri(def["web site"] as string); 88 69 } 89 70 catch (UriFormatException) {} … … 92 73 93 74 // p[cÌÇÝÝ 94 ArrayList partDefList = (ArrayList)def[ KeyDefParts];75 ArrayList partDefList = (ArrayList)def["parts"]; 95 76 if (partDefList == null) 96 77 { … … 101 82 for (int i = 0; i < partDefList.Count; i++) 102 83 { 103 _parts[i] = ReadPart(path, (Hashtable)partDefList[i]); 104 } 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 } 105 90 106 91 // p^[ÌÇÝÝ 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]); 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; 114 109 } 115 110 116 111 // }[J[ÌÇÝÝ 117 ArrayList markerDefList = (ArrayList)def[ KeyDefMarkers];112 ArrayList markerDefList = (ArrayList)def["markers"]; 118 113 _markers = new Part[markerDefList.Count]; 119 114 for (int i = 0; i < markerDefList.Count; i++) … … 123 118 124 119 // ^Cgp^[ÌÇÝÝ 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 { 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 { 189 130 get { return _webSite; } 190 131 } 191 132 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) 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) 215 159 { 216 160 g.DrawImage(part.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 } 161 part.Point.X, part.Point.Y, 162 part.Image.Size.Width, part.Image.Size.Height); 163 } 164 165 g.Dispose(); 166 return image; 234 167 } 235 168 … … 273 206 } 274 207 } 208 209 210 /* 211 #import <Cocoa/Cocoa.h> 212 213 // 214 #define FACE_ROWMAX 3 215 #define FACE_COLMAX 11 216 #define FACE_PATMAX 8 217 #define FACE_IMGW 128 218 #define FACE_IMGH 128 219 #define FACE_IMGSIZE (NSMakeSize(128,128)) 220 221 // }[J[rbg}XN 222 #define FDMARKER_PAGEIN 0x0001 223 #define FDMARKER_PAGEOUT 0x0002 224 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 : NSObject 255 { 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 @end 294 295 @implementation FaceDef 296 297 + (NSDictionary*)infoAtPath:(NSString*)path 298 { 299 NSDictionary *info; 300 301 info = [NSDictionary dictionaryWithContentsOfFile: 302 [path stringByAppendingPathComponent:@"faceDef.plist"]]; 303 304 return info; 305 } 306 307 + (id)faceDefWithContentOfFile:(NSString*)path 308 { 309 return [[[self alloc] initWithContentOfFile:path] autorelease]; 310 } 311 312 - (id)initWithContentOfFile:(NSString*)path 313 { 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_DURING 326 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Ô`FbN 380 [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Ô`FbN 400 [NSException raise:@"FaceDefPatternLoadException" 401 format:@"illigal part no %d in title pattern",no]; 402 } 403 } 404 titlePattern.count = i; 405 NS_HANDLER 406 NSLog(@"FaceDef load error: %@",localException); 407 [self dealloc]; 408 self = nil; 409 NS_ENDHANDLER 410 411 return self; 412 } 413 414 - (void)dealloc 415 { 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*)path 431 { 432 return packagePath; 433 } 434 435 -(NSString*)title 436 { 437 NSString *str; 438 str = [definition objectForKey:@"title"]; 439 return (str != nil) ? str : @""; 440 } 441 442 -(NSString*)author 443 { 444 NSString *str; 445 str = [definition objectForKey:@"author"]; 446 return (str != nil) ? str : @""; 447 } 448 449 -(NSString*)version 450 { 451 NSString *str; 452 str = [definition objectForKey:@"version"]; 453 return (str != nil) ? str : @""; 454 } 455 456 - (NSString*)siteURL 457 { 458 NSString *str; 459 str = [definition objectForKey:@"web site"]; 460 return (str != nil) ? str : @""; 461 } 462 463 - (NSImage*)titleImage 464 { 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)partCount 484 { 485 return partCount; 486 } 487 488 - (const PartDef*)partOfIndex:(int)index 489 { 490 if (0 <= index && index < partCount) return &parts[index]; 491 else return nil; 492 } 493 494 - (const PatternDef*)patternOfRow:(int)row col:(int)col 495 { 496 if (0 <= row && row < FACE_ROWMAX 497 && 0 <= col && col < FACE_COLMAX) return &patterns[row][col]; 498 else return nil; 499 } 500 501 - (int)patternCountOfRow:(int)row col:(int)col 502 { 503 if (0 <= row && row < FACE_ROWMAX 504 && 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)index 509 { 510 if (0 <= row && row < FACE_ROWMAX 511 && 0 <= col && col < FACE_COLMAX 512 && 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)marker 517 { 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)point 527 { 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)point 546 { 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 @end 621 622 */
Note: See TracChangeset
for help on using the changeset viewer.