|  | 
 | /* | 
 |  * 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 "SkGraphics.h" | 
 | #include "SkImageDecoder.h" | 
 | #include "SkPath.h" | 
 | #include "SkRegion.h" | 
 | #include "SkShader.h" | 
 | #include "SkUtils.h" | 
 | #include "SkXfermode.h" | 
 | #include "SkComposeShader.h" | 
 | #include "SkColorPriv.h" | 
 | #include "SkColorFilter.h" | 
 | #include "SkTime.h" | 
 | #include "SkTypeface.h" | 
 |  | 
 | #include "SkImageRef_GlobalPool.h" | 
 | #include "SkOSFile.h" | 
 | #include "SkStream.h" | 
 |  | 
 | #include "SkBlurDrawLooper.h" | 
 | #include "SkColorMatrixFilter.h" | 
 |  | 
 | static void drawmarshmallow(SkCanvas* canvas) { | 
 |     SkBitmap bitmap; | 
 |     SkPaint paint; | 
 |     SkRect r; | 
 |     SkMatrix m; | 
 |  | 
 |     SkImageDecoder::DecodeFile("/Users/reed/Downloads/3elfs.jpg", &bitmap); | 
 |     if (!bitmap.pixelRef()) { | 
 |         return; | 
 |     } | 
 |  | 
 |     SkShader* s = SkShader::CreateBitmapShader(bitmap, | 
 |                                                SkShader::kRepeat_TileMode, | 
 |                                                SkShader::kRepeat_TileMode); | 
 |     paint.setShader(s)->unref(); | 
 |     m.setTranslate(SkIntToScalar(250), SkIntToScalar(134)); | 
 |     s->setLocalMatrix(m); | 
 |  | 
 |     r.set(SkIntToScalar(250), | 
 |           SkIntToScalar(134), | 
 |           SkIntToScalar(250 + 449), | 
 |           SkIntToScalar(134 + 701)); | 
 |     paint.setFlags(2); | 
 |  | 
 |     canvas->drawRect(r, paint); | 
 | } | 
 |  | 
 | static void DrawRoundRect(SkCanvas& canvas) { | 
 |    bool ret = false; | 
 |    SkPaint  paint; | 
 |    SkBitmap bitmap; | 
 |    SkMatrix matrix; | 
 |    matrix.reset(); | 
 |  | 
 |    bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1370, 812); | 
 |    bitmap.allocPixels(); | 
 | #if 0 | 
 |     SkCanvas canvas; | 
 |     canvas.setBitmapDevice(bitmap); | 
 | #endif | 
 |  | 
 |    // set up clipper | 
 |    SkRect skclip; | 
 |    skclip.set(SkIntToScalar(284), SkIntToScalar(40), SkIntToScalar(1370), SkIntToScalar(708)); | 
 |  | 
 | //   ret = canvas.clipRect(skclip); | 
 | //   SkASSERT(ret); | 
 |  | 
 |    matrix.set(SkMatrix::kMTransX, SkFloatToScalar(-1153.28f)); | 
 |    matrix.set(SkMatrix::kMTransY, SkFloatToScalar(1180.50f)); | 
 |  | 
 |    matrix.set(SkMatrix::kMScaleX, SkFloatToScalar(0.177171f)); | 
 |    matrix.set(SkMatrix::kMScaleY, SkFloatToScalar(0.177043f)); | 
 |  | 
 |    matrix.set(SkMatrix::kMSkewX, SkFloatToScalar(0.126968f)); | 
 |    matrix.set(SkMatrix::kMSkewY, SkFloatToScalar(-0.126876f)); | 
 |  | 
 |    matrix.set(SkMatrix::kMPersp0, SkFloatToScalar(0.0f)); | 
 |    matrix.set(SkMatrix::kMPersp1, SkFloatToScalar(0.0f)); | 
 |  | 
 |    ret = canvas.concat(matrix); | 
 |  | 
 |    paint.setAntiAlias(true); | 
 |    paint.setColor(0xb2202020); | 
 |    paint.setStyle(SkPaint::kStroke_Style); | 
 |    paint.setStrokeWidth(SkFloatToScalar(68.13f)); | 
 |  | 
 |    SkRect r; | 
 |    r.set(SkFloatToScalar(-313.714417f), SkFloatToScalar(-4.826389f), SkFloatToScalar(18014.447266f), SkFloatToScalar(1858.154541f)); | 
 |    canvas.drawRoundRect(r, SkFloatToScalar(91.756363f), SkFloatToScalar(91.756363f), paint); | 
 | } | 
 |  | 
 | static bool SetImageRef(SkBitmap* bitmap, SkStream* stream, | 
 |                         SkBitmap::Config pref, const char name[] = NULL) { | 
 | #if 0 | 
 |     // test buffer streams | 
 |     SkStream* str = new SkBufferStream(stream, 717); | 
 |     stream->unref(); | 
 |     stream = str; | 
 | #endif | 
 |  | 
 |     SkImageRef* ref = new SkImageRef_GlobalPool(stream, pref, 1); | 
 |     ref->setURI(name); | 
 |     if (!ref->getInfo(bitmap)) { | 
 |         delete ref; | 
 |         return false; | 
 |     } | 
 |     bitmap->setPixelRef(ref)->unref(); | 
 |     return true; | 
 | } | 
 |  | 
 | //#define SPECIFIC_IMAGE  "/skimages/72.jpg" | 
 | #define SPECIFIC_IMAGE  "/Users/reed/Downloads/3elfs.jpg" | 
 |  | 
 | #define IMAGE_DIR       "/skimages/" | 
 | #define IMAGE_SUFFIX    ".gif" | 
 |  | 
 | class ImageDirView : public SkView { | 
 | public: | 
 |     SkBitmap*   fBitmaps; | 
 |     SkString*   fStrings; | 
 |     int         fBitmapCount; | 
 |     int         fCurrIndex; | 
 |     SkScalar    fSaturation; | 
 |     SkScalar    fAngle; | 
 |  | 
 | 	ImageDirView() { | 
 |         SkImageRef_GlobalPool::SetRAMBudget(320 * 1024); | 
 |          | 
 | #ifdef SPECIFIC_IMAGE | 
 |         fBitmaps = new SkBitmap[3]; | 
 |         fStrings = new SkString[3]; | 
 |         fBitmapCount = 3; | 
 |         const SkBitmap::Config configs[] = { | 
 |             SkBitmap::kARGB_8888_Config, | 
 |             SkBitmap::kRGB_565_Config, | 
 |             SkBitmap::kARGB_4444_Config | 
 |         }; | 
 |         for (int i = 0; i < fBitmapCount; i++) { | 
 | #if 1 | 
 |             SkStream* stream = new SkFILEStream(SPECIFIC_IMAGE); | 
 |             SetImageRef(&fBitmaps[i], stream, configs[i], SPECIFIC_IMAGE); | 
 |             stream->unref(); | 
 | #else | 
 |             SkImageDecoder::DecodeFile(SPECIFIC_IMAGE, &fBitmaps[i]); | 
 | #endif | 
 |         } | 
 | #else | 
 |         int i, N = 0; | 
 |         SkOSFile::Iter  iter(IMAGE_DIR, IMAGE_SUFFIX); | 
 |         SkString    name; | 
 |         while (iter.next(&name)) { | 
 |             N += 1; | 
 |         } | 
 |         fBitmaps = new SkBitmap[N]; | 
 |         fStrings = new SkString[N]; | 
 |         iter.reset(IMAGE_DIR, IMAGE_SUFFIX); | 
 |         for (i = 0; i < N; i++) { | 
 |             iter.next(&name); | 
 |             SkString path(IMAGE_DIR); | 
 |             path.append(name); | 
 |             SkStream* stream = new SkFILEStream(path.c_str()); | 
 |              | 
 |             SetImageRef(&fBitmaps[i], stream, SkBitmap::kNo_Config, | 
 |                         name.c_str()); | 
 |             stream->unref(); | 
 |             fStrings[i] = name; | 
 |         } | 
 |         fBitmapCount = N; | 
 | #endif | 
 |         fCurrIndex = 0; | 
 |         fDX = fDY = 0; | 
 |          | 
 |         fSaturation = SK_Scalar1; | 
 |         fAngle = 0; | 
 |          | 
 |         fScale = SK_Scalar1; | 
 |     } | 
 |      | 
 |     virtual ~ImageDirView() { | 
 |         delete[] fBitmaps; | 
 |         delete[] fStrings; | 
 |  | 
 |         SkImageRef_GlobalPool::DumpPool(); | 
 |     } | 
 |      | 
 | protected: | 
 |     // overrides from SkEventSink | 
 |     virtual bool onQuery(SkEvent* evt) { | 
 |         if (SampleCode::TitleQ(*evt)) { | 
 |             SkString str("ImageDir: "); | 
 | #ifdef SPECIFIC_IMAGE | 
 |             str.append(SPECIFIC_IMAGE); | 
 | #else | 
 |             str.append(IMAGE_DIR); | 
 | #endif | 
 |             SampleCode::TitleR(evt, str.c_str()); | 
 |             return true; | 
 |         } | 
 |         return this->INHERITED::onQuery(evt); | 
 |     } | 
 |      | 
 |     void drawBG(SkCanvas* canvas) { | 
 | //        canvas->drawColor(0xFFDDDDDD); | 
 |         canvas->drawColor(SK_ColorGRAY); | 
 |         canvas->drawColor(SK_ColorWHITE); | 
 |     } | 
 |      | 
 |     SkScalar fScale; | 
 |     virtual void onDraw(SkCanvas* canvas) { | 
 |         this->drawBG(canvas); | 
 |          | 
 |         if (true) { | 
 |             canvas->scale(SkIntToScalar(2), SkIntToScalar(2)); | 
 |             drawmarshmallow(canvas); | 
 |             return; | 
 |         } | 
 |          | 
 |         if (false) { | 
 |             SkPaint p; | 
 |             p.setStyle(SkPaint::kStroke_Style); | 
 |             p.setStrokeWidth(SkIntToScalar(4)); | 
 |             canvas->drawCircle(SkIntToScalar(100), SkIntToScalar(100), SkIntToScalar(50), p); | 
 |             p.setAntiAlias(true); | 
 |             canvas->drawCircle(SkIntToScalar(300), SkIntToScalar(100), SkIntToScalar(50), p); | 
 |         } | 
 |         if (false) { | 
 |             SkScalar cx = this->width()/2; | 
 |             SkScalar cy = this->height()/2; | 
 |             canvas->translate(cx, cy); | 
 |             canvas->scale(fScale, fScale); | 
 |             canvas->translate(-cx, -cy); | 
 |             DrawRoundRect(*canvas); | 
 |             return; | 
 |         } | 
 |      | 
 |         canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); | 
 |          | 
 |         SkScalar x = SkIntToScalar(32), y = SkIntToScalar(32); | 
 |         SkPaint paint; | 
 |  | 
 | #if 0 | 
 |         for (int i = 0; i < fBitmapCount; i++) { | 
 |             SkPaint p; | 
 |              | 
 | #if 1 | 
 |             const SkScalar cm[] = { | 
 |                 SkIntToScalar(2), 0, 0, 0, SkIntToScalar(-255), | 
 |                 0, SkIntToScalar(2), 0, 0, SkIntToScalar(-255), | 
 |                 0, 0, SkIntToScalar(2), 0, SkIntToScalar(-255), | 
 |                 0, 0, 0, SkIntToScalar(1), 0 | 
 |             }; | 
 |             SkColorFilter* cf = new SkColorMatrixFilter(cm); | 
 |             p.setColorFilter(cf)->unref(); | 
 | #endif | 
 |              | 
 |             canvas->drawBitmap(fBitmaps[i], x, y, &p); | 
 |             x += SkIntToScalar(fBitmaps[i].width() + 10); | 
 |         } | 
 |         return; | 
 | #endif | 
 |  | 
 |         canvas->drawBitmap(fBitmaps[fCurrIndex], x, y, &paint); | 
 | #ifndef SPECIFIC_IMAGE | 
 |         if (true) { | 
 |             fCurrIndex += 1; | 
 |             if (fCurrIndex >= fBitmapCount) { | 
 |                 fCurrIndex = 0; | 
 |             } | 
 |             this->inval(NULL); | 
 |         } | 
 | #endif | 
 |     } | 
 |      | 
 |     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { | 
 |         if (true) { | 
 |             fCurrIndex += 1; | 
 |             if (fCurrIndex >= fBitmapCount) | 
 |                 fCurrIndex = 0; | 
 |             this->inval(NULL); | 
 |         } | 
 |         return new Click(this); | 
 |     } | 
 |      | 
 |     virtual bool onClick(Click* click)  { | 
 |         SkScalar center = this->width()/2; | 
 |         fSaturation = SkScalarDiv(click->fCurr.fX - center, center/2); | 
 |         center = this->height()/2; | 
 |         fAngle = SkScalarDiv(click->fCurr.fY - center, center) * 180; | 
 |  | 
 |         fDX += click->fCurr.fX - click->fPrev.fX; | 
 |         fDY += click->fCurr.fY - click->fPrev.fY; | 
 |          | 
 |         fScale = SkScalarDiv(click->fCurr.fX, this->width()); | 
 |  | 
 |         this->inval(NULL); | 
 |         return true; | 
 |         return this->INHERITED::onClick(click); | 
 |     } | 
 |      | 
 | private: | 
 |     SkScalar fDX, fDY; | 
 |     typedef SkView INHERITED; | 
 | }; | 
 |  | 
 | ////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | static SkView* MyFactory() { return new ImageDirView; } | 
 | static SkViewRegister reg(MyFactory); | 
 |  |