Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1366)

Side by Side Diff: gm/xfermodes.cpp

Issue 1685203002: lots of sRGB and F16 blits (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: xfermodes gm now works in srgb and f16 using saveLayer Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
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 "gm.h" 8 #include "gm.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkShader.h" 10 #include "SkShader.h"
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 } 286 }
287 s->unref(); 287 s->unref();
288 } 288 }
289 289
290 private: 290 private:
291 typedef GM INHERITED; 291 typedef GM INHERITED;
292 }; 292 };
293 DEF_GM( return new XfermodesGM; ) 293 DEF_GM( return new XfermodesGM; )
294 294
295 //////////////////////////////////////////////////////////////////////////////// /////////////////// 295 //////////////////////////////////////////////////////////////////////////////// ///////////////////
296 #include "SkNx.h"
297
298 static SkPMColor apply_proc(SkPMColor src, SkPMColor dst, SkXfermodeProc4f proc, float src_alpha) {
299 SkPM4f src4 = SkPM4f::FromPMColor(src);
300 for (int i = 0; i < 4; ++i) {
301 src4.fVec[i] *= src_alpha;
302 }
303 SkPM4f dst4 = SkPM4f::FromPMColor(dst);
304 SkPM4f res4 = proc(src4, dst4);
305 SkPMColor res;
306 SkNx_cast<uint8_t>(Sk4f::Load(res4.fVec) * Sk4f(255) + Sk4f(0.5f)).store(&re s);
307 return res;
308 }
309
310 static bool apply_mode(const SkPixmap& res, const SkPixmap& src, const SkPixmap& dst,
311 SkXfermode* xfer, float src_alpha) {
312 SkXfermode::Mode mode;
313 if (!xfer) {
314 mode = SkXfermode::kSrcOver_Mode;
315 } else if (!xfer->asMode(&mode)) {
316 return false;
317 }
318 SkXfermodeProc4f proc = SkXfermode::GetProc4f(mode);
319 if (!proc) {
320 return false;
321 }
322
323 for (int y = 0; y < res.height(); ++y) {
324 for (int x = 0; x < res.width(); ++x) {
325 *res.writable_addr32(x, y) = apply_proc(*src.addr32(x, y), *dst.addr 32(x, y),
326 proc, src_alpha);
327 }
328 }
329 return true;
330 }
331 296
332 void draw_mode(const SkBitmap& srcB, const SkBitmap& dstB, 297 void draw_mode(const SkBitmap& srcB, const SkBitmap& dstB,
333 SkCanvas* canvas, SkXfermode* mode, SkScalar x, SkScalar y, float src_alpha) { 298 SkCanvas* canvas, SkXfermode* mode, SkScalar x, SkScalar y, float src_alpha) {
334 SkBitmap resB; 299 canvas->saveLayer(SkRect::MakeXYWH(x, y, 64, 64), nullptr);
335 resB.allocN32Pixels(64, 64); 300 canvas->drawBitmap(srcB, x, y, nullptr);
336 301
337 SkPixmap srcPM, dstPM, resPM; 302 SkPaint paint;
338 srcB.peekPixels(&srcPM); 303 paint.setXfermode(mode);
339 dstB.peekPixels(&dstPM); 304 canvas->drawBitmap(dstB, x, y, &paint);
340 resB.peekPixels(&resPM);
341 305
342 if (apply_mode(resPM, srcPM, dstPM, mode, src_alpha)) { 306 canvas->restore();
343 canvas->drawBitmap(resB, x, y, nullptr);
344 }
345 } 307 }
346 308
347 DEF_SIMPLE_GM(xfermodes_proc4f, canvas, 1000, 1000) { 309 DEF_SIMPLE_GM(xfermodes_proc4f, canvas, 1000, 1000) {
348 SkBitmap bg, srcB, dstB, transparent; 310 SkBitmap bg, srcB, dstB, transparent;
349 311
350 bg.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kOpaque_SkA lphaType), 312 bg.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kOpaque_SkA lphaType),
351 gData, 4); 313 gData, 4);
352 make_bitmaps(64, 64, &dstB, &srcB, &transparent); 314 make_bitmaps(64, 64, &dstB, &srcB, &transparent);
353 315
354 canvas->translate(10, 20); 316 canvas->translate(10, 20);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 y0 = y; 371 y0 = y;
410 } else { 372 } else {
411 x0 += SkIntToScalar(400); 373 x0 += SkIntToScalar(400);
412 y0 = 0; 374 y0 = 0;
413 } 375 }
414 376
415 canvas->translate(400, 0); 377 canvas->translate(400, 0);
416 } 378 }
417 s->unref(); 379 s->unref();
418 } 380 }
OLDNEW
« no previous file with comments | « bench/XferU64Bench.cpp ('k') | gyp/core.gypi » ('j') | src/core/SkSpriteBlitterU64.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698