| /* | |
| * Copyright 2011 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "SampleCode.h" | |
| #include "SkView.h" | |
| #include "SkCanvas.h" | |
| #include "SkGradientShader.h" | |
| #include "SkPath.h" | |
| #include "SkRegion.h" | |
| #include "SkShader.h" | |
| #include "SkUtils.h" | |
| #include "Sk1DPathEffect.h" | |
| #include "SkCornerPathEffect.h" | |
| #include "SkPathMeasure.h" | |
| #include "SkRandom.h" | |
| #include "SkColorPriv.h" | |
| #include "SkColorFilter.h" | |
| #include "SkDither.h" | |
| #include "sk_tool_utils.h" | |
| static void make_bm(SkBitmap* bm) { | |
| const SkPMColor colors[] = { | |
| SkPreMultiplyColor(SK_ColorRED), SkPreMultiplyColor(SK_ColorGREEN), | |
| SkPreMultiplyColor(SK_ColorBLUE), SkPreMultiplyColor(SK_ColorWHITE) | |
| }; | |
| SkColorTable* ctable = new SkColorTable(colors, 4); | |
| bm->allocPixels(SkImageInfo::Make(2, 2, kIndex_8_SkColorType, | |
| kOpaque_SkAlphaType), | |
| nullptr, ctable); | |
| ctable->unref(); | |
| *bm->getAddr8(0, 0) = 0; | |
| *bm->getAddr8(1, 0) = 1; | |
| *bm->getAddr8(0, 1) = 2; | |
| *bm->getAddr8(1, 1) = 3; | |
| } | |
| static SkScalar draw_bm(SkCanvas* canvas, const SkBitmap& bm, | |
| SkScalar x, SkScalar y, SkPaint* paint) { | |
| canvas->drawBitmap(bm, x, y, paint); | |
| return SkIntToScalar(bm.width()) * 5/4; | |
| } | |
| static SkScalar draw_set(SkCanvas* c, const SkBitmap& bm, SkScalar x, SkPaint* p) { | |
| x += draw_bm(c, bm, x, 0, p); | |
| p->setFilterQuality(kLow_SkFilterQuality); | |
| x += draw_bm(c, bm, x, 0, p); | |
| p->setDither(true); | |
| return x + draw_bm(c, bm, x, 0, p); | |
| } | |
| static SkScalar draw_row(SkCanvas* canvas, const SkBitmap& bm) { | |
| SkAutoCanvasRestore acr(canvas, true); | |
| SkPaint paint; | |
| SkScalar x = 0; | |
| const int scale = 32; | |
| paint.setAntiAlias(true); | |
| const char* name = sk_tool_utils::colortype_name(bm.colorType()); | |
| canvas->drawText(name, strlen(name), x, SkIntToScalar(bm.height())*scale*5/8, | |
| paint); | |
| canvas->translate(SkIntToScalar(48), 0); | |
| canvas->scale(SkIntToScalar(scale), SkIntToScalar(scale)); | |
| x += draw_set(canvas, bm, 0, &paint); | |
| paint.reset(); | |
| paint.setAlpha(0x80); | |
| draw_set(canvas, bm, x, &paint); | |
| return x * scale / 3; | |
| } | |
| class FilterView : public SampleView { | |
| public: | |
| SkBitmap fBM8, fBM4444, fBM16, fBM32; | |
| FilterView() { | |
| make_bm(&fBM8); | |
| fBM8.copyTo(&fBM4444, kARGB_4444_SkColorType); | |
| fBM8.copyTo(&fBM16, kRGB_565_SkColorType); | |
| fBM8.copyTo(&fBM32, kN32_SkColorType); | |
| this->setBGColor(0xFFDDDDDD); | |
| } | |
| protected: | |
| // overrides from SkEventSink | |
| virtual bool onQuery(SkEvent* evt) { | |
| if (SampleCode::TitleQ(*evt)) { | |
| SampleCode::TitleR(evt, "Filter"); | |
| return true; | |
| } | |
| return this->INHERITED::onQuery(evt); | |
| } | |
| virtual void onDrawContent(SkCanvas* canvas) { | |
| SkScalar x = SkIntToScalar(10); | |
| SkScalar y = SkIntToScalar(10); | |
| canvas->translate(x, y); | |
| y = draw_row(canvas, fBM8); | |
| canvas->translate(0, y); | |
| y = draw_row(canvas, fBM4444); | |
| canvas->translate(0, y); | |
| y = draw_row(canvas, fBM16); | |
| canvas->translate(0, y); | |
| draw_row(canvas, fBM32); | |
| } | |
| private: | |
| typedef SampleView INHERITED; | |
| }; | |
| ////////////////////////////////////////////////////////////////////////////// | |
| static SkView* MyFactory() { return new FilterView; } | |
| static SkViewRegister reg(MyFactory); |