| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 2 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
| 3 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. | 3 * Copyright (C) 2004, 2005, 2006 Apple Computer, 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 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, &shaderMatrix, n
ullptr); | 198 SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, &shaderMatrix, n
ullptr); |
| 199 } | 199 } |
| 200 | 200 |
| 201 } // anonymous namespace | 201 } // anonymous namespace |
| 202 | 202 |
| 203 void Image::drawPattern(GraphicsContext& context, const FloatRect& floatSrcRect,
const FloatSize& scale, | 203 void Image::drawPattern(GraphicsContext& context, const FloatRect& floatSrcRect,
const FloatSize& scale, |
| 204 const FloatPoint& phase, SkXfermode::Mode compositeOp, const FloatRect& dest
Rect, const FloatSize& repeatSpacing) | 204 const FloatPoint& phase, SkXfermode::Mode compositeOp, const FloatRect& dest
Rect, const FloatSize& repeatSpacing) |
| 205 { | 205 { |
| 206 TRACE_EVENT0("skia", "Image::drawPattern"); | 206 TRACE_EVENT0("skia", "Image::drawPattern"); |
| 207 | 207 |
| 208 RefPtr<SkImage> image = imageForCurrentFrame(); | 208 sk_sp<SkImage> image = imageForCurrentFrame(); |
| 209 if (!image) | 209 if (!image) |
| 210 return; | 210 return; |
| 211 | 211 |
| 212 FloatRect normSrcRect = floatSrcRect; | 212 FloatRect normSrcRect = floatSrcRect; |
| 213 | 213 |
| 214 normSrcRect.intersect(FloatRect(0, 0, image->width(), image->height())); | 214 normSrcRect.intersect(FloatRect(0, 0, image->width(), image->height())); |
| 215 if (destRect.isEmpty() || normSrcRect.isEmpty()) | 215 if (destRect.isEmpty() || normSrcRect.isEmpty()) |
| 216 return; // nothing to draw | 216 return; // nothing to draw |
| 217 | 217 |
| 218 SkMatrix localMatrix; | 218 SkMatrix localMatrix; |
| 219 // We also need to translate it such that the origin of the pattern is the | 219 // We also need to translate it such that the origin of the pattern is the |
| 220 // origin of the destination rect, which is what WebKit expects. Skia uses | 220 // origin of the destination rect, which is what WebKit expects. Skia uses |
| 221 // the coordinate system origin as the base for the pattern. If WebKit wants | 221 // the coordinate system origin as the base for the pattern. If WebKit wants |
| 222 // a shifted image, it will shift it from there using the localMatrix. | 222 // a shifted image, it will shift it from there using the localMatrix. |
| 223 const float adjustedX = phase.x() + normSrcRect.x() * scale.width(); | 223 const float adjustedX = phase.x() + normSrcRect.x() * scale.width(); |
| 224 const float adjustedY = phase.y() + normSrcRect.y() * scale.height(); | 224 const float adjustedY = phase.y() + normSrcRect.y() * scale.height(); |
| 225 localMatrix.setTranslate(SkFloatToScalar(adjustedX), SkFloatToScalar(adjuste
dY)); | 225 localMatrix.setTranslate(SkFloatToScalar(adjustedX), SkFloatToScalar(adjuste
dY)); |
| 226 | 226 |
| 227 // Because no resizing occurred, the shader transform should be | 227 // Because no resizing occurred, the shader transform should be |
| 228 // set to the pattern's transform, which just includes scale. | 228 // set to the pattern's transform, which just includes scale. |
| 229 localMatrix.preScale(scale.width(), scale.height()); | 229 localMatrix.preScale(scale.width(), scale.height()); |
| 230 | 230 |
| 231 // Fetch this now as subsetting may swap the image. | 231 // Fetch this now as subsetting may swap the image. |
| 232 auto imageID = image->uniqueID(); | 232 auto imageID = image->uniqueID(); |
| 233 | 233 |
| 234 image = fromSkSp(image->makeSubset(enclosingIntRect(normSrcRect))); | 234 image = image->makeSubset(enclosingIntRect(normSrcRect)); |
| 235 if (!image) | 235 if (!image) |
| 236 return; | 236 return; |
| 237 | 237 |
| 238 { | 238 { |
| 239 SkPaint paint = context.fillPaint(); | 239 SkPaint paint = context.fillPaint(); |
| 240 paint.setColor(SK_ColorBLACK); | 240 paint.setColor(SK_ColorBLACK); |
| 241 paint.setXfermodeMode(compositeOp); | 241 paint.setXfermodeMode(compositeOp); |
| 242 paint.setFilterQuality(context.computeFilterQuality(this, destRect, norm
SrcRect)); | 242 paint.setFilterQuality(context.computeFilterQuality(this, destRect, norm
SrcRect)); |
| 243 paint.setAntiAlias(context.shouldAntialias()); | 243 paint.setAntiAlias(context.shouldAntialias()); |
| 244 paint.setShader(createPatternShader(image.get(), localMatrix, paint, | 244 paint.setShader(createPatternShader(image.get(), localMatrix, paint, |
| 245 FloatSize(repeatSpacing.width() / scale.width(), repeatSpacing.heigh
t() / scale.height()))); | 245 FloatSize(repeatSpacing.width() / scale.width(), repeatSpacing.heigh
t() / scale.height()))); |
| 246 context.drawRect(destRect, paint); | 246 context.drawRect(destRect, paint); |
| 247 } | 247 } |
| 248 | 248 |
| 249 if (currentFrameIsLazyDecoded()) | 249 if (currentFrameIsLazyDecoded()) |
| 250 PlatformInstrumentation::didDrawLazyPixelRef(imageID); | 250 PlatformInstrumentation::didDrawLazyPixelRef(imageID); |
| 251 } | 251 } |
| 252 | 252 |
| 253 PassRefPtr<Image> Image::imageForDefaultFrame() | 253 PassRefPtr<Image> Image::imageForDefaultFrame() |
| 254 { | 254 { |
| 255 RefPtr<Image> image(this); | 255 RefPtr<Image> image(this); |
| 256 | 256 |
| 257 return image.release(); | 257 return image.release(); |
| 258 } | 258 } |
| 259 | 259 |
| 260 bool Image::isTextureBacked() | 260 bool Image::isTextureBacked() |
| 261 { | 261 { |
| 262 RefPtr<SkImage> image = imageForCurrentFrame(); | 262 sk_sp<SkImage> image = imageForCurrentFrame(); |
| 263 return image ? image->isTextureBacked() : false; | 263 return image ? image->isTextureBacked() : false; |
| 264 } | 264 } |
| 265 | 265 |
| 266 bool Image::applyShader(SkPaint& paint, const SkMatrix& localMatrix) | 266 bool Image::applyShader(SkPaint& paint, const SkMatrix& localMatrix) |
| 267 { | 267 { |
| 268 // Default shader impl: attempt to build a shader based on the current frame
SkImage. | 268 // Default shader impl: attempt to build a shader based on the current frame
SkImage. |
| 269 RefPtr<SkImage> image = imageForCurrentFrame(); | 269 sk_sp<SkImage> image = imageForCurrentFrame(); |
| 270 if (!image) | 270 if (!image) |
| 271 return false; | 271 return false; |
| 272 | 272 |
| 273 paint.setShader( | 273 paint.setShader( |
| 274 image->makeShader(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode
, &localMatrix)); | 274 image->makeShader(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode
, &localMatrix)); |
| 275 | 275 |
| 276 return true; | 276 return true; |
| 277 } | 277 } |
| 278 | 278 |
| 279 FloatRect Image::computeTileContaining(const FloatPoint& point, | 279 FloatRect Image::computeTileContaining(const FloatPoint& point, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 298 FloatRect subset = dest; | 298 FloatRect subset = dest; |
| 299 subset.setX((dest.x() - tile.x()) / scale.width()); | 299 subset.setX((dest.x() - tile.x()) / scale.width()); |
| 300 subset.setY((dest.y() - tile.y()) / scale.height()); | 300 subset.setY((dest.y() - tile.y()) / scale.height()); |
| 301 subset.setWidth(dest.width() / scale.width()); | 301 subset.setWidth(dest.width() / scale.width()); |
| 302 subset.setHeight(dest.height() / scale.height()); | 302 subset.setHeight(dest.height() / scale.height()); |
| 303 | 303 |
| 304 return subset; | 304 return subset; |
| 305 } | 305 } |
| 306 | 306 |
| 307 } // namespace blink | 307 } // namespace blink |
| OLD | NEW |