| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 #define __STDC_LIMIT_MACROS | 7 #define __STDC_LIMIT_MACROS |
| 8 | 8 |
| 9 #include "SkDraw.h" | 9 #include "SkDraw.h" |
| 10 #include "SkBlitter.h" | 10 #include "SkBlitter.h" |
| (...skipping 1224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1235 return c.quickReject(dstR.roundOut()); | 1235 return c.quickReject(dstR.roundOut()); |
| 1236 } | 1236 } |
| 1237 | 1237 |
| 1238 static bool clipped_out(const SkMatrix& matrix, const SkRasterClip& clip, | 1238 static bool clipped_out(const SkMatrix& matrix, const SkRasterClip& clip, |
| 1239 int width, int height) { | 1239 int width, int height) { |
| 1240 SkRect r; | 1240 SkRect r; |
| 1241 r.set(0, 0, SkIntToScalar(width), SkIntToScalar(height)); | 1241 r.set(0, 0, SkIntToScalar(width), SkIntToScalar(height)); |
| 1242 return clipped_out(matrix, clip, r); | 1242 return clipped_out(matrix, clip, r); |
| 1243 } | 1243 } |
| 1244 | 1244 |
| 1245 static bool clipHandlesSprite(const SkRasterClip& clip, int x, int y, | 1245 static bool clipHandlesSprite(const SkRasterClip& clip, int x, int y, const SkPi
xmap& pmap) { |
| 1246 const SkBitmap& bitmap) { | 1246 return clip.isBW() || clip.quickContains(x, y, x + pmap.width(), y + pmap.he
ight()); |
| 1247 return clip.isBW() || | |
| 1248 clip.quickContains(x, y, x + bitmap.width(), y + bitmap.height()); | |
| 1249 } | 1247 } |
| 1250 | 1248 |
| 1251 void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix, | 1249 void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix, |
| 1252 const SkRect* dstBounds, const SkPaint& origPaint) const
{ | 1250 const SkRect* dstBounds, const SkPaint& origPaint) const
{ |
| 1253 SkDEBUGCODE(this->validate();) | 1251 SkDEBUGCODE(this->validate();) |
| 1254 | 1252 |
| 1255 // nothing to draw | 1253 // nothing to draw |
| 1256 if (fRC->isEmpty() || | 1254 if (fRC->isEmpty() || |
| 1257 bitmap.width() == 0 || bitmap.height() == 0 || | 1255 bitmap.width() == 0 || bitmap.height() == 0 || |
| 1258 bitmap.colorType() == kUnknown_SkColorType) { | 1256 bitmap.colorType() == kUnknown_SkColorType) { |
| 1259 return; | 1257 return; |
| 1260 } | 1258 } |
| 1261 | 1259 |
| 1262 SkPaint paint(origPaint); | 1260 SkPaint paint(origPaint); |
| 1263 paint.setStyle(SkPaint::kFill_Style); | 1261 paint.setStyle(SkPaint::kFill_Style); |
| 1264 | 1262 |
| 1265 SkMatrix matrix; | 1263 SkMatrix matrix; |
| 1266 matrix.setConcat(*fMatrix, prematrix); | 1264 matrix.setConcat(*fMatrix, prematrix); |
| 1267 | 1265 |
| 1268 if (clipped_out(matrix, *fRC, bitmap.width(), bitmap.height())) { | 1266 if (clipped_out(matrix, *fRC, bitmap.width(), bitmap.height())) { |
| 1269 return; | 1267 return; |
| 1270 } | 1268 } |
| 1271 | 1269 |
| 1272 if (bitmap.colorType() != kAlpha_8_SkColorType && just_translate(matrix, bit
map)) { | 1270 if (bitmap.colorType() != kAlpha_8_SkColorType && just_translate(matrix, bit
map)) { |
| 1273 // | 1271 // |
| 1274 // It is safe to call lock pixels now, since we know the matrix is | 1272 // It is safe to call lock pixels now, since we know the matrix is |
| 1275 // (more or less) identity. | 1273 // (more or less) identity. |
| 1276 // | 1274 // |
| 1277 SkAutoLockPixels alp(bitmap); | 1275 SkAutoPixmapUnlock unlocker; |
| 1278 if (!bitmap.readyToDraw()) { | 1276 if (!bitmap.requestLock(&unlocker)) { |
| 1279 return; | 1277 return; |
| 1280 } | 1278 } |
| 1279 const SkPixmap& pmap = unlocker.pixmap(); |
| 1281 int ix = SkScalarRoundToInt(matrix.getTranslateX()); | 1280 int ix = SkScalarRoundToInt(matrix.getTranslateX()); |
| 1282 int iy = SkScalarRoundToInt(matrix.getTranslateY()); | 1281 int iy = SkScalarRoundToInt(matrix.getTranslateY()); |
| 1283 if (clipHandlesSprite(*fRC, ix, iy, bitmap)) { | 1282 if (clipHandlesSprite(*fRC, ix, iy, pmap)) { |
| 1284 SkTBlitterAllocator allocator; | 1283 SkTBlitterAllocator allocator; |
| 1285 // blitter will be owned by the allocator. | 1284 // blitter will be owned by the allocator. |
| 1286 SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap
, | 1285 SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, pmap,
ix, iy, &allocator); |
| 1287 ix, iy, &allocator); | |
| 1288 if (blitter) { | 1286 if (blitter) { |
| 1289 SkIRect ir; | 1287 SkScan::FillIRect(SkIRect::MakeXYWH(ix, iy, pmap.width(), pmap.h
eight()), |
| 1290 ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height()); | 1288 *fRC, blitter); |
| 1291 | |
| 1292 SkScan::FillIRect(ir, *fRC, blitter); | |
| 1293 return; | 1289 return; |
| 1294 } | 1290 } |
| 1291 // if !blitter, then we fall-through to the slower case |
| 1295 } | 1292 } |
| 1296 } | 1293 } |
| 1297 | 1294 |
| 1298 // now make a temp draw on the stack, and use it | 1295 // now make a temp draw on the stack, and use it |
| 1299 // | 1296 // |
| 1300 SkDraw draw(*this); | 1297 SkDraw draw(*this); |
| 1301 draw.fMatrix = &matrix; | 1298 draw.fMatrix = &matrix; |
| 1302 | 1299 |
| 1303 if (bitmap.colorType() == kAlpha_8_SkColorType) { | 1300 if (bitmap.colorType() == kAlpha_8_SkColorType) { |
| 1304 draw.drawBitmapAsMask(bitmap, paint); | 1301 draw.drawBitmapAsMask(bitmap, paint); |
| 1305 } else { | 1302 } else { |
| 1306 SkAutoBitmapShaderInstall install(bitmap, paint); | 1303 SkAutoBitmapShaderInstall install(bitmap, paint); |
| 1307 const SkPaint& paintWithShader = install.paintWithShader(); | 1304 const SkPaint& paintWithShader = install.paintWithShader(); |
| 1308 const SkRect srcBounds = SkRect::MakeIWH(bitmap.width(), bitmap.height()
); | 1305 const SkRect srcBounds = SkRect::MakeIWH(bitmap.width(), bitmap.height()
); |
| 1309 if (dstBounds) { | 1306 if (dstBounds) { |
| 1310 this->drawRect(srcBounds, paintWithShader, &prematrix, dstBounds); | 1307 this->drawRect(srcBounds, paintWithShader, &prematrix, dstBounds); |
| 1311 } else { | 1308 } else { |
| 1312 draw.drawRect(srcBounds, paintWithShader); | 1309 draw.drawRect(srcBounds, paintWithShader); |
| 1313 } | 1310 } |
| 1314 } | 1311 } |
| 1315 } | 1312 } |
| 1316 | 1313 |
| 1317 void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, | 1314 void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, const SkPaint& ori
gPaint) const { |
| 1318 const SkPaint& origPaint) const { | |
| 1319 SkDEBUGCODE(this->validate();) | 1315 SkDEBUGCODE(this->validate();) |
| 1320 | 1316 |
| 1321 // nothing to draw | 1317 // nothing to draw |
| 1322 if (fRC->isEmpty() || | 1318 if (fRC->isEmpty() || |
| 1323 bitmap.width() == 0 || bitmap.height() == 0 || | 1319 bitmap.width() == 0 || bitmap.height() == 0 || |
| 1324 bitmap.colorType() == kUnknown_SkColorType) { | 1320 bitmap.colorType() == kUnknown_SkColorType) { |
| 1325 return; | 1321 return; |
| 1326 } | 1322 } |
| 1327 | 1323 |
| 1328 SkIRect bounds; | 1324 const SkIRect bounds = SkIRect::MakeXYWH(x, y, bitmap.width(), bitmap.height
()); |
| 1329 bounds.set(x, y, x + bitmap.width(), y + bitmap.height()); | |
| 1330 | 1325 |
| 1331 if (fRC->quickReject(bounds)) { | 1326 if (fRC->quickReject(bounds)) { |
| 1332 return; // nothing to draw | 1327 return; // nothing to draw |
| 1333 } | 1328 } |
| 1334 | 1329 |
| 1335 SkPaint paint(origPaint); | 1330 SkPaint paint(origPaint); |
| 1336 paint.setStyle(SkPaint::kFill_Style); | 1331 paint.setStyle(SkPaint::kFill_Style); |
| 1337 | 1332 |
| 1338 if (NULL == paint.getColorFilter() && clipHandlesSprite(*fRC, x, y, bitmap))
{ | 1333 SkAutoPixmapUnlock unlocker; |
| 1334 if (!bitmap.requestLock(&unlocker)) { |
| 1335 return; |
| 1336 } |
| 1337 const SkPixmap& pmap = unlocker.pixmap(); |
| 1338 |
| 1339 if (NULL == paint.getColorFilter() && clipHandlesSprite(*fRC, x, y, pmap)) { |
| 1339 SkTBlitterAllocator allocator; | 1340 SkTBlitterAllocator allocator; |
| 1340 // blitter will be owned by the allocator. | 1341 // blitter will be owned by the allocator. |
| 1341 SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, bitmap, | 1342 SkBlitter* blitter = SkBlitter::ChooseSprite(*fBitmap, paint, pmap, x, y
, &allocator); |
| 1342 x, y, &allocator); | |
| 1343 | |
| 1344 if (blitter) { | 1343 if (blitter) { |
| 1345 SkScan::FillIRect(bounds, *fRC, blitter); | 1344 SkScan::FillIRect(bounds, *fRC, blitter); |
| 1346 return; | 1345 return; |
| 1347 } | 1346 } |
| 1348 } | 1347 } |
| 1349 | 1348 |
| 1350 SkMatrix matrix; | 1349 SkMatrix matrix; |
| 1351 SkRect r; | 1350 SkRect r; |
| 1352 | 1351 |
| 1353 // get a scalar version of our rect | 1352 // get a scalar version of our rect |
| (...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2268 mask->fImage = SkMask::AllocImage(size); | 2267 mask->fImage = SkMask::AllocImage(size); |
| 2269 memset(mask->fImage, 0, mask->computeImageSize()); | 2268 memset(mask->fImage, 0, mask->computeImageSize()); |
| 2270 } | 2269 } |
| 2271 | 2270 |
| 2272 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2271 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
| 2273 draw_into_mask(*mask, devPath, style); | 2272 draw_into_mask(*mask, devPath, style); |
| 2274 } | 2273 } |
| 2275 | 2274 |
| 2276 return true; | 2275 return true; |
| 2277 } | 2276 } |
| OLD | NEW |