123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /*
- * Copyright 2015 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #include "gm/gm.h"
- #include "include/core/SkBlendMode.h"
- #include "include/core/SkCanvas.h"
- #include "include/core/SkColor.h"
- #include "include/core/SkFont.h"
- #include "include/core/SkImage.h"
- #include "include/core/SkImageInfo.h"
- #include "include/core/SkPaint.h"
- #include "include/core/SkRSXform.h"
- #include "include/core/SkRect.h"
- #include "include/core/SkRefCnt.h"
- #include "include/core/SkScalar.h"
- #include "include/core/SkSize.h"
- #include "include/core/SkString.h"
- #include "include/core/SkSurface.h"
- #include "include/core/SkTypeface.h"
- #include "include/core/SkTypes.h"
- #include "tools/ToolUtils.h"
- // Create a square atlas of:
- // opaque white | opaque red
- // ------------------------------------
- // opaque green | transparent black
- //
- static sk_sp<SkImage> make_atlas(SkCanvas* caller, int atlasSize) {
- const int kBlockSize = atlasSize/2;
- SkImageInfo info = SkImageInfo::MakeN32Premul(atlasSize, atlasSize);
- auto surface(ToolUtils::makeSurface(caller, info));
- SkCanvas* canvas = surface->getCanvas();
- SkPaint paint;
- paint.setBlendMode(SkBlendMode::kSrc);
- paint.setColor(SK_ColorWHITE);
- SkRect r = SkRect::MakeXYWH(0, 0,
- SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize));
- canvas->drawRect(r, paint);
- paint.setColor(SK_ColorRED);
- r = SkRect::MakeXYWH(SkIntToScalar(kBlockSize), 0,
- SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize));
- canvas->drawRect(r, paint);
- paint.setColor(SK_ColorGREEN);
- r = SkRect::MakeXYWH(0, SkIntToScalar(kBlockSize),
- SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize));
- canvas->drawRect(r, paint);
- paint.setColor(SK_ColorTRANSPARENT);
- r = SkRect::MakeXYWH(SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize),
- SkIntToScalar(kBlockSize), SkIntToScalar(kBlockSize));
- canvas->drawRect(r, paint);
- return surface->makeImageSnapshot();
- }
- // This GM tests the drawAtlas API with colors, different xfer modes
- // and transparency in the atlas image
- class DrawAtlasColorsGM : public skiagm::GM {
- public:
- DrawAtlasColorsGM() {
- this->setBGColor(0xFFCCCCCC);
- }
- protected:
- SkString onShortName() override {
- return SkString("draw-atlas-colors");
- }
- SkISize onISize() override {
- return SkISize::Make(kNumXferModes * (kAtlasSize + kPad) + kPad,
- 2 * kNumColors * (kAtlasSize + kPad) + kTextPad + kPad);
- }
- void onDraw(SkCanvas* canvas) override {
- const SkRect target = SkRect::MakeWH(SkIntToScalar(kAtlasSize), SkIntToScalar(kAtlasSize));
- auto atlas = make_atlas(canvas, kAtlasSize);
- const SkBlendMode gModes[] = {
- SkBlendMode::kClear,
- SkBlendMode::kSrc,
- SkBlendMode::kDst,
- SkBlendMode::kSrcOver,
- SkBlendMode::kDstOver,
- SkBlendMode::kSrcIn,
- SkBlendMode::kDstIn,
- SkBlendMode::kSrcOut,
- SkBlendMode::kDstOut,
- SkBlendMode::kSrcATop,
- SkBlendMode::kDstATop,
- SkBlendMode::kXor,
- SkBlendMode::kPlus,
- SkBlendMode::kModulate,
- SkBlendMode::kScreen,
- SkBlendMode::kOverlay,
- SkBlendMode::kDarken,
- SkBlendMode::kLighten,
- SkBlendMode::kColorDodge,
- SkBlendMode::kColorBurn,
- SkBlendMode::kHardLight,
- SkBlendMode::kSoftLight,
- SkBlendMode::kDifference,
- SkBlendMode::kExclusion,
- SkBlendMode::kMultiply,
- SkBlendMode::kHue,
- SkBlendMode::kSaturation,
- SkBlendMode::kColor,
- SkBlendMode::kLuminosity,
- };
- SkColor gColors[] = {
- SK_ColorWHITE,
- SK_ColorRED,
- 0x88888888, // transparent grey
- 0x88000088 // transparent blue
- };
- const int numModes = SK_ARRAY_COUNT(gModes);
- SkASSERT(numModes == kNumXferModes);
- const int numColors = SK_ARRAY_COUNT(gColors);
- SkASSERT(numColors == kNumColors);
- SkRSXform xforms[numColors];
- SkRect rects[numColors];
- SkColor quadColors[numColors];
- SkPaint paint;
- paint.setAntiAlias(true);
- for (int i = 0; i < numColors; ++i) {
- xforms[i].set(1.0f, 0.0f, SkIntToScalar(kPad), i*(target.width()+kPad));
- rects[i] = target;
- quadColors[i] = gColors[i];
- }
- SkFont font(ToolUtils::create_portable_typeface(), kTextPad);
- for (int i = 0; i < numModes; ++i) {
- const char* label = SkBlendMode_Name(gModes[i]);
- canvas->drawString(label, i*(target.width()+kPad)+kPad, SkIntToScalar(kTextPad),
- font, paint);
- }
- for (int i = 0; i < numModes; ++i) {
- canvas->save();
- canvas->translate(SkIntToScalar(i*(target.height()+kPad)),
- SkIntToScalar(kTextPad+kPad));
- // w/o a paint
- canvas->drawAtlas(atlas.get(), xforms, rects, quadColors, numColors,
- gModes[i], nullptr, nullptr);
- canvas->translate(0.0f, numColors*(target.height()+kPad));
- // w a paint
- canvas->drawAtlas(atlas.get(), xforms, rects, quadColors, numColors,
- gModes[i], nullptr, &paint);
- canvas->restore();
- }
- }
- private:
- static constexpr int kNumXferModes = 29;
- static constexpr int kNumColors = 4;
- static constexpr int kAtlasSize = 30;
- static constexpr int kPad = 2;
- static constexpr int kTextPad = 8;
- typedef GM INHERITED;
- };
- DEF_GM( return new DrawAtlasColorsGM; )
|