Changeset 121127 in webkit


Ignore:
Timestamp:
Jun 24, 2012 6:46:14 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Add snap to css3-images image-resolution
https://bugs.webkit.org/show_bug.cgi?id=89745

Patch by David Barr <davidbarr@chromium.org> on 2012-06-24
Reviewed by Tony Chang.

Source/WebCore:

Due to floating point imprecision, it is difficult to be precise in dpcm.
So use PrimitiveValue::roundForImpreciseConversion rather than just floor.

No new tests; extended fast/css/image-resolution/image-resolution.html

  • css/CSSParser.cpp: Accept snap identifier in image-resolution property.

(WebCore::CSSParser::parseImageResolution): Map CSSValueSnap to identifier value from cssValuePool.

  • css/CSSValueKeywords.in: Add snap.
  • css/StyleBuilder.cpp: Extend ApplyPropertyImageResolution to apply RenderStyle::imageResolutionSnap.

(WebCore::ApplyPropertyImageResolution::applyInheritValue): Apply RenderStyle::imageResolutionSnap.
(WebCore::ApplyPropertyImageResolution::applyInitialValue): Apply RenderStyle::imageResolutionSnap.
(WebCore::ApplyPropertyImageResolution::applyValue): Map CSSValueSnap to ImageResolutionSnapPixels.

  • rendering/RenderImage.cpp: Extend conditions for recalculation of intrinsic size.

(WebCore::RenderImage::styleDidChange): Update intrinsic size if RenderStyle::imageResolutionSnap() has changed.
(WebCore::RenderImage::imageDimensionsChanged): Floor scale factor to int, round up if less than 0.01 away from ceiling.

  • rendering/style/RenderStyle.cpp: Include StyleRareInheritedData::m_imageResolutionSnap in style diff.

(WebCore::RenderStyle::diff): Map change in StyleRareInheritedData::m_imageResolutionSnap to StyleDifferenceLayout.

  • rendering/style/RenderStyle.h: Add RenderStyle::imageResolutionSnap, RenderStyle::setImageResolutionSnap, RenderStyle::initialImageResolutionSnap.
  • rendering/style/RenderStyleConstants.h: Add enum ImageResolutionSnap.
  • rendering/style/StyleRareInheritedData.cpp: Add StyleRareInheritedData::m_imageResolutionSnap.

(WebCore::StyleRareInheritedData::StyleRareInheritedData): Add m_imageResolutionSnap to default and copy constructor.
(WebCore::StyleRareInheritedData::operator==): Include m_imageResolutionSnap in comparison.

  • rendering/style/StyleRareInheritedData.h: Add StyleRareInheritedData::m_imageResolutionSnap.

(StyleRareInheritedData): Add 1-bit field StyleRareInheritedData::m_imageResolutionSnap.

LayoutTests:

  • fast/css/image-resolution/image-resolution-expected.txt:
  • fast/css/image-resolution/image-resolution.html:
Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r121121 r121127  
     12012-06-24  David Barr  <davidbarr@chromium.org>
     2
     3        Add snap to css3-images image-resolution
     4        https://bugs.webkit.org/show_bug.cgi?id=89745
     5
     6        Reviewed by Tony Chang.
     7
     8        * fast/css/image-resolution/image-resolution-expected.txt:
     9        * fast/css/image-resolution/image-resolution.html:
     10
    1112012-06-24  Oli Lan  <olilan@chromium.org>
    212
  • trunk/LayoutTests/fast/css/image-resolution/image-resolution-expected.txt

    r120641 r121127  
    220220PASS img.offsetWidth is 16
    221221PASS img.offsetHeight is 16
     222TEST "0dppx snap"
     223PASS img.style.cssText is ""
     224TEST "snap 0dppx"
     225PASS img.style.cssText is ""
     226TEST "1dppx snap"
     227PASS img.style.cssText is "image-resolution: 1dppx snap; "
     228PASS img.offsetWidth is 16
     229PASS img.offsetHeight is 16
     230TEST "snap 1dppx"
     231PASS img.style.cssText is "image-resolution: snap 1dppx; "
     232PASS img.offsetWidth is 16
     233PASS img.offsetHeight is 16
     234TEST "2dppx snap"
     235PASS img.style.cssText is "image-resolution: 2dppx snap; "
     236PASS img.offsetWidth is 8
     237PASS img.offsetHeight is 8
     238TEST "snap 2dppx"
     239PASS img.style.cssText is "image-resolution: snap 2dppx; "
     240PASS img.offsetWidth is 8
     241PASS img.offsetHeight is 8
     242TEST "3dppx snap"
     243PASS img.style.cssText is "image-resolution: 3dppx snap; "
     244PASS img.offsetWidth is 5
     245PASS img.offsetHeight is 5
     246TEST "snap 3dppx"
     247PASS img.style.cssText is "image-resolution: snap 3dppx; "
     248PASS img.offsetWidth is 5
     249PASS img.offsetHeight is 5
     250TEST "4dppx snap"
     251PASS img.style.cssText is "image-resolution: 4dppx snap; "
     252PASS img.offsetWidth is 4
     253PASS img.offsetHeight is 4
     254TEST "snap 4dppx"
     255PASS img.style.cssText is "image-resolution: snap 4dppx; "
     256PASS img.offsetWidth is 4
     257PASS img.offsetHeight is 4
     258TEST "0dpi snap"
     259PASS img.style.cssText is ""
     260TEST "snap 0dpi"
     261PASS img.style.cssText is ""
     262TEST "96dpi snap"
     263PASS img.style.cssText is "image-resolution: 96dpi snap; "
     264PASS img.offsetWidth is 16
     265PASS img.offsetHeight is 16
     266TEST "snap 96dpi"
     267PASS img.style.cssText is "image-resolution: snap 96dpi; "
     268PASS img.offsetWidth is 16
     269PASS img.offsetHeight is 16
     270TEST "192dpi snap"
     271PASS img.style.cssText is "image-resolution: 192dpi snap; "
     272PASS img.offsetWidth is 8
     273PASS img.offsetHeight is 8
     274TEST "snap 192dpi"
     275PASS img.style.cssText is "image-resolution: snap 192dpi; "
     276PASS img.offsetWidth is 8
     277PASS img.offsetHeight is 8
     278TEST "288dpi snap"
     279PASS img.style.cssText is "image-resolution: 288dpi snap; "
     280PASS img.offsetWidth is 5
     281PASS img.offsetHeight is 5
     282TEST "snap 288dpi"
     283PASS img.style.cssText is "image-resolution: snap 288dpi; "
     284PASS img.offsetWidth is 5
     285PASS img.offsetHeight is 5
     286TEST "384dpi snap"
     287PASS img.style.cssText is "image-resolution: 384dpi snap; "
     288PASS img.offsetWidth is 4
     289PASS img.offsetHeight is 4
     290TEST "snap 384dpi"
     291PASS img.style.cssText is "image-resolution: snap 384dpi; "
     292PASS img.offsetWidth is 4
     293PASS img.offsetHeight is 4
     294TEST "150dpi snap"
     295PASS img.style.cssText is "image-resolution: 150dpi snap; "
     296PASS img.offsetWidth is 16
     297PASS img.offsetHeight is 16
     298TEST "snap 150dpi"
     299PASS img.style.cssText is "image-resolution: snap 150dpi; "
     300PASS img.offsetWidth is 16
     301PASS img.offsetHeight is 16
     302TEST "300dpi snap"
     303PASS img.style.cssText is "image-resolution: 300dpi snap; "
     304PASS img.offsetWidth is 5
     305PASS img.offsetHeight is 5
     306TEST "snap 300dpi"
     307PASS img.style.cssText is "image-resolution: snap 300dpi; "
     308PASS img.offsetWidth is 5
     309PASS img.offsetHeight is 5
     310TEST "450dpi snap"
     311PASS img.style.cssText is "image-resolution: 450dpi snap; "
     312PASS img.offsetWidth is 4
     313PASS img.offsetHeight is 4
     314TEST "snap 450dpi"
     315PASS img.style.cssText is "image-resolution: snap 450dpi; "
     316PASS img.offsetWidth is 4
     317PASS img.offsetHeight is 4
     318TEST "600dpi snap"
     319PASS img.style.cssText is "image-resolution: 600dpi snap; "
     320PASS img.offsetWidth is 2
     321PASS img.offsetHeight is 2
     322TEST "snap 600dpi"
     323PASS img.style.cssText is "image-resolution: snap 600dpi; "
     324PASS img.offsetWidth is 2
     325PASS img.offsetHeight is 2
     326TEST "0dpcm snap"
     327PASS img.style.cssText is ""
     328TEST "snap 0dpcm"
     329PASS img.style.cssText is ""
     330TEST "37.7dpcm snap"
     331PASS img.style.cssText is "image-resolution: 37.7dpcm snap; "
     332PASS img.offsetWidth is 16
     333PASS img.offsetHeight is 16
     334TEST "snap 37.7dpcm"
     335PASS img.style.cssText is "image-resolution: snap 37.7dpcm; "
     336PASS img.offsetWidth is 16
     337PASS img.offsetHeight is 16
     338TEST "75.5dpcm snap"
     339PASS img.style.cssText is "image-resolution: 75.5dpcm snap; "
     340PASS img.offsetWidth is 8
     341PASS img.offsetHeight is 8
     342TEST "snap 75.5dpcm"
     343PASS img.style.cssText is "image-resolution: snap 75.5dpcm; "
     344PASS img.offsetWidth is 8
     345PASS img.offsetHeight is 8
     346TEST "113.3dpcm snap"
     347PASS img.style.cssText is "image-resolution: 113.3dpcm snap; "
     348PASS img.offsetWidth is 5
     349PASS img.offsetHeight is 5
     350TEST "snap 113.3dpcm"
     351PASS img.style.cssText is "image-resolution: snap 113.3dpcm; "
     352PASS img.offsetWidth is 5
     353PASS img.offsetHeight is 5
     354TEST "151.1dpcm snap"
     355PASS img.style.cssText is "image-resolution: 151.1dpcm snap; "
     356PASS img.offsetWidth is 4
     357PASS img.offsetHeight is 4
     358TEST "snap 151.1dpcm"
     359PASS img.style.cssText is "image-resolution: snap 151.1dpcm; "
     360PASS img.offsetWidth is 4
     361PASS img.offsetHeight is 4
     362TEST "snap"
     363PASS img.style.cssText is ""
     364TEST "0dppx from-image snap"
     365PASS img.style.cssText is ""
     366TEST "0dppx snap from-image"
     367PASS img.style.cssText is ""
     368TEST "from-image 0dppx snap"
     369PASS img.style.cssText is ""
     370TEST "from-image snap 0dppx"
     371PASS img.style.cssText is ""
     372TEST "snap 0dppx from-image"
     373PASS img.style.cssText is ""
     374TEST "snap from-image 0dppx"
     375PASS img.style.cssText is ""
     376TEST "1dppx from-image snap"
     377PASS img.style.cssText is "image-resolution: 1dppx from-image snap; "
     378PASS img.offsetWidth is 16
     379PASS img.offsetHeight is 16
     380TEST "1dppx snap from-image"
     381PASS img.style.cssText is "image-resolution: 1dppx snap from-image; "
     382PASS img.offsetWidth is 16
     383PASS img.offsetHeight is 16
     384TEST "from-image 1dppx snap"
     385PASS img.style.cssText is "image-resolution: from-image 1dppx snap; "
     386PASS img.offsetWidth is 16
     387PASS img.offsetHeight is 16
     388TEST "from-image snap 1dppx"
     389PASS img.style.cssText is "image-resolution: from-image snap 1dppx; "
     390PASS img.offsetWidth is 16
     391PASS img.offsetHeight is 16
     392TEST "snap 1dppx from-image"
     393PASS img.style.cssText is "image-resolution: snap 1dppx from-image; "
     394PASS img.offsetWidth is 16
     395PASS img.offsetHeight is 16
     396TEST "snap from-image 1dppx"
     397PASS img.style.cssText is "image-resolution: snap from-image 1dppx; "
     398PASS img.offsetWidth is 16
     399PASS img.offsetHeight is 16
     400TEST "2dppx from-image snap"
     401PASS img.style.cssText is "image-resolution: 2dppx from-image snap; "
     402PASS img.offsetWidth is 8
     403PASS img.offsetHeight is 8
     404TEST "2dppx snap from-image"
     405PASS img.style.cssText is "image-resolution: 2dppx snap from-image; "
     406PASS img.offsetWidth is 8
     407PASS img.offsetHeight is 8
     408TEST "from-image 2dppx snap"
     409PASS img.style.cssText is "image-resolution: from-image 2dppx snap; "
     410PASS img.offsetWidth is 8
     411PASS img.offsetHeight is 8
     412TEST "from-image snap 2dppx"
     413PASS img.style.cssText is "image-resolution: from-image snap 2dppx; "
     414PASS img.offsetWidth is 8
     415PASS img.offsetHeight is 8
     416TEST "snap 2dppx from-image"
     417PASS img.style.cssText is "image-resolution: snap 2dppx from-image; "
     418PASS img.offsetWidth is 8
     419PASS img.offsetHeight is 8
     420TEST "snap from-image 2dppx"
     421PASS img.style.cssText is "image-resolution: snap from-image 2dppx; "
     422PASS img.offsetWidth is 8
     423PASS img.offsetHeight is 8
     424TEST "3dppx from-image snap"
     425PASS img.style.cssText is "image-resolution: 3dppx from-image snap; "
     426PASS img.offsetWidth is 5
     427PASS img.offsetHeight is 5
     428TEST "3dppx snap from-image"
     429PASS img.style.cssText is "image-resolution: 3dppx snap from-image; "
     430PASS img.offsetWidth is 5
     431PASS img.offsetHeight is 5
     432TEST "from-image 3dppx snap"
     433PASS img.style.cssText is "image-resolution: from-image 3dppx snap; "
     434PASS img.offsetWidth is 5
     435PASS img.offsetHeight is 5
     436TEST "from-image snap 3dppx"
     437PASS img.style.cssText is "image-resolution: from-image snap 3dppx; "
     438PASS img.offsetWidth is 5
     439PASS img.offsetHeight is 5
     440TEST "snap 3dppx from-image"
     441PASS img.style.cssText is "image-resolution: snap 3dppx from-image; "
     442PASS img.offsetWidth is 5
     443PASS img.offsetHeight is 5
     444TEST "snap from-image 3dppx"
     445PASS img.style.cssText is "image-resolution: snap from-image 3dppx; "
     446PASS img.offsetWidth is 5
     447PASS img.offsetHeight is 5
     448TEST "4dppx from-image snap"
     449PASS img.style.cssText is "image-resolution: 4dppx from-image snap; "
     450PASS img.offsetWidth is 4
     451PASS img.offsetHeight is 4
     452TEST "4dppx snap from-image"
     453PASS img.style.cssText is "image-resolution: 4dppx snap from-image; "
     454PASS img.offsetWidth is 4
     455PASS img.offsetHeight is 4
     456TEST "from-image 4dppx snap"
     457PASS img.style.cssText is "image-resolution: from-image 4dppx snap; "
     458PASS img.offsetWidth is 4
     459PASS img.offsetHeight is 4
     460TEST "from-image snap 4dppx"
     461PASS img.style.cssText is "image-resolution: from-image snap 4dppx; "
     462PASS img.offsetWidth is 4
     463PASS img.offsetHeight is 4
     464TEST "snap 4dppx from-image"
     465PASS img.style.cssText is "image-resolution: snap 4dppx from-image; "
     466PASS img.offsetWidth is 4
     467PASS img.offsetHeight is 4
     468TEST "snap from-image 4dppx"
     469PASS img.style.cssText is "image-resolution: snap from-image 4dppx; "
     470PASS img.offsetWidth is 4
     471PASS img.offsetHeight is 4
     472TEST "0dpi from-image snap"
     473PASS img.style.cssText is ""
     474TEST "0dpi snap from-image"
     475PASS img.style.cssText is ""
     476TEST "from-image 0dpi snap"
     477PASS img.style.cssText is ""
     478TEST "from-image snap 0dpi"
     479PASS img.style.cssText is ""
     480TEST "snap 0dpi from-image"
     481PASS img.style.cssText is ""
     482TEST "snap from-image 0dpi"
     483PASS img.style.cssText is ""
     484TEST "96dpi from-image snap"
     485PASS img.style.cssText is "image-resolution: 96dpi from-image snap; "
     486PASS img.offsetWidth is 16
     487PASS img.offsetHeight is 16
     488TEST "96dpi snap from-image"
     489PASS img.style.cssText is "image-resolution: 96dpi snap from-image; "
     490PASS img.offsetWidth is 16
     491PASS img.offsetHeight is 16
     492TEST "from-image 96dpi snap"
     493PASS img.style.cssText is "image-resolution: from-image 96dpi snap; "
     494PASS img.offsetWidth is 16
     495PASS img.offsetHeight is 16
     496TEST "from-image snap 96dpi"
     497PASS img.style.cssText is "image-resolution: from-image snap 96dpi; "
     498PASS img.offsetWidth is 16
     499PASS img.offsetHeight is 16
     500TEST "snap 96dpi from-image"
     501PASS img.style.cssText is "image-resolution: snap 96dpi from-image; "
     502PASS img.offsetWidth is 16
     503PASS img.offsetHeight is 16
     504TEST "snap from-image 96dpi"
     505PASS img.style.cssText is "image-resolution: snap from-image 96dpi; "
     506PASS img.offsetWidth is 16
     507PASS img.offsetHeight is 16
     508TEST "192dpi from-image snap"
     509PASS img.style.cssText is "image-resolution: 192dpi from-image snap; "
     510PASS img.offsetWidth is 8
     511PASS img.offsetHeight is 8
     512TEST "192dpi snap from-image"
     513PASS img.style.cssText is "image-resolution: 192dpi snap from-image; "
     514PASS img.offsetWidth is 8
     515PASS img.offsetHeight is 8
     516TEST "from-image 192dpi snap"
     517PASS img.style.cssText is "image-resolution: from-image 192dpi snap; "
     518PASS img.offsetWidth is 8
     519PASS img.offsetHeight is 8
     520TEST "from-image snap 192dpi"
     521PASS img.style.cssText is "image-resolution: from-image snap 192dpi; "
     522PASS img.offsetWidth is 8
     523PASS img.offsetHeight is 8
     524TEST "snap 192dpi from-image"
     525PASS img.style.cssText is "image-resolution: snap 192dpi from-image; "
     526PASS img.offsetWidth is 8
     527PASS img.offsetHeight is 8
     528TEST "snap from-image 192dpi"
     529PASS img.style.cssText is "image-resolution: snap from-image 192dpi; "
     530PASS img.offsetWidth is 8
     531PASS img.offsetHeight is 8
     532TEST "288dpi from-image snap"
     533PASS img.style.cssText is "image-resolution: 288dpi from-image snap; "
     534PASS img.offsetWidth is 5
     535PASS img.offsetHeight is 5
     536TEST "288dpi snap from-image"
     537PASS img.style.cssText is "image-resolution: 288dpi snap from-image; "
     538PASS img.offsetWidth is 5
     539PASS img.offsetHeight is 5
     540TEST "from-image 288dpi snap"
     541PASS img.style.cssText is "image-resolution: from-image 288dpi snap; "
     542PASS img.offsetWidth is 5
     543PASS img.offsetHeight is 5
     544TEST "from-image snap 288dpi"
     545PASS img.style.cssText is "image-resolution: from-image snap 288dpi; "
     546PASS img.offsetWidth is 5
     547PASS img.offsetHeight is 5
     548TEST "snap 288dpi from-image"
     549PASS img.style.cssText is "image-resolution: snap 288dpi from-image; "
     550PASS img.offsetWidth is 5
     551PASS img.offsetHeight is 5
     552TEST "snap from-image 288dpi"
     553PASS img.style.cssText is "image-resolution: snap from-image 288dpi; "
     554PASS img.offsetWidth is 5
     555PASS img.offsetHeight is 5
     556TEST "384dpi from-image snap"
     557PASS img.style.cssText is "image-resolution: 384dpi from-image snap; "
     558PASS img.offsetWidth is 4
     559PASS img.offsetHeight is 4
     560TEST "384dpi snap from-image"
     561PASS img.style.cssText is "image-resolution: 384dpi snap from-image; "
     562PASS img.offsetWidth is 4
     563PASS img.offsetHeight is 4
     564TEST "from-image 384dpi snap"
     565PASS img.style.cssText is "image-resolution: from-image 384dpi snap; "
     566PASS img.offsetWidth is 4
     567PASS img.offsetHeight is 4
     568TEST "from-image snap 384dpi"
     569PASS img.style.cssText is "image-resolution: from-image snap 384dpi; "
     570PASS img.offsetWidth is 4
     571PASS img.offsetHeight is 4
     572TEST "snap 384dpi from-image"
     573PASS img.style.cssText is "image-resolution: snap 384dpi from-image; "
     574PASS img.offsetWidth is 4
     575PASS img.offsetHeight is 4
     576TEST "snap from-image 384dpi"
     577PASS img.style.cssText is "image-resolution: snap from-image 384dpi; "
     578PASS img.offsetWidth is 4
     579PASS img.offsetHeight is 4
     580TEST "150dpi from-image snap"
     581PASS img.style.cssText is "image-resolution: 150dpi from-image snap; "
     582PASS img.offsetWidth is 16
     583PASS img.offsetHeight is 16
     584TEST "150dpi snap from-image"
     585PASS img.style.cssText is "image-resolution: 150dpi snap from-image; "
     586PASS img.offsetWidth is 16
     587PASS img.offsetHeight is 16
     588TEST "from-image 150dpi snap"
     589PASS img.style.cssText is "image-resolution: from-image 150dpi snap; "
     590PASS img.offsetWidth is 16
     591PASS img.offsetHeight is 16
     592TEST "from-image snap 150dpi"
     593PASS img.style.cssText is "image-resolution: from-image snap 150dpi; "
     594PASS img.offsetWidth is 16
     595PASS img.offsetHeight is 16
     596TEST "snap 150dpi from-image"
     597PASS img.style.cssText is "image-resolution: snap 150dpi from-image; "
     598PASS img.offsetWidth is 16
     599PASS img.offsetHeight is 16
     600TEST "snap from-image 150dpi"
     601PASS img.style.cssText is "image-resolution: snap from-image 150dpi; "
     602PASS img.offsetWidth is 16
     603PASS img.offsetHeight is 16
     604TEST "300dpi from-image snap"
     605PASS img.style.cssText is "image-resolution: 300dpi from-image snap; "
     606PASS img.offsetWidth is 5
     607PASS img.offsetHeight is 5
     608TEST "300dpi snap from-image"
     609PASS img.style.cssText is "image-resolution: 300dpi snap from-image; "
     610PASS img.offsetWidth is 5
     611PASS img.offsetHeight is 5
     612TEST "from-image 300dpi snap"
     613PASS img.style.cssText is "image-resolution: from-image 300dpi snap; "
     614PASS img.offsetWidth is 5
     615PASS img.offsetHeight is 5
     616TEST "from-image snap 300dpi"
     617PASS img.style.cssText is "image-resolution: from-image snap 300dpi; "
     618PASS img.offsetWidth is 5
     619PASS img.offsetHeight is 5
     620TEST "snap 300dpi from-image"
     621PASS img.style.cssText is "image-resolution: snap 300dpi from-image; "
     622PASS img.offsetWidth is 5
     623PASS img.offsetHeight is 5
     624TEST "snap from-image 300dpi"
     625PASS img.style.cssText is "image-resolution: snap from-image 300dpi; "
     626PASS img.offsetWidth is 5
     627PASS img.offsetHeight is 5
     628TEST "450dpi from-image snap"
     629PASS img.style.cssText is "image-resolution: 450dpi from-image snap; "
     630PASS img.offsetWidth is 4
     631PASS img.offsetHeight is 4
     632TEST "450dpi snap from-image"
     633PASS img.style.cssText is "image-resolution: 450dpi snap from-image; "
     634PASS img.offsetWidth is 4
     635PASS img.offsetHeight is 4
     636TEST "from-image 450dpi snap"
     637PASS img.style.cssText is "image-resolution: from-image 450dpi snap; "
     638PASS img.offsetWidth is 4
     639PASS img.offsetHeight is 4
     640TEST "from-image snap 450dpi"
     641PASS img.style.cssText is "image-resolution: from-image snap 450dpi; "
     642PASS img.offsetWidth is 4
     643PASS img.offsetHeight is 4
     644TEST "snap 450dpi from-image"
     645PASS img.style.cssText is "image-resolution: snap 450dpi from-image; "
     646PASS img.offsetWidth is 4
     647PASS img.offsetHeight is 4
     648TEST "snap from-image 450dpi"
     649PASS img.style.cssText is "image-resolution: snap from-image 450dpi; "
     650PASS img.offsetWidth is 4
     651PASS img.offsetHeight is 4
     652TEST "600dpi from-image snap"
     653PASS img.style.cssText is "image-resolution: 600dpi from-image snap; "
     654PASS img.offsetWidth is 2
     655PASS img.offsetHeight is 2
     656TEST "600dpi snap from-image"
     657PASS img.style.cssText is "image-resolution: 600dpi snap from-image; "
     658PASS img.offsetWidth is 2
     659PASS img.offsetHeight is 2
     660TEST "from-image 600dpi snap"
     661PASS img.style.cssText is "image-resolution: from-image 600dpi snap; "
     662PASS img.offsetWidth is 2
     663PASS img.offsetHeight is 2
     664TEST "from-image snap 600dpi"
     665PASS img.style.cssText is "image-resolution: from-image snap 600dpi; "
     666PASS img.offsetWidth is 2
     667PASS img.offsetHeight is 2
     668TEST "snap 600dpi from-image"
     669PASS img.style.cssText is "image-resolution: snap 600dpi from-image; "
     670PASS img.offsetWidth is 2
     671PASS img.offsetHeight is 2
     672TEST "snap from-image 600dpi"
     673PASS img.style.cssText is "image-resolution: snap from-image 600dpi; "
     674PASS img.offsetWidth is 2
     675PASS img.offsetHeight is 2
     676TEST "0dpcm from-image snap"
     677PASS img.style.cssText is ""
     678TEST "0dpcm snap from-image"
     679PASS img.style.cssText is ""
     680TEST "from-image 0dpcm snap"
     681PASS img.style.cssText is ""
     682TEST "from-image snap 0dpcm"
     683PASS img.style.cssText is ""
     684TEST "snap 0dpcm from-image"
     685PASS img.style.cssText is ""
     686TEST "snap from-image 0dpcm"
     687PASS img.style.cssText is ""
     688TEST "37.7dpcm from-image snap"
     689PASS img.style.cssText is "image-resolution: 37.7dpcm from-image snap; "
     690PASS img.offsetWidth is 16
     691PASS img.offsetHeight is 16
     692TEST "37.7dpcm snap from-image"
     693PASS img.style.cssText is "image-resolution: 37.7dpcm snap from-image; "
     694PASS img.offsetWidth is 16
     695PASS img.offsetHeight is 16
     696TEST "from-image 37.7dpcm snap"
     697PASS img.style.cssText is "image-resolution: from-image 37.7dpcm snap; "
     698PASS img.offsetWidth is 16
     699PASS img.offsetHeight is 16
     700TEST "from-image snap 37.7dpcm"
     701PASS img.style.cssText is "image-resolution: from-image snap 37.7dpcm; "
     702PASS img.offsetWidth is 16
     703PASS img.offsetHeight is 16
     704TEST "snap 37.7dpcm from-image"
     705PASS img.style.cssText is "image-resolution: snap 37.7dpcm from-image; "
     706PASS img.offsetWidth is 16
     707PASS img.offsetHeight is 16
     708TEST "snap from-image 37.7dpcm"
     709PASS img.style.cssText is "image-resolution: snap from-image 37.7dpcm; "
     710PASS img.offsetWidth is 16
     711PASS img.offsetHeight is 16
     712TEST "75.5dpcm from-image snap"
     713PASS img.style.cssText is "image-resolution: 75.5dpcm from-image snap; "
     714PASS img.offsetWidth is 8
     715PASS img.offsetHeight is 8
     716TEST "75.5dpcm snap from-image"
     717PASS img.style.cssText is "image-resolution: 75.5dpcm snap from-image; "
     718PASS img.offsetWidth is 8
     719PASS img.offsetHeight is 8
     720TEST "from-image 75.5dpcm snap"
     721PASS img.style.cssText is "image-resolution: from-image 75.5dpcm snap; "
     722PASS img.offsetWidth is 8
     723PASS img.offsetHeight is 8
     724TEST "from-image snap 75.5dpcm"
     725PASS img.style.cssText is "image-resolution: from-image snap 75.5dpcm; "
     726PASS img.offsetWidth is 8
     727PASS img.offsetHeight is 8
     728TEST "snap 75.5dpcm from-image"
     729PASS img.style.cssText is "image-resolution: snap 75.5dpcm from-image; "
     730PASS img.offsetWidth is 8
     731PASS img.offsetHeight is 8
     732TEST "snap from-image 75.5dpcm"
     733PASS img.style.cssText is "image-resolution: snap from-image 75.5dpcm; "
     734PASS img.offsetWidth is 8
     735PASS img.offsetHeight is 8
     736TEST "113.3dpcm from-image snap"
     737PASS img.style.cssText is "image-resolution: 113.3dpcm from-image snap; "
     738PASS img.offsetWidth is 5
     739PASS img.offsetHeight is 5
     740TEST "113.3dpcm snap from-image"
     741PASS img.style.cssText is "image-resolution: 113.3dpcm snap from-image; "
     742PASS img.offsetWidth is 5
     743PASS img.offsetHeight is 5
     744TEST "from-image 113.3dpcm snap"
     745PASS img.style.cssText is "image-resolution: from-image 113.3dpcm snap; "
     746PASS img.offsetWidth is 5
     747PASS img.offsetHeight is 5
     748TEST "from-image snap 113.3dpcm"
     749PASS img.style.cssText is "image-resolution: from-image snap 113.3dpcm; "
     750PASS img.offsetWidth is 5
     751PASS img.offsetHeight is 5
     752TEST "snap 113.3dpcm from-image"
     753PASS img.style.cssText is "image-resolution: snap 113.3dpcm from-image; "
     754PASS img.offsetWidth is 5
     755PASS img.offsetHeight is 5
     756TEST "snap from-image 113.3dpcm"
     757PASS img.style.cssText is "image-resolution: snap from-image 113.3dpcm; "
     758PASS img.offsetWidth is 5
     759PASS img.offsetHeight is 5
     760TEST "151.1dpcm from-image snap"
     761PASS img.style.cssText is "image-resolution: 151.1dpcm from-image snap; "
     762PASS img.offsetWidth is 4
     763PASS img.offsetHeight is 4
     764TEST "151.1dpcm snap from-image"
     765PASS img.style.cssText is "image-resolution: 151.1dpcm snap from-image; "
     766PASS img.offsetWidth is 4
     767PASS img.offsetHeight is 4
     768TEST "from-image 151.1dpcm snap"
     769PASS img.style.cssText is "image-resolution: from-image 151.1dpcm snap; "
     770PASS img.offsetWidth is 4
     771PASS img.offsetHeight is 4
     772TEST "from-image snap 151.1dpcm"
     773PASS img.style.cssText is "image-resolution: from-image snap 151.1dpcm; "
     774PASS img.offsetWidth is 4
     775PASS img.offsetHeight is 4
     776TEST "snap 151.1dpcm from-image"
     777PASS img.style.cssText is "image-resolution: snap 151.1dpcm from-image; "
     778PASS img.offsetWidth is 4
     779PASS img.offsetHeight is 4
     780TEST "snap from-image 151.1dpcm"
     781PASS img.style.cssText is "image-resolution: snap from-image 151.1dpcm; "
     782PASS img.offsetWidth is 4
     783PASS img.offsetHeight is 4
     784TEST "from-image snap"
     785PASS img.style.cssText is "image-resolution: from-image snap; "
     786PASS img.offsetWidth is 16
     787PASS img.offsetHeight is 16
     788TEST "snap from-image"
     789PASS img.style.cssText is "image-resolution: snap from-image; "
     790PASS img.offsetWidth is 16
     791PASS img.offsetHeight is 16
    222792PASS successfullyParsed is true
    223793
  • trunk/LayoutTests/fast/css/image-resolution/image-resolution.html

    r120683 r121127  
    2828    var unit = explicit && explicit[3];
    2929    var dppx = 1;
     30    if (!unit && !fromImage)
     31        return;
    3032    if (unit && value <= 0)
    3133        return;
     
    3941        else if (unit === 'dpcm')
    4042            dppx = value / (cssPxPerIn / cmPerIn);
     43        else
     44            return;
    4145    }
    4246    if (fromImage && imgResolutionDppx)
    4347        dppx = imgResolutionDppx;
    4448    if (snap)
    45         dppx = Math.floor(dppx);
     49        dppx = Math.floor(dppx + 0.01);
    4650    if (dppx <= 0)
    4751        dppx = 1;
     
    4953}
    5054
    51 function permute2(rule) {
     55function permute3(rule) {
    5256    var s = rule.trim().split(' ');
    5357    if (s.length == 1)
    5458        return s;
    55     return [s.join(' '), [s[1], s[0]].join(' ')];
     59    if (s.length == 2)
     60        return [s.join(' '), [s[1], s[0]].join(' ')];
     61    return [[s[0], s[1], s[2]].join(' '), [s[0], s[2], s[1]].join(' '),
     62            [s[1], s[0], s[2]].join(' '), [s[1], s[2], s[0]].join(' '),
     63            [s[2], s[0], s[1]].join(' '), [s[2], s[1], s[0]].join(' ')];
    5664}
    5765
     
    5967    var tests = resolutions.slice();
    6068    resolutions.forEach(function(resolution) {
    61         tests.push.apply(tests, permute2(resolution + ' from-image'));
     69        tests.push.apply(tests, permute3(resolution + ' from-image'));
     70    });
     71    resolutions.forEach(function(resolution) {
     72        tests.push.apply(tests, permute3(resolution + ' snap'));
     73    });
     74    resolutions.forEach(function(resolution) {
     75        tests.push.apply(tests, permute3(resolution + ' from-image snap'));
    6276    });
    6377    return tests;
  • trunk/Source/WebCore/ChangeLog

    r121126 r121127  
     12012-06-24  David Barr  <davidbarr@chromium.org>
     2
     3        Add snap to css3-images image-resolution
     4        https://bugs.webkit.org/show_bug.cgi?id=89745
     5
     6        Reviewed by Tony Chang.
     7
     8        Due to floating point imprecision, it is difficult to be precise in dpcm.
     9        So use PrimitiveValue::roundForImpreciseConversion rather than just floor.
     10
     11        No new tests; extended fast/css/image-resolution/image-resolution.html
     12
     13        * css/CSSParser.cpp: Accept snap identifier in image-resolution property.
     14        (WebCore::CSSParser::parseImageResolution): Map CSSValueSnap to identifier value from cssValuePool.
     15        * css/CSSValueKeywords.in: Add snap.
     16        * css/StyleBuilder.cpp: Extend ApplyPropertyImageResolution to apply RenderStyle::imageResolutionSnap.
     17        (WebCore::ApplyPropertyImageResolution::applyInheritValue): Apply RenderStyle::imageResolutionSnap.
     18        (WebCore::ApplyPropertyImageResolution::applyInitialValue): Apply RenderStyle::imageResolutionSnap.
     19        (WebCore::ApplyPropertyImageResolution::applyValue): Map CSSValueSnap to ImageResolutionSnapPixels.
     20        * rendering/RenderImage.cpp: Extend conditions for recalculation of intrinsic size.
     21        (WebCore::RenderImage::styleDidChange): Update intrinsic size if RenderStyle::imageResolutionSnap() has changed.
     22        (WebCore::RenderImage::imageDimensionsChanged): Floor scale factor to int, round up if less than 0.01 away from ceiling.
     23        * rendering/style/RenderStyle.cpp: Include StyleRareInheritedData::m_imageResolutionSnap in style diff.
     24        (WebCore::RenderStyle::diff): Map change in StyleRareInheritedData::m_imageResolutionSnap to StyleDifferenceLayout.
     25        * rendering/style/RenderStyle.h: Add RenderStyle::imageResolutionSnap, RenderStyle::setImageResolutionSnap, RenderStyle::initialImageResolutionSnap.
     26        * rendering/style/RenderStyleConstants.h: Add enum ImageResolutionSnap.
     27        * rendering/style/StyleRareInheritedData.cpp: Add StyleRareInheritedData::m_imageResolutionSnap.
     28        (WebCore::StyleRareInheritedData::StyleRareInheritedData): Add m_imageResolutionSnap to default and copy constructor.
     29        (WebCore::StyleRareInheritedData::operator==): Include m_imageResolutionSnap in comparison.
     30        * rendering/style/StyleRareInheritedData.h: Add StyleRareInheritedData::m_imageResolutionSnap.
     31        (StyleRareInheritedData): Add 1-bit field StyleRareInheritedData::m_imageResolutionSnap.
     32
    1332012-06-24  Sheriff Bot  <webkit.review.bot@gmail.com>
    234
  • trunk/Source/WebCore/css/CSSParser.cpp

    r120849 r121127  
    69056905    bool haveResolution = false;
    69066906    bool haveFromImage = false;
     6907    bool haveSnap = false;
    69076908
    69086909    CSSParserValue* value = valueList->current();
     
    69116912            list->append(cssValuePool().createIdentifierValue(value->id));
    69126913            haveFromImage = true;
     6914        } else if (!haveSnap && value->id == CSSValueSnap) {
     6915            list->append(cssValuePool().createIdentifierValue(value->id));
     6916            haveSnap = true;
    69136917        } else if (!haveResolution && validUnit(value, FResolution | FNonNeg) && value->fValue > 0) {
    69146918            list->append(createPrimitiveNumericValue(value));
     
    69196923    }
    69206924    if (!list->length())
     6925        return 0;
     6926    if (!haveFromImage && !haveResolution)
    69216927        return 0;
    69226928    return list;
  • trunk/Source/WebCore/css/CSSValueKeywords.in

    r121083 r121127  
    935935#if defined(ENABLE_CSS_IMAGE_RESOLUTION) && ENABLE_CSS_IMAGE_RESOLUTION
    936936from-image
     937snap
    937938#endif
    938939
  • trunk/Source/WebCore/css/StyleBuilder.cpp

    r120849 r121127  
    17861786    {
    17871787        ApplyPropertyDefaultBase<ImageResolutionSource, &RenderStyle::imageResolutionSource, ImageResolutionSource, &RenderStyle::setImageResolutionSource, ImageResolutionSource, &RenderStyle::initialImageResolutionSource>::applyInheritValue(styleResolver);
     1788        ApplyPropertyDefaultBase<ImageResolutionSnap, &RenderStyle::imageResolutionSnap, ImageResolutionSnap, &RenderStyle::setImageResolutionSnap, ImageResolutionSnap, &RenderStyle::initialImageResolutionSnap>::applyInheritValue(styleResolver);
    17881789        ApplyPropertyDefaultBase<float, &RenderStyle::imageResolution, float, &RenderStyle::setImageResolution, float, &RenderStyle::initialImageResolution>::applyInheritValue(styleResolver);
    17891790    }
     
    17921793    {
    17931794        ApplyPropertyDefaultBase<ImageResolutionSource, &RenderStyle::imageResolutionSource, ImageResolutionSource, &RenderStyle::setImageResolutionSource, ImageResolutionSource, &RenderStyle::initialImageResolutionSource>::applyInitialValue(styleResolver);
     1795        ApplyPropertyDefaultBase<ImageResolutionSnap, &RenderStyle::imageResolutionSnap, ImageResolutionSnap, &RenderStyle::setImageResolutionSnap, ImageResolutionSnap, &RenderStyle::initialImageResolutionSnap>::applyInitialValue(styleResolver);
    17941796        ApplyPropertyDefaultBase<float, &RenderStyle::imageResolution, float, &RenderStyle::setImageResolution, float, &RenderStyle::initialImageResolution>::applyInitialValue(styleResolver);
    17951797    }
     
    18011803        CSSValueList* valueList = static_cast<CSSValueList*>(value);
    18021804        ImageResolutionSource source = RenderStyle::initialImageResolutionSource();
     1805        ImageResolutionSnap snap = RenderStyle::initialImageResolutionSnap();
    18031806        double resolution = RenderStyle::initialImageResolution();
    18041807        for (size_t i = 0; i < valueList->length(); i++) {
     
    18091812            if (primitiveValue->getIdent() == CSSValueFromImage)
    18101813                source = ImageResolutionFromImage;
     1814            else if (primitiveValue->getIdent() == CSSValueSnap)
     1815                snap = ImageResolutionSnapPixels;
    18111816            else
    18121817                resolution = primitiveValue->getDoubleValue(CSSPrimitiveValue::CSS_DPPX);
    18131818        }
    18141819        styleResolver->style()->setImageResolutionSource(source);
     1820        styleResolver->style()->setImageResolutionSnap(snap);
    18151821        styleResolver->style()->setImageResolution(resolution);
    18161822    }
  • trunk/Source/WebCore/rendering/RenderImage.cpp

    r121123 r121127  
    141141    if (diff == StyleDifferenceLayout
    142142        && (oldStyle->imageResolution() != style()->imageResolution()
     143            || oldStyle->imageResolutionSnap() != style()->imageResolutionSnap()
    143144            || oldStyle->imageResolutionSource() != style()->imageResolutionSource()))
    144145        imageDimensionsChanged(true /* imageSizeChanged */);
     
    199200{
    200201#if ENABLE(CSS_IMAGE_RESOLUTION)
    201     bool intrinsicSizeChanged = updateIntrinsicSizeIfNeeded(m_imageResource->imageSize(style()->effectiveZoom() / style()->imageResolution()), imageSizeChanged);
     202    double scale = style()->imageResolution();
     203    if (style()->imageResolutionSnap() == ImageResolutionSnapPixels)
     204        scale = roundForImpreciseConversion<int>(scale);
     205    if (scale <= 0)
     206        scale = 1;
     207    bool intrinsicSizeChanged = updateIntrinsicSizeIfNeeded(m_imageResource->imageSize(style()->effectiveZoom() / scale), imageSizeChanged);
    202208#else
    203209    bool intrinsicSizeChanged = updateIntrinsicSizeIfNeeded(m_imageResource->imageSize(style()->effectiveZoom()), imageSizeChanged);
  • trunk/Source/WebCore/rendering/style/RenderStyle.cpp

    r120641 r121127  
    475475#if ENABLE(CSS_IMAGE_RESOLUTION)
    476476            || rareInheritedData->m_imageResolutionSource != other->rareInheritedData->m_imageResolutionSource
     477            || rareInheritedData->m_imageResolutionSnap != other->rareInheritedData->m_imageResolutionSnap
    477478            || rareInheritedData->m_imageResolution != other->rareInheritedData->m_imageResolution
    478479#endif
  • trunk/Source/WebCore/rendering/style/RenderStyle.h

    r121123 r121127  
    984984#if ENABLE(CSS_IMAGE_RESOLUTION)
    985985    ImageResolutionSource imageResolutionSource() const { return static_cast<ImageResolutionSource>(rareInheritedData->m_imageResolutionSource); }
     986    ImageResolutionSnap imageResolutionSnap() const { return static_cast<ImageResolutionSnap>(rareInheritedData->m_imageResolutionSnap); }
    986987    float imageResolution() const { return rareInheritedData->m_imageResolution; }
    987988#endif
     
    11551156#if ENABLE(CSS_IMAGE_RESOLUTION)
    11561157    void setImageResolutionSource(ImageResolutionSource v) { SET_VAR(rareInheritedData, m_imageResolutionSource, v) }
     1158    void setImageResolutionSnap(ImageResolutionSnap v) { SET_VAR(rareInheritedData, m_imageResolutionSnap, v) }
    11571159    void setImageResolution(float f) { SET_VAR(rareInheritedData, m_imageResolution, f) }
    11581160#endif
     
    16681670    static EImageRendering initialImageRendering() { return ImageRenderingAuto; }
    16691671    static ImageResolutionSource initialImageResolutionSource() { return ImageResolutionSpecified; }
     1672    static ImageResolutionSnap initialImageResolutionSnap() { return ImageResolutionNoSnap; }
    16701673    static float initialImageResolution() { return 1; }
    16711674    static StyleImage* initialBorderImageSource() { return 0; }
  • trunk/Source/WebCore/rendering/style/RenderStyleConstants.h

    r120735 r121127  
    453453enum ImageResolutionSource { ImageResolutionSpecified = 0, ImageResolutionFromImage };
    454454
     455enum ImageResolutionSnap { ImageResolutionNoSnap = 0, ImageResolutionSnapPixels };
     456
    455457enum Order { LogicalOrder = 0, VisualOrder };
    456458
  • trunk/Source/WebCore/rendering/style/StyleRareInheritedData.cpp

    r120641 r121127  
    9090#if ENABLE(CSS_IMAGE_RESOLUTION)
    9191    , m_imageResolutionSource(RenderStyle::initialImageResolutionSource())
     92    , m_imageResolutionSnap(RenderStyle::initialImageResolutionSnap())
    9293#endif
    9394    , hyphenationLimitBefore(-1)
     
    148149#if ENABLE(CSS_IMAGE_RESOLUTION)
    149150    , m_imageResolutionSource(o.m_imageResolutionSource)
     151    , m_imageResolutionSnap(o.m_imageResolutionSnap)
    150152#endif
    151153    , hyphenationString(o.hyphenationString)
     
    232234#if ENABLE(CSS_IMAGE_RESOLUTION)
    233235        && m_imageResolutionSource == o.m_imageResolutionSource
     236        && m_imageResolutionSnap == o.m_imageResolutionSnap
    234237        && m_imageResolution == o.m_imageResolution
    235238#endif
  • trunk/Source/WebCore/rendering/style/StyleRareInheritedData.h

    r120641 r121127  
    104104#if ENABLE(CSS_IMAGE_RESOLUTION)
    105105    unsigned m_imageResolutionSource : 1; // ImageResolutionSource
     106    unsigned m_imageResolutionSnap : 1; // ImageResolutionSnap
    106107#endif
    107108
Note: See TracChangeset for help on using the changeset viewer.