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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 // SkDebugf("--- D_Clear_BitmapXferProc\n"); | 193 // SkDebugf("--- D_Clear_BitmapXferProc\n"); |
194 return D_Clear_BitmapXferProc; // ignore data | 194 return D_Clear_BitmapXferProc; // ignore data |
195 case SkXfermode::kDst_Mode: | 195 case SkXfermode::kDst_Mode: |
196 // SkDebugf("--- D_Dst_BitmapXferProc\n"); | 196 // SkDebugf("--- D_Dst_BitmapXferProc\n"); |
197 return D_Dst_BitmapXferProc; // ignore data | 197 return D_Dst_BitmapXferProc; // ignore data |
198 case SkXfermode::kSrc_Mode: { | 198 case SkXfermode::kSrc_Mode: { |
199 /* | 199 /* |
200 should I worry about dithering for the lower depths? | 200 should I worry about dithering for the lower depths? |
201 */ | 201 */ |
202 SkPMColor pmc = SkPreMultiplyColor(color); | 202 SkPMColor pmc = SkPreMultiplyColor(color); |
203 switch (bitmap.config()) { | 203 switch (bitmap.colorType()) { |
204 case SkBitmap::kARGB_8888_Config: | 204 case kPMColor_SkColorType: |
205 if (data) { | 205 if (data) { |
206 *data = pmc; | 206 *data = pmc; |
207 } | 207 } |
208 // SkDebugf("--- D32_Src_BitmapXferProc\n"); | 208 // SkDebugf("--- D32_Src_BitmapXferProc\n"); |
209 return D32_Src_BitmapXferProc; | 209 return D32_Src_BitmapXferProc; |
210 case SkBitmap::kRGB_565_Config: | 210 case kRGB_565_SkColorType: |
211 if (data) { | 211 if (data) { |
212 *data = SkPixel32ToPixel16(pmc); | 212 *data = SkPixel32ToPixel16(pmc); |
213 } | 213 } |
214 // SkDebugf("--- D16_Src_BitmapXferProc\n"); | 214 // SkDebugf("--- D16_Src_BitmapXferProc\n"); |
215 return D16_Src_BitmapXferProc; | 215 return D16_Src_BitmapXferProc; |
216 case SkBitmap::kA8_Config: | 216 case kAlpha_8_SkColorType: |
217 if (data) { | 217 if (data) { |
218 *data = SkGetPackedA32(pmc); | 218 *data = SkGetPackedA32(pmc); |
219 } | 219 } |
220 // SkDebugf("--- DA8_Src_BitmapXferProc\n"); | 220 // SkDebugf("--- DA8_Src_BitmapXferProc\n"); |
221 return DA8_Src_BitmapXferProc; | 221 return DA8_Src_BitmapXferProc; |
222 default: | 222 default: |
223 break; | 223 break; |
224 } | 224 } |
225 break; | 225 break; |
226 } | 226 } |
227 default: | 227 default: |
228 break; | 228 break; |
229 } | 229 } |
230 return NULL; | 230 return NULL; |
231 } | 231 } |
232 | 232 |
233 static void CallBitmapXferProc(const SkBitmap& bitmap, const SkIRect& rect, | 233 static void CallBitmapXferProc(const SkBitmap& bitmap, const SkIRect& rect, |
234 BitmapXferProc proc, uint32_t procData) { | 234 BitmapXferProc proc, uint32_t procData) { |
235 int shiftPerPixel; | 235 int shiftPerPixel; |
236 switch (bitmap.config()) { | 236 switch (bitmap.colorType()) { |
237 case SkBitmap::kARGB_8888_Config: | 237 case kPMColor_SkColorType: |
238 shiftPerPixel = 2; | 238 shiftPerPixel = 2; |
239 break; | 239 break; |
240 case SkBitmap::kRGB_565_Config: | 240 case kRGB_565_SkColorType: |
241 shiftPerPixel = 1; | 241 shiftPerPixel = 1; |
242 break; | 242 break; |
243 case SkBitmap::kA8_Config: | 243 case kAlpha_8_SkColorType: |
244 shiftPerPixel = 0; | 244 shiftPerPixel = 0; |
245 break; | 245 break; |
246 default: | 246 default: |
247 SkDEBUGFAIL("Can't use xferproc on this config"); | 247 SkDEBUGFAIL("Can't use xferproc on this config"); |
248 return; | 248 return; |
249 } | 249 } |
250 | 250 |
251 uint8_t* pixels = (uint8_t*)bitmap.getPixels(); | 251 uint8_t* pixels = (uint8_t*)bitmap.getPixels(); |
252 SkASSERT(pixels); | 252 SkASSERT(pixels); |
253 const size_t rowBytes = bitmap.rowBytes(); | 253 const size_t rowBytes = bitmap.rowBytes(); |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 proc = gAAProcs[fMode]; | 519 proc = gAAProcs[fMode]; |
520 } else if (fPaint->getStrokeCap() != SkPaint::kRound_Cap) { | 520 } else if (fPaint->getStrokeCap() != SkPaint::kRound_Cap) { |
521 SkASSERT(SkCanvas::kPoints_PointMode == fMode); | 521 SkASSERT(SkCanvas::kPoints_PointMode == fMode); |
522 proc = aa_square_proc; | 522 proc = aa_square_proc; |
523 } | 523 } |
524 } else { // BW | 524 } else { // BW |
525 if (fRadius <= SK_FixedHalf) { // small radii and hairline | 525 if (fRadius <= SK_FixedHalf) { // small radii and hairline |
526 if (SkCanvas::kPoints_PointMode == fMode && fClip->isRect()) { | 526 if (SkCanvas::kPoints_PointMode == fMode && fClip->isRect()) { |
527 uint32_t value; | 527 uint32_t value; |
528 const SkBitmap* bm = blitter->justAnOpaqueColor(&value); | 528 const SkBitmap* bm = blitter->justAnOpaqueColor(&value); |
529 if (bm && SkBitmap::kRGB_565_Config == bm->config()) { | 529 if (bm && kRGB_565_SkColorType == bm->colorType()) { |
530 proc = bw_pt_rect_16_hair_proc; | 530 proc = bw_pt_rect_16_hair_proc; |
531 } else if (bm && SkBitmap::kARGB_8888_Config == bm->config()) { | 531 } else if (bm && kPMColor_SkColorType == bm->colorType()) { |
532 proc = bw_pt_rect_32_hair_proc; | 532 proc = bw_pt_rect_32_hair_proc; |
533 } else { | 533 } else { |
534 proc = bw_pt_rect_hair_proc; | 534 proc = bw_pt_rect_hair_proc; |
535 } | 535 } |
536 } else { | 536 } else { |
537 static Proc gBWProcs[] = { | 537 static Proc gBWProcs[] = { |
538 bw_pt_hair_proc, bw_line_hair_proc, bw_poly_hair_proc | 538 bw_pt_hair_proc, bw_line_hair_proc, bw_poly_hair_proc |
539 }; | 539 }; |
540 proc = gBWProcs[fMode]; | 540 proc = gBWProcs[fMode]; |
541 } | 541 } |
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1169 go ahead and treat it as if it were, so that subsequent code can go fast. | 1169 go ahead and treat it as if it were, so that subsequent code can go fast. |
1170 */ | 1170 */ |
1171 static bool just_translate(const SkMatrix& matrix, const SkBitmap& bitmap) { | 1171 static bool just_translate(const SkMatrix& matrix, const SkBitmap& bitmap) { |
1172 unsigned bits = 0; // TODO: find a way to allow the caller to tell us to | 1172 unsigned bits = 0; // TODO: find a way to allow the caller to tell us to |
1173 // respect filtering. | 1173 // respect filtering. |
1174 return SkTreatAsSprite(matrix, bitmap.width(), bitmap.height(), bits); | 1174 return SkTreatAsSprite(matrix, bitmap.width(), bitmap.height(), bits); |
1175 } | 1175 } |
1176 | 1176 |
1177 void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, | 1177 void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, |
1178 const SkPaint& paint) const { | 1178 const SkPaint& paint) const { |
1179 SkASSERT(bitmap.config() == SkBitmap::kA8_Config); | 1179 SkASSERT(bitmap.colorType() == kAlpha_8_SkColorType); |
1180 | 1180 |
1181 if (just_translate(*fMatrix, bitmap)) { | 1181 if (just_translate(*fMatrix, bitmap)) { |
1182 int ix = SkScalarRoundToInt(fMatrix->getTranslateX()); | 1182 int ix = SkScalarRoundToInt(fMatrix->getTranslateX()); |
1183 int iy = SkScalarRoundToInt(fMatrix->getTranslateY()); | 1183 int iy = SkScalarRoundToInt(fMatrix->getTranslateY()); |
1184 | 1184 |
1185 SkAutoLockPixels alp(bitmap); | 1185 SkAutoLockPixels alp(bitmap); |
1186 if (!bitmap.readyToDraw()) { | 1186 if (!bitmap.readyToDraw()) { |
1187 return; | 1187 return; |
1188 } | 1188 } |
1189 | 1189 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1277 clip.quickContains(x, y, x + bitmap.width(), y + bitmap.height()); | 1277 clip.quickContains(x, y, x + bitmap.width(), y + bitmap.height()); |
1278 } | 1278 } |
1279 | 1279 |
1280 void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix, | 1280 void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix, |
1281 const SkPaint& origPaint) const { | 1281 const SkPaint& origPaint) const { |
1282 SkDEBUGCODE(this->validate();) | 1282 SkDEBUGCODE(this->validate();) |
1283 | 1283 |
1284 // nothing to draw | 1284 // nothing to draw |
1285 if (fRC->isEmpty() || | 1285 if (fRC->isEmpty() || |
1286 bitmap.width() == 0 || bitmap.height() == 0 || | 1286 bitmap.width() == 0 || bitmap.height() == 0 || |
1287 bitmap.config() == SkBitmap::kNo_Config) { | 1287 bitmap.colorType() == kUnknown_SkColorType) { |
1288 return; | 1288 return; |
1289 } | 1289 } |
1290 | 1290 |
1291 SkPaint paint(origPaint); | 1291 SkPaint paint(origPaint); |
1292 paint.setStyle(SkPaint::kFill_Style); | 1292 paint.setStyle(SkPaint::kFill_Style); |
1293 | 1293 |
1294 SkMatrix matrix; | 1294 SkMatrix matrix; |
1295 if (!matrix.setConcat(*fMatrix, prematrix)) { | 1295 if (!matrix.setConcat(*fMatrix, prematrix)) { |
1296 return; | 1296 return; |
1297 } | 1297 } |
1298 | 1298 |
1299 if (clipped_out(matrix, *fRC, bitmap.width(), bitmap.height())) { | 1299 if (clipped_out(matrix, *fRC, bitmap.width(), bitmap.height())) { |
1300 return; | 1300 return; |
1301 } | 1301 } |
1302 | 1302 |
1303 if (fBounder && just_translate(matrix, bitmap)) { | 1303 if (fBounder && just_translate(matrix, bitmap)) { |
1304 SkIRect ir; | 1304 SkIRect ir; |
1305 int32_t ix = SkScalarRoundToInt(matrix.getTranslateX()); | 1305 int32_t ix = SkScalarRoundToInt(matrix.getTranslateX()); |
1306 int32_t iy = SkScalarRoundToInt(matrix.getTranslateY()); | 1306 int32_t iy = SkScalarRoundToInt(matrix.getTranslateY()); |
1307 ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height()); | 1307 ir.set(ix, iy, ix + bitmap.width(), iy + bitmap.height()); |
1308 if (!fBounder->doIRect(ir)) { | 1308 if (!fBounder->doIRect(ir)) { |
1309 return; | 1309 return; |
1310 } | 1310 } |
1311 } | 1311 } |
1312 | 1312 |
1313 if (bitmap.config() != SkBitmap::kA8_Config && | 1313 if (bitmap.colorType() != kAlpha_8_SkColorType && |
1314 just_translate(matrix, bitmap)) { | 1314 just_translate(matrix, bitmap)) { |
1315 // | 1315 // |
1316 // It is safe to call lock pixels now, since we know the matrix is | 1316 // It is safe to call lock pixels now, since we know the matrix is |
1317 // (more or less) identity. | 1317 // (more or less) identity. |
1318 // | 1318 // |
1319 SkAutoLockPixels alp(bitmap); | 1319 SkAutoLockPixels alp(bitmap); |
1320 if (!bitmap.readyToDraw()) { | 1320 if (!bitmap.readyToDraw()) { |
1321 return; | 1321 return; |
1322 } | 1322 } |
1323 int ix = SkScalarRoundToInt(matrix.getTranslateX()); | 1323 int ix = SkScalarRoundToInt(matrix.getTranslateX()); |
(...skipping 12 matching lines...) Expand all Loading... |
1336 return; | 1336 return; |
1337 } | 1337 } |
1338 } | 1338 } |
1339 } | 1339 } |
1340 | 1340 |
1341 // now make a temp draw on the stack, and use it | 1341 // now make a temp draw on the stack, and use it |
1342 // | 1342 // |
1343 SkDraw draw(*this); | 1343 SkDraw draw(*this); |
1344 draw.fMatrix = &matrix; | 1344 draw.fMatrix = &matrix; |
1345 | 1345 |
1346 if (bitmap.config() == SkBitmap::kA8_Config) { | 1346 if (bitmap.colorType() == kAlpha_8_SkColorType) { |
1347 draw.drawBitmapAsMask(bitmap, paint); | 1347 draw.drawBitmapAsMask(bitmap, paint); |
1348 } else { | 1348 } else { |
1349 SkAutoBitmapShaderInstall install(bitmap, paint); | 1349 SkAutoBitmapShaderInstall install(bitmap, paint); |
1350 | 1350 |
1351 SkRect r; | 1351 SkRect r; |
1352 r.set(0, 0, SkIntToScalar(bitmap.width()), | 1352 r.set(0, 0, SkIntToScalar(bitmap.width()), |
1353 SkIntToScalar(bitmap.height())); | 1353 SkIntToScalar(bitmap.height())); |
1354 // is this ok if paint has a rasterizer? | 1354 // is this ok if paint has a rasterizer? |
1355 draw.drawRect(r, install.paintWithShader()); | 1355 draw.drawRect(r, install.paintWithShader()); |
1356 } | 1356 } |
1357 } | 1357 } |
1358 | 1358 |
1359 void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, | 1359 void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, |
1360 const SkPaint& origPaint) const { | 1360 const SkPaint& origPaint) const { |
1361 SkDEBUGCODE(this->validate();) | 1361 SkDEBUGCODE(this->validate();) |
1362 | 1362 |
1363 // nothing to draw | 1363 // nothing to draw |
1364 if (fRC->isEmpty() || | 1364 if (fRC->isEmpty() || |
1365 bitmap.width() == 0 || bitmap.height() == 0 || | 1365 bitmap.width() == 0 || bitmap.height() == 0 || |
1366 bitmap.config() == SkBitmap::kNo_Config) { | 1366 bitmap.colorType() == kUnknown_SkColorType) { |
1367 return; | 1367 return; |
1368 } | 1368 } |
1369 | 1369 |
1370 SkIRect bounds; | 1370 SkIRect bounds; |
1371 bounds.set(x, y, x + bitmap.width(), y + bitmap.height()); | 1371 bounds.set(x, y, x + bitmap.width(), y + bitmap.height()); |
1372 | 1372 |
1373 if (fRC->quickReject(bounds)) { | 1373 if (fRC->quickReject(bounds)) { |
1374 return; // nothing to draw | 1374 return; // nothing to draw |
1375 } | 1375 } |
1376 | 1376 |
(...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2820 mask->fImage = SkMask::AllocImage(size); | 2820 mask->fImage = SkMask::AllocImage(size); |
2821 memset(mask->fImage, 0, mask->computeImageSize()); | 2821 memset(mask->fImage, 0, mask->computeImageSize()); |
2822 } | 2822 } |
2823 | 2823 |
2824 if (SkMask::kJustComputeBounds_CreateMode != mode) { | 2824 if (SkMask::kJustComputeBounds_CreateMode != mode) { |
2825 draw_into_mask(*mask, devPath, style); | 2825 draw_into_mask(*mask, devPath, style); |
2826 } | 2826 } |
2827 | 2827 |
2828 return true; | 2828 return true; |
2829 } | 2829 } |
OLD | NEW |