| 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 | 7 |
| 8 #include "SkDraw.h" | 8 #include "SkDraw.h" |
| 9 #include "SkBlitter.h" | 9 #include "SkBlitter.h" |
| 10 #include "SkBounder.h" | 10 #include "SkBounder.h" |
| (...skipping 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1149 go ahead and treat it as if it were, so that subsequent code can go fast. | 1149 go ahead and treat it as if it were, so that subsequent code can go fast. |
| 1150 */ | 1150 */ |
| 1151 static bool just_translate(const SkMatrix& matrix, const SkBitmap& bitmap) { | 1151 static bool just_translate(const SkMatrix& matrix, const SkBitmap& bitmap) { |
| 1152 unsigned bits = 0; // TODO: find a way to allow the caller to tell us to | 1152 unsigned bits = 0; // TODO: find a way to allow the caller to tell us to |
| 1153 // respect filtering. | 1153 // respect filtering. |
| 1154 return SkTreatAsSprite(matrix, bitmap.width(), bitmap.height(), bits); | 1154 return SkTreatAsSprite(matrix, bitmap.width(), bitmap.height(), bits); |
| 1155 } | 1155 } |
| 1156 | 1156 |
| 1157 void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, | 1157 void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, |
| 1158 const SkPaint& paint) const { | 1158 const SkPaint& paint) const { |
| 1159 SkASSERT(bitmap.getConfig() == SkBitmap::kA8_Config); | 1159 SkASSERT(bitmap.config() == SkBitmap::kA8_Config); |
| 1160 | 1160 |
| 1161 if (just_translate(*fMatrix, bitmap)) { | 1161 if (just_translate(*fMatrix, bitmap)) { |
| 1162 int ix = SkScalarRound(fMatrix->getTranslateX()); | 1162 int ix = SkScalarRound(fMatrix->getTranslateX()); |
| 1163 int iy = SkScalarRound(fMatrix->getTranslateY()); | 1163 int iy = SkScalarRound(fMatrix->getTranslateY()); |
| 1164 | 1164 |
| 1165 SkAutoLockPixels alp(bitmap); | 1165 SkAutoLockPixels alp(bitmap); |
| 1166 if (!bitmap.readyToDraw()) { | 1166 if (!bitmap.readyToDraw()) { |
| 1167 return; | 1167 return; |
| 1168 } | 1168 } |
| 1169 | 1169 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1257 clip.quickContains(x, y, x + bitmap.width(), y + bitmap.height()); | 1257 clip.quickContains(x, y, x + bitmap.width(), y + bitmap.height()); |
| 1258 } | 1258 } |
| 1259 | 1259 |
| 1260 void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix, | 1260 void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix, |
| 1261 const SkPaint& origPaint) const { | 1261 const SkPaint& origPaint) const { |
| 1262 SkDEBUGCODE(this->validate();) | 1262 SkDEBUGCODE(this->validate();) |
| 1263 | 1263 |
| 1264 // nothing to draw | 1264 // nothing to draw |
| 1265 if (fRC->isEmpty() || | 1265 if (fRC->isEmpty() || |
| 1266 bitmap.width() == 0 || bitmap.height() == 0 || | 1266 bitmap.width() == 0 || bitmap.height() == 0 || |
| 1267 bitmap.getConfig() == SkBitmap::kNo_Config) { | 1267 bitmap.config() == SkBitmap::kNo_Config) { |
| 1268 return; | 1268 return; |
| 1269 } | 1269 } |
| 1270 | 1270 |
| 1271 SkPaint paint(origPaint); | 1271 SkPaint paint(origPaint); |
| 1272 paint.setStyle(SkPaint::kFill_Style); | 1272 paint.setStyle(SkPaint::kFill_Style); |
| 1273 | 1273 |
| 1274 SkMatrix matrix; | 1274 SkMatrix matrix; |
| 1275 if (!matrix.setConcat(*fMatrix, prematrix)) { | 1275 if (!matrix.setConcat(*fMatrix, prematrix)) { |
| 1276 return; | 1276 return; |
| 1277 } | 1277 } |
| 1278 | 1278 |
| 1279 if (clipped_out(matrix, *fRC, bitmap.width(), bitmap.height())) { | 1279 if (clipped_out(matrix, *fRC, bitmap.width(), bitmap.height())) { |
| 1280 return; | 1280 return; |
| 1281 } | 1281 } |
| 1282 | 1282 |
| 1283 if (fBounder && just_translate(matrix, bitmap)) { | 1283 if (fBounder && just_translate(matrix, bitmap)) { |
| 1284 SkIRect ir; | 1284 SkIRect ir; |
| 1285 int32_t ix = SkScalarRound(matrix.getTranslateX()); | 1285 int32_t ix = SkScalarRound(matrix.getTranslateX()); |
| 1286 int32_t iy = SkScalarRound(matrix.getTranslateY()); | 1286 int32_t iy = SkScalarRound(matrix.getTranslateY()); |
| 1287 ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height()); | 1287 ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height()); |
| 1288 if (!fBounder->doIRect(ir)) { | 1288 if (!fBounder->doIRect(ir)) { |
| 1289 return; | 1289 return; |
| 1290 } | 1290 } |
| 1291 } | 1291 } |
| 1292 | 1292 |
| 1293 if (bitmap.getConfig() != SkBitmap::kA8_Config && | 1293 if (bitmap.config() != SkBitmap::kA8_Config && |
| 1294 just_translate(matrix, bitmap)) { | 1294 just_translate(matrix, bitmap)) { |
| 1295 // | 1295 // |
| 1296 // It is safe to call lock pixels now, since we know the matrix is | 1296 // It is safe to call lock pixels now, since we know the matrix is |
| 1297 // (more or less) identity. | 1297 // (more or less) identity. |
| 1298 // | 1298 // |
| 1299 SkAutoLockPixels alp(bitmap); | 1299 SkAutoLockPixels alp(bitmap); |
| 1300 if (!bitmap.readyToDraw()) { | 1300 if (!bitmap.readyToDraw()) { |
| 1301 return; | 1301 return; |
| 1302 } | 1302 } |
| 1303 int ix = SkScalarRound(matrix.getTranslateX()); | 1303 int ix = SkScalarRound(matrix.getTranslateX()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1316 return; | 1316 return; |
| 1317 } | 1317 } |
| 1318 } | 1318 } |
| 1319 } | 1319 } |
| 1320 | 1320 |
| 1321 // now make a temp draw on the stack, and use it | 1321 // now make a temp draw on the stack, and use it |
| 1322 // | 1322 // |
| 1323 SkDraw draw(*this); | 1323 SkDraw draw(*this); |
| 1324 draw.fMatrix = &matrix; | 1324 draw.fMatrix = &matrix; |
| 1325 | 1325 |
| 1326 if (bitmap.getConfig() == SkBitmap::kA8_Config) { | 1326 if (bitmap.config() == SkBitmap::kA8_Config) { |
| 1327 draw.drawBitmapAsMask(bitmap, paint); | 1327 draw.drawBitmapAsMask(bitmap, paint); |
| 1328 } else { | 1328 } else { |
| 1329 SkAutoBitmapShaderInstall install(bitmap, paint); | 1329 SkAutoBitmapShaderInstall install(bitmap, paint); |
| 1330 | 1330 |
| 1331 SkRect r; | 1331 SkRect r; |
| 1332 r.set(0, 0, SkIntToScalar(bitmap.width()), | 1332 r.set(0, 0, SkIntToScalar(bitmap.width()), |
| 1333 SkIntToScalar(bitmap.height())); | 1333 SkIntToScalar(bitmap.height())); |
| 1334 // is this ok if paint has a rasterizer? | 1334 // is this ok if paint has a rasterizer? |
| 1335 draw.drawRect(r, install.paintWithShader()); | 1335 draw.drawRect(r, install.paintWithShader()); |
| 1336 } | 1336 } |
| 1337 } | 1337 } |
| 1338 | 1338 |
| 1339 void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, | 1339 void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, |
| 1340 const SkPaint& origPaint) const { | 1340 const SkPaint& origPaint) const { |
| 1341 SkDEBUGCODE(this->validate();) | 1341 SkDEBUGCODE(this->validate();) |
| 1342 | 1342 |
| 1343 // nothing to draw | 1343 // nothing to draw |
| 1344 if (fRC->isEmpty() || | 1344 if (fRC->isEmpty() || |
| 1345 bitmap.width() == 0 || bitmap.height() == 0 || | 1345 bitmap.width() == 0 || bitmap.height() == 0 || |
| 1346 bitmap.getConfig() == SkBitmap::kNo_Config) { | 1346 bitmap.config() == SkBitmap::kNo_Config) { |
| 1347 return; | 1347 return; |
| 1348 } | 1348 } |
| 1349 | 1349 |
| 1350 SkIRect bounds; | 1350 SkIRect bounds; |
| 1351 bounds.set(x, y, x + bitmap.width(), y + bitmap.height()); | 1351 bounds.set(x, y, x + bitmap.width(), y + bitmap.height()); |
| 1352 | 1352 |
| 1353 if (fRC->quickReject(bounds)) { | 1353 if (fRC->quickReject(bounds)) { |
| 1354 return; // nothing to draw | 1354 return; // nothing to draw |
| 1355 } | 1355 } |
| 1356 | 1356 |
| (...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2826 mask->fImage = SkMask::AllocImage(size); | 2826 mask->fImage = SkMask::AllocImage(size); |
| 2827 memset(mask->fImage, 0, mask->computeImageSize()); | 2827 memset(mask->fImage, 0, mask->computeImageSize()); |
| 2828 } | 2828 } |
| 2829 | 2829 |
| 2830 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2830 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
| 2831 draw_into_mask(*mask, devPath, style); | 2831 draw_into_mask(*mask, devPath, style); |
| 2832 } | 2832 } |
| 2833 | 2833 |
| 2834 return true; | 2834 return true; |
| 2835 } | 2835 } |
| OLD | NEW |