Merge "Apply bilinear filtering to text."

This commit is contained in:
Romain Guy
2010-10-01 16:37:52 -07:00
committed by Android (Google) Code Review
7 changed files with 160 additions and 58 deletions

View File

@@ -21,6 +21,62 @@
namespace android {
namespace uirenderer {
///////////////////////////////////////////////////////////////////////////////
// Defines
///////////////////////////////////////////////////////////////////////////////
#define PATH_HEAP_SIZE 64
///////////////////////////////////////////////////////////////////////////////
// Helpers
///////////////////////////////////////////////////////////////////////////////
PathHeap::PathHeap(): mHeap(PATH_HEAP_SIZE * sizeof(SkPath)) {
}
PathHeap::PathHeap(SkFlattenableReadBuffer& buffer): mHeap(PATH_HEAP_SIZE * sizeof(SkPath)) {
int count = buffer.readS32();
mPaths.setCount(count);
SkPath** ptr = mPaths.begin();
SkPath* p = (SkPath*) mHeap.allocThrow(count * sizeof(SkPath));
for (int i = 0; i < count; i++) {
new (p) SkPath;
p->unflatten(buffer);
*ptr++ = p;
p++;
}
}
PathHeap::~PathHeap() {
SkPath** iter = mPaths.begin();
SkPath** stop = mPaths.end();
while (iter < stop) {
(*iter)->~SkPath();
iter++;
}
}
int PathHeap::append(const SkPath& path) {
SkPath* p = (SkPath*) mHeap.allocThrow(sizeof(SkPath));
new (p) SkPath(path);
*mPaths.append() = p;
return mPaths.count();
}
void PathHeap::flatten(SkFlattenableWriteBuffer& buffer) const {
int count = mPaths.count();
buffer.write32(count);
SkPath** iter = mPaths.begin();
SkPath** stop = mPaths.end();
while (iter < stop) {
(*iter)->flatten(buffer);
iter++;
}
}
///////////////////////////////////////////////////////////////////////////////
// Display list
///////////////////////////////////////////////////////////////////////////////

View File

@@ -45,39 +45,11 @@ namespace uirenderer {
class PathHeap: public SkRefCnt {
public:
PathHeap(): mHeap(64 * sizeof(SkPath)) {
};
PathHeap();
PathHeap(SkFlattenableReadBuffer& buffer);
~PathHeap();
PathHeap(SkFlattenableReadBuffer& buffer): mHeap(64 * sizeof(SkPath)) {
int count = buffer.readS32();
mPaths.setCount(count);
SkPath** ptr = mPaths.begin();
SkPath* p = (SkPath*) mHeap.allocThrow(count * sizeof(SkPath));
for (int i = 0; i < count; i++) {
new (p) SkPath;
p->unflatten(buffer);
*ptr++ = p;
p++;
}
}
~PathHeap() {
SkPath** iter = mPaths.begin();
SkPath** stop = mPaths.end();
while (iter < stop) {
(*iter)->~SkPath();
iter++;
}
}
int append(const SkPath& path) {
SkPath* p = (SkPath*) mHeap.allocThrow(sizeof(SkPath));
new (p) SkPath(path);
*mPaths.append() = p;
return mPaths.count();
}
int append(const SkPath& path);
int count() const { return mPaths.count(); }
@@ -85,17 +57,7 @@ public:
return *mPaths[index];
}
void flatten(SkFlattenableWriteBuffer& buffer) const {
int count = mPaths.count();
buffer.write32(count);
SkPath** iter = mPaths.begin();
SkPath** stop = mPaths.end();
while (iter < stop) {
(*iter)->flatten(buffer);
iter++;
}
}
void flatten(SkFlattenableWriteBuffer& buffer) const;
private:
SkChunkAlloc mHeap;

View File

@@ -435,25 +435,25 @@ void FontRenderer::initTextTexture() {
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, mCacheWidth, mCacheHeight, 0,
GL_ALPHA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Split up our cache texture into lines of certain widths
int nextLine = 0;
mCacheLines.push(new CacheTextureLine(mCacheWidth, 16, nextLine, 0));
mCacheLines.push(new CacheTextureLine(mCacheWidth, 18, nextLine, 0));
nextLine += mCacheLines.top()->mMaxHeight;
mCacheLines.push(new CacheTextureLine(mCacheWidth, 24, nextLine, 0));
mCacheLines.push(new CacheTextureLine(mCacheWidth, 26, nextLine, 0));
nextLine += mCacheLines.top()->mMaxHeight;
mCacheLines.push(new CacheTextureLine(mCacheWidth, 24, nextLine, 0));
mCacheLines.push(new CacheTextureLine(mCacheWidth, 26, nextLine, 0));
nextLine += mCacheLines.top()->mMaxHeight;
mCacheLines.push(new CacheTextureLine(mCacheWidth, 32, nextLine, 0));
mCacheLines.push(new CacheTextureLine(mCacheWidth, 34, nextLine, 0));
nextLine += mCacheLines.top()->mMaxHeight;
mCacheLines.push(new CacheTextureLine(mCacheWidth, 32, nextLine, 0));
mCacheLines.push(new CacheTextureLine(mCacheWidth, 34, nextLine, 0));
nextLine += mCacheLines.top()->mMaxHeight;
mCacheLines.push(new CacheTextureLine(mCacheWidth, 40, nextLine, 0));
mCacheLines.push(new CacheTextureLine(mCacheWidth, 42, nextLine, 0));
nextLine += mCacheLines.top()->mMaxHeight;
mCacheLines.push(new CacheTextureLine(mCacheWidth, mCacheHeight - nextLine, nextLine, 0));
}
@@ -631,6 +631,7 @@ void FontRenderer::setFont(SkPaint* paint, uint32_t fontId, float fontSize) {
precacheLatin(paint);
}
}
FontRenderer::DropShadow FontRenderer::renderDropShadow(SkPaint* paint, const char *text,
uint32_t startIndex, uint32_t len, int numGlyphs, uint32_t radius) {
checkInit();
@@ -713,7 +714,7 @@ void FontRenderer::computeGaussianWeights(float* weights, int32_t radius) {
float normalizeFactor = 0.0f;
for(int32_t r = -radius; r <= radius; r ++) {
float floatR = (float)r;
float floatR = (float) r;
weights[r + radius] = coeff1 * pow(e, floatR * floatR * coeff2);
normalizeFactor += weights[r + radius];
}
@@ -742,7 +743,7 @@ void FontRenderer::horizontalBlur(float* weights, int32_t radius,
if ((x > radius) && (x < (width - radius))) {
const uint8_t *i = input + (x - radius);
for(int r = -radius; r <= radius; r ++) {
currentPixel = (float)(*i);
currentPixel = (float) (*i);
blurredPixel += currentPixel * gPtr[0];
gPtr++;
i++;

View File

@@ -183,14 +183,14 @@ protected:
}
bool fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_t *retOriginY) {
if (glyph.fHeight > mMaxHeight) {
if (glyph.fHeight + 2 > mMaxHeight) {
return false;
}
if (mCurrentCol + glyph.fWidth < mMaxWidth) {
*retOriginX = mCurrentCol;
*retOriginY = mCurrentRow;
mCurrentCol += glyph.fWidth;
if (mCurrentCol + glyph.fWidth + 2 < mMaxWidth) {
*retOriginX = mCurrentCol + 1;
*retOriginY = mCurrentRow + 1;
mCurrentCol += glyph.fWidth + 2;
mDirty = true;
return true;
}

View File

@@ -39,6 +39,15 @@
</intent-filter>
</activity>
<activity
android:name="LabelsActivity"
android:label="_Labels">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="ResizeActivity"
android:label="_Resize"

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="200dip"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:text="This is a long text view for ellipsizing" />
<TextView
android:layout_width="200dip"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:gravity="center_horizontal"
android:text="This is a very long text view for ellipsizing" />
<TextView
android:layout_width="200dip"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:gravity="right"
android:text="This is a very long text view for ellipsizing" />
</LinearLayout>

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.test.hwui;
import android.app.Activity;
import android.os.Bundle;
@SuppressWarnings({"UnusedDeclaration"})
public class LabelsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.labels);
}
}