From fb13abd800cd610c7f46815848545feff83e5748 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Sun, 16 Jan 2011 15:16:38 -0800 Subject: [PATCH] Fix 9patch rendering in ExpandableListView. Change-Id: I60843d61a40b0cb7dd09923cb4489a5a76f20486 --- .../android/widget/ExpandableListView.java | 4 +- core/res/res/values/themes.xml | 6 +- libs/hwui/Debug.h | 4 ++ libs/hwui/LayerRenderer.cpp | 7 +-- libs/hwui/Patch.cpp | 15 +++-- libs/hwui/Patch.h | 2 +- tests/HwAccelerationTest/AndroidManifest.xml | 10 ++++ .../drawable-mdpi/expander_ic_maximized.9.png | Bin 0 -> 1929 bytes .../drawable-mdpi/expander_ic_minimized.9.png | Bin 0 -> 1982 bytes .../test/hwui/SimplePatchActivity.java | 56 ++++++++++++++++++ 10 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 tests/HwAccelerationTest/res/drawable-mdpi/expander_ic_maximized.9.png create mode 100644 tests/HwAccelerationTest/res/drawable-mdpi/expander_ic_minimized.9.png create mode 100644 tests/HwAccelerationTest/src/com/android/test/hwui/SimplePatchActivity.java diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java index 3d21048e5f30b..472a33521b537 100644 --- a/core/java/android/widget/ExpandableListView.java +++ b/core/java/android/widget/ExpandableListView.java @@ -22,7 +22,6 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; -import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; @@ -212,6 +211,9 @@ public class ExpandableListView extends ListView { .getDimensionPixelSize(com.android.internal.R.styleable.ExpandableListView_indicatorLeft, 0); mIndicatorRight = a .getDimensionPixelSize(com.android.internal.R.styleable.ExpandableListView_indicatorRight, 0); + if (mIndicatorRight == 0) { + mIndicatorRight = mIndicatorLeft + mGroupIndicator.getIntrinsicWidth(); + } mChildIndicatorLeft = a.getDimensionPixelSize( com.android.internal.R.styleable.ExpandableListView_childIndicatorLeft, CHILD_INDICATOR_INHERIT); mChildIndicatorRight = a.getDimensionPixelSize( diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 971719ee25f91..291c1f888f5ce 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -114,7 +114,7 @@ ?android:attr/expandableListPreferredItemPaddingLeft 3dip - 33dip + 0dip ?android:attr/expandableListPreferredItemIndicatorLeft @@ -815,7 +815,7 @@ ?android:attr/expandableListPreferredItemPaddingLeft 3dip - 33dip + 0dip ?android:attr/expandableListPreferredItemIndicatorLeft @@ -1074,7 +1074,7 @@ ?android:attr/expandableListPreferredItemPaddingLeft 3dip - 33dip + 0dip ?android:attr/expandableListPreferredItemIndicatorLeft diff --git a/libs/hwui/Debug.h b/libs/hwui/Debug.h index bdd8e7357200b..71ec7609f0d07 100644 --- a/libs/hwui/Debug.h +++ b/libs/hwui/Debug.h @@ -37,6 +37,10 @@ // Turn on to display vertex and tex coords data about 9patch objects // This flag requires DEBUG_PATCHES to be turned on #define DEBUG_PATCHES_VERTICES 0 +// Turn on to display vertex and tex coords data used by empty quads +// in 9patch objects +// This flag requires DEBUG_PATCHES to be turned on +#define DEBUG_PATCHES_EMPTY_VERTICES 0 // Turn on to display debug info about paths #define DEBUG_PATHS 0 diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index cd2554e14a4f6..e6bea786dfdc5 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -29,10 +29,6 @@ namespace uirenderer { void LayerRenderer::prepare(bool opaque) { LAYER_RENDERER_LOGD("Rendering into layer, fbo = %d", mLayer->fbo); -#if RENDER_LAYERS_AS_REGIONS - mLayer->region.clear(); -#endif - glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &mPreviousFbo); glBindFramebuffer(GL_FRAMEBUFFER, mLayer->fbo); @@ -78,6 +74,7 @@ void LayerRenderer::generateMesh() { mLayer->meshIndices = NULL; mLayer->meshElementCount = 0; } + mLayer->region.clear(); return; } @@ -129,6 +126,8 @@ void LayerRenderer::generateMesh() { indices[index + 4] = quad + 1; // top-right indices[index + 5] = quad + 3; // bottom-right } + + mLayer->region.clear(); #endif } diff --git a/libs/hwui/Patch.cpp b/libs/hwui/Patch.cpp index e5cb67b81be3c..77cbb80fa4daa 100644 --- a/libs/hwui/Patch.cpp +++ b/libs/hwui/Patch.cpp @@ -212,7 +212,7 @@ void Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, fl } float u2 = fmax(0.0f, stepX - 0.5f) / bitmapWidth; - generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount); + bool valid = generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount); x1 = x2; u1 = (stepX + 0.5f) / bitmapWidth; @@ -223,17 +223,22 @@ void Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, fl generateQuad(vertex, x1, y1, width, y2, u1, v1, 1.0f, v2, quadCount); } -void Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2, +bool Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2, float u1, float v1, float u2, float v2, uint32_t& quadCount) { const uint32_t oldQuadCount = quadCount; - const bool valid = x2 - x1 > 0.9999f && y2 - y1 > 0.9999f; + const bool valid = x2 >= x1 && y2 >= y1; if (valid) { quadCount++; } // Skip degenerate and transparent (empty) quads if (!valid || ((mColorKey >> oldQuadCount) & 0x1) == 1) { - return; +#if DEBUG_PATCHES_EMPTY_VERTICES + PATCH_LOGD(" quad %d (empty)", oldQuadCount); + PATCH_LOGD(" left, top = %.2f, %.2f\t\tu1, v1 = %.2f, %.2f", x1, y1, u1, v1); + PATCH_LOGD(" right, bottom = %.2f, %.2f\t\tu2, v2 = %.2f, %.2f", x2, y2, u2, v2); +#endif + return false; } #if RENDER_LAYERS_AS_REGIONS @@ -262,6 +267,8 @@ void Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, f PATCH_LOGD(" left, top = %.2f, %.2f\t\tu1, v1 = %.2f, %.2f", x1, y1, u1, v1); PATCH_LOGD(" right, bottom = %.2f, %.2f\t\tu2, v2 = %.2f, %.2f", x2, y2, u2, v2); #endif + + return true; } }; // namespace uirenderer diff --git a/libs/hwui/Patch.h b/libs/hwui/Patch.h index 0f0ffa22594e7..45ce99842c204 100644 --- a/libs/hwui/Patch.h +++ b/libs/hwui/Patch.h @@ -71,7 +71,7 @@ private: void generateRow(TextureVertex*& vertex, float y1, float y2, float v1, float v2, float stretchX, float width, float bitmapWidth, uint32_t& quadCount); - void generateQuad(TextureVertex*& vertex, + bool generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2, float u1, float v1, float u2, float v2, uint32_t& quadCount); diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml index e73afa0f4eb41..7099ab57a8128 100644 --- a/tests/HwAccelerationTest/AndroidManifest.xml +++ b/tests/HwAccelerationTest/AndroidManifest.xml @@ -24,6 +24,16 @@ android:label="HwUi" android:hardwareAccelerated="true"> + + + + + + + diff --git a/tests/HwAccelerationTest/res/drawable-mdpi/expander_ic_maximized.9.png b/tests/HwAccelerationTest/res/drawable-mdpi/expander_ic_maximized.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c32766cece2372f69dbd6524bd8fb765fe9bab GIT binary patch literal 1929 zcmV;42X^?0P)e|+afl)y;{niP%|KcS zDbQMh{M%qQM9qIj20Q>DfG|S?4KShc^Pm{Rgl?eS{FRlJ3qhRr_V#$7_(veK6yyky zcjtg;WDFHk1u5uIV`gUN&Bw>555gceNDM3oR5c|uG}Imx z7RWd-FwhYs2QneY&(F^dssoOJnn0-{2RR&On3|gYfu=lANM{fgPyhi$PysQ335!@P zC~%J+Jz5KNRwpo!XM$)DA0!Ty$4t;rT(NNBLQw9R4P>k1!XWu2OP17u)T1O;Am{_; z3WYs;_8bDGXjmQq;f#!oGGsnTe(Tn)he7H=`jEq9A}DPD*)1>^0@KMF0RaJh82`hE z4;O)HCIl%R*Fe)xJ_}OVFhS#u;nk~GOb!kXap+zLiZhCdiTy*<19yoAFrQ@svym{6 zUrQ)9K)LJZ&!2DE*x055xi`^s`Sdeq&VY)5<(ynxb-?hj0E#JsXb>MHe*XOV4v;!z zefZLeJrG+1u{;nz1mdGWd=Q&LfB>{rO=}ua6jf&u{0JDo&>6EEB%v)@q?AI0v``nV z$xg68KyW946t^`L0+ohz;l{12?i;ePBo*wgi>c637cQMqq6s5u4AB{SkIa;z*qB8- zaN)lD-o5X=^Uk?*D{cQ*wz7YTJIS`l1by5l`#^R%?*!@BkNiHgOY+hWi*PT;RY;61nk2W}_lRl)JGh(F&pllN3uH*6ep}DV-Vx6s4 zON7BU&tWZckc%t4al73fLi}AKkwDN=tJPfXc3V^wWx6ZPTLeM4pG+pF=rVVzJo0;c&>9@t~%! z8h$pLy_3mgPN7O%0U#Dh)?V^o-HQKK>n=$fAQo|qb8=Xo=SP7+;Mu%ntif93AlKjl zP<~65mwi6p=YGF`G%MNf_dg#D2J4iAAOA~e!)Ug6XEY3jW!X3t+KWUYkE+$G3kDxC z%;_xLGlcc0n3iyo$z-DDa=A--TCXmqvr47nqymh-^ToV=09C#~-_*xH$ljY(_|F>3 zF9Djdp3o%2FkXi)F10*`%{l0gn;w+%Ha$#1y%{4YH8UvcXbe{;5$P;KFxSdr{wb=%hJNXxg7tgg{nm#y-JC=pJgDFIz0dQ!@B6&J-|z9jkT!~I zBqaW?k~qy6L$wdz>o9_-55p)C{*n`ells63x)BbC<>34=s{27k?*Y!`7zjP{x*Gy$Kx%J$1@HfISg!gXSdr|a85oBnwit-9LJG32YfjLUfG61YPwu5DKB_< zde|)q(px$-BODZ{oPt{{mZfw${eIZ}wpy*HGMUUAB~vPuJ^`P_xJ_so`&$yUbW@>F zsO9td6lh%DVkXO@Dn6{_1&-s+Vp|(tuUE>>{C!~(BvCG6#x0x8HgQxeUgz5FrG8Gc z+3Z+8pMR)QskC6E)!EtEYi6^#({GGeBANTfajH}*RmTcZBF{+@@r7xmgy!exkJ0Cy zg@s(Nv=>q#I*Mo2YV{R04&YFlrIvov{a$($8uPmohsFIZY#EnGne4vTI}4)HTrT%W zsZ?r(jM#e-#nx)IRg=kdm8aPrzVfpeyptVa`~`MGtyZ@ym5MYF2*`rL;HGeJG#b@l zw#y)d7i<>0UE3gs@8xn?gCt7A2jrK=B2J6>_$*urT9!+w;w|jeBzojEw8c+Gjf}vL z%biYV8nw59Q+FJMJ zrPu2fgcCCc!{cJ1@MhTH2BUH6WwCgLZ~~o2L#NYG-L1eL^h3-E2G@rYiNvPc?VhA$ zL?TfI$G4D7ChLO&16ipBoauJEY6>2U#Woxchm1X@zgC)iB`^i-7Rewewx5fOi=5x@ zKZzwhGAIeu)DN_XO(+@(6JB4bafLMw!lKjck0H%IcH%WG!`Sry*Au@0v9< P00000NkvXXu0mjf-OY-J literal 0 HcmV?d00001 diff --git a/tests/HwAccelerationTest/res/drawable-mdpi/expander_ic_minimized.9.png b/tests/HwAccelerationTest/res/drawable-mdpi/expander_ic_minimized.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4515b42177bb19f5e0e34d984116e37898fd199f GIT binary patch literal 1982 zcmV;v2SNCWP)f+hH!!65D=RA(f;jE%?eReI zk3eQA$Ppm#&H>TL7%HX;GNB*HnfmbIL)K->mVx4rAu1~Bjl8`4Zy+<91xPT1d?O+v z@&_1Dhd>H|Y>)~6!E!(ori6xu+JhqK^XJdXAPiy$1_nBUU@1L*+9^FI&< zv4NUgKyt|8FvHZ;^ba)UfvnCTDxd%Yh@b*u023CmSWw^|J$kej=&Vj)AkPHRAU;SO zDvz0@d-faxrD$lz!iquiTeogK z3{nr$ha4soL1_cXZUJ#ZLP89UjEq*HyBe6k!`7@>a~_)OYM|*SALfo{N^Ut3@-?Fi>O$Bmq zqUZAIXU?1f6#>gRxwz^wGBPYcSr9~n_#pA~=g)V5)FJD`mrm?~*cyoCf%qX19|hur z*c1W;psfl*l!(HxjaIq_wJV~tcH2WiJnQ7i-%Tlj9?e(B+e-6!b0tCsZ-wv^FYMb4t4mMH~*Xed++`4`@Z=rZU0xc zI{uJfK-@*FSnppEuMzw6cHl;+!{Kn8N~I1#q|;1BqtU%wF6Xk_?Ifg%_&y8ZEQ#Xx z`%iScT~{y|e3wqAxw0*j$*eRQjaxpS@1WD^{6vaYqfY|35KqZazbtPVy8dC-x#Z>L z8y&+~wOC2+90-8tfk5E6X_{XQ!+3vG(_~q`DM`|WcDqeud&DL#f{~`K>u!K;%}7TFGMLF`VCK`SGtCrCO~z^ZEQsjv=ZCkx1lF%!NWB1;@BjEEabNz$U7Y^%BNUrcC7| zpD>&sQ_^08wAn;eT;mH~BY?DCulM$-Tkv|lw^68A*Z5EXko(Voe8%JPZ1(&8H?xZI z-?}px46dVwKmNzmhA>--god%_a5ydlXdSk8tz0g<85}dmIg5qsLRiycI>nugMx${u zncRn%mMk&t77B$00NAaSzs>Uls`4Iv(|X@VyqZ+uKQoly0yJYbAxcG29B(2EET7fV z#%Z9Bc{8<$5HUu#DsGHnpv=fcQ9%nsom#2T&{A>ZCTNq11;f}%^ex)x6bb`voUAZp z#)4W@@0mg$F#QkQCo()gMqPB_px*o5J?DO$bAHE>L)tjnSd#dtZQp>;on#qfW*2jl zk5h>HI1Gu%O-I3m=mQ>fBNmJ4kn<1Hz3(UV9KyK{@7-kda-YpN@NrP6ze`_|$)xD< zcqS1@COD4!;B-3I;U}N^tqf#2370r8Nzy6gm2D7G-R*X3W#Ez1LpLLcx6UE1G>k^0 zj+9%i*411tR~`1eZ8qBpK@b+mm{O_q8L>)(?l+Kxk`c6Zd?XSP1A%}Zh0A-aNJ87Wf3bD?RNXrA&ur;Ly}g%%w)6KP3#aE zvO-8CdxwP#^7(v+>GR&w(o2?H+Rfo`Tmb(+8B}39oxYaIWL|gn(Y&Ehh$lVea#_~9 z)&^UaOSBBTmv>HDsZ{m@co$73lNIHRxtns7J_Qt%0swf0=lS0XC>mrsMAqe%UGxi$ zqg0gWGaL>d-T5+2SS%J($g;QLH4m!Q>MKguve0kzFVi?Zr(^(|x2=ciZQlvnmP@$B z-*HycsFB}-#-DXtEynhO$_~JNuOR83MItT34U-_ZU#v1yY#6)TY&K_c_iFIEBj|b# z$#;6k9mrfX8vWt-`;Rk2QoYU{8J{3!LZwn|BdhnkBQU^427rKS;8ZeTgUCTCPFyF{ z0?>#CgF#PmV%}_iTFB=s!+M0-V&T^cg{u@NPsx-UtSR z$FQZUen#LZ|A1`kAQ}$GL}B176|Tgqqond#2>k_cW)~+xfk0r{^#A9Hf9PFMd9F3e QX#fBK07*qoM6N<$f``Mu<^TWy literal 0 HcmV?d00001 diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/SimplePatchActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/SimplePatchActivity.java new file mode 100644 index 0000000000000..a9b4d1c3cefbb --- /dev/null +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/SimplePatchActivity.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2011 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.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.View; + +@SuppressWarnings({"UnusedDeclaration"}) +public class SimplePatchActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(new PatchView(this)); + } + + private static class PatchView extends View { + private final Drawable mDrawable; + + public PatchView(Context context) { + super(context); + setBackgroundColor(0xff000000); + mDrawable = context.getResources().getDrawable(R.drawable.expander_ic_minimized); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.save(); + canvas.translate(200, 200); + mDrawable.setBounds(3, 0, 33, 64); + mDrawable.draw(canvas); + mDrawable.setBounds(63, 0, 94, 64); + mDrawable.draw(canvas); + canvas.restore(); + } + } +}