рдбрд╛рдЗрд╡рд┐рдВрдЧ рдЧрд╣рд░рд╛: рд╕реАрдПрд╕рдПрд╕ рд╕реЗ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рддрдХ

70 рд╕рд╛рд▓ рдкрд╣рд▓реЗ, 16 рджрд┐рд╕рдВрдмрд░, 1947 рдХреЛ, рдмреЗрд▓ рд▓реИрдмреНрд╕ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛рдУрдВ рдореЗрдВ, рдЬреЙрди рдмреЙрд░реНрдбрд┐рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ рдЬреЙрди рдмрд╛рд░реНрдбрд┐рди рдФрд░ рд╡рд╛рд▓реНрдЯрд░ рдмреНрд░реЗрдЯрди рдиреЗ рдкрд╣рд▓рд╛ рдкрд░рд┐рдЪрд╛рд▓рди рджреНрд╡рд┐рдзреНрд░реБрд╡реА рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдмрдирд╛рдпрд╛ рдерд╛ред 23 рджрд┐рд╕рдВрдмрд░ рдХреЛ, рдмреНрд░реЗрдЯрди рдиреЗ рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдПрдореНрдкрд▓реАрдлрд╛рдпрд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рджрд┐рди рдХреЛ рдЕрдХреНрд╕рд░ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рджрд┐рд╡рд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдмрд╛рд░реНрдбрд┐рди рдмрд╛рдИрдВ рддрд░рдл рдЦрдбрд╝рд╛ рд╣реИ, рдмреНрд░реЗрдЯрди рджрд╛рдпреАрдВ рдУрд░ рдЦрдбрд╝рд╛ рд╣реИ, рд╢реЙрдХреНрд▓реА рдмреИрдареА рд╣реИ

рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдорд╣рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдХреЛ 20 рд╡реАрдВ рд╢рддрд╛рдмреНрджреА рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд┐рд╖реНрдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдЕрднреА рднреА рд▓реИрдВрдк рдФрд░ рд░рд┐рд▓реЗ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдкреВрд░реА рдЗрдорд╛рд░рддреЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдВрдЧреЗред 1956 рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП Shockley, Bardin, рдФрд░ Brattain рдХреЛ рднреМрддрд┐рдХреА рдореЗрдВ рдиреЛрдмреЗрд▓ рдкреБрд░рд╕реНрдХрд╛рд░ рдорд┐рд▓рд╛ред рдЗрди рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдиреЗ рдХреЗрд╡рд▓ рдХреБрдЫ рдкрд░рдорд╛рдгреБрдУрдВ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЕрд░рдмреЛрдВ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдорд╛рдирд╡ рдЬрд╛рддрд┐ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╕рдмрд╕реЗ рд╡рд┐рд╢рд╛рд▓ рдЙрдкрдХрд░рдг рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЖрдЗрдП рдПрдХ рдорд╛рдирд╕рд┐рдХ рдпрд╛рддреНрд░рд╛ рдкрд░ рдЬрд╛рдПрдВ: рд╣рдо рдЕрдкрдиреЗ рдЬрдиреНрдорджрд┐рди - рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рд╕реЗ рдкрде рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗред

рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рд▓реЗрдирд╛ рд╣реИ? рдареАрдХ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╣реИрдмреНрд░рдХреИрдЯ рдмрдЯрди рдбреНрд░рд╛ рдХрд░реЗрдВред

HTML рдФрд░ CSS


рдПрдХ рдмрдЯрди рдореЗрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдкрд┐рдХреНрд╕рд▓реНрд╕, рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рдмреЙрд░реНрдбрд░ рд╣реЛрддреЗ рд╣реИрдВред рдХреЛрдб рдореЗрдВ, <a> рдЯреИрдЧ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП CSS рд▓реЗрдЖрдЙрдЯ рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реАрдПрд╕рдПрд╕ рдирд┐рдпрдо рдЧреЛрд▓ рдХреЛрдиреЛрдВ рдкрд░ рдПрдХ рд╕реАрдорд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ:

border-radius: 3px;
Knop

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реАрдорд╛ рдореЗрдВ рдЪрд╛рд░ рдЦрдВрдб рдФрд░ рдЪрд╛рд░ рдЖрд░реНрдХреНрд╕ (рдПрдХ рд╕рд░реНрдХрд▓ рдХреЗ "рдХреНрд╡рд╛рд░реНрдЯрд░") рд╣реЛрддреЗ рд╣реИрдВред

рдмреНрд░рд╛рдЙрдЬрд╝рд░


рд╢реЛрдз рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдкрд╕рдВрджреАрджрд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд▓рд┐рдпрд╛ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдПрдлрдПрдл рд╣рдорд╛рд░реЗ рдмрдЯрди рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗ, рдЙрд╕реЗ рддрддреНрд╡реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдкрд░ рдмрд╣реБрдд рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ:

  • рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ HTML рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ, DOM рдЯреНрд░реА рд▓рд┐рдЦреЗрдВ
  • CSS рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ, рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
  • рдкреГрд╖реНрда рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╛рдЗрдВрдб рдирд┐рдпрдо
  • рд╕рднреА рджреГрд╢реНрдпрдорд╛рди рдбреЛрдо рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдПрдХ рдкреЗрдбрд╝ рдХреА рд░рдЪрдирд╛ рдХрд░реЗрдВ - рдлреНрд░реЗрдоред
  • рдлрд╝реНрд░реЗрдо рдХреЗ рд▓рд┐рдП, рдЖрдпрд╛рдо рдФрд░ рд╕реНрдерд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ ( рд╡реАрдбрд┐рдпреЛ рджреЗрдЦреЗрдВ )
  • рдЬрд╝реЗрдб-рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ (<рдХреИрдирд╡рд╛рд╕>, рдПрд╕рд╡реАрдЬреА, <рд╡реАрдбрд┐рдпреЛ>) рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдлреНрд░реЗрдо рд╕реЗ рдкрд░рддреЗрдВ рд▓рд┐рдЦреЗрдВред
  • рдХреНрд░рдо рдореЗрдВ рдПрдХ рдбреНрд░рд╛рдЗрдВрдЧ рд╕реВрдЪреА рдмрдирд╛рдПрдВ: рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рд░рдВрдЧ, рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐, рд╕реАрдорд╛, рд╡рдВрд╢рдЬ, рд░реВрдкрд░реЗрдЦрд╛ред

рдЕрддрд┐рд░рд┐рдХреНрддред рдкрдарди рд╕рд╛рдордЧреНрд░реА:

рд╣рдо рдЗрди рдЪрд░рдгреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред рдЙрдирдХреЗ рдмрд╛рдж рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреНрд░рд╛рдЗрдВрдЧ рдЖрддреА рд╣реИред

рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
Mozilla Firefox. Firefox Mercurial Visual Studio C++. VS symbols.mozilla.org. - /layout/.

, , , Firefox. c , , тАФ FF.

NsCSSRenderingBorders.cpp рдлрд╝рд╛рдЗрд▓ рдбреНрд░реЙрдЗрдВрдЧ рдмреЙрд░реНрдбрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ ред рдФрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдмреЙрд░реНрдбрд░реНрд╕ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕реЛрдЪрд╛ рд╣реЛрдЧрд╛): рдбреНрд░реЙрдмреИрдбрд░реНрд╕ () ред рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдорд╛рдорд▓рд╛ рд╣реИ: рд╕реАрдорд╛-рддреНрд░рд┐рдЬреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рддрд░рдл рдХреА рд╕реАрдорд╛рдПрдВ рдареЛрд╕ рдФрд░ рдПрдХ рд╣реА рд░рдВрдЧ рдХреА рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдЕрдЧрд░
if (allBordersSame &&
      mCompositeColors[0] == nullptr &&
      mBorderStyles[0] == NS_STYLE_BORDER_STYLE_SOLID &&
      !mAvoidStroke &&
      !mNoBorderRadius)
  {
    // Relatively simple case.
    gfxRect outerRect = ThebesRect(mOuterRect);
    RoundedRect borderInnerRect(outerRect, mBorderRadii);
    borderInnerRect.Deflate(mBorderWidths[eSideTop],
                            mBorderWidths[eSideBottom],
                            mBorderWidths[eSideLeft],
                            mBorderWidths[eSideRight]);

    // Instead of stroking we just use two paths: an inner and an outer.
    // This allows us to draw borders that we couldn't when stroking. For example,
    // borders with a border width >= the border radius. (i.e. when there are
    // square corners on the inside)
    //
    // Further, this approach can be more efficient because the backend
    // doesn't need to compute an offset curve to stroke the path. We know that
    // the rounded parts are elipses we can offset exactly and can just compute
    // a new cubic approximation.
    RefPtr<PathBuilder> builder = mDrawTarget->CreatePathBuilder();
    AppendRoundedRectToPath(builder, mOuterRect, mBorderRadii, true);
    AppendRoundedRectToPath(builder, ToRect(borderInnerRect.rect), borderInnerRect.corners, false);
    RefPtr<Path> path = builder->Finish();
    mDrawTarget->Fill(path, color);
    return;
  }


рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬреИрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд┐рдВрджреАрджрд╛рд░ рдФрд░ рдзрд░рд╛рд╢рд╛рдпреА рдмреЙрд░реНрдбрд░ рд╡рд╛рд▓реЗ рдХреЛрдиреЛрдВ рдореЗрдВ рдбреЙрдХрд┐рдВрдЧ, рдбреНрд░рд╛рдбреЙрд╕реНрдбрдСрд░реНрдХреНрдбрдбреЙрд░реНрдирд░ () рджреЗрдЦреЗрдВ ред рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдб рдореЗрдВ
рдорд╣рд╛рди рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
    //      radius.width
    // |<----------------->|
    // |                   |
    // |             ___---+-------------
    // |         __--     #|#       ###
    // |       _-        ##|##     #####
    // |     /           ##+##     ##+##
    // |   /             # P #     #####
    // |  |               #|#       ###
    // | |             __--+-------------
    // ||            _-    ^
    // ||          /       |
    // |         /        first dot is filled
    // |        |
    // |       |
    // |      |
    // |      |
    // |      |
    // +------+
    // |##  ##|
    // |##  ##|
    // |##  ##|


рд▓реЗрдХрд┐рди рд╡рд╛рдкрд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдЧрд░ред рдХрдореЗрдВрдЯреНрд░реА рд╕реЗ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рджреЛ рдЖрдпрддреЛрдВ - рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдорд╛ рдЦреАрдВрдЪреА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рдирд┐рд░реНрдорд┐рдд рдкрде (рдкрде) рд╡рд╛рдВрдЫрд┐рдд рд░рдВрдЧ рд╕реЗ рднрд░ рдЬрд╛рддрд╛ рд╣реИред

AppendRoundedRectToPath(builder, mOuterRect, mBorderRadii, true);
AppendRoundedRectToPath(builder, ToRect(borderInnerRect.rect), borderInnerRect.corners, false);
RefPtr<Path> path = builder->Finish();
mDrawTarget->Fill(path, color);

рдкрд░ рдЬрд╛рдПрдВ AppendRoundedRectToPath () gfx / 2 рдбреА / PathHelpers.cpp рдореЗрдВред

рдлрд┐рд░ рд╕реЗ рд╣рдо рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ
a9430-clip-21kb

рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдиреЛрдВ рдХреЛ рдмреЗрдЬрд╝рд┐рдпрд░ рд╡рдХреНрд░ рджреНрд╡рд╛рд░рд╛ рдЪрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рд╣реИ ред рдмреЗрдЬрд┐рдпрд░ рдХрд░реНрд╡реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рд▓рдХреЛрдВ рдФрд░ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рдЖрд░реЗрдЦрдг рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЖрдЧреЗ рд╕реАрдЦрддреЗ рд╣реИрдВ, рд╡рдХреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдВрдХ 0 рдФрд░ 3 рдЖрдпрдд рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдЕрдВрдХ 0, 1 рдФрд░ C рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВ, рдЕрдВрдХ 3, 2 рдФрд░ рджреВрд╕рд░реА рддрд░рдл Cред рдЖрдХреГрддрд┐ рджреЗрдЦреЗрдВ:

рдореЛрдЬрд╝рд┐рд▓рд╛ рдЧреЛрд▓ рд╕реАрдорд╛ bezier рд╡рдХреНрд░

рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЦрдВрдбреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ 01 / 0C рдФрд░ 32 / 3C рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣рд╛рдБ рд▓реЗрдЦрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рджреВ рдХреЛ рдирд┐рд░рдВрддрд░ рдЕрд▓реНрдлрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

const Float alpha = Float(0.55191497064665766025);

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЯрд┐рдкреНрдкрдгреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдЪреЗрдХрдкреЙрдЗрдВрдЯ рдЪрдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓реЗрдЦ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрдХреНрд╕рд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдиреНрдирд┐рдХрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреНрд░реЗрдЬрд╝реЗрдирд╣реИрдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЖрдкрдХреЛ "рдорд╛рдереЗ рдореЗрдВ" рдирд╣реАрдВ - рдЦрдВрдбреЛрдВ рдФрд░ рд╣рд▓рдХреЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдХреЗ y = f (x), рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЪрд╛рд▓рд╛рдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рдеред рднрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдЪреАрдЬ, рдЖрджрд┐ред

рдЪрдХреНрд░ рдореЗрдВ рдЖрдЧреЗ рд╣рдо рдХреЛрдиреЗ рд╕реЗ рдХреЛрдиреЗ рддрдХ рдЬрд╛рддреЗ рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдлрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕реАрдорд╛ рд░реЗрдЦрд╛ рдФрд░ рдХреЛрдиреЗ рдХреЗ рдЪрд╛рдк рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ:

aPathBuilder->LineTo(p0);
aPathBuilder->BezierTo(p1, p2, p3); 

рдЕрддрд┐рд░рд┐рдХреНрддред рдкрдарди рд╕рд╛рдордЧреНрд░реА

рдкреВрд░реНрдг рдкрд░рд┐рд╢рд┐рд╖реНрдЯ
void
AppendRoundedRectToPath(PathBuilder* aPathBuilder,
                        const Rect& aRect,
                        const RectCornerRadii& aRadii,
                        bool aDrawClockwise)
{
  // For CW drawing, this looks like:
  //
  //  ...******0**      1    C
  //              ****
  //                  ***    2
  //                     **
  //                       *
  //                        *
  //                         3
  //                         *
  //                         *
  //
  // Where 0, 1, 2, 3 are the control points of the Bezier curve for
  // the corner, and C is the actual corner point.
  //
  // At the start of the loop, the current point is assumed to be
  // the point adjacent to the top left corner on the top
  // horizontal.  Note that corner indices start at the top left and
  // continue clockwise, whereas in our loop i = 0 refers to the top
  // right corner.
  //
  // When going CCW, the control points are swapped, and the first
  // corner that's drawn is the top left (along with the top segment).
  //
  // There is considerable latitude in how one chooses the four
  // control points for a Bezier curve approximation to an ellipse.
  // For the overall path to be continuous and show no corner at the
  // endpoints of the arc, points 0 and 3 must be at the ends of the
  // straight segments of the rectangle; points 0, 1, and C must be
  // collinear; and points 3, 2, and C must also be collinear.  This
  // leaves only two free parameters: the ratio of the line segments
  // 01 and 0C, and the ratio of the line segments 32 and 3C.  See
  // the following papers for extensive discussion of how to choose
  // these ratios:
  //
  //   Dokken, Tor, et al. "Good approximation of circles by
  //      curvature-continuous Bezier curves."  Computer-Aided
  //      Geometric Design 7(1990) 33--41.
  //   Goldapp, Michael. "Approximation of circular arcs by cubic
  //      polynomials." Computer-Aided Geometric Design 8(1991) 227--238.
  //   Maisonobe, Luc. "Drawing an elliptical arc using polylines,
  //      quadratic, or cubic Bezier curves."
  //      http://www.spaceroots.org/documents/ellipse/elliptical-arc.pdf
  //
  // We follow the approach in section 2 of Goldapp (least-error,
  // Hermite-type approximation) and make both ratios equal to
  //
  //          2   2 + n - sqrt(2n + 28)
  //  alpha = - * ---------------------
  //          3           n - 4
  //
  // where n = 3( cbrt(sqrt(2)+1) - cbrt(sqrt(2)-1) ).
  //
  // This is the result of Goldapp's equation (10b) when the angle
  // swept out by the arc is pi/2, and the parameter "a-bar" is the
  // expression given immediately below equation (21).
  //
  // Using this value, the maximum radial error for a circle, as a
  // fraction of the radius, is on the order of 0.2 x 10^-3.
  // Neither Dokken nor Goldapp discusses error for a general
  // ellipse; Maisonobe does, but his choice of control points
  // follows different constraints, and Goldapp's expression for
  // 'alpha' gives much smaller radial error, even for very flat
  // ellipses, than Maisonobe's equivalent.
  //
  // For the various corners and for each axis, the sign of this
  // constant changes, or it might be 0 -- it's multiplied by the
  // appropriate multiplier from the list before using.

  const Float alpha = Float(0.55191497064665766025);

  typedef struct { Float a, b; } twoFloats;

  twoFloats cwCornerMults[4] = { { -1,  0 },    // cc == clockwise
                                 {  0, -1 },
                                 { +1,  0 },
                                 {  0, +1 } };
  twoFloats ccwCornerMults[4] = { { +1,  0 },   // ccw == counter-clockwise
                                  {  0, -1 },
                                  { -1,  0 },
                                  {  0, +1 } };

  twoFloats *cornerMults = aDrawClockwise ? cwCornerMults : ccwCornerMults;

  Point cornerCoords[] = { aRect.TopLeft(), aRect.TopRight(),
                           aRect.BottomRight(), aRect.BottomLeft() };

  Point pc, p0, p1, p2, p3;

  if (aDrawClockwise) {
    aPathBuilder->MoveTo(Point(aRect.X() + aRadii[RectCorner::TopLeft].width,
                               aRect.Y()));
  } else {
    aPathBuilder->MoveTo(Point(aRect.X() + aRect.Width() - aRadii[RectCorner::TopRight].width,
                               aRect.Y()));
  }

  for (int i = 0; i < 4; ++i) {
    // the corner index -- either 1 2 3 0 (cw) or 0 3 2 1 (ccw)
    int c = aDrawClockwise ? ((i+1) % 4) : ((4-i) % 4);

    // i+2 and i+3 respectively.  These are used to index into the corner
    // multiplier table, and were deduced by calculating out the long form
    // of each corner and finding a pattern in the signs and values.
    int i2 = (i+2) % 4;
    int i3 = (i+3) % 4;

    pc = cornerCoords[c];

    if (aRadii[c].width > 0.0 && aRadii[c].height > 0.0) {
      p0.x = pc.x + cornerMults[i].a * aRadii[c].width;
      p0.y = pc.y + cornerMults[i].b * aRadii[c].height;

      p3.x = pc.x + cornerMults[i3].a * aRadii[c].width;
      p3.y = pc.y + cornerMults[i3].b * aRadii[c].height;

      p1.x = p0.x + alpha * cornerMults[i2].a * aRadii[c].width;
      p1.y = p0.y + alpha * cornerMults[i2].b * aRadii[c].height;

      p2.x = p3.x - alpha * cornerMults[i3].a * aRadii[c].width;
      p2.y = p3.y - alpha * cornerMults[i3].b * aRadii[c].height;

      aPathBuilder->LineTo(p0);
      aPathBuilder->BezierTo(p1, p2, p3);
    } else {
      aPathBuilder->LineTo(pc);
    }
  }

  aPathBuilder->Close();
}


рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рд╕рдм 2 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдмреИрдХрдПрдВрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореЛрдЬрд╝рд┐рд▓рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЗрдВрдЬрди


рдЧреЗрдХреЛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдЗрдВрдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдореЛрдЬрд╝ 2 рдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдмреИрдХрдПрдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдХрд╛рд╣рд┐рд░рд╛, рд╕реНрдХрд┐рдпрд╛, рдбрд╛рдпрд░реЗрдХреНрдЯ 2 рдбреА, рдХреНрд╡рд╛рд░реНрдЯреНрдЬ рдФрд░ рдПрдирд╡реА рдкрдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд╛рдпрд░реЗрдХреНрдЯ 2 рдбреА, рдХрд╛рд╣рд┐рд░рд╛, рд╕реНрдХрд┐рдпрд╛ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╕реНрдХреАрдпрд╛ рднреА рдХреНрд░реЛрдорд┐рдпрдо рдмреИрдХрдПрдВрдб рд╣реИред рдЖрдк рдмреИрдХрдПрдВрдб рдХреЛ рд▓рдЧрднрдЧ: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдмреИрдХрдПрдВрдб, рдмрджрд▓реЗ рдореЗрдВ, рд╕реАрдкреАрдпреВ рдкрд░ рд╕рдм рдХреБрдЫ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╡реЗ рдХреБрдЫ рд╣рдж рддрдХ GPU рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХрд┐рдЖ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ OpenGL рдмреИрдХреЗрдВрдб рд╣реИрдВ - рдЧрдгреЗрд╢ред

Direct2D рдХреЛрдб рдмрдВрдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо Skia рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдХреНрдпреВрдмрд┐рдХ рд╡рдХреНрд░ SkPath :: cubicTo рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╡рдХреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдбреА рд╕рд┐рд╕реНрдЯреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рдХрдИ рд╕реАрдзреЗ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреАрдВрдЪреЗ рдЧрдП рд╣реИрдВ (рджреЗрдЦреЗрдВ рдХреЛрд░ / рд╕реНрдХреЗрдЧреАрдореЗрдЯреНрд░реАред рд╕реАрдкреАрдкреА)ред

рдЕрддрд┐рд░рд┐рдХреНрддред рдкрдарди рд╕рд╛рдордЧреНрд░реА

рдорд╢реАрди рдХреЛрдб


рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реНрдХрд┐рдпрд╛ рдЗрдВрдЯрд░реНрдирд▓ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд▓реЗ рд▓рд┐рдпрд╛ - AppendRoundedRectToPath (), рдЬрд╣рд╛рдВ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдкрд░ рд╕рднреА рдСрдкрд░реЗрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рдЬреЛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдЕрд╕рдВрддреБрд╖реНрдЯ рдХреЛрдб рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрд╢рди рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ред

...
142B1863 00 00                add         byte ptr [eax],al  
142B1865 00 8D 43 FF 0F 84    add         byte ptr [ebp-7BF000BDh],cl  
142B186B 67 01 00             add         dword ptr [bx+si],eax  
142B186E 00 99 0F 57 C9 F7    add         byte ptr [ecx-836A8F1h],bl  
142B1874 F9                   stc  
142B1875 8B C3                mov         eax,ebx  
142B1877 8B CA                mov         ecx,edx  
142B1879 99                   cdq  
142B187A F7 7C 24 28          idiv        eax,dword ptr [esp+28h]  
...

рдЕрд╣рд╛! рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдПрд╕рдПрдо рд╕реЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬрд┐рддрдирд╛ рджреВрд░ рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдбреАрдбреА рдСрдкрд░реЗрд╢рди рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред : рдкрд╣рд▓рд╛ рдХрджрдо рдмрдврд╝рд╛рдПрдВ

142B1863 00 00 add byte ptr [eax],al
рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрддрд╛ - 0x142B1863
0x00 - opcode - рд╕реАрдкреАрдпреВ рдЕрдиреБрджреЗрд╢ рдХреЛрдбред рдЗрд╕ рдореЛрдЬрд╝рд┐рд▓рд╛ рдХреЛ x86 рдХреЗ рддрд╣рдд рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ x86 рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдЯреЗрдмрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдкрд░ , рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЛрдб 00 рдХрд╛ рдЕрд░реНрде рд╣реИ ADD mnemonics рдХреЗ рд╕рд╛рде 8-рдмрд┐рдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЪрд╛рд▓рдиред рдкрд╣рд▓рд╛ рдСрдкрд░реЗрдВрдб рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдпрд╛ рд░реИрдВрдбрдо рдПрдХреНрд╕реЗрд╕ рдореЗрдореЛрд░реА рд╕реЗрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдСрдкрд░реЗрдВрдб рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБ, рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЕрд▓реНрдЯреНрд░рд╛рдлрд╛рд╕реНрдЯ рд░реИрдо рдореЗрдореЛрд░реА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рджреВрд╕рд░реА рдмрд╛рдЗрдЯ рднреА 0x00 рд╣реИ рдФрд░ рдЗрд╕реЗ MOD-REG-R / M рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдЯреНрд╕ рдСрдкрд░реЗрдВрдб рдФрд░ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред



R = M = 000b рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ MOD = 00b рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдмреЛрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ
REG = 000b рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ AL рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (EAX рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдирд┐рдЪрд▓реЗ 8 рдмрд┐рдЯреНрд╕)
[eax] - рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЬреЛрдбрд╝ рд░реИрдо рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, EAX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдХрд┐рд╕рдХрд╛ рдкрддрд╛ рд╣реИред

рдкреНрд░реЛрд╕реЗрд╕рд░ ADD рдХрдорд╛рдВрдб рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ?

рдкреНрд░реЛрд╕реЗрд╕рд░


рд╕реНрдХрд╛рдИрд▓реЗрдХ рдорд╛рдЗрдХреНрд░реЛрдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╡рд░реНрдгрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдЪрд░рдгреЛрдВ рдХреА рдПрдХ (рдЕрддреНрдпрдВрдд рд╕рд░рд▓реАрдХреГрдд) рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХреА:

  1. X86 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ 32KB L1 рдирд┐рд░реНрджреЗрд╢ рдХреИрд╢ рд╕реЗ 16-рдмрд╛рдЗрдЯ рдХреЗ рдкреНрд░реАрдбреЛрдбрд┐рдВрдЧ рдмрдлрд░ рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  2. рдкреНрд░реАрдХреЛрдб рдХрд┐рдП рдЧрдП рдХрдорд╛рдВрдб рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреНрдпреВ (рдЖрдХрд╛рд░ рдореЗрдВ 2x25) рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рдХреЛрдбрд░реНрд╕ рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ
  3. x86 1-4 (┬╡OPs). ADD 1 ┬╡OP ALU (- ) 2 ┬╡OP AGU ( ) (., ). 86 .
  4. Allocation Queue (IDQ). , Loop Stream Detector тАФ .
  5. : , . . .
  6. рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЗрд╢рди рдпреВрдирд┐рдлрд╛рдЗрдб рд╢реЗрдбреНрдпреВрд▓рд░ рдореИрдиреЗрдЬрд░ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рдФрд░ рдХрд┐рд╕ рдкреЛрд░реНрдЯ рдкрд░ рд░рд╕реАрдж рдХреЗ рдЖрджреЗрд╢ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрд╢рди рднреЗрдЬреЗ рдЬрд╛рдПрдВред рдкреНрд░рддреНрдпреЗрдХ рдмрдВрджрд░рдЧрд╛рд╣ рдХреЗ рдкреАрдЫреЗ рдПрдХ рдПрдХреНрдЪреБрдПрдЯрд░ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛ рдСрдкрд░реЗрд╢рди ALU рдФрд░ AGU рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗред


рд╕реНрдХрд╛рдИрд▓реЗрдХ рдХрд╛ рдореВрд▓ред En.wikichip.org рд╕реЗ рдЪрд┐рддреНрд░ ред

рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдпрд╣ рдореЗрд░рд╛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд┐рд╡рд░рдг рд╣реИ рдФрд░ рд╕рдЯреАрдХ рдФрд░ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХрд╛ рдвреЛрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдЧреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрдВрдЯреЗрд▓ рдХреЛрд░ i7 рдкрд░рд┐рд╡рд╛рд░ рд╕реЗ рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рд▓реЗрдЦ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЛрд╕реНрдЯ рдЬрд░реНрдиреА рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ

ALU


рдЕрдм рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ ALU рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ: рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдорд╛рдЗрдХреНрд░реЛрдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ ALU рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЗрдВрдЯреЗрд▓ рдХрд╛ рд╡реНрдпрд╛рдкрд╛рд░ рд░рд╣рд╕реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд╛рдж рдореЗрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред

рджреЛ рдмрд╛рдЗрдирд░реА рдмрд┐рдЯреНрд╕ (рдпрд╛рдиреА рдереЛрдбрд╝рд╛) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЛ рдПрдХ рдпреЛрдЬрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЖрдЙрдЯрдкреБрдЯ рд╕рдо рдФрд░ рдХреИрд░реА рдмрд┐рдЯ рд╣реИред


рд╕реНрд░реЛрдд: рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛

рдХреЗ рдмрд╛рдж рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рд╣рдореЗрдВ рдХрдИ рдЕрдВрдХреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдпреЛрдЬрдХ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЕрдВрдХ рд╕реЗ рдХреИрд░реА рдмрд┐рдЯ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдпреЛрдЬрдХ рдХреЛ рдкреВрд░реНрдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред


рд╕реНрд░реЛрдд: рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдХреГрддрд┐ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпреЛрдЬрдХ рддрд░реНрдХ рддрддреНрд╡реЛрдВ рд╕реЗ рдмрдирд╛ рд╣реИ: XOR, AND, ORред рдФрд░ рд╣рд░ рддрд╛рд░реНрдХрд┐рдХ рддрддреНрд╡рдХрдИ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдпрд╛ рдПрдХ рд░рд┐рд▓реЗ рднреА ред CMOS рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░

рдореИрдЯреЙрд╕, рд╕реАрдПрдордУрдПрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди, рдПрдЪ 20 / 6/6
рдкрд░ рдкреВрд░реНрдг рдпреЛрдЬрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ред рд╕реНрд░реЛрдд

рддреЛ рд╣рдо рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдорд┐рд▓ рдЧрдпрд╛! рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рди рдХреЗрд╡рд▓ рдПрдПрд▓рдпреВ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрдХрд╛рдЗрдпрд╛рдВ рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдХреИрд╢ рдореЗрдВ рдЗрд╕рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдпреЛрдЬрдХ рд╕рд░реНрдХрд┐рдЯ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрдЯреЗрд▓ 8008 45 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╕рднреА рдХреИрд░реА рдмрд┐рдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ (рд╕рдорд╛рдирд╛рдВрддрд░ рдХреИрд░реА рдХреЗ рд╕рд╛рде рддрдерд╛рдХрдерд┐рдд рдпреЛрдЬрдХ)ред рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдмреНрд▓реЙрдЧ рдореЗрдВ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ ALU Intel 8008 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдкрдврд╝реЗрдВрдХреЗрди рд╢рд┐рд░рд┐рдлред рдпрд╛рдиреА рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреБрдгрди "рд╕рд┐рд░ рдкрд░" рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдлрд╛рдпрджреЗрдордВрдж рд╣реИ ред

рдирд┐рд╖реНрдХрд░реНрд╖: рд╣рдордиреЗ рдХреНрдпрд╛ рд╕реАрдЦрд╛?


  • рдпрд╣ рдЬрдЯрд┐рд▓ рд╣реИ
  • рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЕрддреНрдпрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдВрдЬреАрдирд┐рдпрд░ рдЬрдЯрд┐рд▓ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕реНрддрд░реЛрдВ (рдкрд░рддреЛрдВ) рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  • рдмрд╣реБрд╕реНрддрд░реАрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИред
  • рд╕реНрддрд░реЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдЗрдВрдЯрд░рдлреЗрд╕, рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЦреБрд▓реЗрдкрди рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП HTML рдФрд░ CSS, C ++, x86 рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рд╕реЗрдЯ, рдЖрджрд┐ред
  • рджрд┐рди рдХрд╛ рд╣рдорд╛рд░рд╛ рдирд╛рдпрдХ рдмрд╣реБрдд рдиреАрдЪреЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ - рдПрдХ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ ред

рдкреБрдирд╢реНрдЪ рдХреЗ рдмрд╛рдж рд╕реЗ рдореИрдВ рдПрдХ рд╢реМрдХрд┐рдпрд╛ (рд╡реЗрдм тАЛтАЛрдбреЗрд╡рд▓рдкрд░) рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ C ++, ASM, BT рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛рдлреА рдХреБрдЫ - рдЗрдВрд╕реНрдЯреАрдЯреНрдпреВрдЯ рдХреЛрд░реНрд╕ рд╕реЗ, рдореИрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгреА рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

Source: https://habr.com/ru/post/hi400363/


All Articles