Home | History | Annotate | Download | only in samplecode
      1 #include "SampleCode.h"
      2 #include "SkView.h"
      3 #include "SkCanvas.h"
      4 #include "SkGraphics.h"
      5 #include "SkRandom.h"
      6 #include "SkFlipPixelRef.h"
      7 #include "SkPageFlipper.h"
      8 
      9 #include <pthread.h>
     10 
     11 #define WIDTH   200
     12 #define HEIGHT  200
     13 
     14 static bool gDone;
     15 
     16 static void bounce(SkScalar* x, SkScalar* dx, const int max) {
     17     *x += *dx;
     18     if (*x < 0) {
     19         *x = 0;
     20         if (*dx < 0) {
     21             *dx = -*dx;
     22         }
     23     } else if (*x > SkIntToScalar(max)) {
     24         *x = SkIntToScalar(max);
     25         if (*dx > 0) {
     26             *dx = -*dx;
     27         }
     28     }
     29 }
     30 
     31 static void* draw_proc(void* context) {
     32     const int OVALW = 32;
     33     const int OVALH = 32;
     34 
     35     const SkBitmap* bm = static_cast<const SkBitmap*>(context);
     36     SkFlipPixelRef* ref = static_cast<SkFlipPixelRef*>(bm->pixelRef());
     37 
     38     const int DSCALE = 1;
     39     SkScalar    dx = SkIntToScalar(7) / DSCALE;
     40     SkScalar    dy = SkIntToScalar(5) / DSCALE;
     41     SkScalar    x = 0;
     42     SkScalar    y = 0;
     43 
     44     SkPaint paint;
     45 
     46     paint.setAntiAlias(true);
     47     paint.setColor(SK_ColorRED);
     48 
     49     SkRect oval;
     50     oval.setEmpty();
     51 
     52     while (!gDone) {
     53         ref->inval(oval, true);
     54         oval.set(x, y, x + SkIntToScalar(OVALW), y + SkIntToScalar(OVALH));
     55         ref->inval(oval, true);
     56 
     57         SkAutoFlipUpdate    update(ref);
     58 
     59         if (!update.dirty().isEmpty()) {
     60             // this must be local to the loop, since it needs to forget the pixels
     61             // its writing to after each iteration, since we do the swap
     62             SkCanvas    canvas(update.bitmap());
     63 
     64 //            SkDebugf("----- dirty [%d %d %d %d]\n", dirty.getBounds().fLeft, dirty.getBounds().fTop, dirty.getBounds().width(), dirty.getBounds().height());
     65             canvas.clipRegion(update.dirty());
     66 
     67             canvas.drawColor(0, SkXfermode::kClear_Mode);
     68             canvas.drawOval(oval, paint);
     69         }
     70         bounce(&x, &dx, WIDTH-OVALW);
     71         bounce(&y, &dy, HEIGHT-OVALH);
     72 
     73 #if 1
     74         for (int i = 0; i < 1000; i++) {
     75             for (int j = 0; j < 10000; j++) {
     76                 SkFixedMul(j, 10);
     77             }
     78         }
     79 #endif
     80     }
     81     return NULL;
     82 }
     83 
     84 static const SkBitmap::Config gConfigs[] = {
     85     SkBitmap::kARGB_8888_Config,
     86 #if 1
     87     SkBitmap::kRGB_565_Config,
     88     SkBitmap::kARGB_4444_Config,
     89     SkBitmap::kA8_Config
     90 #endif
     91 };
     92 
     93 class PageFlipView : public SampleView {
     94 public:
     95 
     96     enum { N = SK_ARRAY_COUNT(gConfigs) };
     97 
     98     pthread_t   fThreads[N];
     99     SkBitmap    fBitmaps[N];
    100 
    101 	PageFlipView() {
    102         gDone = false;
    103         for (int i = 0; i < N; i++) {
    104             int             status;
    105             pthread_attr_t  attr;
    106 
    107             status = pthread_attr_init(&attr);
    108             SkASSERT(0 == status);
    109 
    110             fBitmaps[i].setConfig(gConfigs[i], WIDTH, HEIGHT);
    111             SkFlipPixelRef* pr = new SkFlipPixelRef(gConfigs[i], WIDTH, HEIGHT);
    112             fBitmaps[i].setPixelRef(pr)->unref();
    113             fBitmaps[i].eraseColor(0);
    114 
    115             status = pthread_create(&fThreads[i], &attr,  draw_proc, &fBitmaps[i]);
    116             SkASSERT(0 == status);
    117         }
    118         this->setBGColor(0xFFDDDDDD);
    119     }
    120 
    121     virtual ~PageFlipView() {
    122         gDone = true;
    123         for (int i = 0; i < N; i++) {
    124             void* ret;
    125             int status = pthread_join(fThreads[i], &ret);
    126             SkASSERT(0 == status);
    127         }
    128     }
    129 
    130 protected:
    131     // overrides from SkEventSink
    132     virtual bool onQuery(SkEvent* evt) {
    133         if (SampleCode::TitleQ(*evt)) {
    134             SampleCode::TitleR(evt, "PageFlip");
    135             return true;
    136         }
    137         return this->INHERITED::onQuery(evt);
    138     }
    139 
    140     virtual void onDrawContent(SkCanvas* canvas) {
    141         SkScalar x = SkIntToScalar(10);
    142         SkScalar y = SkIntToScalar(10);
    143         for (int i = 0; i < N; i++) {
    144             canvas->drawBitmap(fBitmaps[i], x, y);
    145             x += SkIntToScalar(fBitmaps[i].width() + 20);
    146         }
    147         this->inval(NULL);
    148     }
    149 
    150     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
    151         this->inval(NULL);
    152         return this->INHERITED::onFindClickHandler(x, y);
    153     }
    154 
    155     virtual bool onClick(Click* click) {
    156         return this->INHERITED::onClick(click);
    157     }
    158 
    159 private:
    160     typedef SampleView INHERITED;
    161 };
    162 
    163 //////////////////////////////////////////////////////////////////////////////
    164 
    165 static SkView* MyFactory() { return new PageFlipView; }
    166 static SkViewRegister reg(MyFactory);
    167 
    168