日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

[系统控件重绘教程(一)]重绘NSWindow

發布時間:2024/3/13 windows 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [系统控件重绘教程(一)]重绘NSWindow 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
NSWindow的風格一直只有兩種,很難看。Panel倒是有種HUD風格的,但window沒有,畢竟window和panel的titile大小還是不一樣的,網上有關于HUDWindow的代碼,不過那是把window的titlebar給隱藏掉,自己畫上三個button和右下角可以resize的東東,如果用這個window來彈出sheet的話會很詭異的出現…… ????就是sheet從window的最上面彈出來了,底層window看不到titlebar了~ @@AL@.* ?
NSWindow在設置成Texture模式之后可以設置背景色,不過這是單色,漸進色設置不了。最簡單的方法就是先給window設置背景色,再覆蓋上一層NSView來填充content的顏色,不過這樣不是渾然一體的,每個window都要這樣搞的話還是很麻煩的。 krUtOVI ?
所以只能從被apple隱藏起來的方法里找辦法了~所以class-dump出來看看~ ij ?7MP ?
你會發現在NSWindow.h中繪制界面的函數幾乎沒有,不想那些繼承與NSView的控件一樣,那么多私有的繪制方法。那window是怎樣繪制的呢。 w\)K0RN ?
仔細觀察,你會發現NSWindow有很多擴展類,而且window功能性的東西是非常多的,所以它的重繪肯定是委托給別人來做了(這一點通過獲取NSWindow的closebutton可以知道,那三個button都不是標準的NSButton,而是 NSThemeButton?記不太清楚了)。經過查找可以發現函數
?
1 +(Class)frameViewClassForStyleMask:(unsigned int )styleMask
非常可疑,而且dump出來的類有一個叫做NSThemeFrame的,查看它的類方法,哈哈,發現了吧,全是跟window有關的繪制方法。 suY47DCX) ?
jr=9.=jI8k ?
所以接下來的事情就很簡單了,寫一個類繼承 NSThemeFrame *'>_X X ?
?
1 2 3 4 5 6 #import <COCOA Cocoa.h> #import "NSThemeFrame.h" @interface KAThemeFrame : NSThemeFrame { } @end
P_(8+)ud- ?
PVIOe}N ?
那么需要重寫哪些函數呢~我們的目標是重畫TitleBar,具體窗體的內容不需要重畫,因為反正有一個NSView要覆蓋在上面的,所以一個方法就足夠了,廢話少說,上代碼 )9hqd ?
?
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 #import "KAThemeFrame.h" ?? @implementation KAThemeFrame ?? - ( id )contentFill { ???? // This color is used only when dragging. ???? // Please don't try to modify the value. ???? return [ NSColor colorWithCalibratedWhite:.13 alpha:1]; } ?? - ( id )frameColor { ???? return [ NSColor redColor]; } ?? - ( void )_drawTitleBar:( NSRect )rect { ???? NSRect titleRect = [ self titlebarRect]; ?????? ???? // Panel style ???? if ([ self _isUtility]) ???? { ???????? KAGradient *titleGradient = [KAGradient gradientWithStartingColor: [ NSColor colorWithCalibratedRed:0.423f green:0.423f blue:0.423f alpha:1.0]? ?????????????????????????????????????????????????????????????? endingColor: [ NSColor colorWithCalibratedRed:0.365f green:0.365f blue:0.365f alpha:1.0]]; ???????? [titleGradient drawInRect:titleRect angle:-90]; ???? } ???? // Window style ???? else ???? { ???????? float radius = 4; ???????? NSBezierPath *borderPath = [ NSBezierPath bezierPathWithRoundedRect:titleRect cornerRadius:radius inCorners:(OSTopLeftCorner | OSTopRightCorner)]; ???????? NSBezierPath *titlebarPath = [ NSBezierPath bezierPathWithRoundedRect: NSInsetRect (titleRect, 1, 1) cornerRadius:radius-1 inCorners:(OSTopLeftCorner | OSTopRightCorner)]; ?????????? ???????? KAGradient *titleGradient? = [KAGradient gradientWithStartingColor: [ NSColor colorWithCalibratedRed:0.423f green:0.423f blue:0.423f alpha:1.0]? ??????????????????????????????????????????????????????????????? endingColor: [ NSColor colorWithCalibratedRed:0.365f green:0.365f blue:0.365f alpha:1.0]]; ???????? KAGradient *borderGradient = [KAGradient gradientWithStartingColor: [ NSColor colorWithCalibratedRed:0.423f green:0.423f blue:0.423f alpha:1.0]? ??????????????????????????????????????????????????????????????? endingColor: [ NSColor colorWithCalibratedRed:0.365f green:0.365f blue:0.365f alpha:1.0]]; ?????????? ?????????? ???????? [[ NSColor clearColor] set]; ???????? NSRectFill (titleRect); ?????????? ???????? [borderGradient drawInBezierPath:borderPath angle:-90]; ???????? [titleGradient drawInBezierPath:titlebarPath angle:-90]; ?????????? ???? } ???? [ self _drawTitleStringIn:[ self _titlebarTitleRect] withColor:[ NSColor colorWithDeviceWhite:.75 alpha:1]]; } @end
Lc{AB!Br ?
r fqwxr45h ?
這樣你就有一個屬于自己自定義的TitileBar的window了~ KN}#8.'>3 ?
當然你自己實現的畫還可以區分HUD啊,Texture啊啥的風格來重畫~ ;z'&$#pA ?
當然你也可以通過重寫
?
1 - ( void )_drawFrameRects:( NSRect )fp8;
來畫背景。 h.edb6 ?
到這里可以說重繪NSWindow已經完成了,但是怎樣通過styleMask來控制它的重繪呢,怎樣創建一個IBPlugin來在IB里拖出你自己的window呢,怎樣為這個window設置一個你自己的contentview呢? |'h (S| ?
且聽下(下下?)回分解~先講完重繪,再講創建IBPlugin。 CD&a_-'z$K ?
8 0tA5AP ?
這里給出KAGradient的代碼(支持10.4/10.5/10.6)很簡單的一個工廠模式,為了使用接口一致,所以堆NSGradient做了封裝~_KAGradient在10.5/10.6有performance問題~ 7m2iL#5[ ?
?
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 @protocol KAGradientProtocol ?? + ( id ) gradientWithStartingColor: ( NSColor *) startingColor ???????????????? endingColor: ( NSColor *) endingColor; ?? - ( id ) initWithStartingColor: ( NSColor *) startingColor ????????????????? endingColor: ( NSColor *) endingColor; - ( void ) addColorStop: ( NSColor *) stopColor ??????????? atPosition: (CGFloat) position; ?? - ( void ) drawFromPoint: ( NSPoint ) startingPoint ??????????????? toPoint: ( NSPoint ) endingPoint; - ( void ) drawFromCenter: ( NSPoint ) startingCenter ????????????????? radius: (CGFloat) startRadius ??????????????? toCenter: ( NSPoint ) endCenter ????????????????? radius: (CGFloat) endRadius; ?? - ( void ) drawInRect: ( NSRect ) rect? ?????????????? angle: (CGFloat) angle; - ( void ) drawInBezierPath: ( NSBezierPath *) path? ???????????????????? angle: (CGFloat) angle; ?? - ( void ) drawRadialInRect: ( NSRect ) rect; - ( void ) drawRadialInBezierPath: ( NSBezierPath *) path; ?? @end
#Zdh<. ?
NNt n ?
?
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 #import <COCOA Cocoa.h> #import "KAGradientProtocol.h" ?? typedef struct _KAGradientElement? ???? { ???????? CGFloat red, green, blue, alpha; ???????? CGFloat position; ?????????? ???????? struct _KAGradientElement *nextElement; ???? } KAGradientElement; ?? typedef enum? _KABlendingMode ???? { ???????? KALinearBlendingMode, ???????? KAChromaticBlendingMode, ???????? KAInverseChromaticBlendingMode, ???? } KAGradientBlendingMode; ?? /*! ????? @class ????? @abstract??? Private Gradient class which will be used on 10.4. ????? @discussion? The is a class which uses Quartz to draw gradient graphics on? ?????????????????? 10.4. You can add color stop after initialization. ? */ @interface _KAGradient : NSObject <KAGRADIENTPROTOCOL> { ???? KAGradientElement* elementList; ???? KAGradientBlendingMode blendingMode; ?????? ???? CGFunctionRef gradientFunction;???? } @end
T8S&9BM7 ?
[+\He/M6 ?
?
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 #import "_KAGradient.h" ?? @interface? _KAGradient (PrivateMethods) ?? - ( void )_commonInit; ?? - ( void )setBlendingMode:(KAGradientBlendingMode)mode; - (KAGradientBlendingMode)blendingMode; ?? - ( void )addElement:(KAGradientElement*)newElement; - (KAGradientElement *)elementAtIndex:(unsigned)index; - (KAGradientElement)removeElementAtIndex:(unsigned)index; - (KAGradientElement)removeElementAtPosition:( float )position; ?? @end ?? //C Fucti***** for color blending static void linearEvaluation?? ( void *info, c*****t float *in, float *out); static void chromaticEvaluation( void *info, c*****t float *in, float *out); static void inverseChromaticEvaluation( void *info, c*****t float *in, float *out); static void transformRGB_HSV( float *components); static void transformHSV_RGB( float *components); static void resolveHSV( float *color1, float *color2); ?? @implementation _KAGradient ?? + gradientWithStartingColor: ( NSColor *) startingColor ???????????????? endingColor: ( NSColor *) endingColor { ???? _KAGradient* instance = [[[ self class ] alloc] init]; ?????? ???? KAGradientElement color1; ???? KAGradientElement color2; ?????? ???? [[startingColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace ] getRed: &color1.red? ?????????????????????????????????????????????????????????????????????????? green: &color1.green ??????????????????????????????????????????????????????????????????????????? blue: &color1.blue? ?????????????????????????????????????????????????????????????????????????? alpha: &color1.alpha]; ???? [[endingColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace ] getRed: &color2.red ???????????????????????????????????????????????????????????????????????? green: &color2.green ????????????????????????????????????????????????????????????????????????? blue: &color2.blue ???????????????????????????????????????????????????????????????????????? alpha: &color2.alpha]; ???? color1.position = 0; ???? color2.position = 1; ?????? ???? [instance addElement: &color1]; ???? [instance addElement: &color2]; ?????? ???? return [instance autorelease]; } ?? - ( id ) init { ???? if ( self = [ super init]) ???? { ???????? [ self _commonInit]; ???????? [ self setBlendingMode: KALinearBlendingMode]; ???? } ???? return self ; } ?? - ( id ) initWithStartingColor: ( NSColor *) startingColor ????????????????? endingColor: ( NSColor *) endingColor { ???? self = [ super init]; ?????? ???? if ( self ) ???? { ???????? [ self _commonInit]; ???????? [ self setBlendingMode: KALinearBlendingMode]; ?????????? ???????? KAGradientElement color1; ???????? KAGradientElement color2; ?????????? ???????? [[startingColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace ] getRed: &color1.red? ?????????????????????????????????????????????????????????????????????????????? green: &color1.green ??????????????????????????????????????????????????????????????????????????????? blue: &color1.blue? ?????????????????????????????????????????????????????????????????????????????? alpha: &color1.alpha]; ???????? [[endingColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace ] getRed: &color2.red ???????????????????????????????????????????????????????????????????????????? green: &color2.green ????????????????????????????????????????????????????????????????????????????? blue: &color2.blue ???????????????????????????????????????????????????????????????????????????? alpha: &color2.alpha]; ???????? color1.position = 0; ???????? color2.position = 1; ?????????? ???????? [ self addElement: &color1]; ???????? [ self addElement: &color2]; ???? } ?????? ?????? ???? return self ; } ?? - ( void ) dealloc { ???? CGFunctionRelease(gradientFunction); ?????? ???? KAGradientElement* elementToRemove = elementList; ???? while (elementList != nil ) ???? { ???????? elementToRemove = elementList; ???????? elementList = elementList->nextElement; ???????? free(elementToRemove); ???? } ?????? ???? [ super dealloc]; } ?? - ( id ) copyWithZone: ( NSZone *) zone { ???? _KAGradient * copy = [[[ self class ] allocWithZone: zone] init]; ?????? ???? // now just copy my elementList ???? KAGradientElement* currentElement = elementList; ???? while (currentElement) ???? { ???????? [ copy addElement: currentElement]; ???????? currentElement = currentElement->nextElement; ???? } ?????? ???? [ copy setBlendingMode: blendingMode]; ?????? ???? return copy ; } ?? - ( void )encodeWithCoder:( NSCoder *)coder { ???? if ([coder allowsKeyedCoding]) ???? { ???????? unsigned count = 0; ???????? KAGradientElement *currentElement = elementList; ???????? while(currentElement != nil ) ???????? { ???????????? [coder encodeValueOfObjCType: @encode ( float ) at:&(currentElement->red)]; ???????????? [coder encodeValueOfObjCType: @encode ( float ) at:&(currentElement->green)]; ???????????? [coder encodeValueOfObjCType: @encode ( float ) at:&(currentElement->blue)]; ???????????? [coder encodeValueOfObjCType: @encode ( float ) at:&(currentElement->alpha)]; ???????????? [coder encodeValueOfObjCType: @encode ( float ) at:&(currentElement->position)]; ?????????????? ???????????? count++; ???????????? currentElement = currentElement->nextElement; ???????? } ???????? [coder encodeInt:count forKey:@ "KAGradientElementCount" ]; ???????? [coder encodeInt:blendingMode forKey:@ "KAGradientBlendingMode" ]; ???? } ???? else ???????? [ NSException raise: NSInvalidArchiveOperationException format:@ "Only supports NSKeyedArchiver coders" ]; } ?? - ( id )initWithCoder:( NSCoder *)coder { ???? [ self _commonInit]; ?????? ???? [ self setBlendingMode:[coder decodeIntForKey:@ "KAGradientBlendingMode" ]]; ???? unsigned count = [coder decodeIntForKey:@ "KAGradientElementCount" ]; ?????? ???? while(count != 0) ???? { ???????? KAGradientElement newElement; ?????????? ???????? [coder decodeValueOfObjCType: @encode ( float ) at:&(newElement.red)]; ???????? [coder decodeValueOfObjCType: @encode ( float ) at:&(newElement.green)]; ???????? [coder decodeValueOfObjCType: @encode ( float ) at:&(newElement.blue)]; ???????? [coder decodeValueOfObjCType: @encode ( float ) at:&(newElement.alpha)]; ???????? [coder decodeValueOfObjCType: @encode ( float ) at:&(newElement.position)]; ?????????? ???????? count--; ???????? [ self addElement:&newElement]; ???? } ???? return self ; } #pragma mark - ?? #pragma mark [PrivateMethods] - ( void )_commonInit { ???? elementList = nil ; } ?? - ( void )setBlendingMode:(KAGradientBlendingMode)mode { ???? blendingMode = mode; ?????? ???? //Choose what blending function to use ???? void *evaluationFunction; ???? switch (blendingMode) ???? { ???????? case KALinearBlendingMode: ???????????? evaluationFunction = &linearEvaluation;??????????? break ; ???????? case KAChromaticBlendingMode: ???????????? evaluationFunction = &chromaticEvaluation;??????????? break ; ???????? case KAInverseChromaticBlendingMode: ???????????? evaluationFunction = &inverseChromaticEvaluation;??? break ; ???? } ?????? ???? //replace the current CoreGraphics Function with new one ???? if (gradientFunction != NULL ) ???????? CGFunctionRelease(gradientFunction); ?????? ???? CGFunctionCallbacks evaluationCallbackInfo = {0 , evaluationFunction, NULL };??? //Version, evaluator function, cleanup function ?????? ???? static c*****t float input_value_range?? [2] = { 0, 1 };??????????????????????? //range? for the evaluator input ???? static c*****t float output_value_ranges [8] = { 0, 1, 0, 1, 0, 1, 0, 1 };??????? //ranges for the evaluator output (4 returned values) ?????? ???? gradientFunction = CGFunctionCreate(&elementList,??????????????????? //the two transition colors ???????????????????????????????????????? 1, input_value_range? ,??????? //number of inputs (just fraction of progression) ???????????????????????????????????????? 4, output_value_ranges,??????? //number of outputs (4 - RGBa) ???????????????????????????????????????? &evaluationCallbackInfo);??????? //info for using the evaluator function ?????? } - (KAGradientBlendingMode)blendingMode { ???? return blendingMode; } ?? - ( void )addElement:(KAGradientElement*)newElement { ???? if (elementList == nil || newElement->position < elementList->position) ???? { ???????? // insert at the beginning ???????? KAGradientElement* tmpNext = elementList; ???????? elementList = malloc( sizeof (KAGradientElement)); ???????? *elementList = *newElement; ???????? elementList->nextElement = tmpNext; ???? } ???? else ???? { ???????? KAGradientElement* currentElement = elementList; ???????? while (currentElement->nextElement != nil? ??????????????? && !((currentElement->position <= newElement->position)? ???????????????????? && (newElement->position < currentElement->nextElement->position))) ???????? { ???????????? currentElement = currentElement->nextElement; ???????? } ?????????? ???????? KAGradientElement* tmpNext = currentElement->nextElement; ???????? currentElement->nextElement = malloc( sizeof (KAGradientElement)); ???????? *(currentElement->nextElement) = *newElement; ???????? currentElement->nextElement->nextElement = tmpNext; ???? } } - (KAGradientElement *)elementAtIndex:(unsigned)index { ???? unsigned count = 0; ???? KAGradientElement *currentElement = elementList; ?????? ???? while (currentElement != nil ) ???? { ???????? if (count == index) ???????????? return currentElement; ?????????? ???????? count++; ???????? currentElement = currentElement->nextElement; ???? } ?????? ???? return nil ; } - (KAGradientElement)removeElementAtIndex:(unsigned)index { ???? KAGradientElement removedElement; ?????? ???? if (elementList != nil ) ???? { ???????? if (index == 0) ???????? { ???????????? KAGradientElement *tmpNext = elementList; ???????????? elementList = elementList->nextElement; ?????????????? ???????????? removedElement = *tmpNext; ???????????? free(tmpNext); ?????????????? ???????????? return removedElement; ???????? } ?????????? ???????? unsigned count = 1;??????? //we want to start one ahead ???????? KAGradientElement *currentElement = elementList; ???????? while(currentElement->nextElement != nil ) ???????? { ???????????? if (count == index) ???????????? { ???????????????? KAGradientElement *tmpNext? = currentElement->nextElement; ???????????????? currentElement->nextElement = currentElement->nextElement->nextElement; ?????????????????? ???????????????? removedElement = *tmpNext; ???????????????? free(tmpNext); ?????????????????? ???????????????? return removedElement; ???????????? } ?????????????? ???????????? count++; ???????????? currentElement = currentElement->nextElement; ???????? } ???? } ?????? ???? //element is not found, return empty element ???? removedElement.red?? = 0.0; ???? removedElement.green = 0.0; ???? removedElement.blue? = 0.0; ???? removedElement.alpha = 0.0; ???? removedElement.position = NAN; ???? removedElement.nextElement = nil ; ?????? ???? return removedElement; } - (KAGradientElement)removeElementAtPosition:( float )position { ???? KAGradientElement removedElement; ?????? ???? if (elementList != nil ) ???? { ???????? if (elementList->position == position) ???????? { ???????????? KAGradientElement *tmpNext = elementList; ???????????? elementList = elementList->nextElement; ?????????????? ???????????? removedElement = *tmpNext; ???????????? free(tmpNext); ?????????????? ???????????? return removedElement; ???????? } ???????? else ???????? { ???????????? KAGradientElement *curElement = elementList; ???????????? while(curElement->nextElement != nil ) ???????????? { ???????????????? if (curElement->nextElement->position == position) ???????????????? { ???????????????????? KAGradientElement *tmpNext = curElement->nextElement; ???????????????????? curElement->nextElement = curElement->nextElement->nextElement; ?????????????????????? ???????????????????? removedElement = *tmpNext; ???????????????????? free(tmpNext); ?????????????????????? ???????????????????? return removedElement; ???????????????? } ???????????? } ???????? } ???? } ?????? ???? //element is not found, return empty element ???? removedElement.red?? = 0.0; ???? removedElement.green = 0.0; ???? removedElement.blue? = 0.0; ???? removedElement.alpha = 0.0; ???? removedElement.position = NAN; ???? removedElement.nextElement = nil ; ?????? ???? return removedElement; } ?? #pragma mark [color stop] - ( void ) addColorStop: ( NSColor *) stopColor ??????????? atPosition: (CGFloat) position { ???? if ( nil == stopColor) ???????? [ NSException raise: NSInvalidArgumentException format:@ "The incoming color can't be nil" ]; ???? if (position < 0.0f || position > 1.0f) ???????? [ NSException raise: NSInvalidArgumentException format:@ "Location value should > 0.0f and < 1.0f. It can't be %f" , position]; ?????? ???? KAGradientElement newElement; ?????? ???? // put the components of color into the newElement? ???? //- must make sure it is a RGB color (not gray or CMYK) ???? [[stopColor colorUsingColorSpaceName: NSCalibratedRGBColorSpace ] getRed: &newElement.red ?????????????????????????????????????????????????????????????????????? green: &newElement.green ??????????????????????????????????????????????????????????????????????? blue: &newElement.blue? ?????????????????????????????????????????????????????????????????????? alpha: &newElement.alpha]; ???? newElement.position = position; ???? [ self addElement: &newElement]; } ?? #pragma mark [Draw functi*****] // draw - ( void ) drawFromPoint: ( NSPoint ) startingPoint ??????????????? toPoint: ( NSPoint ) endingPoint { ?????? } - ( void ) drawFromCenter: ( NSPoint ) startingCenter ????????????????? radius: (CGFloat) startRadius ??????????????? toCenter: ( NSPoint ) endCenter ????????????????? radius: (CGFloat) endRadius { ?????? } ?? - ( void ) drawInRect: ( NSRect ) rect? ?????????????? angle: (CGFloat) angle { ???? //First Calculate where the beginning and ending points should be ???? CGPoint startPoint; ???? CGPoint endPoint; ?????? ???? if (angle == 0)??????? //screw the calculati***** - we know the answer ?????? { ???????? startPoint = CGPointMake( NSMinX (rect), NSMinY (rect));??? //right of rect ???????? endPoint?? = CGPointMake( NSMaxX (rect), NSMinY (rect));??? //left? of rect ?????? } ???? else if (angle == 90)??? //same as above ?????? { ???????? startPoint = CGPointMake( NSMinX (rect), NSMinY (rect));??? //bottom of rect ???????? endPoint?? = CGPointMake( NSMinX (rect), NSMaxY (rect));??? //top??? of rect ?????? } ???? else??????????????????????? //ok, we'll do the calculati***** now? ?????? { ???????? float x,y; ???????? float sina, cosa, tana; ?????????? ???????? float length; ???????? float deltax, ???????? deltay; ?????????? ???????? float rangle = angle * pi/180;??? //convert the angle to radians ?????????? ???????? if (fabsf(tan(rangle))<=1)??? //for range [-45,45], [135,225] ???????? { ???????????? x = NSWidth (rect); ???????????? y = NSHeight (rect); ?????????????? ???????????? sina = sin(rangle); ???????????? cosa = cos(rangle); ???????????? tana = tan(rangle); ?????????????? ???????????? length = x/fabsf(cosa)+(y-x*fabsf(tana))*fabsf(sina); ?????????????? ???????????? deltax = length*cosa/2; ???????????? deltay = length*sina/2; ???????? } ???????? else??????????????????????? //for range [45,135], [225,315] ???????? { ???????????? x = NSHeight (rect); ???????????? y = NSWidth (rect); ?????????????? ???????????? sina = sin(rangle - 90*pi/180); ???????????? cosa = cos(rangle - 90*pi/180); ???????????? tana = tan(rangle - 90*pi/180); ?????????????? ???????????? length = x/fabsf(cosa)+(y-x*fabsf(tana))*fabsf(sina); ?????????????? ???????????? deltax =-length*sina/2; ???????????? deltay = length*cosa/2; ???????? } ?????????? ???????? startPoint = CGPointMake( NSMidX (rect)-deltax, NSMidY (rect)-deltay); ???????? endPoint?? = CGPointMake( NSMidX (rect)+deltax, NSMidY (rect)+deltay); ???? } ?????? ???? //Calls to CoreGraphics ???? CGContextRef currentContext = (CGContextRef)[[ NSGraphicsContext currentContext] graphicsPort]; ???? CGContextSaveGState(currentContext); #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4 ???? CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); #else ???? CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); #endif ???? CGShadingRef myCGShading = CGShadingCreateAxial(colorspace, startPoint, endPoint, gradientFunction, false , false ); ?????? ???? CGContextClipToRect (currentContext, *(CGRect *)&rect);??? //This is where the action happens ???? CGContextDrawShading(currentContext, myCGShading); ?????? ???? CGShadingRelease(myCGShading); ???? CGColorSpaceRelease(colorspace ); ???? CGContextRestoreGState(currentContext); } - ( void ) drawInBezierPath: ( NSBezierPath *) path? ???????????????????? angle: (CGFloat) angle { ???? NSGraphicsContext *currentContext = [ NSGraphicsContext currentContext]; ???? [currentContext saveGraphicsState]; ???? NSAffineTransform *transform = [[ NSAffineTransform alloc] init]; ?????? ???? [transform rotateByDegrees:-angle]; ???? [path transformUsingAffineTransform:transform]; ???? [transform invert]; ???? [transform concat]; ?????? ???? [path addClip]; ???? [ self drawInRect:[path bounds] angle:0]; ???? [path transformUsingAffineTransform:transform]; ???? [transform release]; ???? [currentContext restoreGraphicsState]; } ?? - ( void ) drawRadialInRect: ( NSRect ) rect { ???? CGPoint startPoint, endPoint; ???? float startRadius, endRadius; ???? float scalex, scaley, transx, transy; ?????? ???? startPoint = endPoint = CGPointMake( NSMidX (rect), NSMidY (rect)); ?????? ???? startRadius = -1; ???? if ( NSHeight (rect)> NSWidth (rect)) ???? { ???????? scalex = NSWidth (rect)/ NSHeight (rect); ???????? transx = rect.origin.x + ( NSHeight (rect)- NSWidth (rect))/2; ???????? scaley = 1; ???????? transy = 1; ???????? endRadius = NSHeight (rect)/2; ???? } ???? else ???? { ???????? scalex = 1; ???????? transx = 1; ???????? scaley = NSHeight (rect)/ NSWidth (rect); ???????? transy = rect.origin.y + ( NSWidth (rect)- NSHeight (rect))/2; ???????? endRadius = NSWidth (rect)/2; ???? } ?????? ???? //Calls to CoreGraphics ???? CGContextRef currentContext = (CGContextRef)[[ NSGraphicsContext currentContext] graphicsPort]; ???? CGContextSaveGState(currentContext); #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 ???? CGColorSpaceRef colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); #else ???? CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); #endif ???? CGShadingRef myCGShading = CGShadingCreateRadial(colorspace, startPoint, startRadius, endPoint, endRadius, gradientFunction, true , true ); ?????? ???? CGContextClipToRect? (currentContext, *(CGRect *)&rect); ???? CGContextScaleCTM??? (currentContext, scalex, scaley); ???? CGContextTranslateCTM(currentContext, transx, transy); ???? CGContextDrawShading (currentContext, myCGShading);??????? //This is where the action happens ?????? ???? CGShadingRelease(myCGShading); ???? CGColorSpaceRelease(colorspace); ???? CGContextRestoreGState(currentContext); } - ( void ) drawRadialInBezierPath: ( NSBezierPath *) path { ???? NSGraphicsContext *currentContext = [ NSGraphicsContext currentContext]; ???? [currentContext saveGraphicsState]; ???? [path addClip]; ???? [ self drawRadialInRect:[path bounds]]; ???? [currentContext restoreGraphicsState]; } #pragma mark - ?? #pragma mark Core Graphics //Blending Functi*****/ void linearEvaluation ( void *info, c*****t float *in, float *out) { ???? float position = *in; ?????? ???? if (*(KAGradientElement **)info == nil )??? //if elementList is empty return clear color ???? { ???????? out[0] = out[1] = out[2] = out[3] = 1; ???????? return ; ???? } ?????? ???? //This grabs the first two colors in the sequence ???? KAGradientElement *color1 = *(KAGradientElement **)info; ???? KAGradientElement *color2 = color1->nextElement; ?????? ???? //make sure first color and second color are on other sides of position ???? while(color2 != nil && color2->position < position) ?????? { ???????? color1 = color2; ???????? color2 = color1->nextElement; ?????? } ???? //if we don't have another color then make next color the same color ???? if (color2 == nil ) ???? { ???????? color2 = color1; ???? } ?????? ???? //----------FailSafe settings---------- ???? //color1->red?? = 1; color2->red?? = 0; ???? //color1->green = 1; color2->green = 0; ???? //color1->blue? = 1; color2->blue? = 0; ???? //color1->alpha = 1; color2->alpha = 1; ???? //color1->position = .5; ???? //color2->position = .5; ???? //------------------------------------- ?????? ???? if (position <= color1->position)??????????? //Make all below color color1's position equal to color1 ?????? { ???????? out[0] = color1->red;? ???????? out[1] = color1->green; ???????? out[2] = color1->blue; ???????? out[3] = color1->alpha; ?????? } ???? else if (position >= color2->position)??? //Make all above color color2's position equal to color2 ?????? { ???????? out[0] = color2->red;? ???????? out[1] = color2->green; ???????? out[2] = color2->blue; ???????? out[3] = color2->alpha; ?????? } ???? else??????????????????????????????????????? //Interpolate color at posti***** between color1 and color1 ?????? { ???????? //adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position? ???????? position = (position-color1->position)/(color2->position - color1->position); ?????????? ???????? out[0] = (color2->red?? - color1->red? )*position + color1->red;? ???????? out[1] = (color2->green - color1->green)*position + color1->green; ???????? out[2] = (color2->blue? - color1->blue )*position + color1->blue; ???????? out[3] = (color2->alpha - color1->alpha)*position + color1->alpha; ???? } ?????? ???? //Premultiply the color by the alpha. ???? out[0] *= out[3]; ???? out[1] *= out[3]; ???? out[2] *= out[3]; } ?? //Chromatic Evaluation -? //??? This blends colors by their Hue, Saturation, and Value(Brightness) right now I just? //??? transform the RGB values stored in the KAGradientElements to HSB, in the future I may //??? streamline it to avoid transforming in and out of HSB colorspace *for later* // //??? For the chromatic blend we shift the hue of color1 to meet the hue of color2. To do //??? this we will add to the hue's angle (if we subtract we'll be doing the inverse //??? chromatic...scroll down more for that). All we need to do is keep adding to the hue //? until we wrap around the colorwheel and get to color2. void chromaticEvaluation( void *info, c*****t float *in, float *out) { ???? float position = *in; ?????? ???? if (*(KAGradientElement **)info == nil )??? //if elementList is empty return clear color ???? { ???????? out[0] = out[1] = out[2] = out[3] = 1; ???????? return ; ???? } ?????? ???? //This grabs the first two colors in the sequence ???? KAGradientElement *color1 = *(KAGradientElement **)info; ???? KAGradientElement *color2 = color1->nextElement; ?????? ???? float c1[4]; ???? float c2[4]; ?????? ???? //make sure first color and second color are on other sides of position ???? while(color2 != nil && color2->position < position) ?????? { ???????? color1 = color2; ???????? color2 = color1->nextElement; ?????? } ???? //if we don't have another color then make next color the same color ???? if (color2 == nil ) ???? { ???????? color2 = color1; ???? } ?????? ?????? ???? c1[0] = color1->red;? ???? c1[1] = color1->green; ???? c1[2] = color1->blue; ???? c1[3] = color1->alpha; ?????? ???? c2[0] = color2->red;? ???? c2[1] = color2->green; ???? c2[2] = color2->blue; ???? c2[3] = color2->alpha; ?????? ???? transformRGB_HSV(c1); ???? transformRGB_HSV(c2); ???? resolveHSV(c1,c2); ?????? ???? if (c1[0] > c2[0]) //if color1's hue is higher than color2's hue then? ???????? c2[0] += 360;??? //??? we need to move c2 one revolution around the wheel ?????? ?????? ???? if (position <= color1->position)??????????? //Make all below color color1's position equal to color1 ?????? { ???????? out[0] = c1[0];? ???????? out[1] = c1[1]; ???????? out[2] = c1[2]; ???????? out[3] = c1[3]; ?????? } ???? else if (position >= color2->position)??? //Make all above color color2's position equal to color2 ?????? { ???????? out[0] = c2[0];? ???????? out[1] = c2[1]; ???????? out[2] = c2[2]; ???????? out[3] = c2[3]; ?????? } ???? else??????????????????????????????????????? //Interpolate color at posti***** between color1 and color1 ?????? { ???????? //adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position? ???????? position = (position-color1->position)/(color2->position - color1->position); ?????????? ???????? out[0] = (c2[0] - c1[0])*position + c1[0];? ???????? out[1] = (c2[1] - c1[1])*position + c1[1]; ???????? out[2] = (c2[2] - c1[2])*position + c1[2]; ???????? out[3] = (c2[3] - c1[3])*position + c1[3]; ?????? } ?????? ???? transformHSV_RGB(out); ?????? ???? //Premultiply the color by the alpha. ???? out[0] *= out[3]; ???? out[1] *= out[3]; ???? out[2] *= out[3]; } ?? //Inverse Chromatic Evaluation -? //??? Inverse Chromatic is about the same story as Chromatic Blend, but here the Hue //??? is strictly decreasing, that is we need to get from color1 to color2 by decreasing //??? the 'angle' (i.e. 90o -> 180o would be done by subtracting 270o and getting -180o... //??? which is equivalent to 180o mod 360o void inverseChromaticEvaluation( void *info, c*****t float *in, float *out) { ???? float position = *in; ?????? ???? if (*(KAGradientElement **)info == nil )??? //if elementList is empty return clear color ???? { ???????? out[0] = out[1] = out[2] = out[3] = 1; ???????? return ; ???? } ?????? ???? //This grabs the first two colors in the sequence ???? KAGradientElement *color1 = *(KAGradientElement **)info; ???? KAGradientElement *color2 = color1->nextElement; ?????? ???? float c1[4]; ???? float c2[4]; ?????? ???? //make sure first color and second color are on other sides of position ???? while(color2 != nil && color2->position < position) ?????? { ???????? color1 = color2; ???????? color2 = color1->nextElement; ?????? } ???? //if we don't have another color then make next color the same color ???? if (color2 == nil ) ???? { ???????? color2 = color1; ???? } ?????? ???? c1[0] = color1->red;? ???? c1[1] = color1->green; ???? c1[2] = color1->blue; ???? c1[3] = color1->alpha; ?????? ???? c2[0] = color2->red;? ???? c2[1] = color2->green; ???? c2[2] = color2->blue; ???? c2[3] = color2->alpha; ?????? ???? transformRGB_HSV(c1); ???? transformRGB_HSV(c2); ???? resolveHSV(c1,c2); ?????? ???? if (c1[0] < c2[0]) //if color1's hue is higher than color2's hue then? ???????? c1[0] += 360;??? //??? we need to move c2 one revolution back on the wheel ?????? ?????? ???? if (position <= color1->position)??????????? //Make all below color color1's position equal to color1 ?????? { ???????? out[0] = c1[0];? ???????? out[1] = c1[1]; ???????? out[2] = c1[2]; ???????? out[3] = c1[3]; ?????? } ???? else if (position >= color2->position)??? //Make all above color color2's position equal to color2 ?????? { ???????? out[0] = c2[0];? ???????? out[1] = c2[1]; ???????? out[2] = c2[2]; ???????? out[3] = c2[3]; ?????? } ???? else??????????????????????????????????????? //Interpolate color at posti***** between color1 and color1 ?????? { ???????? //adjust position so that it goes from 0 to 1 in the range from color 1 & 2's position? ???????? position = (position-color1->position)/(color2->position - color1->position); ?????????? ???????? out[0] = (c2[0] - c1[0])*position + c1[0];? ???????? out[1] = (c2[1] - c1[1])*position + c1[1]; ???????? out[2] = (c2[2] - c1[2])*position + c1[2]; ???????? out[3] = (c2[3] - c1[3])*position + c1[3]; ?????? } ?????? ???? transformHSV_RGB(out); ?????? ???? //Premultiply the color by the alpha. ???? out[0] *= out[3]; ???? out[1] *= out[3]; ???? out[2] *= out[3]; } ?? ?? void transformRGB_HSV( float *components) //H,S,B -> R,G,B { ???? float H, S, V; ???? float R = components[0], ???? G = components[1], ???? B = components[2]; ?????? ???? float MAX = R > G ? (R > B ? R : B) : (G > B ? G : B), ???? MIN = R < G ? (R < B ? R : B) : (G < B ? G : B); ?????? ???? if (MAX == MIN) ???????? H = NAN; ???? else if (MAX == R) ???????? if (G >= B) ???????????? H = 60*(G-B)/(MAX-MIN)+0; ???????? else ???????????? H = 60*(G-B)/(MAX-MIN)+360; ???????? else if (MAX == G) ???????????? H = 60*(B-R)/(MAX-MIN)+120; ???????? else if (MAX == B) ???????????? H = 60*(R-G)/(MAX-MIN)+240; ?????? ???? S = MAX == 0 ? 0 : 1 - MIN/MAX; ???? V = MAX; ?????? ???? components[0] = H; ???? components[1] = S; ???? components[2] = V; } ?? void transformHSV_RGB( float *components) //H,S,B -> R,G,B { ???? float R, G, B; ???? float H = fmodf(components[0],359),??? //map to [0,360) ???? S = components[1], ???? V = components[2]; ?????? ???? int?? Hi = ( int )floorf(H/60.) % 6; ???? float f? = H/60-Hi, ???? p? = V*(1-S), ???? q? = V*(1-f*S), ???? t? = V*(1-(1-f)*S); ?????? ???? switch (Hi) ???? { ???????? case 0:??? R=V;G=t;B=p;??? break ; ???????? case 1:??? R=q;G=V;B=p;??? break ; ???????? case 2:??? R=p;G=V;B=t;??? break ; ???????? case 3:??? R=p;G=q;B=V;??? break ; ???????? case 4:??? R=t;G=p;B=V;??? break ; ???????? case 5:??? R=V;G=p;B=q;??? break ; ???? } ?????? ???? components[0] = R; ???? components[1] = G; ???? components[2] = B; } ?? void resolveHSV( float *color1, float *color2)??? //H value may be undefined (i.e. graycale color) {??????????????????????????????????????????? //??? we want to fill it with a sensible value ???? if (isnan(color1[0]) && isnan(color2[0])) ???????? color1[0] = color2[0] = 0; ???? else if (isnan(color1[0])) ???????? color1[0] = color2[0]; ???? else if (isnan(color2[0])) ???????? color2[0] = color1[0]; }
nt2b}u>* ?
*y4DK6OFe ?
?
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 #import <COCOA Cocoa.h> #import "KAGradientProtocol.h" ?? /*! ???? @class ???? @abstract??? Private Gradient class which will be used on OS X which version ????????????????? is more than 10.5 ???? @discussion? The is a class which uses NSGradient to draw graphics on? ????????????????? 10.5/10.6. And it has the different draw methods than NSGradient. ????????????????? You can add color stop after initialization. */ @interface _NSGradient : NSObject <KAGRADIENTPROTOCOL> { @private ???? NSGradient??????? *m_Gradient; ???? NSMutableArray??? *m_Colors; ???? NSMutableArray??? *m_Locati*****; ?????? ???? int??????????????? __colorsCount; } ?? /*! ???? @function ???? @abstract?? Add color stop ???? @discussion You can add a color stop after initialization. ???? @param????? color The color you want to add. ???? @param??????? location The color location. The value should between 0.0f and 1.0f. ???? @result???? Void. ???? @exception??? NSInvalidArgumentException If the colro is nil or value of? ???????????????? location is invalid, it will rasie the exception. */ - ( void ) addColor:( NSColor *) color andLocation:(CGFloat) location; ?? #pragma mark Accessors - ( NSGradient *) m_Gradient; - ( void ) setM_Gradient: ( NSGradient *) newValue; - ( NSMutableArray *) m_Colors; - ( void ) setM_Colors: ( NSMutableArray *) newValue; - ( NSMutableArray *) m_Locati*****; - ( void ) setM_Locati*****: ( NSMutableArray *) newValue; @end
Ic'D# m ?
T\gs ?
?
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 #import "_NSGradient.h" ?? ?? @implementation _NSGradient ?? - ( void ) dealloc { ???? [ self setM_Colors: nil ]; ???? [ self setM_Gradient: nil ]; ???? [ self setM_Locati*****: nil ]; ?????? ???? [ super dealloc]; } ?? #pragma mark Protocol Methods + ( id ) gradientWithStartingColor: ( NSColor *) startingColor ????????????????????? endingColor: ( NSColor *) endingColor { ???? return [[[ self alloc] initWithStartingColor:startingColor endingColor:endingColor] autorelease]; } ?? - ( id ) initWithStartingColor: ( NSColor *) startingColor ????????????????? endingColor: ( NSColor *) endingColor { ???? if ( self = [ super init]) ???? { ???????? [ self setM_Colors:[ NSMutableArray array]]; ???????? [ self setM_Locati*****:[ NSMutableArray array]]; ?????????? ???????? [ self addColor:startingColor andLocation:0.0f]; ???????? [ self addColor:endingColor andLocation:1.0f]; ???? } ???? return self ; } ?? - ( void ) addColorStop: ( NSColor *) stopColor ??????????? atPosition: (CGFloat) position { ???? [ self addColor:stopColor andLocation:position]; } ?? - ( void ) drawFromPoint: ( NSPoint ) startingPoint ??????????????? toPoint: ( NSPoint ) endingPoint { ???? [ self _initGradientInstance]; ???? [m_Gradient drawFromPoint:startingPoint? ?????????????????????? toPoint:endingPoint? ?????????????????????? opti*****: NSGradientDrawsAfterEndingLocation ]; } ?? - ( void ) drawFromCenter: ( NSPoint ) startingCenter ????????????????? radius: (CGFloat) startRadius ??????????????? toCenter: ( NSPoint ) endCenter ????????????????? radius: (CGFloat) endRadius { ???? [ self _initGradientInstance]; ???? [m_Gradient drawFromCenter:startingCenter? ???????????????????????? radius:startRadius? ?????????????????????? toCenter:endCenter? ???????????????????????? radius:endRadius? ??????????????????????? opti*****: NSGradientDrawsAfterEndingLocation ]; } ?? - ( void ) drawInRect: ( NSRect ) rect? ?????????????? angle: (CGFloat) angle { ???? [ self _initGradientInstance]; ???? [m_Gradient drawInRect:rect angle:angle]; } ?? - ( void ) drawInBezierPath: ( NSBezierPath *) path? ???????????????????? angle: (CGFloat) angle { ???? [ self _initGradientInstance]; ???? [m_Gradient drawInBezierPath:path angle:angle]; } ?? - ( void ) drawRadialInRect: ( NSRect ) rect { ???? [ self _initGradientInstance]; ???? [m_Gradient drawInRect:rect relativeCenterPosition: NSZeroPoint ]; } ?? - ( void ) drawRadialInBezierPath: ( NSBezierPath *) path { ???? [ self _initGradientInstance]; ???? [m_Gradient drawInBezierPath:path relativeCenterPosition: NSZeroPoint ]; } ?? ?? #pragma mark Private Methods /*! ???? @function ???? @abstract?? The private method to init the gradient instance. ???? @discussion Beacuse we need to add color after initialization, we can't init ???????????????? the gradient instance before starting drawing. The method should ???????????????? only be invoked when drawing. ???? @param????? nil ???? @result???? void ???? @exception??? NSInvalidArgumentException If the graident have less than 2 color ???????????????? stops, it will raise this exception. */ - ( void ) _initGradientInstance { ???? // Gradients must have at least two color stops: one defining the location of the start color and one defining the location of the end color. ???? // Gradients may have additional color stops located at different transition points in between the start and end stops. ???? if (__colorsCount < 2) ???????? [ NSException raise: NSInvalidArgumentException format:@ "Color stop of Gradient must be more than 2. We only have %i now." , __colorsCount]; ?????? ???? if ( nil == [ self m_Gradient]) ???? { ???????? CGFloat *locati***** = malloc( sizeof (CGFloat)*__colorsCount); ???????? for ( int i = 0; i < __colorsCount; i++) ???????? { ???????????? locati*****[i] = [[m_Locati***** objectAtIndex:i] floatValue]; ???????? } ???????? NSGradient *tempGradient = [[ NSGradient alloc] initWithColors:m_Colors ?????????????????????????????????????????????????????????? atLocati*****:locati*****? ??????????????????????????????????????????????????????????? colorSpace:[ NSColorSpace deviceRGBColorSpace]]; ???????? [ self setM_Gradient:tempGradient]; ???????? [tempGradient release]; ???????? free(locati*****); ???? } } ?? ?? - ( void ) addColor:( NSColor *) color andLocation:(CGFloat) location { ???? if ( nil == color) ???????? [ NSException raise: NSInvalidArgumentException format:@ "The incoming color can't be nil" ]; ???? if (location < 0.0f || location > 1.0f) ???????? [ NSException raise: NSInvalidArgumentException format:@ "Location value should > 0.0f and < 1.0f. It can't be %f" , location]; ?????? ???? [m_Colors insertObject:color atIndex:__colorsCount]; ???? [m_Locati***** insertObject:[ NSNumber numberWithFloat:location] atIndex:__colorsCount]; ?????? ???? __colorsCount ++; } ?? #pragma mark Accessors ?? - ( NSGradient *) m_Gradient { ???? return m_Gradient; } ?? - ( void ) setM_Gradient: ( NSGradient *) newValue { ???? [m_Gradient autorelease]; ???? m_Gradient = [newValue retain]; } ?? ?? - ( NSMutableArray *) m_Colors { ???? return m_Colors; } ?? - ( void ) setM_Colors: ( NSMutableArray *) newValue { ???? [m_Colors autorelease]; ???? m_Colors = [newValue retain]; } ?? ?? - ( NSMutableArray *) m_Locati***** { ???? return m_Locati*****; } ?? - ( void ) setM_Locati*****: ( NSMutableArray *) newValue { ???? [m_Locati***** autorelease]; ???? m_Locati***** = [newValue retain]; } ?? @end
sVh)Ofn ?
2hHRitt36 ?
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #import <COCOA Cocoa.h> #import "KAGradientProtocol.h" ?? /*! ???? @class ???? @abstract??? Factory class for gradient. ???? @discussion? This is a factory class which uses to create different gradient ????????????????? instance according os's version. */ @interface KAGradient : NSObject <KAGRADIENTPROTOCOL> { ???? id <KAGRADIENTPROTOCOL> m_TheGradient; } ?? - ( id <KAGRADIENTPROTOCOL>) theGradient; - ( void ) SetGradient:( id <KAGRADIENTPROTOCOL>)newGradient; ?? @end
|>ztx}\ ?
Mi.#x_ ?
?
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 #import "KAGradient.h" #import "_KAGradient.h" #import "_NSGradient.h" ?? @implementation KAGradient ?? #pragma mark Protocol Methods + ( id ) gradientWithStartingColor: ( NSColor *) startingColor ????????????????????? endingColor: ( NSColor *) endingColor { ???? return [[[ self alloc] initWithStartingColor:startingColor endingColor:endingColor] autorelease]; } ?? - ( id ) initWithStartingColor: ( NSColor *) startingColor ????????????????? endingColor: ( NSColor *) endingColor { ???? if ( self = [ super init]) ???? { ???????? SInt32 minorVer, majorVer; ???????? Gestalt(gestaltSystemVersionMajor, &majorVer); ???????? Gestalt(gestaltSystemVersionMinor, &minorVer); ?????????? ???????? // Leopard && Snow Leopard ???????? if ((majorVer >= 10)&&(minorVer >= 5)) ???????? { ???????????? [ self SetGradient:[_NSGradient gradientWithStartingColor:startingColor endingColor:endingColor]]; ???????? } ???????? // 10.4 ???????? else if ((majorVer == 10)&&(minorVer == 4) ) ???????? { ???????????? [ self SetGradient:[_KAGradient gradientWithStartingColor:startingColor endingColor:endingColor]]; ???????? } ???????? // Error OS Version ???????? else ???????? { ???????????? [ NSException raise: NSInvalidArgumentException format:@ "You can't use gradient on this OS version. We only support 10.4 and later. You Max OS version is %i.%i" ,? ????????????? majorVer, minorVer]; ???????? } ???? } ???? return self ; } - ( void ) addColorStop: ( NSColor *) stopColor ??????????? atPosition: (CGFloat) position { ???? [m_TheGradient addColorStop:stopColor atPosition:position]; } ?? - ( void ) drawFromPoint: ( NSPoint ) startingPoint ??????????????? toPoint: ( NSPoint ) endingPoint { ???? [m_TheGradient drawFromPoint:startingPoint toPoint:endingPoint]; } ?? - ( void ) drawFromCenter: ( NSPoint ) startingCenter ????????????????? radius: (CGFloat) startRadius ??????????????? toCenter: ( NSPoint ) endCenter ????????????????? radius: (CGFloat) endRadius { ???? [m_TheGradient drawFromCenter:startingCenter radius:startRadius toCenter:endCenter radius:endRadius]; } ?? - ( void ) drawInRect: ( NSRect ) rect? ?????????????? angle: (CGFloat) angle { ???? [m_TheGradient drawInRect:rect angle:angle]; } ?? - ( void ) drawInBezierPath: ( NSBezierPath *) path? ???????????????????? angle: (CGFloat) angle { ???? [m_TheGradient drawInBezierPath:path angle:angle]; } ?? - ( void ) drawRadialInRect: ( NSRect ) rect { ???? [m_TheGradient drawRadialInRect:rect]; } ?? - ( void ) drawRadialInBezierPath: ( NSBezierPath *) path { ???? [m_TheGradient drawRadialInBezierPath:path]; } ?? - ( void ) dealloc { ???? [ self SetGradient: nil ]; ?????? ???? [ super dealloc]; } ?? - ( id <KAGRADIENTPROTOCOL>) theGradient { ???? return m_TheGradient; } - ( void ) SetGradient:( id <KAGRADIENTPROTOCOL>)newGradient { ???? if (m_TheGradient != newGradient) ???? { ???????? if (newGradient != nil && ![newGradient conformsToProtocol: @protocol (KAGradientProtocol)]) ???????? { ???????????? [ NSException raise: NSInvalidArgumentException format:@ "The %@ doesn't implement all methods in KAGradientProtocol." , newGradient]; ???????? } ???????? [m_TheGradient release]; ???????? m_TheGradient = [newGradient retain]; ???? } } ?? @end

總結

以上是生活随笔為你收集整理的[系统控件重绘教程(一)]重绘NSWindow的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲国产精彩中文乱码av | 国产高清视频在线播放 | 一区二区丝袜 | 久久线视频 | 91麻豆精品国产91久久久更新时间 | 伊人超碰在线 | 天天干天天草天天爽 | 国产高清永久免费 | 欧美一区二区视频97 | 99免费看片 | 亚洲一级电影视频 | 国内精品免费 | 久久精品99国产国产精 | 久久久精品一区二区 | 免费a网址 | 日韩中文字幕免费视频 | 精品久久久久国产免费第一页 | 国产精品久久久久久久久软件 | 国产99一区 | 国产电影黄色av | 国产成人精品久久亚洲高清不卡 | 日韩v在线91成人自拍 | 午夜在线免费视频 | 视频一区二区免费 | 欧美日韩午夜在线 | 国产黄a三级三级三级三级三级 | 国产高清精品在线观看 | a黄色一级| 成人黄色影片在线 | 九九精品毛片 | 在线电影中文字幕 | 国产精品igao视频网入口 | 欧美午夜剧场 | 亚洲乱码精品久久久久 | 免费看高清毛片 | 丝袜美女在线 | 韩国一区二区av | 欧美一区二区日韩一区二区 | 日韩三级精品 | 免费国产亚洲视频 | 国产精品区免费视频 | 国产精品免费一区二区三区在线观看 | 黄av资源 | 激情五月激情综合网 | 青青啪 | 色综合久久88色综合天天 | 亚洲性xxxx | 国产成人精品在线观看 | 黄色看片| 婷婷av资源 | 久久九九免费视频 | 欧美日一级片 | 色姑娘综合天天 | 91中文字幕网 | 国产精品网红直播 | 亚洲欧洲精品视频 | 久草综合在线观看 | 97人人视频 | 色999五月色| 精品一区 在线 | 97av影院| 中文字幕a在线 | 91精品国产99久久久久久红楼 | 精品女同一区二区三区在线观看 | 国产黄色大全 | 成人黄色资源 | 青青河边草观看完整版高清 | 日韩精品免费一区二区三区 | 日日摸日日添日日躁av | 九九久久国产精品 | 国产精品免费久久久久影院仙踪林 | 久久成人免费 | 456成人精品影院 | 97日日碰人人模人人澡分享吧 | 999抗病毒口服液 | 成人永久视频 | 激情综合色播五月 | 日韩大片免费在线观看 | 日韩在线观看视频在线 | 99精品国产福利在线观看免费 | 99午夜| 亚洲欧美精品一区二区 | 在线观看成人小视频 | 欧美国产日韩在线视频 | 国产99久久久国产精品 | 国产 中文 日韩 欧美 | 国产高清在线免费观看 | 久久久久一区二区三区 | 国产福利在线免费 | 伊人宗合| 日本韩国欧美在线观看 | 久久不射电影网 | 精品一区久久 | 成人精品亚洲 | 97热视频 | 激情综合网五月 | 亚洲成人免费在线 | 日韩在线播放av | 天天干,夜夜爽 | 免费视频二区 | 欧美日韩一区久久 | www.五月天婷婷.com | 精品一区中文字幕 | 人人干干人人 | 免费看的黄色网 | 成人app在线播放 | 精品视频999 | 成人av在线影院 | 日韩免费三区 | 免费日韩 精品中文字幕视频在线 | 日韩av一区二区在线 | 亚洲一区二区三区毛片 | 久久国产精品一二三区 | 天天天射 | 久久久久在线 | 久草在线观 | 亚洲国产免费网站 | 久久99精品国产99久久6尤 | 综合色狠狠 | 2019精品手机国产品在线 | 黄污在线观看 | 免费在线观看a v | 成人av电影免费观看 | 久久精品之| 国产免费一区二区三区最新 | 99久久精品国产欧美主题曲 | 国产精品美女久久久网av | av电影在线观看完整版一区二区 | 久久久影视 | 亚洲欧美视频网站 | 在线中文字幕观看 | 亚洲国产婷婷 | 少妇搡bbb| 国内精品亚洲 | 国产黄色理论片 | 久久色视频 | 天天翘av | 国产99一区| 日日草夜夜操 | 免费看成人av | 人人爽人人爽人人片 | 国产区精品视频 | 亚洲免费av观看 | 四虎在线免费观看 | 久久国产精品99久久久久久进口 | 久久视了| 午夜久久福利影院 | 丝袜美腿一区 | 亚洲砖区区免费 | 香蕉久久久久 | av在线播放快速免费阴 | 久久久久婷 | 99热九九这里只有精品10 | 成人国产精品入口 | 丁香婷婷色月天 | 999视频在线播放 | 色婷婷丁香 | 亚洲精品18p | 久久av福利 | 国产精品午夜免费福利视频 | 91在线麻豆| 激情网色| 天天插天天干天天操 | 美女在线观看网站 | 欧美一区在线看 | 99爱视频| 美女视频黄色免费 | 99 久久久久 | 18国产精品白浆在线观看免费 | 精品在线视频播放 | 精品久久片| 成人性生交大片免费观看网站 | 四虎国产精品免费观看视频优播 | 手机在线日韩视频 | 黄色一级动作片 | 在线观看日本高清mv视频 | 日韩免费看视频 | 亚洲成人av片在线观看 | 国产精品电影一区 | 中文字幕在线看视频 | 精品久久国产 | 亚洲三级av | 综合黄色网| 日韩在线观看电影 | 国产色啪 | 欧美日韩精品久久久 | 丝袜一区在线 | 国产区久久 | 99精品久久99久久久久 | 精品极品在线 | 国产视频精品网 | 日韩av免费一区二区 | 国产精品成人一区二区三区吃奶 | 久久久久久久久久久成人 | 成人黄色电影在线播放 | www.夜夜操 | 国产一区二区三区免费观看视频 | 国产福利精品一区二区 | 免费看三级 | 尤物九九久久国产精品的分类 | 91精品资源 | 色婷婷狠狠 | 国产福利一区二区三区视频 | 久影院| 精品成人a区在线观看 | 亚洲一一在线 | 人人爽人人爽av | 亚洲毛片在线观看. | 中文字幕免费成人 | 久久免费视频国产 | 国产一区高清在线观看 | 欧美成人69av | 国产特级毛片aaaaaa高清 | 狠狠的干狠狠的操 | 很黄很污的视频网站 | 久保带人| 亚洲国产视频直播 | 色综合久久久久综合体桃花网 | 欧美-第1页-屁屁影院 | 久久99久久精品国产 | 国产精品乱码久久久久 | 欧美激情奇米色 | 91av小视频| 黄色视屏av | 96av视频| 五月婷婷中文网 | 亚洲久草在线 | 国产精品久久久久一区二区 | 亚洲专区视频在线观看 | 国产在线观看免 | 日日爽| 在线视频观看你懂的 | 一区在线观看 | 久久99精品久久久久久久久久久久 | 久久精品一二三区 | 久日精品| 91在线观看欧美日韩 | 日韩在线中文字幕 | 日批视频在线观看免费 | 干干夜夜 | 国产免费视频在线 | 亚洲天堂网在线视频观看 | 日本三级人妇 | 99久久夜色精品国产亚洲96 | 成人午夜电影在线播放 | 久久久免费在线观看 | 欧美精品免费视频 | av免费观看高清 | 国产在线精品区 | 欧美精品国产综合久久 | 国产精品无av码在线观看 | 黄色小网站在线 | 天天操天天干天天爱 | 一本一本久久a久久精品综合 | 欧美国产日韩在线视频 | 亚洲精品中文在线 | 91在线公开视频 | 日韩欧美精品一区二区 | 国产精品久久免费看 | 中文字幕在线观看视频一区二区三区 | 97超碰成人 | 伊人狠狠色丁香婷婷综合 | 中文av一区二区 | 色婷婷免费| av大全在线看 | 99999精品视频 | 久久精品日产第一区二区三区乱码 | 欧美 另类 交 | 久久伊人精品一区二区三区 | 日韩在线免费视频观看 | 国产中文字幕在线观看 | 色婷婷综合视频在线观看 | 日日综合网 | 在线精品在线 | 久久综合中文色婷婷 | 天天色天天爱天天射综合 | 一二三区在线 | 国产精品一区二区电影 | 久久九九视频 | 中文字幕a∨在线乱码免费看 | 亚洲精品中文字幕在线 | 日本中文乱码卡一卡二新区 | 91精品国产自产91精品 | 国产成人精品一区二区三区福利 | 美女视频又黄又免费 | 福利视频入口 | 国产精品你懂的在线观看 | 国产精品入口a级 | 婷婷综合电影 | 国产精品18久久久久vr手机版特色 | 少妇自拍av | 国产精品日韩在线 | 00av视频 | 国产精品自在欧美一区 | 久草电影免费在线观看 | 欧美 亚洲 另类 激情 另类 | 国产精品久久久精品 | 亚洲国产视频网站 | 日韩欧美网址 | 91成人国产 | 欧美日韩在线观看视频 | 亚洲精品合集 | 看黄色91 | 精品国产精品一区二区夜夜嗨 | 欧美一级艳片视频免费观看 | 九九热久久久 | 色综合天天色综合 | 超级碰碰免费视频 | 天天综合网天天 | 国产精品高潮久久av | 色综合天天天天做夜夜夜夜做 | 天天插狠狠干 | 欧美激情综合五月色丁香小说 | 日本婷婷色 | 国产一区欧美在线 | 波多在线视频 | 狠狠狠色丁香婷婷综合久久五月 | www.com.黄 | 中文字幕久久精品 | 国产一线二线三线在线观看 | 国产一区二区精品 | 欧美久草在线 | 久久伊人婷婷 | 免费日韩一区二区三区 | 久av在线| 夜夜澡人模人人添人人看 | 国产资源精品 | 欧美伦理电影一区二区 | 爱射综合 | 91日韩在线专区 | 91精品久久香蕉国产线看观看 | 9在线观看免费高清完整 | 日韩一区二区三区高清在线观看 | 亚洲mv大片欧洲mv大片免费 | 精品久久久久久国产91 | 国产黄色片久久久 | 99久久这里有精品 | 中文字幕亚洲精品在线观看 | 日韩电影一区二区三区 | 日韩中文字幕国产精品 | 亚洲每日更新 | 亚洲成a人片综合在线 | 欧美亚洲国产日韩 | 欧美激情综合五月色丁香小说 | 亚洲国产精品久久久久婷婷884 | 91喷水| 蜜桃视频在线观看一区 | 久久国语露脸国产精品电影 | 最近中文字幕免费av | 国产综合91| 国产一区二区网址 | 国产最新在线视频 | 狠狠狠色丁香综合久久天下网 | 亚洲黄色精品 | 西西4444www大胆无视频 | 国产精品va在线观看入 | 久久天天躁 | 99精品免费视频 | 久久久伦理 | 一区二区三区手机在线观看 | 日韩区视频 | 六月色婷婷 | 香蕉视频在线免费 | 最新免费av在线 | 18做爰免费视频网站 | 国产婷婷精品av在线 | 日韩电影在线看 | 亚洲电影院 | 久久人人精 | 黄色毛片大全 | 欧洲成人免费 | 不卡视频一区二区三区 | 日韩成人在线一区二区 | 亚洲精品视频免费看 | 日本h视频在线观看 | 免费91在线观看 | 免费成人在线视频网站 | 国模视频一区二区 | 国产一区在线观看视频 | 国产欧美久久久精品影院 | 久久97精品| 中文欧美字幕免费 | 成人全视频免费观看在线看 | 精品欧美一区二区三区久久久 | 欧美精品久久99 | 亚洲乱码在线 | 日本公妇色中文字幕 | 天天看天天干天天操 | 黄色av成人在线观看 | 国产真实精品久久二三区 | 伊人久久影视 | 国产精品成人一区二区三区吃奶 | 特级aaa毛片| 久久专区 | 在线看不卡av | 成人影视片 | 天天曰 | 久久精品香蕉 | 狠狠色丁香久久婷婷综合五月 | 欧美另类高清 videos | 欧美精品国产精品 | 日韩精品一区二区三区在线播放 | 狠狠干狠狠久久 | 天天干天天操天天入 | 五月在线 | 色九色| 99久久精品无码一区二区毛片 | 日韩欧美在线中文字幕 | 久久在线观看视频 | 日韩大陆欧美高清视频区 | 亚洲专区 国产精品 | 欧美美女视频在线观看 | 日本久久综合视频 | 天天色天天 | 欧美激情精品 | 久久精品专区 | 久久久国产精华液 | 黄色avwww| 久久夜色精品国产欧美一区麻豆 | 精品欧美在线视频 | 欧美国产三区 | 婷婷激情网站 | 91chinesexxx| 国产成人综合在线观看 | 亚洲成人999 | 日本系列中文字幕 | 亚洲精品乱码久久久久久蜜桃欧美 | 996久久国产精品线观看 | 久久久久国产一区二区三区四区 | 国产成人黄色 | 欧美日韩三区二区 | 69国产成人综合久久精品欧美 | 免费在线h| 奇米网8888 | 欧美日韩在线观看视频 | 国产99精品| 久久久久久久久福利 | 国产精品1区2区3区在线观看 | 在线精品视频在线观看高清 | 久久久久久免费毛片精品 | 6699私人影院 | 国产99久久精品一区二区永久免费 | 欧美日韩在线播放一区 | 国产视频手机在线 | 在线综合 亚洲 欧美在线视频 | 色婷婷在线视频 | 国产成人精品国内自产拍免费看 | 四虎影视精品永久在线观看 | 91在线视频免费 | 一区二区三区在线不卡 | 99精品黄色片免费大全 | 日韩成人免费观看 | 97超级碰碰碰碰久久久久 | 久久久久亚洲精品成人网小说 | 色噜噜色噜噜 | 视频成人永久免费视频 | 亚洲精品日韩一区二区电影 | 亚洲精品66 | 国产生活一级片 | 久久久一本精品99久久精品 | 日日爽 | 成人在线播放视频 | 久久免费片 | 国产高清99 | 91av欧美 | 麻豆91在线观看 | 久久久久久久免费 | 91麻豆精品国产91久久久久 | 青青河边草手机免费 | 在线观看色网站 | 91桃色在线观看视频 | 国产色a在线观看 | 日日操网 | 97在线公开视频 | 伊人国产女 | 91中文在线观看 | 亚洲精品一区二区久 | 久久精品中文字幕免费mv | 不卡的av在线播放 | 欧美一二三视频 | 国内精品视频一区二区三区八戒 | 一区二区视频电影在线观看 | 国产一区欧美二区 | 欧美日韩不卡在线视频 | 色瓜| 国产一级视频在线 | 日韩成人免费观看 | 日韩网站在线观看 | 免费黄色在线播放 | 久久公开免费视频 | 美女免费视频黄 | 国产精品精品国产色婷婷 | 久久伊人精品一区二区三区 | 欧美日韩高清国产 | 免费在线激情视频 | 久久歪歪| 99精品国产在热久久下载 | 伊人五月天.com | 99这里只有久久精品视频 | 99久久这里有精品 | 国产婷婷在线观看 | 欧美夫妻生活视频 | 伊人婷婷在线 | 日韩在线视频观看免费 | 久久精品国产免费看久久精品 | 国产精品久久久久久久久久久杏吧 | 啪啪午夜免费 | 激情导航 | 国产精品视频你懂的 | 亚洲国产一区二区精品专区 | 色噜噜日韩精品一区二区三区视频 | 天天草天天干天天射 | 欧美一级视频免费看 | 国产欧美日韩精品一区二区免费 | 2020天天干天天操 | 天天干天天色2020 | a级一a一级在线观看 | www.亚洲| 4438全国亚洲精品观看视频 | 国产麻豆视频网站 | 免费日韩高清 | 91在线播放综合 | 在线观看av麻豆 | 国产一级电影网 | 日本三级香港三级人妇99 | 国产成人精品一区二区三区福利 | 欧美人牲| 久久公开视频 | 天天色成人网 | 天天躁天天操 | 国产精品久久久久久久免费大片 | 国产黄在线播放 | 美女黄频在线观看 | 人人爽人人爽人人爽 | 可以免费看av | 亚洲1级片 | 日韩欧美在线观看一区二区三区 | 婷婷综合导航 | 久久久久久美女 | 这里只有精品视频在线 | 中文字幕一区二区在线观看 | 国产 日韩 欧美 中文 在线播放 | 精品影院一区二区久久久 | 色a在线观看 | 亚洲热久久 | 色噜噜狠狠色综合中国 | 五月婷婷网站 | 久久免费看视频 | 日韩黄色免费看 | 超碰在线日韩 | 最新av网址在线 | 欧美激情精品久久久久久 | 亚洲精品小视频 | 在线观看国产亚洲 | 国产美女被啪进深处喷白浆视频 | 国产黑丝一区二区 | 国产免费国产 | 亚洲国产成人高清精品 | 中文字幕文字幕一区二区 | 天天色天天色 | 成人免费大片黄在线播放 | 黄色av免费 | 国产一级免费观看 | 超碰人人在 | 69亚洲精品| 成人一级黄色片 | 国产高清绿奴videos | 日日夜夜天天久久 | 精品久久九九 | 日韩av不卡在线观看 | 美女网站在线观看 | 69国产盗摄一区二区三区五区 | 欧美日韩亚洲第一页 | 超碰夜夜 | 亚洲视频久久久 | 看全黄大色黄大片 | 婷婷久久综合九色综合 | 91久久国产露脸精品国产闺蜜 | 亚洲 在线 | 亚洲狠狠操 | 六月色 | 中中文字幕av在线 | 国产精品久久电影网 | 97精品国产97久久久久久 | 久久99热这里只有精品 | 久久人人爽人人爽人人片av软件 | 久久精品电影院 | 国产精品免费不卡 | 亚洲九九爱 | 国产精品精品国产色婷婷 | 亚洲精品乱码久久久久 | 国产色一区 | 久久精品视频在线观看免费 | 免费在线色电影 | 成人免费观看视频网站 | 中文字幕亚洲综合久久五月天色无吗'' | 国产麻豆剧传媒免费观看 | 欧美日韩国产在线一区 | 日韩免费三级 | 国产精品久久久久久爽爽爽 | 九草在线视频 | 91精品国产自产在线观看永久 | jizz欧美性9| 在线免费观看视频 | 欧美一区二区伦理片 | 欧美日韩高清一区二区 | av亚洲产国偷v产偷v自拍小说 | 美女视频黄的免费的 | 日韩av成人在线观看 | 九九久久久久久久久激情 | 欧美日韩精品区 | 国产中文字幕一区二区三区 | 日韩欧美一区二区三区免费观看 | 91最新网址在线观看 | 精品久久久久久综合 | 国产第一页福利影院 | 精品国产成人 | 国产白浆视频 | 国产高清在线不卡 | 91高清一区 | 日本黄色免费电影网站 | 园产精品久久久久久久7电影 | 久久久国产精品网站 | 免费国产视频 | 久久久精品网 | 亚洲 欧美 国产 va在线影院 | 99精品国产一区二区三区麻豆 | 特级毛片在线免费观看 | 亚洲精品男人天堂 | 99久久电影 | 成人国产精品电影 | 在线视频 日韩 | 日韩色av色资源 | 成年人免费看的视频 | 亚洲国产剧情av | 欧美在线观看视频一区二区 | 亚洲精品毛片一级91精品 | 丝袜美腿在线播放 | 天天综合导航 | 国产精品久久久久四虎 | 在线亚洲天堂网 | 日日躁你夜夜躁你av蜜 | 国产男女免费完整视频 | 韩日av一区二区 | 美女在线国产 | 国产高清视频在线观看 | 六月色丁| 久久人人爽人人人人片 | 五月开心六月婷婷 | 久草在线资源免费 | 午夜婷婷综合 | 国产一级片视频 | 亚洲五月婷婷 | 国产v亚洲v | 九九99视频 | 日韩.com | 天天干天天干天天操 | 在线观看岛国av | 国产亚洲精品精品精品 | 国产成人免费在线 | 国产亚州av| 激情深爱.com| 国产视频在线免费观看 | 99久久精品日本一区二区免费 | 99 视频 高清 | 777奇米四色| 99热网站 | av电影免费观看 | 天天操天天干天天插 | 91人人射 | 久久久久久国产精品久久 | 欧美在线free| 99在线精品视频观看 | 国产一二区在线观看 | 久久超碰99 | 亚洲国产精品成人女人久久 | 亚洲欧美视频在线 | 精品久久久免费视频 | 亚洲成人黄 | 日批在线观看 | 91最新网址 | 天天干亚洲 | 一区二区精品视频 | 国产精品久久久久久久久久了 | 少妇搡bbb | 国产日韩视频在线观看 | 成人国产精品久久久春色 | 亚洲精欧美一区二区精品 | 亚洲日日日 | 久久久国产日韩 | 久草免费手机视频 | 精品国产乱码久久久久久1区二区 | 国产精品国产三级在线专区 | 天天干天天干天天操 | 国产精品不卡在线观看 | 欧美成人手机版 | 一区二区在线影院 | 97视频在线免费 | 久久久久久久久精 | 国产精品va在线观看入 | 免费日韩 精品中文字幕视频在线 | 天天天干天天射天天天操 | 欧美精品做受xxx性少妇 | 狠狠色狠狠色终合网 | 一区二区三区福利 | 激情深爱五月 | 亚洲视频专区在线 | 国产黄色精品在线观看 | 日韩在线一二三区 | 深爱五月网 | 成人免费看视频 | 国产精品毛片 | 国产91成人 | 天堂av网址 | 97超碰超碰久久福利超碰 | 亚洲人成人天堂h久久 | 成人a在线观看高清电影 | 午夜精品导航 | 高清av免费看 | 99久久99热这里只有精品 | 丁香六月色 | 亚洲精品456在线播放 | 九九九九色 | 日韩成人免费在线电影 | 开心激情综合网 | 天天操夜夜摸 | 伊在线视频 | 久久免费视频精品 | 国产成人精品福利 | 免费欧美高清视频 | 在线观看午夜 | 免费观看成人 | 久久久久久国产精品美女 | 亚洲欧美日韩在线看 | 亚洲理论影院 | 国产精品国内免费一区二区三区 | 麻豆视频在线看 | 精品国产乱码久久久久久天美 | 日韩在线观看av | 久久婷婷视频 | 色狠狠干 | 国产一区二区在线免费观看 | 成人av免费在线 | 国产一区二区在线播放 | 九九九九热精品免费视频点播观看 | 欧美成人h版在线观看 | a在线播放 | 免费在线电影网址大全 | 免费毛片一区二区三区久久久 | 国产高清免费av | 免费看的黄网站 | 日日爱999 | 成人一级免费电影 | 狠狠狠狠狠狠狠狠 | 亚洲成a人片77777kkkk1在线观看 | 中文字幕丝袜 | www.com久久| 最新久久免费视频 | 97碰碰视频| 日本成人免费在线观看 | 欧美在线视频第一页 | aaa免费毛片 | 一本一本久久a久久精品综合小说 | 久久免费av| 最新午夜电影 | 中文字幕一区二区三区四区视频 | 亚洲精品视频中文字幕 | 色婷婷激情网 | 久草五月 | 麻豆久久精品 | 国产精品女主播一区二区三区 | 日韩一区二区三免费高清在线观看 | 91精品在线麻豆 | 在线视频第一页 | 国产成人精品久久二区二区 | 日本中文一级片 | 五月天天色 | 色视频在线免费 | 丁香婷婷综合五月 | 女人高潮一级片 | 日韩精品视频在线观看免费 | 日韩欧美99 | 天天射天天射天天 | 黄色国产高清 | 欧美日本不卡高清 | 奇米影音四色 | 亚洲国内精品视频 | 亚洲一区二区高潮无套美女 | 国产一二三在线视频 | 丁香综合av | 美女网色| 国产精品四虎 | 成人观看视频 | 性色va | 久久久久久片 | 国产日产高清dvd碟片 | 国产精品久久久久久一区二区 | 久久亚洲二区 | 91视频 - x99av | 精品欧美一区二区精品久久 | 国产天天爽 | 天天操天天色天天 | 久久久999精品视频 国产美女免费观看 | 色网站免费在线观看 | 久久国产精品系列 | 久久电影色 | 日韩.com | 国产二区视频在线观看 | 日韩va在线观看 | 国产三级视频在线 | 亚洲激情电影在线 | 久久99精品国产一区二区三区 | 一区二区三区在线观看免费视频 | 免费成人av网站 | 精品9999| 中文字幕一区二区在线播放 | 婷婷激情综合五月天 | 中文字幕人成乱码在线观看 | 欧美综合久久久 | 久草久草在线 | 毛片基地黄久久久久久天堂 | 99re中文字幕 | 麻豆 free xxxx movies hd | 久久影视一区二区 | 天天躁日日躁狠狠躁av中文 | 在线免费视频 你懂得 | 国产精品专区一 | 91超国产| 欧美日韩视频在线观看一区二区 | 欧美视频18 | 亚洲精品在线看 | 一级黄色在线视频 | 国内少妇自拍视频一区 | 91福利影院在线观看 | 一级片免费观看 | 99r在线视频 | 久久精彩视频 | 国产一级视屏 | 96久久久 | 在线久热 | 婷婷草 | 欧美成年黄网站色视频 | 亚洲精品美女视频 | 日韩欧美一区二区不卡 | 丝袜网站在线观看 | 国产免码va在线观看免费 | 人人插人人做 | 四虎永久视频 | 色婷婷av一区二 | 日韩欧美一区二区三区在线 | 久草色在线观看 | av片一区| 99久久精品免费看国产一区二区三区 | 中字幕视频在线永久在线观看免费 | 96亚洲精品久久 | 免费观看av| 久久精品久久久久久久 | 国产字幕在线播放 | 国产免费久久精品 | 亚洲做受高潮欧美裸体 | 精品久久福利 | 色婷婷亚洲精品 | 欧美成人性战久久 | 中文字幕日韩电影 | 日韩动漫免费观看高清完整版在线观看 | 国产91对白在线播 | 不卡视频一区二区三区 | 探花视频免费观看高清视频 | 久久伊99综合婷婷久久伊 | 国产福利一区在线观看 | 国产一区二区三区黄 | 亚洲国产美女久久久久 | 手机看片福利 | 毛片网站免费在线观看 | 日韩精品在线看 | 97电院网手机版 | 国产剧情av在线播放 | 91av观看| 国产精品v欧美精品 | 精品女同一区二区三区在线观看 | 在线观看中文字幕亚洲 | 在线91av| 四虎成人精品永久免费av | 国产高清视频 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久久久久久蜜桃一区二区 | 免费电影一区二区三区 | 久久 一区 | 欧美大片www | 亚洲专区视频在线观看 | 久久久久女人精品毛片九一 | 丝袜美腿在线视频 | 欧美日比视频 | 婷婷六月天在线 | 国产黑丝一区二区三区 | 成人免费在线观看电影 | 精品在线一区二区 | 国产精品日韩久久久久 | 国产精品综合久久久 | 丁香婷婷久久久综合精品国产 | 久艹视频在线免费观看 | 久久草 | 黄色毛片电影 | 国产在线色 | 国产精品国产自产拍高清av | 国产一区二区在线免费视频 | 国产专区精品 | 色五婷婷 | 久久伦理 | 黄色小说视频网站 | 在线观看中文字幕第一页 | 国产专区一| 丁香六月婷婷综合 | 国产精品99蜜臀久久不卡二区 | 四虎在线免费 | 69国产盗摄一区二区三区五区 | av一本久道久久波多野结衣 | 成人在线视频你懂的 | 国产精品一区在线播放 | 9999国产| 婷婷色中文网 | 婷婷激情欧美 | 国产精品久久9 | 色综合色综合久久综合频道88 | 91精品999| 久久黄色小说视频 | 日韩精品免费在线视频 | 国产成人精品999在线观看 | wwwwww色| 色婷婷国产精品一区在线观看 | 成人午夜电影在线 | www.伊人网 | 在线观看亚洲国产精品 | 国产999精品久久久 免费a网站 | 久久综合加勒比 | 亚洲第一伊人 | 婷婷在线网站 | 久色网 | 免费网站污 | 国语精品免费视频 | 在线视频观看成人 | 久久亚洲精品国产亚洲老地址 | 夜夜躁日日躁 | 久久久高清 | 69视频国产 | 99精品乱码国产在线观看 | 国产五十路毛片 | 国产成人a亚洲精品 | 精品国产视频在线观看 | 欧美激情第十页 | 免费福利在线 | 亚洲无人区小视频 | 欧美国产不卡 | 色999视频 | 欧美日韩高清一区二区三区 | 国产视频亚洲 | 香蕉免费在线 | 91精品国产成人观看 | 久久久福利视频 | 婷婷av综合 | 亚洲午夜精品电影 | 久久毛片高清国产 | 最近免费中文视频 | 成年人在线观看视频免费 | 久久综合五月天婷婷伊人 | 999国产| 午夜国产影院 | 亚洲精品在线观看的 | 国产精品久久久久久一二三四五 | 狠狠地日 | 亚洲男人天堂2018 | 99999精品| 色无五月 | 亚洲自拍偷拍色图 | 五月婷婷丁香在线观看 | 国产无套一区二区三区久久 | 国产一级片久久 | 99久久久国产精品美女 | 亚洲黄色av一区 | 久久久久久久久久电影 | 欧美性久久久久久 | 99精品国产一区二区 | 网站免费黄 | 久草久草在线观看 | 视频成人| 亚洲国产视频a | 玖玖999| 成年人在线观看 | 国产在线播放不卡 | 中文字幕在线观看第二页 | 91污在线观看 | 99热这里只有精品1 av中文字幕日韩 | 不卡av电影在线 | 在线播放亚洲激情 | 青春草国产视频 | 不卡视频在线 | 一级黄色视屏 | 91欧美视频网站 |