OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. |
3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 ASSERT(!m_layerCount); | 89 ASSERT(!m_layerCount); |
90 ASSERT(!saveCount()); | 90 ASSERT(!saveCount()); |
91 } | 91 } |
92 #endif | 92 #endif |
93 } | 93 } |
94 | 94 |
95 void GraphicsContext::save() | 95 void GraphicsContext::save() |
96 { | 96 { |
97 if (contextDisabled()) | 97 if (contextDisabled()) |
98 return; | 98 return; |
| 99 ASSERT(m_canvas); |
99 | 100 |
100 m_paintState->incrementSaveCount(); | 101 m_paintState->incrementSaveCount(); |
101 | |
102 ASSERT(m_canvas); | |
103 m_canvas->save(); | 102 m_canvas->save(); |
104 } | 103 } |
105 | 104 |
106 void GraphicsContext::restore() | 105 void GraphicsContext::restore() |
107 { | 106 { |
108 if (contextDisabled()) | 107 if (contextDisabled()) |
109 return; | 108 return; |
| 109 ASSERT(m_canvas); |
110 | 110 |
111 if (!m_paintStateIndex && !m_paintState->saveCount()) { | 111 if (!m_paintStateIndex && !m_paintState->saveCount()) { |
112 WTF_LOG_ERROR("ERROR void GraphicsContext::restore() stack is empty"); | 112 WTF_LOG_ERROR("ERROR void GraphicsContext::restore() stack is empty"); |
113 return; | 113 return; |
114 } | 114 } |
115 | 115 |
116 if (m_paintState->saveCount()) { | 116 if (m_paintState->saveCount()) { |
117 m_paintState->decrementSaveCount(); | 117 m_paintState->decrementSaveCount(); |
118 } else { | 118 } else { |
119 m_paintStateIndex--; | 119 m_paintStateIndex--; |
120 m_paintState = m_paintStateStack[m_paintStateIndex].get(); | 120 m_paintState = m_paintStateStack[m_paintStateIndex].get(); |
121 } | 121 } |
122 | 122 |
123 ASSERT(m_canvas); | |
124 m_canvas->restore(); | 123 m_canvas->restore(); |
125 } | 124 } |
126 | 125 |
127 #if ENABLE(ASSERT) | 126 #if ENABLE(ASSERT) |
128 unsigned GraphicsContext::saveCount() const | 127 unsigned GraphicsContext::saveCount() const |
129 { | 128 { |
130 // Each m_paintStateStack entry implies an additional save op | 129 // Each m_paintStateStack entry implies an additional save op |
131 // (on top of its own saveCount), except for the first frame. | 130 // (on top of its own saveCount), except for the first frame. |
132 unsigned count = m_paintStateIndex; | 131 unsigned count = m_paintStateIndex; |
133 ASSERT(m_paintStateStack.size() > m_paintStateIndex); | 132 ASSERT(m_paintStateStack.size() > m_paintStateIndex); |
134 for (unsigned i = 0; i <= m_paintStateIndex; ++i) | 133 for (unsigned i = 0; i <= m_paintStateIndex; ++i) |
135 count += m_paintStateStack[i]->saveCount(); | 134 count += m_paintStateStack[i]->saveCount(); |
136 | 135 |
137 return count; | 136 return count; |
138 } | 137 } |
139 #endif | 138 #endif |
140 | 139 |
141 void GraphicsContext::saveLayer(const SkRect* bounds, const SkPaint* paint) | 140 void GraphicsContext::saveLayer(const SkRect* bounds, const SkPaint* paint) |
142 { | 141 { |
143 if (contextDisabled()) | 142 if (contextDisabled()) |
144 return; | 143 return; |
145 | |
146 ASSERT(m_canvas); | 144 ASSERT(m_canvas); |
147 | 145 |
148 m_canvas->saveLayer(bounds, paint); | 146 m_canvas->saveLayer(bounds, paint); |
149 } | 147 } |
150 | 148 |
151 void GraphicsContext::restoreLayer() | 149 void GraphicsContext::restoreLayer() |
152 { | 150 { |
153 if (contextDisabled()) | 151 if (contextDisabled()) |
154 return; | 152 return; |
155 | |
156 ASSERT(m_canvas); | 153 ASSERT(m_canvas); |
157 | 154 |
158 m_canvas->restore(); | 155 m_canvas->restore(); |
159 } | 156 } |
160 | 157 |
161 #if ENABLE(ASSERT) | 158 #if ENABLE(ASSERT) |
162 void GraphicsContext::setInDrawingRecorder(bool val) | 159 void GraphicsContext::setInDrawingRecorder(bool val) |
163 { | 160 { |
164 // Nested drawing recorers are not allowed. | 161 // Nested drawing recorers are not allowed. |
165 ASSERT(!val || !m_inDrawingRecorder); | 162 ASSERT(!val || !m_inDrawingRecorder); |
166 m_inDrawingRecorder = val; | 163 m_inDrawingRecorder = val; |
167 } | 164 } |
168 #endif | 165 #endif |
169 | 166 |
170 void GraphicsContext::setStrokeGradient(PassRefPtr<Gradient> gradient, float alp
ha) | 167 void GraphicsContext::setStrokeGradient(PassRefPtr<Gradient> gradient, float alp
ha) |
171 { | 168 { |
172 if (contextDisabled()) | 169 if (contextDisabled()) |
173 return; | 170 return; |
174 | 171 |
175 ASSERT(gradient); | 172 ASSERT(gradient); |
176 if (!gradient) { | 173 if (!gradient) { |
177 setStrokeColor(Color::black); | 174 setStrokeColor(Color::black); |
178 return; | 175 return; |
179 } | 176 } |
| 177 |
180 mutableState()->setStrokeGradient(gradient, alpha); | 178 mutableState()->setStrokeGradient(gradient, alpha); |
181 } | 179 } |
182 | 180 |
183 void GraphicsContext::setFillGradient(PassRefPtr<Gradient> gradient, float alpha
) | 181 void GraphicsContext::setFillGradient(PassRefPtr<Gradient> gradient, float alpha
) |
184 { | 182 { |
185 if (contextDisabled()) | 183 if (contextDisabled()) |
186 return; | 184 return; |
187 | 185 |
188 ASSERT(gradient); | 186 ASSERT(gradient); |
189 if (!gradient) { | 187 if (!gradient) { |
(...skipping 15 matching lines...) Expand all Loading... |
205 if (!color.alpha()) { | 203 if (!color.alpha()) { |
206 if (shadowMode == DrawShadowOnly) { | 204 if (shadowMode == DrawShadowOnly) { |
207 // shadow only, but there is no shadow: use an empty draw looper to
disable rendering of the source primitive | 205 // shadow only, but there is no shadow: use an empty draw looper to
disable rendering of the source primitive |
208 setDrawLooper(drawLooperBuilder.release()); | 206 setDrawLooper(drawLooperBuilder.release()); |
209 return; | 207 return; |
210 } | 208 } |
211 clearDrawLooper(); | 209 clearDrawLooper(); |
212 return; | 210 return; |
213 } | 211 } |
214 | 212 |
215 drawLooperBuilder->addShadow(offset, blur, color, shadowTransformMode, shado
wAlphaMode); | 213 drawLooperBuilder->addShadow(offset, blur, Color::toDeviceColor(color), shad
owTransformMode, shadowAlphaMode); |
216 if (shadowMode == DrawShadowAndForeground) { | 214 if (shadowMode == DrawShadowAndForeground) { |
217 drawLooperBuilder->addUnmodifiedContent(); | 215 drawLooperBuilder->addUnmodifiedContent(); |
218 } | 216 } |
219 setDrawLooper(drawLooperBuilder.release()); | 217 setDrawLooper(drawLooperBuilder.release()); |
220 } | 218 } |
221 | 219 |
222 void GraphicsContext::setDrawLooper(PassOwnPtr<DrawLooperBuilder> drawLooperBuil
der) | 220 void GraphicsContext::setDrawLooper(PassOwnPtr<DrawLooperBuilder> drawLooperBuil
der) |
223 { | 221 { |
224 if (contextDisabled()) | 222 if (contextDisabled()) |
225 return; | 223 return; |
(...skipping 21 matching lines...) Expand all Loading... |
247 // We only support one active color filter at the moment. If (when) this bec
omes a problem, | 245 // We only support one active color filter at the moment. If (when) this bec
omes a problem, |
248 // we should switch to using color filter chains (Skia work in progress). | 246 // we should switch to using color filter chains (Skia work in progress). |
249 ASSERT(!stateToSet->colorFilter()); | 247 ASSERT(!stateToSet->colorFilter()); |
250 stateToSet->setColorFilter(WebCoreColorFilterToSkiaColorFilter(colorFilter))
; | 248 stateToSet->setColorFilter(WebCoreColorFilterToSkiaColorFilter(colorFilter))
; |
251 } | 249 } |
252 | 250 |
253 void GraphicsContext::concat(const SkMatrix& matrix) | 251 void GraphicsContext::concat(const SkMatrix& matrix) |
254 { | 252 { |
255 if (contextDisabled()) | 253 if (contextDisabled()) |
256 return; | 254 return; |
257 | |
258 ASSERT(m_canvas); | 255 ASSERT(m_canvas); |
259 | 256 |
260 m_canvas->concat(matrix); | 257 m_canvas->concat(matrix); |
261 } | 258 } |
262 | 259 |
263 void GraphicsContext::beginLayer(float opacity, SkXfermode::Mode xfermode, const
FloatRect* bounds, ColorFilter colorFilter, SkImageFilter* imageFilter) | 260 void GraphicsContext::beginLayer(float opacity, SkXfermode::Mode xfermode, const
FloatRect* bounds, ColorFilter colorFilter, SkImageFilter* imageFilter) |
264 { | 261 { |
265 if (contextDisabled()) | 262 if (contextDisabled()) |
266 return; | 263 return; |
267 | 264 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 { | 346 { |
350 if (contextDisabled()) | 347 if (contextDisabled()) |
351 return; | 348 return; |
352 | 349 |
353 ASSERT(numPoints > 2); | 350 ASSERT(numPoints > 2); |
354 | 351 |
355 SkPath path; | 352 SkPath path; |
356 setPathFromPoints(&path, numPoints, points); | 353 setPathFromPoints(&path, numPoints, points); |
357 | 354 |
358 SkPaint paint(immutableState()->fillPaint()); | 355 SkPaint paint(immutableState()->fillPaint()); |
| 356 paint.setColor(Color::toDeviceColor(color).rgb()); |
359 paint.setAntiAlias(shouldAntialias); | 357 paint.setAntiAlias(shouldAntialias); |
360 paint.setColor(color.rgb()); | |
361 | 358 |
362 drawPath(path, paint); | 359 drawPath(path, paint); |
363 } | 360 } |
364 | 361 |
365 void GraphicsContext::drawFocusRingPath(const SkPath& path, const Color& color,
int width) | 362 void GraphicsContext::drawFocusRingPath(const SkPath& path, const Color& color,
int width) |
366 { | 363 { |
367 drawPlatformFocusRing(path, m_canvas, color.rgb(), width); | 364 drawPlatformFocusRing(path, m_canvas, Color::toDeviceColor(color).rgb(), wid
th); |
368 } | 365 } |
369 | 366 |
370 void GraphicsContext::drawFocusRingRect(const SkRect& rect, const Color& color,
int width) | 367 void GraphicsContext::drawFocusRingRect(const SkRect& rect, const Color& color,
int width) |
371 { | 368 { |
372 drawPlatformFocusRing(rect, m_canvas, color.rgb(), width); | 369 drawPlatformFocusRing(rect, m_canvas, Color::toDeviceColor(color).rgb(), wid
th); |
373 } | 370 } |
374 | 371 |
375 void GraphicsContext::drawFocusRing(const Path& focusRingPath, int width, int of
fset, const Color& color) | 372 void GraphicsContext::drawFocusRing(const Path& focusRingPath, int width, int of
fset, const Color& color) |
376 { | 373 { |
377 // FIXME: Implement support for offset. | 374 // FIXME: Implement support for offset. |
378 if (contextDisabled()) | 375 if (contextDisabled()) |
379 return; | 376 return; |
380 | 377 |
381 drawFocusRingPath(focusRingPath.skPath(), color, width); | 378 drawFocusRingPath(focusRingPath.skPath(), color, width); |
382 } | 379 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 clipRoundedRect(rect); | 461 clipRoundedRect(rect); |
465 if (shadowSpread < 0) | 462 if (shadowSpread < 0) |
466 roundedHole.expandRadii(-shadowSpread); | 463 roundedHole.expandRadii(-shadowSpread); |
467 else | 464 else |
468 roundedHole.shrinkRadii(shadowSpread); | 465 roundedHole.shrinkRadii(shadowSpread); |
469 } else { | 466 } else { |
470 clip(rect.rect()); | 467 clip(rect.rect()); |
471 } | 468 } |
472 | 469 |
473 OwnPtr<DrawLooperBuilder> drawLooperBuilder = DrawLooperBuilder::create(); | 470 OwnPtr<DrawLooperBuilder> drawLooperBuilder = DrawLooperBuilder::create(); |
474 drawLooperBuilder->addShadow(FloatSize(shadowOffset), shadowBlur, shadowColo
r, | 471 drawLooperBuilder->addShadow(FloatSize(shadowOffset), shadowBlur, Color::toD
eviceColor(shadowColor), |
475 DrawLooperBuilder::ShadowRespectsTransforms, DrawLooperBuilder::ShadowIg
noresAlpha); | 472 DrawLooperBuilder::ShadowRespectsTransforms, DrawLooperBuilder::ShadowIg
noresAlpha); |
476 setDrawLooper(drawLooperBuilder.release()); | 473 setDrawLooper(drawLooperBuilder.release()); |
| 474 |
477 fillRectWithRoundedHole(outerRect, roundedHole, fillColor); | 475 fillRectWithRoundedHole(outerRect, roundedHole, fillColor); |
478 } | 476 } |
479 | 477 |
480 void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) | 478 void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) |
481 { | 479 { |
482 if (contextDisabled()) | 480 if (contextDisabled()) |
483 return; | 481 return; |
484 ASSERT(m_canvas); | 482 ASSERT(m_canvas); |
485 | 483 |
486 StrokeStyle penStyle = strokeStyle(); | 484 StrokeStyle penStyle = strokeStyle(); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
670 int thickness = SkMax32(static_cast<int>(strokeThickness()), 1); | 668 int thickness = SkMax32(static_cast<int>(strokeThickness()), 1); |
671 SkRect r; | 669 SkRect r; |
672 r.fLeft = WebCoreFloatToSkScalar(pt.x()); | 670 r.fLeft = WebCoreFloatToSkScalar(pt.x()); |
673 // Avoid anti-aliasing lines. Currently, these are always horizontal. | 671 // Avoid anti-aliasing lines. Currently, these are always horizontal. |
674 // Round to nearest pixel to match text and other content. | 672 // Round to nearest pixel to match text and other content. |
675 r.fTop = WebCoreFloatToSkScalar(floorf(pt.y() + 0.5f)); | 673 r.fTop = WebCoreFloatToSkScalar(floorf(pt.y() + 0.5f)); |
676 r.fRight = r.fLeft + WebCoreFloatToSkScalar(width); | 674 r.fRight = r.fLeft + WebCoreFloatToSkScalar(width); |
677 r.fBottom = r.fTop + SkIntToScalar(thickness); | 675 r.fBottom = r.fTop + SkIntToScalar(thickness); |
678 paint = immutableState()->fillPaint(); | 676 paint = immutableState()->fillPaint(); |
679 // Text lines are drawn using the stroke color. | 677 // Text lines are drawn using the stroke color. |
680 paint.setColor(strokeColor().rgb()); | 678 paint.setColor(Color::toDeviceColor(strokeColor()).rgb()); |
681 drawRect(r, paint); | 679 drawRect(r, paint); |
682 return; | 680 return; |
683 } | 681 } |
684 case DottedStroke: | 682 case DottedStroke: |
685 case DashedStroke: { | 683 case DashedStroke: { |
686 int y = floorf(pt.y() + std::max<float>(strokeThickness() / 2.0f, 0.5f))
; | 684 int y = floorf(pt.y() + std::max<float>(strokeThickness() / 2.0f, 0.5f))
; |
687 drawLine(IntPoint(pt.x(), y), IntPoint(pt.x() + width, y)); | 685 drawLine(IntPoint(pt.x(), y), IntPoint(pt.x() + width, y)); |
688 return; | 686 return; |
689 } | 687 } |
690 } | 688 } |
(...skipping 13 matching lines...) Expand all Loading... |
704 | 702 |
705 SkRect skRect = rect; | 703 SkRect skRect = rect; |
706 int fillcolorNotTransparent = immutableState()->fillColor().rgb() & 0xFF0000
00; | 704 int fillcolorNotTransparent = immutableState()->fillColor().rgb() & 0xFF0000
00; |
707 if (fillcolorNotTransparent) | 705 if (fillcolorNotTransparent) |
708 drawRect(skRect, immutableState()->fillPaint()); | 706 drawRect(skRect, immutableState()->fillPaint()); |
709 | 707 |
710 if (immutableState()->strokeData().style() != NoStroke | 708 if (immutableState()->strokeData().style() != NoStroke |
711 && immutableState()->strokeColor().alpha()) { | 709 && immutableState()->strokeColor().alpha()) { |
712 // Stroke a width: 1 inset border | 710 // Stroke a width: 1 inset border |
713 SkPaint paint(immutableState()->fillPaint()); | 711 SkPaint paint(immutableState()->fillPaint()); |
714 paint.setColor(strokeColor().rgb()); | 712 paint.setColor(Color::toDeviceColor(strokeColor()).rgb()); |
715 paint.setStyle(SkPaint::kStroke_Style); | 713 paint.setStyle(SkPaint::kStroke_Style); |
716 paint.setStrokeWidth(1); | 714 paint.setStrokeWidth(1); |
717 | 715 |
718 skRect.inset(0.5f, 0.5f); | 716 skRect.inset(0.5f, 0.5f); |
719 drawRect(skRect, paint); | 717 drawRect(skRect, paint); |
720 } | 718 } |
721 } | 719 } |
722 | 720 |
723 void GraphicsContext::drawText(const Font& font, const TextRunPaintInfo& runInfo
, const FloatPoint& point, const SkPaint& paint) | 721 void GraphicsContext::drawText(const Font& font, const TextRunPaintInfo& runInfo
, const FloatPoint& point, const SkPaint& paint) |
724 { | 722 { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 drawImage(image, FloatRect(r), FloatRect(FloatPoint(), FloatSize(image->size
())), op, shouldRespectImageOrientation); | 792 drawImage(image, FloatRect(r), FloatRect(FloatPoint(), FloatSize(image->size
())), op, shouldRespectImageOrientation); |
795 } | 793 } |
796 | 794 |
797 void GraphicsContext::drawImage(Image* image, const FloatRect& dest, const Float
Rect& src, SkXfermode::Mode op, RespectImageOrientationEnum shouldRespectImageOr
ientation) | 795 void GraphicsContext::drawImage(Image* image, const FloatRect& dest, const Float
Rect& src, SkXfermode::Mode op, RespectImageOrientationEnum shouldRespectImageOr
ientation) |
798 { | 796 { |
799 if (contextDisabled() || !image) | 797 if (contextDisabled() || !image) |
800 return; | 798 return; |
801 | 799 |
802 SkPaint imagePaint = immutableState()->fillPaint(); | 800 SkPaint imagePaint = immutableState()->fillPaint(); |
803 imagePaint.setXfermodeMode(op); | 801 imagePaint.setXfermodeMode(op); |
804 imagePaint.setColor(SK_ColorBLACK); | 802 imagePaint.setColor(SK_ColorBLACK); // FIXME: not color correct. |
805 imagePaint.setFilterQuality(computeFilterQuality(image, dest, src)); | 803 imagePaint.setFilterQuality(computeFilterQuality(image, dest, src)); |
806 imagePaint.setAntiAlias(shouldAntialias()); | 804 imagePaint.setAntiAlias(shouldAntialias()); |
807 image->draw(m_canvas, imagePaint, dest, src, shouldRespectImageOrientation,
Image::ClampImageToSourceRect); | 805 image->draw(m_canvas, imagePaint, dest, src, shouldRespectImageOrientation,
Image::ClampImageToSourceRect); |
808 m_paintController.setImagePainted(); | 806 m_paintController.setImagePainted(); |
809 } | 807 } |
810 | 808 |
811 SkFilterQuality GraphicsContext::computeFilterQuality(Image* image, const FloatR
ect& dest, const FloatRect& src) const | 809 SkFilterQuality GraphicsContext::computeFilterQuality(Image* image, const FloatR
ect& dest, const FloatRect& src) const |
812 { | 810 { |
813 InterpolationQuality resampling; | 811 InterpolationQuality resampling; |
814 if (printing()) { | 812 if (printing()) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 | 909 |
912 drawRect(rect, immutableState()->fillPaint()); | 910 drawRect(rect, immutableState()->fillPaint()); |
913 } | 911 } |
914 | 912 |
915 void GraphicsContext::fillRect(const FloatRect& rect, const Color& color, SkXfer
mode::Mode xferMode) | 913 void GraphicsContext::fillRect(const FloatRect& rect, const Color& color, SkXfer
mode::Mode xferMode) |
916 { | 914 { |
917 if (contextDisabled()) | 915 if (contextDisabled()) |
918 return; | 916 return; |
919 | 917 |
920 SkPaint paint = immutableState()->fillPaint(); | 918 SkPaint paint = immutableState()->fillPaint(); |
921 paint.setColor(color.rgb()); | 919 paint.setColor(Color::toDeviceColor(color).rgb()); |
922 paint.setXfermodeMode(xferMode); | 920 paint.setXfermodeMode(xferMode); |
923 | |
924 drawRect(rect, paint); | 921 drawRect(rect, paint); |
925 } | 922 } |
926 | 923 |
927 void GraphicsContext::fillRoundedRect(const FloatRoundedRect& rrect, const Color
& color) | 924 void GraphicsContext::fillRoundedRect(const FloatRoundedRect& rrect, const Color
& color) |
928 { | 925 { |
929 if (contextDisabled()) | 926 if (contextDisabled()) |
930 return; | 927 return; |
931 | 928 |
932 if (!rrect.isRounded() || !rrect.isRenderable()) { | 929 if (!rrect.isRounded() || !rrect.isRenderable()) { |
933 fillRect(rrect.rect(), color); | 930 fillRect(rrect.rect(), color); |
934 return; | 931 return; |
935 } | 932 } |
936 | 933 |
937 if (color == fillColor()) { | 934 if (color == fillColor()) { |
938 drawRRect(rrect, immutableState()->fillPaint()); | 935 drawRRect(rrect, immutableState()->fillPaint()); |
939 return; | 936 return; |
940 } | 937 } |
941 | 938 |
942 SkPaint paint = immutableState()->fillPaint(); | 939 SkPaint paint = immutableState()->fillPaint(); |
943 paint.setColor(color.rgb()); | 940 paint.setColor(Color::toDeviceColor(color).rgb()); |
944 | 941 |
945 drawRRect(rrect, paint); | 942 drawRRect(rrect, paint); |
946 } | 943 } |
947 | 944 |
948 namespace { | 945 namespace { |
949 | 946 |
950 bool isSimpleDRRect(const FloatRoundedRect& outer, const FloatRoundedRect& inner
) | 947 bool isSimpleDRRect(const FloatRoundedRect& outer, const FloatRoundedRect& inner
) |
951 { | 948 { |
952 // A DRRect is "simple" (i.e. can be drawn as a rrect stroke) if | 949 // A DRRect is "simple" (i.e. can be drawn as a rrect stroke) if |
953 // 1) all sides have the same width | 950 // 1) all sides have the same width |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
989 { | 986 { |
990 if (contextDisabled()) | 987 if (contextDisabled()) |
991 return; | 988 return; |
992 ASSERT(m_canvas); | 989 ASSERT(m_canvas); |
993 | 990 |
994 if (!isSimpleDRRect(outer, inner)) { | 991 if (!isSimpleDRRect(outer, inner)) { |
995 if (color == fillColor()) { | 992 if (color == fillColor()) { |
996 m_canvas->drawDRRect(outer, inner, immutableState()->fillPaint()); | 993 m_canvas->drawDRRect(outer, inner, immutableState()->fillPaint()); |
997 } else { | 994 } else { |
998 SkPaint paint(immutableState()->fillPaint()); | 995 SkPaint paint(immutableState()->fillPaint()); |
999 paint.setColor(color.rgb()); | 996 paint.setColor(Color::toDeviceColor(color).rgb()); |
1000 m_canvas->drawDRRect(outer, inner, paint); | 997 m_canvas->drawDRRect(outer, inner, paint); |
1001 } | 998 } |
1002 | 999 |
1003 return; | 1000 return; |
1004 } | 1001 } |
1005 | 1002 |
1006 // We can draw this as a stroked rrect. | 1003 // We can draw this as a stroked rrect. |
1007 float strokeWidth = inner.rect().x() - outer.rect().x(); | 1004 float strokeWidth = inner.rect().x() - outer.rect().x(); |
1008 SkRRect strokeRRect = outer; | 1005 SkRRect strokeRRect = outer; |
1009 strokeRRect.inset(strokeWidth / 2, strokeWidth / 2); | 1006 strokeRRect.inset(strokeWidth / 2, strokeWidth / 2); |
1010 | 1007 |
1011 SkPaint strokePaint(immutableState()->fillPaint()); | 1008 SkPaint strokePaint(immutableState()->fillPaint()); |
1012 strokePaint.setColor(color.rgb()); | 1009 strokePaint.setColor(Color::toDeviceColor(color).rgb()); |
1013 strokePaint.setStyle(SkPaint::kStroke_Style); | 1010 strokePaint.setStyle(SkPaint::kStroke_Style); |
1014 strokePaint.setStrokeWidth(strokeWidth); | 1011 strokePaint.setStrokeWidth(strokeWidth); |
1015 | 1012 |
1016 m_canvas->drawRRect(strokeRRect, strokePaint); | 1013 m_canvas->drawRRect(strokeRRect, strokePaint); |
1017 } | 1014 } |
1018 | 1015 |
1019 void GraphicsContext::fillEllipse(const FloatRect& ellipse) | 1016 void GraphicsContext::fillEllipse(const FloatRect& ellipse) |
1020 { | 1017 { |
1021 if (contextDisabled()) | 1018 if (contextDisabled()) |
1022 return; | 1019 return; |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 { | 1201 { |
1205 concat(affineTransformToSkMatrix(affine)); | 1202 concat(affineTransformToSkMatrix(affine)); |
1206 } | 1203 } |
1207 | 1204 |
1208 void GraphicsContext::fillRectWithRoundedHole(const FloatRect& rect, const Float
RoundedRect& roundedHoleRect, const Color& color) | 1205 void GraphicsContext::fillRectWithRoundedHole(const FloatRect& rect, const Float
RoundedRect& roundedHoleRect, const Color& color) |
1209 { | 1206 { |
1210 if (contextDisabled()) | 1207 if (contextDisabled()) |
1211 return; | 1208 return; |
1212 | 1209 |
1213 SkPaint paint(immutableState()->fillPaint()); | 1210 SkPaint paint(immutableState()->fillPaint()); |
1214 paint.setColor(color.rgb()); | 1211 paint.setColor(Color::toDeviceColor(color).rgb()); |
1215 m_canvas->drawDRRect(SkRRect::MakeRect(rect), roundedHoleRect, paint); | 1212 m_canvas->drawDRRect(SkRRect::MakeRect(rect), roundedHoleRect, paint); |
1216 } | 1213 } |
1217 | 1214 |
1218 void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2
, float strokeWidth, StrokeStyle penStyle) | 1215 void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2
, float strokeWidth, StrokeStyle penStyle) |
1219 { | 1216 { |
1220 // For odd widths, we add in 0.5 to the appropriate x/y so that the float ar
ithmetic | 1217 // For odd widths, we add in 0.5 to the appropriate x/y so that the float ar
ithmetic |
1221 // works out. For example, with a border width of 3, WebKit will pass us (y
1+y2)/2, e.g., | 1218 // works out. For example, with a border width of 3, WebKit will pass us (y
1+y2)/2, e.g., |
1222 // (50+53)/2 = 103/2 = 51 when we want 51.5. It is always true that an even
width gave | 1219 // (50+53)/2 = 103/2 = 51 when we want 51.5. It is always true that an even
width gave |
1223 // us a perfect position, but an odd width gave us a position that is off by
exactly 0.5. | 1220 // us a perfect position, but an odd width gave us a position that is off by
exactly 0.5. |
1224 if (penStyle == DottedStroke || penStyle == DashedStroke) { | 1221 if (penStyle == DottedStroke || penStyle == DashedStroke) { |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1360 static const SkPMColor colors[] = { | 1357 static const SkPMColor colors[] = { |
1361 SkPreMultiplyARGB(0x60, 0xFF, 0x00, 0x00), // More transparent red | 1358 SkPreMultiplyARGB(0x60, 0xFF, 0x00, 0x00), // More transparent red |
1362 SkPreMultiplyARGB(0x60, 0xC0, 0xC0, 0xC0) // More transparent gray | 1359 SkPreMultiplyARGB(0x60, 0xC0, 0xC0, 0xC0) // More transparent gray |
1363 }; | 1360 }; |
1364 | 1361 |
1365 return colors[index]; | 1362 return colors[index]; |
1366 } | 1363 } |
1367 #endif | 1364 #endif |
1368 | 1365 |
1369 } // namespace blink | 1366 } // namespace blink |
OLD | NEW |