moz-skia/samplecode/SampleMipMap.cpp

162 строки
4.6 KiB
C++
Исходник Обычный вид История

Automatic update of all copyright notices to reflect new license terms. I have manually examined all of these diffs and restored a few files that seem to require manual adjustment. The following files still need to be modified manually, in a separate CL: android_sample/SampleApp/AndroidManifest.xml android_sample/SampleApp/res/layout/layout.xml android_sample/SampleApp/res/menu/sample.xml android_sample/SampleApp/res/values/strings.xml android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java android_sample/SampleApp/src/com/skia/sampleapp/SampleView.java experimental/CiCarbonSampleMain.c experimental/CocoaDebugger/main.m experimental/FileReaderApp/main.m experimental/SimpleCocoaApp/main.m experimental/iOSSampleApp/Shared/SkAlertPrompt.h experimental/iOSSampleApp/Shared/SkAlertPrompt.m experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Debug.xcconfig experimental/iOSSampleApp/SkiOSSampleApp-Release.xcconfig gpu/src/android/GrGLDefaultInterface_android.cpp gyp/common.gypi gyp_skia include/ports/SkHarfBuzzFont.h include/views/SkOSWindow_wxwidgets.h make.bat make.py src/opts/memset.arm.S src/opts/memset16_neon.S src/opts/memset32_neon.S src/opts/opts_check_arm.cpp src/ports/SkDebug_brew.cpp src/ports/SkMemory_brew.cpp src/ports/SkOSFile_brew.cpp src/ports/SkXMLParser_empty.cpp src/utils/ios/SkImageDecoder_iOS.mm src/utils/ios/SkOSFile_iOS.mm src/utils/ios/SkStream_NSData.mm tests/FillPathTest.cpp Review URL: http://codereview.appspot.com/4816058 git-svn-id: http://skia.googlecode.com/svn/trunk@1982 2bbb7eff-a529-9590-31e7-b0007b416f81
2011-07-28 18:26:00 +04:00
/*
* 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 "SkDevice.h"
#include "SkPaint.h"
#include "SkShader.h"
static SkBitmap createBitmap(int n) {
SkBitmap bitmap;
bitmap.setConfig(SkBitmap::kARGB_8888_Config, n, n);
bitmap.allocPixels();
bitmap.eraseColor(0);
SkCanvas canvas(bitmap);
SkRect r;
r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n));
SkPaint paint;
paint.setAntiAlias(true);
paint.setColor(SK_ColorRED);
canvas.drawOval(r, paint);
paint.setColor(SK_ColorBLUE);
paint.setStrokeWidth(SkIntToScalar(n)/15);
paint.setStyle(SkPaint::kStroke_Style);
canvas.drawLine(0, 0, r.fRight, r.fBottom, paint);
canvas.drawLine(0, r.fBottom, r.fRight, 0, paint);
return bitmap;
}
class MipMapView : public SampleView {
SkBitmap fBitmap;
enum {
N = 64
};
bool fOnce;
public:
MipMapView() {
fOnce = false;
}
void init() {
if (fOnce) {
return;
}
fOnce = true;
fBitmap = createBitmap(N);
fWidth = N;
}
protected:
// overrides from SkEventSink
virtual bool onQuery(SkEvent* evt) {
if (SampleCode::TitleQ(*evt)) {
SampleCode::TitleR(evt, "MipMaps");
return true;
}
return this->INHERITED::onQuery(evt);
}
void drawN(SkCanvas* canvas, const SkBitmap& bitmap) {
SkAutoCanvasRestore acr(canvas, true);
for (int i = N; i > 1; i >>= 1) {
canvas->drawBitmap(bitmap, 0, 0, NULL);
canvas->translate(SkIntToScalar(N + 8), 0);
canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
}
}
void drawN2(SkCanvas* canvas, const SkBitmap& bitmap) {
SkBitmap bg;
bg.setConfig(SkBitmap::kARGB_8888_Config, N, N);
bg.allocPixels();
SkAutoCanvasRestore acr(canvas, true);
for (int i = 0; i < 6; i++) {
bg.eraseColor(0);
SkCanvas c(bg);
c.scale(SK_Scalar1 / (1 << i), SK_Scalar1 / (1 << i));
c.drawBitmap(bitmap, 0, 0, NULL);
canvas->save();
canvas->scale(SkIntToScalar(1 << i), SkIntToScalar(1 << i));
canvas->drawBitmap(bg, 0, 0, NULL);
canvas->restore();
canvas->translate(SkIntToScalar(N + 8), 0);
}
}
virtual void onDrawContent(SkCanvas* canvas) {
this->init();
canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
canvas->scale(1.00000001f, 0.9999999f);
drawN2(canvas, fBitmap);
canvas->translate(0, SkIntToScalar(N + 8));
SkBitmap bitmap(fBitmap);
bitmap.buildMipMap();
drawN2(canvas, bitmap);
SkScalar time = SampleCode::GetAnimScalar(SkIntToScalar(1)/4,
SkIntToScalar(2));
if (time >= SK_Scalar1) {
time = SkIntToScalar(2) - time;
}
fWidth = 8 + SkScalarRound(N * time);
SkRect dst;
dst.set(0, 0, SkIntToScalar(fWidth), SkIntToScalar(fWidth));
SkPaint paint;
paint.setFilterBitmap(true);
paint.setAntiAlias(true);
canvas->translate(0, SkIntToScalar(N + 8));
canvas->drawBitmapRect(fBitmap, NULL, dst, NULL);
canvas->translate(SkIntToScalar(N + 8), 0);
canvas->drawBitmapRect(fBitmap, NULL, dst, &paint);
canvas->translate(-SkIntToScalar(N + 8), SkIntToScalar(N + 8));
canvas->drawBitmapRect(bitmap, NULL, dst, NULL);
canvas->translate(SkIntToScalar(N + 8), 0);
canvas->drawBitmapRect(bitmap, NULL, dst, &paint);
SkShader* s = SkShader::CreateBitmapShader(bitmap,
SkShader::kRepeat_TileMode,
SkShader::kRepeat_TileMode);
paint.setShader(s)->unref();
SkMatrix m;
m.setScale(SkIntToScalar(fWidth) / N,
SkIntToScalar(fWidth) / N);
s->setLocalMatrix(m);
SkRect r;
r.set(0, 0, SkIntToScalar(4*N), SkIntToScalar(5*N/2));
r.offset(SkIntToScalar(N + 12), -SkIntToScalar(N + 4));
canvas->drawRect(r, paint);
this->inval(NULL);
}
private:
int fWidth;
typedef SampleView INHERITED;
};
//////////////////////////////////////////////////////////////////////////////
static SkView* MyFactory() { return new MipMapView; }
static SkViewRegister reg(MyFactory);