1028b98a08072bd1764936e47c54fa2da5cf92744robertphillips/* 2028b98a08072bd1764936e47c54fa2da5cf92744robertphillips * Copyright 2014 Google Inc. 3028b98a08072bd1764936e47c54fa2da5cf92744robertphillips * 4028b98a08072bd1764936e47c54fa2da5cf92744robertphillips * Use of this source code is governed by a BSD-style license that can be 5028b98a08072bd1764936e47c54fa2da5cf92744robertphillips * found in the LICENSE file. 6028b98a08072bd1764936e47c54fa2da5cf92744robertphillips */ 7028b98a08072bd1764936e47c54fa2da5cf92744robertphillips 8028b98a08072bd1764936e47c54fa2da5cf92744robertphillips#include "gm.h" 933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 10c5aa2669df99f1faa341aa5f0d8ceb4c85eef185Mike Reed#include "SkRegion.h" 11028b98a08072bd1764936e47c54fa2da5cf92744robertphillips 12028b98a08072bd1764936e47c54fa2da5cf92744robertphillips// This GM exercises the use case found in crbug.com/423834. 13028b98a08072bd1764936e47c54fa2da5cf92744robertphillips// The following pattern: 14e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips// save(); 15e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips// clipRect(rect, noAA); 16e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips// drawRect(bigRect, noAA); 17e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips// restore(); 18e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips// 19e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips// drawRect(rect, noAA); 20028b98a08072bd1764936e47c54fa2da5cf92744robertphillips// can leave 1 pixel wide remnants of the first rect. 212a24338c777462e04a2b26295f9c034155ee8f3ehalcanarystatic void Draw(SkCanvas* canvas, const SkRect& rect) { 22028b98a08072bd1764936e47c54fa2da5cf92744robertphillips SkPaint p; 23028b98a08072bd1764936e47c54fa2da5cf92744robertphillips p.setAntiAlias(false); 24028b98a08072bd1764936e47c54fa2da5cf92744robertphillips 25e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips const SkRect bigRect = SkRect::MakeWH(600, 600); 26028b98a08072bd1764936e47c54fa2da5cf92744robertphillips 27028b98a08072bd1764936e47c54fa2da5cf92744robertphillips canvas->save(); 28e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips // draw a black rect through the clip 29e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips canvas->save(); 30e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips canvas->clipRect(rect); 31e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips canvas->drawRect(bigRect, p); 32e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips canvas->restore(); 33e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips 34e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips // now draw the white rect on top 35e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips p.setColor(SK_ColorWHITE); 36e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips canvas->drawRect(rect, p); 37028b98a08072bd1764936e47c54fa2da5cf92744robertphillips canvas->restore(); 382a24338c777462e04a2b26295f9c034155ee8f3ehalcanary} 39028b98a08072bd1764936e47c54fa2da5cf92744robertphillips 402a24338c777462e04a2b26295f9c034155ee8f3ehalcanaryDEF_SIMPLE_GM_BG(clipdrawdraw, canvas, 512, 512, 412a24338c777462e04a2b26295f9c034155ee8f3ehalcanary sk_tool_utils::color_to_565(0xFFCCCCCC)) { 42e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips // Vertical remnant 43e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips const SkRect rect1 = SkRect::MakeLTRB(136.5f, 137.5f, 338.5f, 293.5f); 44e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips 45e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips // Horizontal remnant 46e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips // 179.488 rounds the right way (i.e., 179), 179.499 rounds the wrong way (i.e., 180) 47e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips const SkRect rect2 = SkRect::MakeLTRB(207.5f, 179.499f, 530.5f, 429.5f); 48e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips 49e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips Draw(canvas, rect1); 50e85a32d4f8ce7fb9b6aaae89137dbf3766d833f2robertphillips Draw(canvas, rect2); 51028b98a08072bd1764936e47c54fa2da5cf92744robertphillips} 521e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed 531e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed/////////////////////////////////////////////////////////////////////////////////////////////////// 541e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed 551e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike ReedDEF_SIMPLE_GM(clip_region, canvas, 256, 256) { 561e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed SkRegion rgn({ 10, 10, 100, 100 }); 571e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed 581e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed canvas->save(); 591e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed canvas->clipRegion(rgn); 601e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed canvas->drawColor(SK_ColorRED); 611e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed canvas->restore(); 621e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed 631e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed SkRect bounds = { 30, 30, 80, 80 }; 641e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed canvas->saveLayer(&bounds, nullptr); 651e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed canvas->clipRegion(rgn); 661e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed canvas->drawColor(SK_ColorBLUE); 671e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed canvas->restore(); 681e06d3d7b92ce35f9f81f7085ada5d1017f0e830Mike Reed} 69